summaryrefslogtreecommitdiff
path: root/testgraphical
diff options
context:
space:
mode:
Diffstat (limited to 'testgraphical')
-rw-r--r--testgraphical/document-pool/demo/CurrentTime.odsbin0 -> 8299 bytes
-rw-r--r--testgraphical/document-pool/demo/knownissues.xcl8
-rw-r--r--testgraphical/document-pool/singletest/eis-test.odtbin0 -> 9623 bytes
-rw-r--r--testgraphical/prechecks/makefile.mk56
-rw-r--r--testgraphical/prechecks/softwaretests.pl564
-rwxr-xr-xtestgraphical/prj/build.lst7
-rw-r--r--testgraphical/prj/d.lst0
-rw-r--r--testgraphical/qa/graphical/Test.java113
-rw-r--r--testgraphical/qa/graphical/makefile.mk57
-rw-r--r--testgraphical/references/unxlngi/demo/CurrentTime.ods.pdfbin0 -> 13916 bytes
-rw-r--r--testgraphical/references/unxlngi/demo/CurrentTime.ods.ps576
-rw-r--r--testgraphical/references/unxlngi/singletest/eis-test.odt.pdfbin0 -> 14356 bytes
-rw-r--r--testgraphical/references/unxlngi/singletest/eis-test.odt.ps565
-rw-r--r--testgraphical/references/unxlngi/singletest/tolerance.ini_4
-rw-r--r--testgraphical/references/unxsoli/singletest/eis-test.odt.pdfbin0 -> 9162 bytes
-rw-r--r--testgraphical/references/wntmsci/demo/CurrentTime.ods.pdfbin0 -> 13916 bytes
-rw-r--r--testgraphical/references/wntmsci/demo/CurrentTime.ods.ps499
-rw-r--r--testgraphical/references/wntmsci/singletest/eis-test.odt.pdfbin0 -> 9142 bytes
-rw-r--r--testgraphical/references/wntmsci/singletest/eis-test.odt.ps1984
-rw-r--r--testgraphical/source/CallExternals.pm539
-rw-r--r--testgraphical/source/ConvwatchHelper.pm574
-rw-r--r--testgraphical/source/compare.pl408
-rw-r--r--testgraphical/source/cwstestresult.pl208
-rw-r--r--testgraphical/source/cwstestresulthelper.pm268
-rw-r--r--testgraphical/source/dbhelper.pm209
-rw-r--r--testgraphical/source/filehelper.pm358
-rw-r--r--testgraphical/source/fill_documents_loop.pl423
-rw-r--r--testgraphical/source/graphical_compare.pm586
-rw-r--r--testgraphical/source/loghelper.pm94
-rw-r--r--testgraphical/source/makefile.mk112
-rw-r--r--testgraphical/source/oshelper.pm110
-rw-r--r--testgraphical/source/solarenvhelper.pm63
-rw-r--r--testgraphical/source/stringhelper.pm69
-rw-r--r--testgraphical/source/timehelper.pm99
-rw-r--r--testgraphical/ui/java/ConvwatchGUIProject/build.xml74
-rw-r--r--testgraphical/ui/java/ConvwatchGUIProject/dist/ConvwatchGUIProject.jarbin0 -> 28271 bytes
-rw-r--r--testgraphical/ui/java/ConvwatchGUIProject/makefile.mk71
-rw-r--r--testgraphical/ui/java/ConvwatchGUIProject/manifest.mf3
-rw-r--r--testgraphical/ui/java/ConvwatchGUIProject/nbproject/build-impl.xml805
-rw-r--r--testgraphical/ui/java/ConvwatchGUIProject/nbproject/genfiles.properties9
-rw-r--r--testgraphical/ui/java/ConvwatchGUIProject/nbproject/private/config.properties0
-rw-r--r--testgraphical/ui/java/ConvwatchGUIProject/nbproject/private/private.properties8
-rw-r--r--testgraphical/ui/java/ConvwatchGUIProject/nbproject/private/private.xml4
-rw-r--r--testgraphical/ui/java/ConvwatchGUIProject/nbproject/project.properties72
-rw-r--r--testgraphical/ui/java/ConvwatchGUIProject/nbproject/project.xml15
-rw-r--r--testgraphical/ui/java/ConvwatchGUIProject/src/ConvwatchGUI.form286
-rw-r--r--testgraphical/ui/java/ConvwatchGUIProject/src/ConvwatchGUI.java535
-rw-r--r--testgraphical/ui/java/ConvwatchGUIProject/src/IniFile.java718
-rw-r--r--testgraphical/ui/java/makefile.mk53
-rw-r--r--testgraphical/util/makefile.pmk34
50 files changed, 11240 insertions, 0 deletions
diff --git a/testgraphical/document-pool/demo/CurrentTime.ods b/testgraphical/document-pool/demo/CurrentTime.ods
new file mode 100644
index 000000000000..e027215ddb74
--- /dev/null
+++ b/testgraphical/document-pool/demo/CurrentTime.ods
Binary files differ
diff --git a/testgraphical/document-pool/demo/knownissues.xcl b/testgraphical/document-pool/demo/knownissues.xcl
new file mode 100644
index 000000000000..5cdad159bc35
--- /dev/null
+++ b/testgraphical/document-pool/demo/knownissues.xcl
@@ -0,0 +1,8 @@
+[ps]
+### contains date in it, will fail every time ###
+CurrentTime.ods
+
+[pdf]
+### contains date in it, will fail every time ###
+CurrentTime.ods
+
diff --git a/testgraphical/document-pool/singletest/eis-test.odt b/testgraphical/document-pool/singletest/eis-test.odt
new file mode 100644
index 000000000000..bb9c6a43f623
--- /dev/null
+++ b/testgraphical/document-pool/singletest/eis-test.odt
Binary files differ
diff --git a/testgraphical/prechecks/makefile.mk b/testgraphical/prechecks/makefile.mk
new file mode 100644
index 000000000000..13796c949ab5
--- /dev/null
+++ b/testgraphical/prechecks/makefile.mk
@@ -0,0 +1,56 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..
+
+PRJNAME=gfxcmp_prechecks
+TARGET=notargetyet
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+.IF "$(VERBOSE)"!=""
+ P_VERBOSE=-verbose
+.ENDIF
+.IF "$(SHOW)"!=""
+ P_JAVA6=-java6
+.ENDIF
+
+# PERLDEBUG=-d:ptkdb
+ALLTAR:
+.IF "$(GUI)"=="WNT" || "$(GUI)"=="OS2"
+ $(PERL) $(PERLDEBUG) softwaretests.pl -printerdriver -imagemagick -ghostscript $(P_VERBOSE) $(P_JAVA6)
+.ELSE
+ $(PERL) $(PERLDEBUG) softwaretests.pl -imagemagick -ghostscript $(P_VERBOSE) $(P_JAVA6)
+.ENDIF
+
+.INCLUDE : $(PRJ)$/util$/makefile.pmk
diff --git a/testgraphical/prechecks/softwaretests.pl b/testgraphical/prechecks/softwaretests.pl
new file mode 100644
index 000000000000..f591fa139879
--- /dev/null
+++ b/testgraphical/prechecks/softwaretests.pl
@@ -0,0 +1,564 @@
+eval 'exec perl -wS $0 ${1+\"$@\"}'
+ if 0;
+
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+# This is a pre check, which checks if some extra software exists
+
+BEGIN
+{
+ # Adding the path of this script file to the include path in the hope
+ # that all used modules can be found in it.
+ $0 =~ /^(.*)[\/\\]/;
+ push @INC, $1;
+}
+
+use strict;
+use English; # $OSNAME, ...
+use Getopt::Long;
+use Cwd;
+use Cwd 'chdir';
+my $cwd = getcwd();
+
+our $help; # Help option flag
+our $version; # Version option flag
+
+# flush STDOUT
+# my $old_handle = select (STDOUT); # "select" STDOUT and save # previously selected handle
+# $| = 1; # perform flush after each write to STDOUT
+# select ($old_handle); # restore previously selected handle
+
+$OUTPUT_AUTOFLUSH=1; # works only if use English is used.
+
+our $sGlobalIniFile;
+our $verbose = 0;
+our $ghostscript;
+our $imagemagick;
+our $java6;
+our $printerdriver;
+
+our $version_info = 'compare.pl';
+
+GetOptions(
+ "ghostscript" => \$ghostscript,
+ "imagemagick" => \$imagemagick,
+ "java6" => \$java6,
+ "printerdriver" => \$printerdriver,
+ "verbose" => \$verbose,
+
+ "help" => \$help,
+ "version" => \$version
+ );
+
+if ($help)
+{
+ print_usage(*STDOUT);
+ exit(0);
+}
+# Check for version option
+if ($version)
+{
+ print STDERR "$version_info\n";
+ exit(0);
+}
+
+# prepare the GlobalIniFile
+
+sub prepare()
+{
+ my $sEnv = "$ENV{PRJ}";
+ if (! $sEnv)
+ {
+ print "Warning: Seems you are not in a makefile.mk environment.\n";
+ $sEnv = "..";
+ }
+ my $sPath = getcwd();
+ $sPath .= "/" . $sEnv;
+ chdir ($sPath);
+ cwd();
+ $sPath = getcwd();
+ my $sInpath = $ENV{INPATH};
+ $sPath .= "/" . $sInpath . "/misc";
+ $sGlobalIniFile = "$sPath/pathes.ini";
+ print "Global Path ini file is: $sGlobalIniFile\n" if ($verbose);
+}
+
+sub unixpath($)
+{
+ my $path = shift;
+ $path =~ s/\\/\//g; # make out of '\' a '/'
+ return $path;
+}
+
+# search for file in a given path list.
+# the path list should be separated as the path variable in the corresponding OS
+sub searchForFileInPath($$)
+{
+ my $sFile = shift;
+ my $sPathList = shift;
+
+ my $sep = ':';
+ if ($OSNAME eq "MSWin32")
+ {
+ $sep = ';';
+ }
+ my @path = split($sep, $sPathList);
+
+ my $sPath;
+ my $startdir;
+ my $bFound = 0;
+ my $olddir = getcwd();
+
+ my $sWindowsHomeDir = unixpath(lc($ENV{WINDIR}));
+
+ foreach $startdir (@path)
+ {
+ my $nCount = 0;
+ #
+ # IMPORTANT: leave out windir path.
+ #
+ if ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
+ {
+ my $sPath = unixpath(lc(convertCygwinPath($startdir)));
+ if ($sPath =~ /^$sWindowsHomeDir/ )
+ {
+ print "path: $startdir is windows path leave out.\n" if ($verbose);
+ next;
+ }
+ }
+
+ local *DIR;
+ if (opendir (DIR, $startdir)) # open directory
+ {
+ print "path: $startdir" if ($verbose);
+ chdir ($startdir);
+ cwd();
+ my $myfile;
+ while ($myfile = readdir(DIR)) # get filename
+ {
+ if (-f $myfile ) # is it a file?
+ {
+ $nCount ++;
+ if ($myfile eq $sFile) # is it the real file?
+ {
+ $sPath = $startdir;
+ $bFound = 1;
+ last;
+ }
+ }
+ }
+ closedir(DIR);
+ print " ($nCount)\n" if ($verbose);
+ }
+ if ($bFound == 1)
+ {
+ last;
+ }
+ }
+ chdir ($olddir);
+ cwd();
+
+ return $sPath;
+}
+
+
+prepare();
+# don't remove the inifile, only build clean should do this.
+# if ( -e "$sGlobalIniFile")
+# {
+# unlink($sGlobalIniFile);
+# }
+
+
+# small helper, which replaces the return code
+sub errorAdaption($)
+{
+ my $error = shift;
+ if ($error != 0)
+ {
+ $error = $error / 256;
+ }
+ if ($error > 127)
+ {
+ $error = $error - 256;
+ }
+ return $error;
+}
+
+# for every error we increment this variable by 1
+our $nGlobalErrors = 0;
+
+sub handleError($$)
+{
+ my $error = shift;
+ my $sText = shift;
+ if ($error != 0)
+ {
+ print "ERROR: search for $sText has failed with Errornumber: $error\n";
+ $nGlobalErrors ++;
+ }
+}
+
+sub convertCygwinPath($)
+{
+ my $sPath = shift;
+
+ if ($OSNAME eq "cygwin")
+ {
+ # print "Cygwin Path Patch.\n" if ($verbose);
+ if ($sPath =~ /\/cygdrive\/(.)/)
+ {
+ my $Letter = $1;
+ $sPath =~ s/\/cygdrive\/${Letter}/${Letter}\:/;
+ # print "Cygwin Path Patch: '$sPath'\n" if ($verbose);
+ }
+ }
+ return $sPath;
+}
+
+# append key=value to GlobalIniFile
+sub insertPath($$)
+{
+ my $sKey = shift;
+ my $sValue = shift;
+
+ $sValue = convertCygwinPath($sValue);
+ my $sIniFile = convertCygwinPath($sGlobalIniFile);
+ local *INIFILE;
+ if (open(INIFILE, ">>" . $sIniFile ))
+ {
+ print INIFILE "$sKey=$sValue\n";
+ }
+ close(INIFILE);
+}
+
+sub getFastPath($)
+{
+ my $sKey = shift;
+ my $sValue;
+ local *INIFILE;
+ my $sIniFile = convertCygwinPath($sGlobalIniFile);
+ if (open(INIFILE, $sIniFile))
+ {
+ my $line;
+ while ($line = <INIFILE>)
+ {
+ chomp($line);
+ if ( $line =~ /^$sKey=(.*)$/ )
+ {
+ $sValue = $1;
+ # print INIFILE "$sKey=$sValue\n";
+ }
+ }
+ close(INIFILE);
+ }
+ return $sValue;
+}
+
+sub checkForGhostscript()
+{
+ print "Search for Ghostscript\n" if ($verbose);
+ if ($OSNAME eq "linux" ||
+ $OSNAME eq "solaris")
+ {
+ # search for ghostscript
+ local *GHOSTSCRIPT;
+ if (open(GHOSTSCRIPT, "which gs 2>&1 |"))
+ {
+ my $line;
+ while ($line = <GHOSTSCRIPT>)
+ {
+ chomp($line);
+ print "- $line\n" if ($verbose);
+ }
+ close(GHOSTSCRIPT);
+ }
+ my $error = errorAdaption($?);
+ handleError($error, "Ghostscript");
+ }
+ elsif ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
+ {
+ my $sGSExe = "gswin32c.exe";
+ # my $sGSPath = "C:/gs/gs8.64/bin";
+ my $sGSPath = getFastPath("gs.path");
+ if (! $sGSPath)
+ {
+ $sGSPath = searchForFileInPath($sGSExe, $ENV{PATH});
+
+ if ( ! -e "$sGSPath/$sGSExe")
+ {
+ $nGlobalErrors ++;
+ print "ERROR: search for $sGSPath/$sGSExe failed.\n";
+ print "Please install ghostscript from www.adobe.com to and make it available in \$PATH variable \n";
+ }
+ else
+ {
+ insertPath("gs.path", $sGSPath);
+ insertPath("gs.exe", $sGSExe);
+ }
+ }
+ if ( -e "$sGSPath/$sGSExe" )
+ {
+ print "Found Ghostscript: '$sGSPath'\n" if ($verbose);
+ }
+ }
+ else
+ {
+ print "ERROR: Check for Ghostscript failed, due to unsupported '$OSNAME' environment.\n";
+ $nGlobalErrors ++;
+ }
+}
+
+
+sub checkForPSDriver()
+{
+ # we don't need to check for unix here, due to the fact, unix is per default be able to print in postscript
+ if ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
+ {
+ print "Check for postscript driver.\n" if ($verbose);
+ my $sWindowsRoot = $ENV{windir};
+ if (! $sWindowsRoot)
+ {
+ $sWindowsRoot = $ENV{WINDIR};
+ }
+ my $sCrossOfficeDriver = "${sWindowsRoot}/system32/crossoffice.ppd";
+ if ( ! -e "$sCrossOfficeDriver")
+ {
+ print "ERROR: Don't found Postscript driver $sCrossOfficeDriver file\n";
+ $nGlobalErrors ++;
+ print "Take a look on: http://so-gfxcmp.germany.sun.com/docs/further/convwatch/convwatch.html.\n";
+ }
+ }
+}
+
+sub checkForImageMagick()
+{
+ print "Search for Imagemagick\n" if ($verbose);
+ if ($OSNAME eq "linux" ||
+ $OSNAME eq "solaris")
+ {
+ # search for imagemagick
+ local *IMAGEMAGICK;
+ if (open(IMAGEMAGICK, "which convert 2>&1 |"))
+ {
+ my $line;
+ while ($line = <IMAGEMAGICK>)
+ {
+ chomp($line);
+ print "- $line\n" if ($verbose);
+ }
+ close(IMAGEMAGICK);
+ }
+ my $error = errorAdaption($?);
+ handleError($error, "Imagemagick");
+ }
+ elsif ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
+ {
+ my $sImageMagickExe = "convert.exe";
+ # my $sImageMagickPath = "C:/gs/gs8.64/bin";
+ my $sImageMagickPath = getFastPath("imagemagick.path");
+ if (! $sImageMagickPath)
+ {
+ $sImageMagickPath = searchForFileInPath($sImageMagickExe, $ENV{PATH});
+ if ($sImageMagickPath)
+ {
+ if ( ! -e "$sImageMagickPath/$sImageMagickExe")
+ {
+ $nGlobalErrors ++;
+ print "ERROR: search for $sImageMagickPath/$sImageMagickExe failed.\n";
+ print "Please install ImageMagick from www.imagemagick.org to and make it available in \$PATH variable \n";
+ }
+ else
+ {
+ insertPath("imagemagick.path", $sImageMagickPath);
+ # insertPath("gs.exe", $sImageMagickExe);
+ }
+ }
+ else
+ {
+ # next try, search image magick in $PROGRAMFILES
+ my $sPrograms = unixpath($ENV{PROGRAMFILES});
+
+ if (! $sPrograms)
+ {
+ print "There exist no \$PROGRAMFILES path, wrong Windows version?\n";
+ $nGlobalErrors++;
+ }
+ else
+ {
+ local *DIR;
+ if (opendir (DIR, $sPrograms)) # open program directory
+ {
+ my $myfile;
+ while ($myfile = readdir(DIR)) # get a filename
+ {
+ if ($myfile =~ /ImageMagick/)
+ {
+ $sImageMagickPath = $sPrograms . "/" . $myfile;
+ last;
+ }
+ }
+ closedir(DIR);
+ }
+ if (! -e $sImageMagickPath)
+ {
+ print "ImageMagick not found.\n";
+ $nGlobalErrors ++;
+ }
+ else
+ {
+ insertPath("imagemagick.path", $sImageMagickPath);
+ }
+ }
+ }
+
+ }
+ if ( -e "$sImageMagickPath/$sImageMagickExe" )
+ {
+ print "Found ImageMagick: '$sImageMagickPath'\n" if ($verbose);
+ }
+ }
+ else
+ {
+ print "ERROR: not supported environment\n";
+ }
+}
+
+sub checkForJava6()
+{
+ print "Search for Java6\n" if ($verbose);
+ my $javaexe = "java";
+ if ( $ENV{JAVA6} )
+ {
+ $javaexe = $ENV{JAVA6};
+ }
+
+ if ($OSNAME eq "linux" || $OSNAME eq "cygwin")
+ {
+ # search for imagemagick
+ local *JAVA;
+ if (open(JAVA, "$javaexe -version 2>&1 |"))
+ {
+ my $line;
+ while ($line = <JAVA>)
+ {
+ chomp($line);
+ print "- $line\n" if ($verbose);
+ if ( $line =~ /java version "(.*)"/ )
+ {
+ my $javaversion = $1;
+ my @version = split('\.', $javaversion);
+ print "Found Java version: $version[1] the complete version: $javaversion\n" if ($verbose);
+ if ( $version[1] < 6)
+ {
+ print "Wrong Java version, at least Java version 6 is need but found $javaversion.\n";
+ $nGlobalErrors++;
+ print "It is possible to overwrite the java exe with environment variable JAVA6='path'.\n";
+ }
+ else
+ {
+ insertPath("java.exe", $javaexe);
+ }
+ last;
+ }
+ }
+ close(JAVA);
+ }
+ my $error = errorAdaption($?);
+ handleError($error, "Java");
+ }
+ elsif ($OSNAME eq "MSWin32")
+ {
+ my $javaexe = "java";
+ if ( $ENV{JAVA6} )
+ {
+ $javaexe = $ENV{JAVA6};
+ }
+
+ if (! -e $javaexe)
+ {
+ print "Java not found.\n";
+ $nGlobalErrors ++;
+ }
+ else
+ {
+ print "Found Java: '$javaexe'\n" if ($verbose);
+ insertPath("java.exe", $javaexe);
+ }
+ }
+ else
+ {
+ print "ERROR: Java not found.\n";
+ }
+}
+
+# different checks
+print "Environment '$OSNAME'\n" if ($verbose);
+
+if ($printerdriver)
+{
+ checkForPSDriver();
+}
+if ($ghostscript)
+{
+ checkForGhostscript();
+}
+if ($imagemagick)
+{
+ checkForImageMagick();
+}
+if ($java6)
+{
+ checkForJava6();
+}
+
+# return with found errors
+exit($nGlobalErrors);
+
+# ------------------------------------------------------------------------------
+sub print_usage(*)
+{
+ local *HANDLE = $_[0];
+ my $tool_name = basename($0);
+
+ print(HANDLE <<END_OF_USAGE);
+
+Usage: $tool_name [OPTIONS]
+
+ -ghostscript Try to find ghostscript in your environment
+ -imagemagick Try to find imagemagick
+ -java6 Checks for java 1.6.x
+ -printerdriver Try to find printer driver, windows only
+ -verbose be verbose
+
+ -h, --help Print this help, then exit
+ -v, --version Print version number, then exit
+
+END_OF_USAGE
+;
+}
diff --git a/testgraphical/prj/build.lst b/testgraphical/prj/build.lst
new file mode 100755
index 000000000000..75878a6d9dd8
--- /dev/null
+++ b/testgraphical/prj/build.lst
@@ -0,0 +1,7 @@
+gfxcmp testgraphical : instsetoo_native qadevOOo NULL
+gfxcmp testgraphical usr1 - all gfxcmp_mkout NULL
+#gfxcmp testgraphical\prechecks nmake - all gfxcmp_pre NULL
+gfxcmp testgraphical\ui\java\ConvwatchGUIProject nmake - all gfxcmp_java_ui NULL
+gfxcmp testgraphical\ui\java nmake - all gfxcmp_java gfxcmp_java_ui NULL
+# gfxcmp testgraphical\source nmake - all gfxcmp_src gfxcmp_java NULL
+#i112751 gfxcmp testgraphical\qa\graphical nmake - all gfxcmp_qa gfxcmp_java NULL
diff --git a/testgraphical/prj/d.lst b/testgraphical/prj/d.lst
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/testgraphical/prj/d.lst
diff --git a/testgraphical/qa/graphical/Test.java b/testgraphical/qa/graphical/Test.java
new file mode 100644
index 000000000000..8c633dede44c
--- /dev/null
+++ b/testgraphical/qa/graphical/Test.java
@@ -0,0 +1,113 @@
+/*************************************************************************
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2000, 2010 Oracle and/or its affiliates.
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* This file is part of OpenOffice.org.
+*
+* OpenOffice.org is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License version 3
+* only, as published by the Free Software Foundation.
+*
+* OpenOffice.org is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License version 3 for more details
+* (a copy is included in the LICENSE file that accompanied this code).
+*
+* You should have received a copy of the GNU Lesser General Public License
+* version 3 along with OpenOffice.org. If not, see
+* <http://www.openoffice.org/license.html>
+* for a copy of the LGPLv3 License.
+************************************************************************/
+
+package org.openoffice.testgraphical.qa.graphical;
+
+import org.openoffice.Runner;
+import org.openoffice.test.OfficeConnection;
+import static org.junit.Assert.*;
+
+import helper.ProcessHandler;
+import graphical.FileHelper;
+import java.io.File;
+
+public final class Test {
+ @org.junit.Before
+ public void setUp() throws Exception
+ {
+ connection.setUp();
+ }
+
+ @org.junit.After
+ public void tearDown() throws Exception
+ {
+ connection.tearDown();
+ }
+
+ @org.junit.Test
+ public void test()
+ {
+ boolean good = true;
+
+ final String sPerlEXE = System.getenv("PERL");
+ // System.out.println("PERL:=" + sPerlEXE);
+
+ final String sPRJ = System.getenv("PRJ");
+ // System.out.println("PRJ:=" + sPRJ);
+
+ String sShow = "";
+ if (System.getProperty("SHOW") != null)
+ {
+ sShow = "-show";
+ }
+
+ final String sComparePath = FileHelper.appendPath(sPRJ, "source");
+ final String sCompareName = FileHelper.appendPath(sComparePath, "compare.pl");
+
+ File aCompareFile = new File(sCompareName);
+ if (!aCompareFile.exists())
+ {
+ System.out.println("Path to compare.pl is wrong: '" + aCompareFile.getAbsolutePath() + "'");
+ assertTrue(false);
+ }
+
+ final String sConnectionString = connection.getDescription();
+
+ String[] sCommandArray =
+ {
+ sPerlEXE,
+ aCompareFile.getAbsolutePath(),
+ "-creatortype", "pdf",
+
+// If you make changes here, do it also in ../../source/makefile.mk in selftest: target!
+
+ "-pool", "singletest",
+ "-document", "eis-test.odt",
+ // "-pool", "demo",
+ // "-document", "CurrentTime.ods",
+ "-connectionstring", sConnectionString,
+ // "-verbose",
+ sShow
+ };
+
+ ProcessHandler aHandler = new ProcessHandler(sCommandArray);
+ boolean bBackValue = aHandler.executeSynchronously();
+ int nExitCode = aHandler.getExitCode();
+
+ // String sBack = aHandler.getOutputText();
+ if (nExitCode != 0)
+ {
+ good = false;
+ }
+
+ assertTrue(good);
+
+ // Runner.run(
+ // "-sce", "sw.sce", "-xcl", "knownissues.xcl", "-tdoc",
+ // "testdocuments", "-cs", connection.getDescription()));
+ }
+
+ private final OfficeConnection connection = new OfficeConnection();
+}
diff --git a/testgraphical/qa/graphical/makefile.mk b/testgraphical/qa/graphical/makefile.mk
new file mode 100644
index 000000000000..7cb43a6585db
--- /dev/null
+++ b/testgraphical/qa/graphical/makefile.mk
@@ -0,0 +1,57 @@
+#*************************************************************************
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#***********************************************************************/
+
+.IF "$(OOO_SUBSEQUENT_TESTS)" == ""
+nothing .PHONY:
+ @echo "OOO_SUBSEQUENT_TESTS not given, do nothing."
+.ELSE
+
+PRJ = ../..
+PRJNAME = testgraphical
+TARGET = qa_graphical
+
+.IF "$(OOO_JUNIT_JAR)" != ""
+
+.IF "$(SHOW)" != ""
+# You will need java6 for this!
+JAVAIFLAGS:=$(JAVAIFLAGS) -DSHOW=1
+.ENDIF
+
+PACKAGE = org/openoffice/testgraphical/qa/graphical
+JAVATESTFILES = Test.java
+JAVAFILES = $(JAVATESTFILES)
+JARFILES = OOoRunner.jar test.jar
+EXTRAJARFILES = $(OOO_JUNIT_JAR)
+.END
+
+.INCLUDE: settings.mk
+.INCLUDE: target.mk
+.INCLUDE: installationtest.mk
+
+ALLTAR : javatest
+
+.END
+
+clean:
diff --git a/testgraphical/references/unxlngi/demo/CurrentTime.ods.pdf b/testgraphical/references/unxlngi/demo/CurrentTime.ods.pdf
new file mode 100644
index 000000000000..a753c03708c7
--- /dev/null
+++ b/testgraphical/references/unxlngi/demo/CurrentTime.ods.pdf
Binary files differ
diff --git a/testgraphical/references/unxlngi/demo/CurrentTime.ods.ps b/testgraphical/references/unxlngi/demo/CurrentTime.ods.ps
new file mode 100644
index 000000000000..aa7455255e2c
--- /dev/null
+++ b/testgraphical/references/unxlngi/demo/CurrentTime.ods.ps
@@ -0,0 +1,576 @@
+%!PS-Adobe-3.0
+%%BoundingBox: (atend)
+%%Creator: (Oracle Open Office 3.2)
+%%For: (ll93751)
+%%CreationDate: (Fri May 12 00:00:14 2000)
+%%Title: (CurrentTime)
+%%LanguageLevel: 2
+%%DocumentData: Clean7Bit
+%%Pages: (atend)
+%%Orientation: (atend)
+%%PageOrder: Ascend
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset PSPrint-Prolog 1.0 0
+/ISO1252Encoding [
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /A /B /C /D /E /F /G
+/H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W
+/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /a /b /c /d /e /f /g
+/h /i /j /k /l /m /n /o
+/p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /unused
+/Euro /unused /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl
+/circumflex /perthousand /Scaron /guilsinglleft /OE /unused /Zcaron /unused
+/unused /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash
+/tilde /trademark /scaron /guilsinglright /oe /unused /zcaron /Ydieresis
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron
+/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered
+/cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown
+/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
+/Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls
+/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def
+
+/psp_definefont { exch dup findfont dup length dict begin { 1 index /FID ne
+{ def } { pop pop } ifelse } forall /Encoding 3 -1 roll def
+currentdict end exch pop definefont pop } def
+
+/pathdict dup 8 dict def load begin
+/rcmd { { currentfile 1 string readstring pop 0 get dup 32 gt { exit }
+{ pop } ifelse } loop dup 126 eq { pop exit } if 65 sub dup 16#3 and 1
+add exch dup 16#C and -2 bitshift 16#3 and 1 add exch 16#10 and 16#10
+eq 3 1 roll exch } def
+/rhex { dup 1 sub exch currentfile exch string readhexstring pop dup 0
+get dup 16#80 and 16#80 eq dup 3 1 roll { 16#7f and } if 2 index 0 3
+-1 roll put 3 1 roll 0 0 1 5 -1 roll { 2 index exch get add 256 mul }
+for 256 div exch pop exch { neg } if } def
+/xcmd { rcmd exch rhex exch rhex exch 5 -1 roll add exch 4 -1 roll add
+1 index 1 index 5 -1 roll { moveto } { lineto } ifelse } def end
+/readpath { 0 0 pathdict begin { xcmd } loop end pop pop } def
+
+systemdict /languagelevel known not {
+/xshow { exch dup length 0 1 3 -1 roll 1 sub { dup 3 index exch get
+exch 2 index exch get 1 string dup 0 4 -1 roll put currentpoint 3 -1
+roll show moveto 0 rmoveto } for pop pop } def
+/rectangle { 4 -2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0
+rlineto closepath } def
+/rectfill { rectangle fill } def
+/rectstroke { rectangle stroke } def } if
+/bshow { currentlinewidth 3 1 roll currentpoint 3 index show moveto
+setlinewidth false charpath stroke setlinewidth } def
+/bxshow { currentlinewidth 4 1 roll setlinewidth exch dup length 1 sub
+0 1 3 -1 roll { 1 string 2 index 2 index get 1 index exch 0 exch put dup
+currentpoint 3 -1 roll show moveto currentpoint 3 -1 roll false charpath
+stroke moveto 2 index exch get 0 rmoveto } for pop pop setlinewidth } def
+
+/psp_lzwfilter { currentfile /ASCII85Decode filter /LZWDecode filter } def
+/psp_ascii85filter { currentfile /ASCII85Decode filter } def
+/psp_lzwstring { psp_lzwfilter 1024 string readstring } def
+/psp_ascii85string { psp_ascii85filter 1024 string readstring } def
+/psp_imagedict {
+/psp_bitspercomponent { 3 eq { 1 }{ 8 } ifelse } def
+/psp_decodearray { [ [0 1 0 1 0 1] [0 255] [0 1] [0 255] ] exch get }
+def 7 dict dup
+/ImageType 1 put dup
+/Width 7 -1 roll put dup
+/Height 5 index put dup
+/BitsPerComponent 4 index psp_bitspercomponent put dup
+/Decode 5 -1 roll psp_decodearray put dup
+/ImageMatrix [1 0 0 1 0 0] dup 5 8 -1 roll put put dup
+/DataSource 4 -1 roll 1 eq { psp_lzwfilter } { psp_ascii85filter } ifelse put
+} def
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%
+%%BeginResource: font ArialMTFID10HGSet1
+%!PS-AdobeFont-1.0-2.53740
+% Creator: SunTypeTools-TT 1.0 gelf
+% Original font name: ArialMT
+30 dict begin
+/PaintType 0 def
+/FontType 3 def
+/StrokeWidth 0 def
+/FontName (ArialMTFID10HGSet1) cvn def
+/XUID [103 0 0 16#44E1DF76 13 16#50429D91 16#0D1ECFCF] def
+/FontMatrix [.001 0 0 .001 0 0] def
+/FontBBox [-664 -324 2028 1037] def
+/Encoding 256 array def
+ 0 1 255 {Encoding exch /.notdef put} for
+ Encoding 0 /glyph0 put
+ Encoding 32 /glyph1 put
+ Encoding 48 /glyph2 put
+ Encoding 49 /glyph3 put
+ Encoding 51 /glyph4 put
+ Encoding 58 /glyph5 put
+ Encoding 80 /glyph6 put
+ Encoding 83 /glyph7 put
+ Encoding 97 /glyph8 put
+ Encoding 101 /glyph9 put
+ Encoding 103 /glyph10 put
+ Encoding 104 /glyph11 put
+ Encoding 116 /glyph12 put
+/CharProcs 14 dict def
+ CharProcs begin
+ /.notdef {} def
+ /glyph0 {
+ 750 0 125 0 625 625 setcachedevice
+ 125 0 moveto
+ 125 625 lineto
+ 625 625 lineto
+ 625 0 lineto
+ 125 0 lineto
+ closepath
+ 140 15 moveto
+ 609 15 lineto
+ 609 609 lineto
+ 140 609 lineto
+ 140 15 lineto
+ closepath
+ fill
+ } bind def
+ /glyph1 {
+ 277 0 0 0 0 0 setcachedevice
+ } bind def
+ /glyph2 {
+ 556 0 41 -12 508 718 setcachedevice
+ 41 353 moveto
+ 41 437 50 505 67 557 curveto
+ 84 608 110 648 145 676 curveto
+ 179 704 222 718 274 718 curveto
+ 313 718 347 711 375 695 curveto
+ 404 680 428 658 447 628 curveto
+ 466 600 481 564 492 522 curveto
+ 502 480 508 424 508 353 curveto
+ 508 269 500 201 482 149 curveto
+ 465 98 439 58 405 30 curveto
+ 371 2 327 -12 274 -12 curveto
+ 206 -12 151 12 112 62 curveto
+ 65 121 41 218 41 353 curveto
+ closepath
+ 131 353 moveto
+ 131 235 145 157 173 118 curveto
+ 200 80 234 60 274 60 curveto
+ 315 60 349 79 376 118 curveto
+ 404 157 417 235 417 353 curveto
+ 417 470 404 549 376 587 curveto
+ 349 626 315 645 273 645 curveto
+ 233 645 201 629 177 594 curveto
+ 147 551 131 470 131 353 curveto
+ closepath
+ fill
+ } bind def
+ /glyph3 {
+ 556 0 108 0 372 718 setcachedevice
+ 372 0 moveto
+ 284 0 lineto
+ 284 560 lineto
+ 263 540 236 520 201 499 curveto
+ 167 479 136 464 108 454 curveto
+ 108 539 lineto
+ 158 562 201 590 237 623 curveto
+ 274 655 300 687 315 718 curveto
+ 372 718 lineto
+ 372 0 lineto
+ closepath
+ fill
+ } bind def
+ /glyph4 {
+ 556 0 41 -12 510 718 setcachedevice
+ 41 188 moveto
+ 129 200 lineto
+ 140 151 157 115 181 93 curveto
+ 205 71 235 60 270 60 curveto
+ 311 60 346 74 375 103 curveto
+ 403 131 417 166 417 209 curveto
+ 417 250 404 283 377 309 curveto
+ 352 335 318 348 277 348 curveto
+ 261 348 240 345 215 338 curveto
+ 225 416 lineto
+ 230 415 235 415 239 415 curveto
+ 276 415 310 424 340 444 curveto
+ 370 463 385 494 385 534 curveto
+ 385 566 374 593 352 614 curveto
+ 331 635 302 646 268 646 curveto
+ 234 646 205 636 182 614 curveto
+ 160 593 145 561 138 517 curveto
+ 50 533 lineto
+ 61 592 85 637 124 670 curveto
+ 162 702 209 718 266 718 curveto
+ 305 718 341 710 374 693 curveto
+ 406 677 432 654 449 625 curveto
+ 466 596 475 565 475 532 curveto
+ 475 501 467 474 450 448 curveto
+ 434 423 409 402 376 387 curveto
+ 419 378 452 357 475 327 curveto
+ 499 296 510 257 510 211 curveto
+ 510 149 488 96 442 52 curveto
+ 396 9 339 -12 269 -12 curveto
+ 207 -12 154 5 113 43 curveto
+ 71 81 48 129 41 188 curveto
+ closepath
+ fill
+ } bind def
+ /glyph5 {
+ 277 0 90 0 190 518 setcachedevice
+ 90 418 moveto
+ 90 518 lineto
+ 190 518 lineto
+ 190 418 lineto
+ 90 418 lineto
+ closepath
+ 90 0 moveto
+ 90 100 lineto
+ 190 100 lineto
+ 190 0 lineto
+ 90 0 lineto
+ closepath
+ fill
+ } bind def
+ /glyph6 {
+ 666 0 77 0 623 715 setcachedevice
+ 77 0 moveto
+ 77 715 lineto
+ 347 715 lineto
+ 394 715 431 713 456 708 curveto
+ 491 703 520 692 544 675 curveto
+ 568 659 587 636 602 606 curveto
+ 616 577 623 544 623 508 curveto
+ 623 448 604 396 565 354 curveto
+ 526 312 457 291 355 291 curveto
+ 171 291 lineto
+ 171 0 lineto
+ 77 0 lineto
+ closepath
+ 171 375 moveto
+ 356 375 lineto
+ 417 375 461 386 487 409 curveto
+ 513 432 525 464 525 505 curveto
+ 525 535 518 561 503 583 curveto
+ 488 604 468 618 443 625 curveto
+ 427 629 398 631 354 631 curveto
+ 171 631 lineto
+ 171 375 lineto
+ closepath
+ fill
+ } bind def
+ /glyph7 {
+ 666 0 44 -12 614 728 setcachedevice
+ 44 229 moveto
+ 134 237 lineto
+ 138 202 148 172 164 149 curveto
+ 179 126 203 108 235 94 curveto
+ 268 80 305 72 345 72 curveto
+ 381 72 413 78 441 88 curveto
+ 469 99 489 114 503 133 curveto
+ 516 151 523 172 523 194 curveto
+ 523 216 517 236 503 253 curveto
+ 491 270 469 284 439 295 curveto
+ 420 302 377 314 312 330 curveto
+ 246 346 200 360 173 375 curveto
+ 140 393 114 415 97 441 curveto
+ 81 468 72 498 72 530 curveto
+ 72 566 82 600 103 632 curveto
+ 123 663 153 687 192 703 curveto
+ 232 719 275 728 324 728 curveto
+ 377 728 424 719 464 702 curveto
+ 505 685 536 660 558 626 curveto
+ 580 594 591 556 593 514 curveto
+ 502 507 lineto
+ 498 552 481 586 453 609 curveto
+ 425 632 383 644 328 644 curveto
+ 270 644 229 634 203 613 curveto
+ 177 592 163 566 163 537 curveto
+ 163 511 172 490 191 473 curveto
+ 209 457 257 440 334 422 curveto
+ 411 405 463 390 492 376 curveto
+ 534 357 564 333 584 304 curveto
+ 604 274 614 240 614 202 curveto
+ 614 164 604 128 582 94 curveto
+ 560 61 529 35 488 16 curveto
+ 447 -2 401 -12 350 -12 curveto
+ 285 -12 231 -2 187 16 curveto
+ 144 35 109 63 84 101 curveto
+ 59 139 46 182 44 229 curveto
+ closepath
+ fill
+ } bind def
+ /glyph8 {
+ 556 0 36 -11 513 530 setcachedevice
+ 404 63 moveto
+ 372 36 340 17 310 5 curveto
+ 280 -5 248 -11 213 -11 curveto
+ 156 -11 112 2 82 30 curveto
+ 51 58 36 93 36 136 curveto
+ 36 162 41 185 53 206 curveto
+ 64 227 80 244 99 256 curveto
+ 117 269 138 279 162 285 curveto
+ 179 290 205 294 240 298 curveto
+ 311 307 363 317 396 329 curveto
+ 397 341 397 348 397 352 curveto
+ 397 387 389 413 372 427 curveto
+ 350 447 316 457 272 457 curveto
+ 231 457 201 450 181 436 curveto
+ 161 421 146 395 137 358 curveto
+ 51 370 lineto
+ 59 407 71 437 89 459 curveto
+ 107 482 133 500 167 512 curveto
+ 201 524 240 530 285 530 curveto
+ 329 530 365 525 393 514 curveto
+ 420 504 440 491 454 475 curveto
+ 467 459 476 439 481 415 curveto
+ 484 400 485 374 485 334 curveto
+ 485 217 lineto
+ 485 135 487 84 491 62 curveto
+ 495 41 502 20 513 0 curveto
+ 421 0 lineto
+ 413 18 407 39 404 63 curveto
+ closepath
+ 396 260 moveto
+ 365 247 317 236 253 227 curveto
+ 217 222 191 216 176 209 curveto
+ 162 203 150 193 142 181 curveto
+ 134 168 129 154 129 139 curveto
+ 129 116 138 96 156 80 curveto
+ 174 65 200 57 234 57 curveto
+ 268 57 298 64 324 79 curveto
+ 351 94 370 114 382 140 curveto
+ 392 160 396 189 396 228 curveto
+ 396 260 lineto
+ closepath
+ fill
+ } bind def
+ /glyph9 {
+ 556 0 36 -11 514 530 setcachedevice
+ 420 166 moveto
+ 511 155 lineto
+ 497 103 471 62 432 32 curveto
+ 393 3 344 -11 283 -11 curveto
+ 208 -11 147 11 103 58 curveto
+ 59 104 36 170 36 254 curveto
+ 36 342 59 409 104 458 curveto
+ 148 506 207 530 278 530 curveto
+ 348 530 404 506 448 459 curveto
+ 492 412 514 346 514 260 curveto
+ 514 255 514 247 514 236 curveto
+ 127 236 lineto
+ 130 180 146 136 175 105 curveto
+ 204 76 240 60 284 60 curveto
+ 316 60 343 68 366 85 curveto
+ 389 103 407 129 420 166 curveto
+ closepath
+ 132 309 moveto
+ 421 309 lineto
+ 418 352 407 385 388 407 curveto
+ 360 440 324 458 279 458 curveto
+ 239 458 206 444 178 417 curveto
+ 150 390 135 354 132 309 curveto
+ closepath
+ fill
+ } bind def
+ /glyph10 {
+ 556 0 32 -210 489 530 setcachedevice
+ 49 -42 moveto
+ 135 -55 lineto
+ 138 -81 148 -101 165 -113 curveto
+ 187 -129 216 -137 254 -137 curveto
+ 294 -137 326 -129 348 -112 curveto
+ 370 -96 385 -74 393 -44 curveto
+ 397 -26 400 10 399 67 curveto
+ 361 22 313 0 256 0 curveto
+ 185 0 130 25 90 77 curveto
+ 52 128 32 190 32 262 curveto
+ 32 311 41 357 59 399 curveto
+ 77 440 103 473 137 496 curveto
+ 170 519 210 530 256 530 curveto
+ 317 530 368 505 408 456 curveto
+ 408 518 lineto
+ 489 518 lineto
+ 489 70 lineto
+ 489 -10 481 -67 464 -101 curveto
+ 448 -134 422 -161 386 -180 curveto
+ 351 -200 307 -210 254 -210 curveto
+ 193 -210 143 -196 104 -168 curveto
+ 67 -140 48 -99 49 -42 curveto
+ closepath
+ 122 268 moveto
+ 122 200 136 151 163 119 curveto
+ 189 88 224 72 264 72 curveto
+ 305 72 338 88 366 119 curveto
+ 393 150 407 199 407 265 curveto
+ 407 329 393 376 365 409 curveto
+ 337 441 303 457 263 457 curveto
+ 224 457 191 441 163 410 curveto
+ 136 378 122 331 122 268 curveto
+ closepath
+ fill
+ } bind def
+ /glyph11 {
+ 556 0 65 0 488 715 setcachedevice
+ 65 0 moveto
+ 65 715 lineto
+ 153 715 lineto
+ 153 458 lineto
+ 194 506 246 530 309 530 curveto
+ 347 530 380 522 409 507 curveto
+ 437 492 458 471 470 444 curveto
+ 482 418 488 379 488 328 curveto
+ 488 0 lineto
+ 400 0 lineto
+ 400 328 lineto
+ 400 372 391 404 372 424 curveto
+ 353 444 326 454 291 454 curveto
+ 265 454 240 448 217 434 curveto
+ 194 421 178 402 168 379 curveto
+ 159 356 153 324 153 283 curveto
+ 153 0 lineto
+ 65 0 lineto
+ closepath
+ fill
+ } bind def
+ /glyph12 {
+ 277 0 17 -6 270 699 setcachedevice
+ 257 78 moveto
+ 270 0 lineto
+ 246 -3 224 -6 204 -6 curveto
+ 172 -6 147 -1 129 8 curveto
+ 112 18 100 31 92 48 curveto
+ 85 64 82 99 82 151 curveto
+ 82 450 lineto
+ 17 450 lineto
+ 17 518 lineto
+ 82 518 lineto
+ 82 646 lineto
+ 169 699 lineto
+ 169 518 lineto
+ 257 518 lineto
+ 257 450 lineto
+ 169 450 lineto
+ 169 146 lineto
+ 169 122 170 105 174 98 curveto
+ 177 91 182 85 189 81 curveto
+ 196 77 206 75 219 75 curveto
+ 229 75 241 76 257 78 curveto
+ closepath
+ fill
+ } bind def
+ end
+/BuildGlyph {
+ exch /CharProcs get exch
+ 2 copy known not
+ {pop /.notdef} if
+ get exec
+} bind def
+/BuildChar {
+ 1 index /Encoding get exch get
+ 1 index /BuildGlyph get exec
+} bind def
+currentdict end
+(ArialMTFID10HGSet1) cvn exch definefont pop
+%%EndResource
+%%DocumentSuppliedResources: font ArialMTFID10HGSet1
+[{
+%%BeginFeature: *PageSize A4
+<</PageSize [595 842] /ImagingBBox null>> setpagedevice
+%%EndFeature
+} stopped cleartomark
+%%EndSetup
+%%Page: 1 1
+%%PageOrientation: Portrait
+%%PageBoundingBox: 18 18 577 824
+%%BeginPageSetup
+%
+%%EndPageSetup
+gsave
+[0.24 0 0 -0.24 18 824] concat
+gsave
+grestore
+gsave
+readpath
+V00EC00ECA003CE07D900A00BC~
+closepath clip newpath
+grestore
+gsave
+readpath
+V00EC00ECA003CE07D900A00BC~
+closepath clip newpath
+1174 280 moveto
+0 0 0 setrgbcolor
+(ArialMTFID10HGSet1) cvn findfont 42 -42 matrix scale makefont setfont
+<536865657431>
+[28 23 23 23 12 0]
+xshow
+grestore
+gsave
+readpath
+V00EC00ECA003CE07D900A00BC~
+closepath clip newpath
+grestore
+gsave
+readpath
+V00EC0C8CA003CE07D900A00BC~
+closepath clip newpath
+grestore
+gsave
+readpath
+V00EC0C8CA003CE07D900A00BC~
+closepath clip newpath
+1174 3256 moveto
+0 0 0 setrgbcolor
+(ArialMTFID10HGSet1) cvn findfont 42 -42 matrix scale makefont setfont
+<5061676520>
+[28 23 23 23 0]
+xshow
+1283 3256 moveto
+<31>
+show
+grestore
+gsave
+readpath
+V00EC0C8CA003CE07D900A00BC~
+closepath clip newpath
+grestore
+gsave
+568 782 moveto
+0 0 0 setrgbcolor
+(ArialMTFID10HGSet1) cvn findfont 367 -367 matrix scale makefont setfont
+<30>
+show
+781 782 moveto
+<3A>
+show
+1050 782 moveto
+<3030>
+[204 0]
+xshow
+1466 782 moveto
+<3A>
+show
+1735 782 moveto
+<3133>
+[204 0]
+xshow
+grestore grestore
+showpage
+%%PageTrailer
+
+%%Trailer
+%%BoundingBox: 0 0 595 842
+%%Orientation: Portrait
+%%Pages: 1
+%%EOF
diff --git a/testgraphical/references/unxlngi/singletest/eis-test.odt.pdf b/testgraphical/references/unxlngi/singletest/eis-test.odt.pdf
new file mode 100644
index 000000000000..cf48e3d3df14
--- /dev/null
+++ b/testgraphical/references/unxlngi/singletest/eis-test.odt.pdf
Binary files differ
diff --git a/testgraphical/references/unxlngi/singletest/eis-test.odt.ps b/testgraphical/references/unxlngi/singletest/eis-test.odt.ps
new file mode 100644
index 000000000000..456905de90b2
--- /dev/null
+++ b/testgraphical/references/unxlngi/singletest/eis-test.odt.ps
@@ -0,0 +1,565 @@
+%!PS-Adobe-3.0
+%%BoundingBox: (atend)
+%%Creator: (StarOffice 9)
+%%For: (ll93751)
+%%CreationDate: (Fri Mar 5 11:50:06 2010)
+%%Title: (eis-test)
+%%LanguageLevel: 2
+%%DocumentData: Clean7Bit
+%%Pages: (atend)
+%%Orientation: (atend)
+%%PageOrder: Ascend
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset PSPrint-Prolog 1.0 0
+/ISO1252Encoding [
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /A /B /C /D /E /F /G
+/H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W
+/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /a /b /c /d /e /f /g
+/h /i /j /k /l /m /n /o
+/p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /unused
+/Euro /unused /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl
+/circumflex /perthousand /Scaron /guilsinglleft /OE /unused /Zcaron /unused
+/unused /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash
+/tilde /trademark /scaron /guilsinglright /oe /unused /zcaron /Ydieresis
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron
+/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered
+/cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown
+/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
+/Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls
+/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def
+
+/psp_definefont { exch dup findfont dup length dict begin { 1 index /FID ne
+{ def } { pop pop } ifelse } forall /Encoding 3 -1 roll def
+currentdict end exch pop definefont pop } def
+
+/pathdict dup 8 dict def load begin
+/rcmd { { currentfile 1 string readstring pop 0 get dup 32 gt { exit }
+{ pop } ifelse } loop dup 126 eq { pop exit } if 65 sub dup 16#3 and 1
+add exch dup 16#C and -2 bitshift 16#3 and 1 add exch 16#10 and 16#10
+eq 3 1 roll exch } def
+/rhex { dup 1 sub exch currentfile exch string readhexstring pop dup 0
+get dup 16#80 and 16#80 eq dup 3 1 roll { 16#7f and } if 2 index 0 3
+-1 roll put 3 1 roll 0 0 1 5 -1 roll { 2 index exch get add 256 mul }
+for 256 div exch pop exch { neg } if } def
+/xcmd { rcmd exch rhex exch rhex exch 5 -1 roll add exch 4 -1 roll add
+1 index 1 index 5 -1 roll { moveto } { lineto } ifelse } def end
+/readpath { 0 0 pathdict begin { xcmd } loop end pop pop } def
+
+systemdict /languagelevel known not {
+/xshow { exch dup length 0 1 3 -1 roll 1 sub { dup 3 index exch get
+exch 2 index exch get 1 string dup 0 4 -1 roll put currentpoint 3 -1
+roll show moveto 0 rmoveto } for pop pop } def
+/rectangle { 4 -2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0
+rlineto closepath } def
+/rectfill { rectangle fill } def
+/rectstroke { rectangle stroke } def } if
+/bshow { currentlinewidth 3 1 roll currentpoint 3 index show moveto
+setlinewidth false charpath stroke setlinewidth } def
+/bxshow { currentlinewidth 4 1 roll setlinewidth exch dup length 1 sub
+0 1 3 -1 roll { 1 string 2 index 2 index get 1 index exch 0 exch put dup
+currentpoint 3 -1 roll show moveto currentpoint 3 -1 roll false charpath
+stroke moveto 2 index exch get 0 rmoveto } for pop pop setlinewidth } def
+
+/psp_lzwfilter { currentfile /ASCII85Decode filter /LZWDecode filter } def
+/psp_ascii85filter { currentfile /ASCII85Decode filter } def
+/psp_lzwstring { psp_lzwfilter 1024 string readstring } def
+/psp_ascii85string { psp_ascii85filter 1024 string readstring } def
+/psp_imagedict {
+/psp_bitspercomponent { 3 eq { 1 }{ 8 } ifelse } def
+/psp_decodearray { [ [0 1 0 1 0 1] [0 255] [0 1] [0 255] ] exch get }
+def 7 dict dup
+/ImageType 1 put dup
+/Width 7 -1 roll put dup
+/Height 5 index put dup
+/BitsPerComponent 4 index psp_bitspercomponent put dup
+/Decode 5 -1 roll psp_decodearray put dup
+/ImageMatrix [1 0 0 1 0 0] dup 5 8 -1 roll put put dup
+/DataSource 4 -1 roll 1 eq { psp_lzwfilter } { psp_ascii85filter } ifelse put
+} def
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%
+%%BeginResource: font TimesNewRomanPSMTFID26HGSet1
+%!PS-AdobeFont-1.0-2.53740
+% Creator: SunTypeTools-TT 1.0 gelf
+% Original font name: TimesNewRomanPSMT
+30 dict begin
+/PaintType 0 def
+/FontType 3 def
+/StrokeWidth 0 def
+/FontName (TimesNewRomanPSMTFID26HGSet1) cvn def
+/XUID [103 0 0 16#2F10B8E9 9 16#7048BAB3 16#9CA4D966] def
+/FontMatrix [.001 0 0 .001 0 0] def
+/FontBBox [-568 -306 2028 1006] def
+/Encoding 256 array def
+ 0 1 255 {Encoding exch /.notdef put} for
+ Encoding 0 /glyph0 put
+ Encoding 45 /glyph1 put
+ Encoding 69 /glyph2 put
+ Encoding 73 /glyph3 put
+ Encoding 83 /glyph4 put
+ Encoding 84 /glyph5 put
+ Encoding 101 /glyph6 put
+ Encoding 115 /glyph7 put
+ Encoding 116 /glyph8 put
+/CharProcs 10 dict def
+ CharProcs begin
+ /.notdef {} def
+ /glyph0 {
+ 777 0 125 0 625 625 setcachedevice
+ 125 0 moveto
+ 125 625 lineto
+ 625 625 lineto
+ 625 0 lineto
+ 125 0 lineto
+ closepath
+ 140 15 moveto
+ 609 15 lineto
+ 609 609 lineto
+ 140 609 lineto
+ 140 15 lineto
+ closepath
+ fill
+ } bind def
+ /glyph1 {
+ 333 0 40 187 292 261 setcachedevice
+ 40 261 moveto
+ 292 261 lineto
+ 292 187 lineto
+ 40 187 lineto
+ 40 261 lineto
+ closepath
+ fill
+ } bind def
+ /glyph2 {
+ 610 0 20 0 587 662 setcachedevice
+ 208 625 moveto
+ 208 364 lineto
+ 354 364 lineto
+ 392 364 417 370 430 381 curveto
+ 447 396 456 422 458 460 curveto
+ 476 460 lineto
+ 476 229 lineto
+ 458 229 lineto
+ 454 262 449 282 444 291 curveto
+ 439 303 429 312 416 318 curveto
+ 402 325 382 328 354 328 curveto
+ 208 328 lineto
+ 208 110 lineto
+ 208 81 210 63 212 57 curveto
+ 215 50 220 45 226 41 curveto
+ 232 38 245 36 263 36 curveto
+ 375 36 lineto
+ 413 36 440 38 457 43 curveto
+ 474 49 490 59 506 74 curveto
+ 526 94 547 125 568 166 curveto
+ 587 166 lineto
+ 530 0 lineto
+ 20 0 lineto
+ 20 18 lineto
+ 43 18 lineto
+ 59 18 74 21 88 29 curveto
+ 98 34 105 42 109 52 curveto
+ 113 62 115 84 115 116 curveto
+ 115 546 lineto
+ 115 588 111 614 102 624 curveto
+ 91 637 71 644 43 644 curveto
+ 20 644 lineto
+ 20 662 lineto
+ 530 662 lineto
+ 538 517 lineto
+ 519 517 lineto
+ 512 551 504 575 496 588 curveto
+ 488 602 476 611 459 618 curveto
+ 446 623 423 625 390 625 curveto
+ 208 625 lineto
+ closepath
+ fill
+ } bind def
+ /glyph3 {
+ 333 0 24 0 308 662 setcachedevice
+ 308 18 moveto
+ 308 0 lineto
+ 24 0 lineto
+ 24 18 lineto
+ 48 18 lineto
+ 75 18 95 25 107 41 curveto
+ 115 52 119 77 119 117 curveto
+ 119 544 lineto
+ 119 578 117 600 113 611 curveto
+ 110 619 103 626 93 632 curveto
+ 79 640 64 644 48 644 curveto
+ 24 644 lineto
+ 24 662 lineto
+ 308 662 lineto
+ 308 644 lineto
+ 284 644 lineto
+ 257 644 238 636 225 620 curveto
+ 217 609 213 584 213 544 curveto
+ 213 117 lineto
+ 213 83 215 62 219 50 curveto
+ 223 42 229 36 240 29 curveto
+ 254 22 269 18 284 18 curveto
+ 308 18 lineto
+ closepath
+ fill
+ } bind def
+ /glyph4 {
+ 556 0 62 -15 502 677 setcachedevice
+ 458 677 moveto
+ 458 448 lineto
+ 440 448 lineto
+ 435 492 424 527 409 553 curveto
+ 394 579 372 600 344 615 curveto
+ 316 630 287 638 257 638 curveto
+ 223 638 195 628 173 607 curveto
+ 151 586 140 563 140 536 curveto
+ 140 516 146 498 161 481 curveto
+ 181 457 229 424 305 383 curveto
+ 367 351 409 325 432 307 curveto
+ 454 290 472 269 484 244 curveto
+ 496 220 502 195 502 168 curveto
+ 502 119 483 76 444 39 curveto
+ 405 3 355 -15 293 -15 curveto
+ 274 -15 256 -13 239 -10 curveto
+ 229 -9 208 -2 177 7 curveto
+ 145 17 125 22 116 22 curveto
+ 108 22 102 20 97 15 curveto
+ 93 10 89 0 86 -15 curveto
+ 68 -15 lineto
+ 68 211 lineto
+ 86 211 lineto
+ 95 164 106 129 121 105 curveto
+ 135 82 157 62 187 46 curveto
+ 216 31 248 22 283 22 curveto
+ 324 22 356 33 380 55 curveto
+ 403 76 415 102 415 131 curveto
+ 415 147 411 164 402 180 curveto
+ 393 197 379 212 360 227 curveto
+ 348 236 313 257 256 289 curveto
+ 200 321 159 346 135 365 curveto
+ 111 384 93 404 81 427 curveto
+ 68 450 62 475 62 502 curveto
+ 62 550 80 591 117 625 curveto
+ 153 660 200 677 256 677 curveto
+ 291 677 328 668 368 651 curveto
+ 386 643 399 639 406 639 curveto
+ 415 639 422 641 427 646 curveto
+ 433 651 437 662 440 677 curveto
+ 458 677 lineto
+ closepath
+ fill
+ } bind def
+ /glyph5 {
+ 610 0 30 0 585 662 setcachedevice
+ 578 662 moveto
+ 585 506 lineto
+ 567 506 lineto
+ 563 534 559 553 552 565 curveto
+ 542 584 529 598 512 607 curveto
+ 496 616 474 620 446 620 curveto
+ 353 620 lineto
+ 353 114 lineto
+ 353 74 357 48 366 38 curveto
+ 378 25 397 18 423 18 curveto
+ 446 18 lineto
+ 446 0 lineto
+ 165 0 lineto
+ 165 18 lineto
+ 188 18 lineto
+ 216 18 236 26 248 43 curveto
+ 255 53 259 77 259 114 curveto
+ 259 620 lineto
+ 179 620 lineto
+ 148 620 126 618 113 613 curveto
+ 97 607 82 596 70 578 curveto
+ 58 561 51 537 48 506 curveto
+ 30 506 lineto
+ 38 662 lineto
+ 578 662 lineto
+ closepath
+ fill
+ } bind def
+ /glyph6 {
+ 443 0 37 -13 415 460 setcachedevice
+ 106 278 moveto
+ 106 212 122 160 154 122 curveto
+ 187 84 225 65 269 65 curveto
+ 298 65 324 74 346 90 curveto
+ 367 106 385 133 400 172 curveto
+ 415 163 lineto
+ 409 118 389 78 355 41 curveto
+ 323 4 282 -13 232 -13 curveto
+ 179 -13 133 7 94 49 curveto
+ 56 90 37 146 37 217 curveto
+ 37 294 56 354 96 396 curveto
+ 135 439 184 460 243 460 curveto
+ 293 460 334 444 367 411 curveto
+ 399 378 415 334 415 278 curveto
+ 106 278 lineto
+ closepath
+ 106 307 moveto
+ 313 307 lineto
+ 312 335 308 355 303 367 curveto
+ 295 385 283 400 267 410 curveto
+ 250 420 234 426 216 426 curveto
+ 189 426 165 416 144 395 curveto
+ 123 374 110 344 106 307 curveto
+ closepath
+ fill
+ } bind def
+ /glyph7 {
+ 389 0 48 -13 354 460 setcachedevice
+ 320 460 moveto
+ 320 308 lineto
+ 304 308 lineto
+ 291 355 276 388 256 405 curveto
+ 237 422 212 431 182 431 curveto
+ 160 431 141 425 127 413 curveto
+ 113 401 106 388 106 373 curveto
+ 106 355 111 339 122 326 curveto
+ 132 313 152 299 183 284 curveto
+ 254 249 lineto
+ 320 217 354 175 354 122 curveto
+ 354 81 338 48 308 23 curveto
+ 277 0 243 -13 204 -13 curveto
+ 177 -13 146 -8 110 0 curveto
+ 100 4 91 5 84 5 curveto
+ 77 5 71 1 66 -6 curveto
+ 50 -6 lineto
+ 50 152 lineto
+ 66 152 lineto
+ 76 107 93 73 119 49 curveto
+ 145 26 173 15 205 15 curveto
+ 228 15 246 21 260 35 curveto
+ 274 48 281 63 281 82 curveto
+ 281 104 274 124 258 139 curveto
+ 242 154 210 173 163 197 curveto
+ 116 220 85 241 70 260 curveto
+ 56 279 48 302 48 331 curveto
+ 48 367 61 398 86 423 curveto
+ 111 448 144 460 184 460 curveto
+ 202 460 223 457 248 449 curveto
+ 265 444 276 441 281 441 curveto
+ 287 441 291 442 293 445 curveto
+ 296 447 300 452 304 460 curveto
+ 320 460 lineto
+ closepath
+ fill
+ } bind def
+ /glyph8 {
+ 277 0 9 -7 279 594 setcachedevice
+ 161 594 moveto
+ 161 447 lineto
+ 265 447 lineto
+ 265 413 lineto
+ 161 413 lineto
+ 161 123 lineto
+ 161 94 165 74 173 64 curveto
+ 182 54 192 49 205 49 curveto
+ 216 49 226 52 236 59 curveto
+ 247 65 254 75 260 88 curveto
+ 279 88 lineto
+ 268 57 251 33 230 17 curveto
+ 210 0 188 -7 166 -7 curveto
+ 151 -7 137 -2 122 5 curveto
+ 108 13 98 25 90 41 curveto
+ 84 56 80 80 80 112 curveto
+ 80 413 lineto
+ 9 413 lineto
+ 9 429 lineto
+ 27 436 45 448 64 465 curveto
+ 83 482 100 502 114 526 curveto
+ 122 538 132 561 145 594 curveto
+ 161 594 lineto
+ closepath
+ fill
+ } bind def
+ end
+/BuildGlyph {
+ exch /CharProcs get exch
+ 2 copy known not
+ {pop /.notdef} if
+ get exec
+} bind def
+/BuildChar {
+ 1 index /Encoding get exch get
+ 1 index /BuildGlyph get exec
+} bind def
+currentdict end
+(TimesNewRomanPSMTFID26HGSet1) cvn exch definefont pop
+%%EndResource
+%%DocumentSuppliedResources: font TimesNewRomanPSMTFID26HGSet1
+%%EndSetup
+%%Page: 1 1
+%%PageOrientation: Portrait
+%%PageBoundingBox: 18 18 577 824
+%%BeginPageSetup
+%
+[{
+%%BeginFeature: *PageSize A4
+<</PageSize [595 842] /ImagingBBox null>> setpagedevice
+%%EndFeature
+} stopped cleartomark
+%%EndPageSetup
+gsave
+[0.24 0 0 -0.24 18 824] concat
+gsave
+1122 184 moveto
+0 0 0 setrgbcolor
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 25 -25 matrix scale makefont setfont
+<4549532D54657374>
+[15 8 14 9 15 11 10 0]
+xshow
+1114 215 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 29 -29 matrix scale makefont setfont
+<4549532D54657374>
+[17 10 16 10 18 13 11 0]
+xshow
+1107 251 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 33 -33 matrix scale makefont setfont
+<4549532D54657374>
+[20 11 19 11 20 15 13 0]
+xshow
+1100 291 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 38 -38 matrix scale makefont setfont
+<4549532D54657374>
+[23 13 20 13 22 17 15 0]
+xshow
+1092 337 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 42 -42 matrix scale makefont setfont
+<4549532D54657374>
+[26 14 23 14 25 19 16 0]
+xshow
+1088 385 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 44 -44 matrix scale makefont setfont
+<4549532D54657374>
+[27 14 24 15 27 19 17 0]
+xshow
+1085 435 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 46 -46 matrix scale makefont setfont
+<4549532D54657374>
+[28 15 26 15 28 20 18 0]
+xshow
+1077 490 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 50 -50 matrix scale makefont setfont
+<4549532D54657374>
+[30 17 28 16 31 22 19 0]
+xshow
+1070 549 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 54 -54 matrix scale makefont setfont
+<4549532D54657374>
+[33 18 30 19 33 24 21 0]
+xshow
+1063 613 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 58 -58 matrix scale makefont setfont
+<4549532D54657374>
+[35 19 33 20 35 26 23 0]
+xshow
+1055 681 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 63 -63 matrix scale makefont setfont
+<4549532D54657374>
+[37 21 35 21 38 28 24 0]
+xshow
+1048 754 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 67 -67 matrix scale makefont setfont
+<4549532D54657374>
+[41 22 37 22 41 30 26 0]
+xshow
+1033 835 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 75 -75 matrix scale makefont setfont
+<4549532D54657374>
+[46 25 42 25 46 33 29 0]
+xshow
+1018 926 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 83 -83 matrix scale makefont setfont
+<4549532D54657374>
+[51 28 46 28 51 37 32 0]
+xshow
+1003 1025 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 92 -92 matrix scale makefont setfont
+<4549532D54657374>
+[56 30 51 31 56 40 36 0]
+xshow
+1003 1127 moveto
+<4549532D54657374>
+[56 30 51 31 56 40 36 0]
+xshow
+989 1236 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 100 -100 matrix scale makefont setfont
+<4549532D54657374>
+[61 33 56 33 61 44 39 0]
+xshow
+974 1354 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 108 -108 matrix scale makefont setfont
+<4549532D54657374>
+[66 36 60 36 66 49 41 0]
+xshow
+959 1481 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 117 -117 matrix scale makefont setfont
+<4549532D54657374>
+[71 39 65 39 71 52 45 0]
+xshow
+929 1625 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 133 -133 matrix scale makefont setfont
+<4549532D54657374>
+[81 44 74 45 81 59 52 0]
+xshow
+900 1788 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 150 -150 matrix scale makefont setfont
+<4549532D54657374>
+[92 50 83 50 92 66 58 0]
+xshow
+870 1969 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 167 -167 matrix scale makefont setfont
+<4549532D54657374>
+[102 56 93 55 102 73 65 0]
+xshow
+840 2168 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 183 -183 matrix scale makefont setfont
+<4549532D54657374>
+[112 61 102 61 112 81 71 0]
+xshow
+811 2386 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 200 -200 matrix scale makefont setfont
+<4549532D54657374>
+[122 67 111 67 122 88 78 0]
+xshow
+766 2630 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 225 -225 matrix scale makefont setfont
+<4549532D54657374>
+[137 75 125 75 137 100 88 0]
+xshow
+722 2901 moveto
+(TimesNewRomanPSMTFID26HGSet1) cvn findfont 250 -250 matrix scale makefont setfont
+<4549532D54657374>
+[153 83 139 84 152 112 96 0]
+xshow
+grestore grestore
+showpage
+%%PageTrailer
+
+%%Trailer
+%%BoundingBox: 0 0 595 842
+%%Orientation: Portrait
+%%Pages: 1
+%%EOF
diff --git a/testgraphical/references/unxlngi/singletest/tolerance.ini_ b/testgraphical/references/unxlngi/singletest/tolerance.ini_
new file mode 100644
index 000000000000..ba027e21452a
--- /dev/null
+++ b/testgraphical/references/unxlngi/singletest/tolerance.ini_
@@ -0,0 +1,4 @@
+# This is the tolerance we will accept if there are problems
+# [eis-test.odt.ps]
+# accept=111
+# page1=111
diff --git a/testgraphical/references/unxsoli/singletest/eis-test.odt.pdf b/testgraphical/references/unxsoli/singletest/eis-test.odt.pdf
new file mode 100644
index 000000000000..96c922f4aa63
--- /dev/null
+++ b/testgraphical/references/unxsoli/singletest/eis-test.odt.pdf
Binary files differ
diff --git a/testgraphical/references/wntmsci/demo/CurrentTime.ods.pdf b/testgraphical/references/wntmsci/demo/CurrentTime.ods.pdf
new file mode 100644
index 000000000000..a753c03708c7
--- /dev/null
+++ b/testgraphical/references/wntmsci/demo/CurrentTime.ods.pdf
Binary files differ
diff --git a/testgraphical/references/wntmsci/demo/CurrentTime.ods.ps b/testgraphical/references/wntmsci/demo/CurrentTime.ods.ps
new file mode 100644
index 000000000000..36b469ce81a3
--- /dev/null
+++ b/testgraphical/references/wntmsci/demo/CurrentTime.ods.ps
@@ -0,0 +1,499 @@
+%!PS-Adobe-3.0
+%%Title: CurrentTime
+%%Creator: PScript5.dll Version 5.2.2
+%%CreationDate: 5/17/2010 15:0:3
+%%For: ll93751
+%%BoundingBox: (atend)
+%%Pages: (atend)
+%%Orientation: Portrait
+%%PageOrder: Special
+%%DocumentNeededResources: (atend)
+%%DocumentSuppliedResources: (atend)
+%%DocumentData: Clean7Bit
+%%TargetDevice: (Generic Printer For MSWord Testing) (1) 1
+%%LanguageLevel: 2
+%%EndComments
+
+%%BeginDefaults
+%%PageBoundingBox: 18 18 577 824
+%%ViewingOrientation: 1 0 0 1
+%%EndDefaults
+
+
+%%BeginProlog
+%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0
+/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false
+setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype
+ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch
+def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0
+rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def
+/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def
+typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72
+def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp
+exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def
+/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype
+{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint}
+readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop
+(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def
+/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- )
+tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup
+xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint
+tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck
+{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(])
+tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup
+rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}
+forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier
+/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin
+$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0
+ne{grestoreall}if errorname(VMerror)ne{showpage}if initgraphics courier setfont
+lmargin 720 moveto errorname(VMerror)eq{userdict/ehsave known{clear userdict
+/ehsave get restore 2 vmreclaim}if vmstatus exch pop exch pop PrtVMMsg}{
+(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt
+$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==}
+repeat}if}ifelse systemdict/showpage get exec(%%[ Error: )print errorname
+=print(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end
+end}dup 0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking
+where{pop/setpacking where{pop oldpack setpacking}if}if
+%%EndResource
+userdict /Pscript_WinNT_Incr 230 dict dup begin put
+%%BeginResource: file Pscript_FatalError 5.0 0
+userdict begin/FatalErrorIf{{initgraphics findfont 1 index 0 eq{exch pop}{dup
+length dict begin{1 index/FID ne{def}{pop pop}ifelse}forall/Encoding
+{ISOLatin1Encoding}stopped{StandardEncoding}if def currentdict end
+/ErrFont-Latin1 exch definefont}ifelse exch scalefont setfont counttomark 3 div
+cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def end
+%%EndResource
+userdict begin/PrtVMMsg{vmstatus exch sub exch pop gt{[
+(Dieser Druckauftrag erfordert mehr Speicher, als auf diesem Drucker vorhanden ist. )
+100 500
+(Versuchen Sie es mit einer oder mehreren der folgenden Methoden und drucken Sie dann erneut:)
+100 485(Wählen Sie für das Ausgabeformat die Option "Optimale Portierung".)115
+470
+(Stellen Sie sicher, daß auf der Registerkarte "Geräteeinstellungen" die Angabe für "Verfügbarer Postscript-Speicher" korrekt ist.)
+115 455(Reduzieren Sie die Anzahl der im Dokument verwendeten Schriftarten. )
+115 440(Drucken Sie das Dokument in verschiedenen Teilstücken. )115 425 12
+/Times-Roman showpage(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}
+if}bind def end version cvi 2016 ge{/VM?{pop}bind def}{/VM? userdict/PrtVMMsg
+get def}ifelse
+105000 VM?
+%%BeginResource: file Pscript_Win_Basic 5.0 0
+/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^
+/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/-
+/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true ,
+d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C
+/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M
+/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d
+/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage
+, d/K/stroke , d/W/widthshow , d/R/rotate , d/L2? false/languagelevel where{pop
+languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d/yS/yshow , d/zS/xyshow ,
+d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, d}bd/bn/bind ld/lw/Lw ld
+/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx matrix
+currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit/UtilsInit
+counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;}b
+/initialize{`{/Pscript_Win_Data where{!}{U/Pscript_Win_Data & put}?/ADO_mxRot ~
+d/TextInitialised? F d reinitialize E}{U/Pscript_Win_Data 230 dict @ ` put
+/ADO_mxRot ~ d/TextInitialised? F d reinitialize}?}b/terminate{!{& self eq
+{exit}{E}?}loop E}b/suspend/terminate , d/resume{` Pscript_Win_Data `}b U `
+/lucas 21690 d/featurebegin{countdictstack lucas[}b/featurecleanup{stopped
+{cleartomark @ lucas eq{! exit}if}loop countdictstack ~ sub @ 0 gt{{E}repeat}
+{!}?}b E/snap{transform 0.25 sub round 0.25 add ~ 0.25 sub round 0.25 add ~
+itransform}b/dsnap{dtransform round ~ round ~ idtransform}b/nonzero_round{@ 0.5
+ge{round}{@ -0.5 lt{round}{0 ge{1}{-1}?}?}?}b/nonzero_dsnap{dtransform
+nonzero_round ~ nonzero_round ~ idtransform}b U<04>cvn{}put/rr{1 ^ 0 - 0 ~ -
+neg 0 - C}b/irp{4 -2 $ + +S fx 4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b/rp{4 2 $ M 1 ^ 0
+- 0 ~ - neg 0 -}b/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool
+2 ^ put}b/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e
+{DefIf_El !}b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b
+/freeVM{/Courier findfont[40 0 0 -40 0 0]makefont Ji 2 vmreclaim}b/hfRedefFont
+{findfont @ length dict `{1 ^/FID ne{d}{! !}?}forall & E @ ` ~{/CharStrings 1
+dict `/.notdef 0 d & E d}if/Encoding 256 array 0 1 255{1 ^ ~/.notdef put}for d
+E definefont !}bind d/hfMkCIDFont{/CIDFont findresource @ length 2 add dict `{1
+^ @/FID eq ~ @/XUID eq ~/UIDBase eq or or{! !}{d}?}forall/CDevProc ~ d/Metrics2
+16 dict d/CIDFontName 1 ^ d & E 1 ^ ~/CIDFont defineresource ![~]composefont !}
+bind d
+%%EndResource
+%%BeginResource: file Pscript_Win_Utils_L2 5.0 0
+/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge
+{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $
+snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F
+setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d
+/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b
+/resourcestatus where{!/ColorRendering/ProcSet resourcestatus{! ! T}{F}?}{F}?
+not{/ColorRendering<</GetHalftoneName{currenthalftone @/HalftoneName known{
+/HalftoneName get}{!/none}?}bn/GetPageDeviceName{currentpagedevice @
+/PageDeviceName known{/PageDeviceName get @ null eq{!/none}if}{!/none}?}bn
+/GetSubstituteCRD{!/DefaultColorRendering/ColorRendering resourcestatus{! !
+/DefaultColorRendering}{(DefaultColorRendering*){cvn exit}127 string
+/ColorRendering resourceforall}?}bn>>/defineresource where{!/ProcSet
+defineresource !}{! !}?}if/buildcrdname{/ColorRendering/ProcSet findresource `
+mark GetHalftoneName @ type @/nametype ne ~/stringtype ne and{!/none}if(.)
+GetPageDeviceName @ type @/nametype ne ~/stringtype ne and{!/none}if(.)5 ^ 0 5
+-1 1{^ length add}for string 6 1 $ 5 ^ 5{~ 1 ^ cvs length 1 ^ length 1 ^ sub
+getinterval}repeat ! cvn 3 1 $ ! ! E}b/definecolorrendering{~ buildcrdname ~
+/ColorRendering defineresource !}b/findcolorrendering where{!}{
+/findcolorrendering{buildcrdname @/ColorRendering resourcestatus{! ! T}{
+/ColorRendering/ProcSet findresource ` GetSubstituteCRD E F}?}b}?
+/selectcolorrendering{findcolorrendering !/ColorRendering findresource
+setcolorrendering}b/G2UBegin{findresource/FontInfo get/GlyphNames2Unicode get
+`}bind d/G2CCBegin{findresource/FontInfo get/GlyphNames2HostCode get `}bind d
+/G2UEnd{E}bind d/AddFontInfoBegin{/FontInfo 8 dict @ `}bind d/AddFontInfo{
+/GlyphNames2Unicode 16 dict d/GlyphNames2HostCode 16 dict d}bind d
+/AddFontInfoEnd{E d}bind d/T0AddCFFMtx2{/CIDFont findresource/Metrics2 get ` d
+E}bind d
+%%EndResource
+end
+%%EndProlog
+
+%%BeginSetup
+statusdict begin (%%[ ProductName: ) print product print ( ]%%)= flush end
+[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec
+featurebegin{
+%%BeginNonPPDFeature: JobTimeout 0
+0 /languagelevel where{pop languagelevel}{1}ifelse 2 ge{1 dict dup/JobTimeout 4 -1 roll put setuserparams}{statusdict/setjobtimeout get exec}ifelse
+%%EndNonPPDFeature
+}featurecleanup
+
+featurebegin{
+%%BeginNonPPDFeature: WaitTimeout 300
+300 /languagelevel where{pop languagelevel}{1}ifelse 2 ge{1 dict dup/WaitTimeout 4 -1 roll put setuserparams}{statusdict/waittimeout 3 -1 roll put}ifelse
+%%EndNonPPDFeature
+}featurecleanup
+
+featurebegin{
+%%BeginFeature: *InputSlot ManualFeed
+
+<< /ManualFeed true /Policies << /ManualFeed 1 >> >> setpagedevice
+%%EndFeature
+}featurecleanup
+featurebegin{
+%%BeginFeature: *Duplex None
+
+<</Duplex false /Tumble false
+ /Policies << /Duplex 1 /Tumble 1 >>
+>> setpagedevice
+%%EndFeature
+}featurecleanup
+featurebegin{
+%%BeginFeature: *PageRegion A4
+<</PageSize [595 842] /ImagingBBox null>> setpagedevice
+%%EndFeature
+}featurecleanup
+featurebegin{
+%%BeginFeature: *Resolution 1200x1200dpi
+
+ 1 dict dup /HWResolution [1200 1200] put setpagedevice
+%%EndFeature
+}featurecleanup
+1 setlinecap 1 setlinejoin
+/mysetup [ 72 1200 V 0 0 -72 1200 V 18 824.0003 ] def
+%%EndSetup
+
+userdict begin /ehsave save def end
+%%Page: 1 1
+%%PageBoundingBox: 18 18 577 824
+%%EndPageComments
+%%BeginPageSetup
+/DeviceRGB dup setcolorspace /colspABC exch def
+mysetup concat colspRefresh
+%%EndPageSetup
+
+0 0 0 1 scol 22500 VM?
+11 dict begin
+/FontName /TTEC2o00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1ae15c03974a1a9b3c172d5d01da698bb3e9bd8fb187
+15ad84bc85cd145093e29e1b226d167407e1f00a6529c34100fe35097c0d
+b5af1eda9d93c4fbe9bd86433be0237415462af5d09911e8c9f42535e5d2
+2dd429d16a06629077406afc7b7c534dc9e9e045cc02be968fa94e480676
+cb53f625f5f575a27ab6d08d5c839bcfee5628e5ccd4d4605b7fec3a76bb
+28738163f3b82fd887dfecdc22fecb045a567be6d3b5a147b633e25bed18
+40c3e8e2f2258801243cf18236f06a8992b5a43fdca766d185ec61f2b174
+d769605817b24a47643e089d8814e415ab639130ea66e36890bd761d0a8f
+5d374c4904ff82dfe0f21c18dee922bc8376caeba56e25b6c9ddbd670491
+72036f023f43bf7830df38d0c36ef5d7184a77d3822cb988db6213ddd19d
+879129e1b8f3a8dafd1d138bec6d1ded9fbbb5b4294072df1f12a135929c
+9a45aea5ebc051f8d6514ccf32b2acbd84dfcbcce5469c945c93be1929e7
+f9fca6965e31a4328311b483ac44acb3daed602b089ab4fe0f74705bb07b
+21067988ba7246b0dd96c23046cbbc2414fdb62ca2e102c041d24e977418
+1bd25e1bd6f500cad2b24572a49f549bf2e59a693759d0acb7c42c2caaa6
+f940204c5d06b53cc4847dac692da2e938bf86283692a51a631279087ecd
+19b56062b53f44ca8d3025a1c25c7aed9b406e9d9fed5a13ff540359abc6
+0a0a444273d3bf793cb00c3158c1050a0a026d200bf4d34f0237233c5b80
+ee79e7cad72f335228314e3461cd05ef2f3826bc1c5c43a92b0551e00b19
+ebeea73ef66820f36ee61ad9be6012c65138a13ef4cd7745cb966af72d76
+d42781dc5aaf5f69753ae6bd324bf42ec9cee010ff5f487dfaf1eea51f2f
+43488c9a9115ceda9b959465b3ae6f1e94ede9ce7867344484db692e5423
+962fa13ffb0073691e3a193f217e588ec12fcad5e3c7a2da41073813b4e4
+99a784d26534294d71d117a87c98a814df39bf6fc01fac1bf8f73960775b
+0a4ed51d90d942c14585b424223f30c4f93ee07bd3c05dd7f36271b10cc0
+914af6e94e4451befc31d1557802dad903b71eb5189c18fadd8ba9ce4ff0
+c2d750518bfca7c652b5c5d314a35fefb8e62e62632d0168c97718779689
+97abcc8e922914102cc46e07874511d23c143f7c2440a81b012532995272
+f01ae7b4d8f66ffac047ba7ddcf4b156ce29e19491ceb0af30494c5755e6
+16eb123ec1f237fa5d36c4a03de9e90000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTEC2o00 findfont /Encoding get
+dup 1 /S put
+dup 2 /h put
+dup 3 /e put
+dup 4 /t put
+dup 5 /one put
+pop
+Pscript_WinNT_Incr begin
+%%BeginResource: file Pscript_Text 5.0 0
+/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d
+/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^
+length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets
+{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{&
+/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get}
+if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{
+{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get
+StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $
+! ! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ length array copy
+put pd_CoverFCRange}if}{!}? 2 ^ ~ definefont fM 5 4 -1 $ put fM 4 0 put fM
+makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M currentpoint snap M 0 - 0
+Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d/ySP null d/sW null d/sSU{N
+/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N/sW ~ d/ySP ~ d/xSP ~ d}b/sT
+{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix astore concat 0 0 M}b/eR/; , d
+/AddOrigFP{{&/FontInfo known{&/FontInfo get length 6 add}{6}? dict `
+/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d/OrigFontStyle ~ d
+/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS{makefont
+Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 copy ~ sub 1
+add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for & E
+/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}b/mF42{15 dict ` @ 4 1 $
+FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 add 255
+idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for/FDepVector
+Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 Encoding
+length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName length 2
+add string}{FontName length 3 add string}?}? @ 0 FontName @ length string cvs
+putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ putinterval cvn 1 ^
+256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 $ put}for & @ E
+/FontName get ~ definefont ! ! ! mF}b/mF_OTF_V{~ ! ~ ! 4 -1 $ ! findfont 2 ^ ~
+definefont fM @ @ 4 6 -1 $ neg put 5 0 put 90 matrix R matrix concatmatrix
+makefont Pscript_Windows_Font 3 1 $ put}b/mF_TTF_V{3{~ !}repeat 3 -1 $ !
+findfont 1 ^ ~ definefont Pscript_Windows_Font 3 1 $ put}b/UmF{L2?
+{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName
+get undefinefont}forall undefinefont}b
+%%EndResource
+end reinitialize
+F /F0 0 /0 F /TTEC2o00 mF
+/F0SA7 F0 [167 0 0 -167 0 0 ] mFS
+F0SA7 Ji
+4696 1120 M <010203030405>[111 93 93 93 46 0]xS
+3600 VM?
+
+currentfile eexec
+9e67edc6b841305d5d10e5a53359c38b0291a4f57acae0c56237cee47bc1
+d85570b1414b43fc17ea6b4843d55ac9afa7067f1a7091b4594d913de276
+a8772313a65fcd26ba87b9a05d166b03e17f03277dd8efccb02a7d4c1be6
+177e723f7aa9e190ce43dd1df2bf2988559fa94bfa641911cece0e747ceb
+9b660904152a628a244fd923b311f5c4a5fe7c546e8d37afebee19511e85
+7ff39e7ff6c4792d53badbc7a555b283f38f31e279752d4342dd5f00e99d
+ba2152623e1e346ef7276b3265bc6cc3a37e315df96fd5d085e519b5cf03
+fb27cf9385ba7058ff6c83c880bff9c4fbd2947bdc5c671ae82a44177042
+f439578104f7c75f2ba09f3a578b522774bde2cbc6643d623a5e689df5bd
+359ed5f335c5b979036b99e788351b92cb83205fff7dfc1b4880b7c6f468
+edd5346a15139d558c3bc6afd4767b4d9529a0b1aa4767bc65f3a158d720
+6b2b276cc6eb3b50ea5319f6a5b9f96114b77ee5ff8b0d84786036821196
+10d2ea5e2af2f62d8e94dfa5e9d87f303e6969e9121676a20da78c247202
+97cf246bcdca069951c2ca4294017dbf317ba60a54367a75dcb0c005394f
+2e21d22fc8f1ca437c52566a26569f6f218d87831bbb59f9d7ce80d28c89
+c77c8ae2b608c786ebca7c5c5a7b7ded13c1007bc6484e8151dc558cb6f0
+6056b74666e6cdb8c0ccdc65044d55b68497ebec08ea9f2c661760595438
+8dfea6f0743c11811fd26f2837f954ef0a99db60eb9c3e1b523e0762deec
+c717a44bfc75d4b55b7b8719218283ecd5e23ccbcc9bc1893cd9dda88922
+be1f24e77c46fbafd369868830f7ac384a338b2dde52ac79f83047febbb7
+a1adfd3f3ea13de8dbb63607beec48b0b5957be43431e98c34591c3ce646
+5c30ed78f1a8d521a4349671263c640e277d310adf33cae19cfdc350adff
+14c02e0b73c1a80c0b97e5974cd751a144d34ca579b5cb81d8e0f230dbb8
+2d306f969dbd71108cc52e7338359ca95bc1873c1c91be7b51240fc14001
+98c8f64796e991eea99e27eba7bdac1f2296da2c6db2cdbcc4d7538af40d
+5cd881a349dbc71725ab9bf815736c339b0f5aec8f6c4ca0438ecca51f39
+130895a4e7fd438813034129b8a838589b370000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTEC2o00 findfont /Encoding get
+dup 6 /P put
+dup 7 /a put
+dup 8 /g put
+dup 9 /space put
+pop
+4696 13024 M <0607080309>[111 93 93 93 0]xS
+5132 13024 M <05>S
+19800 VM?
+11 dict begin
+/FontName /TTBC013398o00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1add2c77631f898ffcae76502bbe5e22d7ef71c602e1
+9e22c890817f47e70d08803467d31dd4454c7e898bf1e600f73ba7788118
+7a31575a7bde4b80b1052323a8cd8606039f631424bead9a04865f2b6ccd
+563650769cf3b9f4ec66fa0b354b1389beaff83c6934509010d5c85f025f
+31060982b13953fa166bd5a265f4594dd80728aad8dbc710567ddbed093f
+27b08481959f39d5ea87844272e351c3b107807046866c6efdb34ab1a02a
+4560b58fd36e23b92ffe3af9cc87a0bcbebea7877536640c59261a3a850a
+0941a1da1349cafaf520ac0b488e6dd848ded092875c1ddfbb53986369d2
+ea38f05fc71a0f819904a116f9de8d4281e77df87763452fd42258656862
+4ee87f6acc7b7e1de1128cffce1168ba4f0f231290002f98b6bd2bc60a37
+f305d9515113ceba5d077871c967bffa3d810d8b4355895fdb320c155536
+880c517ea5384f01027eae42fb1a1cf3b4105a4bd7287b950000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTBC013398o00 findfont /Encoding get
+dup 1 /one put
+dup 2 /five put
+pop
+F /F1 0 /0 F /TTBC013398o00 mF
+/F1S5BA F1 [1466 0 0 -1466 0 0 ] mFS
+F1S5BA Ji
+1459 3161 M <0102>[815 0]xS
+900 VM?
+
+currentfile eexec
+9e67edc6b841305af19a6e4bb2a230e3e9efc9b96f464cd2cec0584bfa5d
+e6b6c8bf4fb2bca3ff5c4ffdcb930b9549cfaa6d954b63169b356002d4a2
+065b3dad6c77543f2f4c58aba309a5f2e2cec5372d5eb49ba5adffe6ec0d
+ed20ee879de2476ee6f4099e560589a666b9194b6bf7f0128e1a3afd80ec
+9f40a396884744c1962e90eba74a9cd4a32f9fdd0782f0c6b6d12f732bee
+20b6ac0c3bfba90b08742c53ddc1970000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTBC013398o00 findfont /Encoding get
+dup 3 /colon put
+pop
+3123 3161 M <03>S
+900 VM?
+
+currentfile eexec
+9e67edc6b841305af19a6e4bb2a230e3e9efc9b96f464cd2cec0584bfa5d
+e6b6c8bf4fb2bca3ff5c4ffdcb930b9549cfaa6d954b63169b356002d4a2
+065b3dad6c77543f2f4c58abba975b6391782ae96f027086c2b7fc4d3f90
+351b67f8a2fc2116477655cf0dff5a6bf15f1a3d629270d6af26f69b32a3
+312831823f86f43a0ab84649de6044d445b8ed1fbd9a8f026fbac386a0e1
+c5428153a9d4e786021ed524ba1216a3b8ab60edfbf05959d5558b762ca6
+ffa65d882d930f795bc1903885698b5558100097185b7cacdbe4413bc735
+faa8d6a05f03b5bcb23f73372cbb5f7cd01ce3e3bb2e524201be263c6e0c
+f04205a026405c90467d80e06d42e97c1af53a494a1c86c7a93c034ec9a1
+58c34d868fc499aa20961ab79c8fd94237c294a6d7569b8cddbab704dca3
+ab7466244b990000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTBC013398o00 findfont /Encoding get
+dup 4 /zero put
+pop
+4201 3161 M <0404>[815 0]xS
+5865 3161 M <03>S
+900 VM?
+
+currentfile eexec
+9e67edc6b841305af19a6e4bb2a230e3e9efc9b96f464cd2cec0584bfa5d
+e6b6c8bf4fb2bca3ff5c4ffdcb930b9549cfaa6d954b63169b356002d4a2
+065b3dad6c77543f2f4c58abb474233ea80ce809e35265271e29a645609a
+f19523b459da829c3beb337f4e916de7baa7dd40e381e60e1d68dd6dc672
+318ee6d51a4977d970db3ae073fa94a7f5afcd21e06e8476d782a2865dd3
+2a9c235bd5f3c5f1f327252a54d27bae21d8962686e2aa6912c72c946bed
+83223cfc201da7c3f18870a82efce4ad7f1c996c4d99903969225ed21444
+37bc8415a6f4b6d44e30c3d0e47b6d6945d1536311137281dee93fc9a238
+a6036c912e79e0ebe6ecb3d20cd3093cccd00d504fa49f3c0efe04da2103
+3e167528183bdb7896175c77778fde8f0d0b65cb28281e8869747cde7f28
+94c91c302ba109d3ae45ff70f1999a40d8e9a33bd9ce6b8b22961db9c435
+a39d612dba6c4fcc51231f651c91bd0b0724b13d8d8e0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTBC013398o00 findfont /Encoding get
+dup 5 /three put
+pop
+6943 3161 M <0405>[815 0]xS
+LH
+(%%[Page: 1]%%) =
+%%PageTrailer
+
+%%Trailer
+%%BoundingBox: 18 18 577 824
+%%DocumentNeededResources:
+%%DocumentSuppliedResources:
+%%+ procset Pscript_WinNT_ErrorHandler 5.0 0
+%%+ procset Pscript_FatalError 5.0 0
+%%+ procset Pscript_Win_Basic 5.0 0
+%%+ procset Pscript_Win_Utils_L2 5.0 0
+%%+ procset Pscript_Text 5.0 0
+Pscript_WinNT_Incr dup /terminate get exec
+ehsave restore
+%%Pages: 1
+(%%[LastPage]%%) =
+%%EOF
+ \ No newline at end of file
diff --git a/testgraphical/references/wntmsci/singletest/eis-test.odt.pdf b/testgraphical/references/wntmsci/singletest/eis-test.odt.pdf
new file mode 100644
index 000000000000..0654d52c11a8
--- /dev/null
+++ b/testgraphical/references/wntmsci/singletest/eis-test.odt.pdf
Binary files differ
diff --git a/testgraphical/references/wntmsci/singletest/eis-test.odt.ps b/testgraphical/references/wntmsci/singletest/eis-test.odt.ps
new file mode 100644
index 000000000000..968c7b3cbd44
--- /dev/null
+++ b/testgraphical/references/wntmsci/singletest/eis-test.odt.ps
@@ -0,0 +1,1984 @@
+%!PS-Adobe-3.0
+%%Title: eis-test
+%%Creator: PScript5.dll Version 5.2.2
+%%CreationDate: 5/17/2010 13:9:19
+%%For: ll93751
+%%BoundingBox: (atend)
+%%Pages: (atend)
+%%Orientation: Portrait
+%%PageOrder: Special
+%%DocumentNeededResources: (atend)
+%%DocumentSuppliedResources: (atend)
+%%DocumentData: Clean7Bit
+%%TargetDevice: (Generic Printer For MSWord Testing) (1) 1
+%%LanguageLevel: 2
+%%EndComments
+
+%%BeginDefaults
+%%PageBoundingBox: 18 18 577 824
+%%ViewingOrientation: 1 0 0 1
+%%EndDefaults
+
+
+%%BeginProlog
+%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0
+/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false
+setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype
+ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch
+def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0
+rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def
+/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def
+typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72
+def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp
+exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def
+/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype
+{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint}
+readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop
+(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def
+/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- )
+tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup
+xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint
+tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck
+{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(])
+tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup
+rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}
+forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier
+/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin
+$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0
+ne{grestoreall}if errorname(VMerror)ne{showpage}if initgraphics courier setfont
+lmargin 720 moveto errorname(VMerror)eq{userdict/ehsave known{clear userdict
+/ehsave get restore 2 vmreclaim}if vmstatus exch pop exch pop PrtVMMsg}{
+(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt
+$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==}
+repeat}if}ifelse systemdict/showpage get exec(%%[ Error: )print errorname
+=print(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end
+end}dup 0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking
+where{pop/setpacking where{pop oldpack setpacking}if}if
+%%EndResource
+userdict /Pscript_WinNT_Incr 230 dict dup begin put
+%%BeginResource: file Pscript_FatalError 5.0 0
+userdict begin/FatalErrorIf{{initgraphics findfont 1 index 0 eq{exch pop}{dup
+length dict begin{1 index/FID ne{def}{pop pop}ifelse}forall/Encoding
+{ISOLatin1Encoding}stopped{StandardEncoding}if def currentdict end
+/ErrFont-Latin1 exch definefont}ifelse exch scalefont setfont counttomark 3 div
+cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def end
+%%EndResource
+userdict begin/PrtVMMsg{vmstatus exch sub exch pop gt{[
+(Dieser Druckauftrag erfordert mehr Speicher, als auf diesem Drucker vorhanden ist. )
+100 500
+(Versuchen Sie es mit einer oder mehreren der folgenden Methoden und drucken Sie dann erneut:)
+100 485(Wählen Sie für das Ausgabeformat die Option "Optimale Portierung".)115
+470
+(Stellen Sie sicher, daß auf der Registerkarte "Geräteeinstellungen" die Angabe für "Verfügbarer Postscript-Speicher" korrekt ist.)
+115 455(Reduzieren Sie die Anzahl der im Dokument verwendeten Schriftarten. )
+115 440(Drucken Sie das Dokument in verschiedenen Teilstücken. )115 425 12
+/Times-Roman showpage(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}
+if}bind def end version cvi 2016 ge{/VM?{pop}bind def}{/VM? userdict/PrtVMMsg
+get def}ifelse
+105000 VM?
+%%BeginResource: file Pscript_Win_Basic 5.0 0
+/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^
+/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/-
+/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true ,
+d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C
+/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M
+/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d
+/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage
+, d/K/stroke , d/W/widthshow , d/R/rotate , d/L2? false/languagelevel where{pop
+languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d/yS/yshow , d/zS/xyshow ,
+d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, d}bd/bn/bind ld/lw/Lw ld
+/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx matrix
+currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit/UtilsInit
+counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;}b
+/initialize{`{/Pscript_Win_Data where{!}{U/Pscript_Win_Data & put}?/ADO_mxRot ~
+d/TextInitialised? F d reinitialize E}{U/Pscript_Win_Data 230 dict @ ` put
+/ADO_mxRot ~ d/TextInitialised? F d reinitialize}?}b/terminate{!{& self eq
+{exit}{E}?}loop E}b/suspend/terminate , d/resume{` Pscript_Win_Data `}b U `
+/lucas 21690 d/featurebegin{countdictstack lucas[}b/featurecleanup{stopped
+{cleartomark @ lucas eq{! exit}if}loop countdictstack ~ sub @ 0 gt{{E}repeat}
+{!}?}b E/snap{transform 0.25 sub round 0.25 add ~ 0.25 sub round 0.25 add ~
+itransform}b/dsnap{dtransform round ~ round ~ idtransform}b/nonzero_round{@ 0.5
+ge{round}{@ -0.5 lt{round}{0 ge{1}{-1}?}?}?}b/nonzero_dsnap{dtransform
+nonzero_round ~ nonzero_round ~ idtransform}b U<04>cvn{}put/rr{1 ^ 0 - 0 ~ -
+neg 0 - C}b/irp{4 -2 $ + +S fx 4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b/rp{4 2 $ M 1 ^ 0
+- 0 ~ - neg 0 -}b/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool
+2 ^ put}b/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e
+{DefIf_El !}b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b
+/freeVM{/Courier findfont[40 0 0 -40 0 0]makefont Ji 2 vmreclaim}b/hfRedefFont
+{findfont @ length dict `{1 ^/FID ne{d}{! !}?}forall & E @ ` ~{/CharStrings 1
+dict `/.notdef 0 d & E d}if/Encoding 256 array 0 1 255{1 ^ ~/.notdef put}for d
+E definefont !}bind d/hfMkCIDFont{/CIDFont findresource @ length 2 add dict `{1
+^ @/FID eq ~ @/XUID eq ~/UIDBase eq or or{! !}{d}?}forall/CDevProc ~ d/Metrics2
+16 dict d/CIDFontName 1 ^ d & E 1 ^ ~/CIDFont defineresource ![~]composefont !}
+bind d
+%%EndResource
+%%BeginResource: file Pscript_Win_Utils_L2 5.0 0
+/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge
+{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $
+snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F
+setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d
+/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b
+/resourcestatus where{!/ColorRendering/ProcSet resourcestatus{! ! T}{F}?}{F}?
+not{/ColorRendering<</GetHalftoneName{currenthalftone @/HalftoneName known{
+/HalftoneName get}{!/none}?}bn/GetPageDeviceName{currentpagedevice @
+/PageDeviceName known{/PageDeviceName get @ null eq{!/none}if}{!/none}?}bn
+/GetSubstituteCRD{!/DefaultColorRendering/ColorRendering resourcestatus{! !
+/DefaultColorRendering}{(DefaultColorRendering*){cvn exit}127 string
+/ColorRendering resourceforall}?}bn>>/defineresource where{!/ProcSet
+defineresource !}{! !}?}if/buildcrdname{/ColorRendering/ProcSet findresource `
+mark GetHalftoneName @ type @/nametype ne ~/stringtype ne and{!/none}if(.)
+GetPageDeviceName @ type @/nametype ne ~/stringtype ne and{!/none}if(.)5 ^ 0 5
+-1 1{^ length add}for string 6 1 $ 5 ^ 5{~ 1 ^ cvs length 1 ^ length 1 ^ sub
+getinterval}repeat ! cvn 3 1 $ ! ! E}b/definecolorrendering{~ buildcrdname ~
+/ColorRendering defineresource !}b/findcolorrendering where{!}{
+/findcolorrendering{buildcrdname @/ColorRendering resourcestatus{! ! T}{
+/ColorRendering/ProcSet findresource ` GetSubstituteCRD E F}?}b}?
+/selectcolorrendering{findcolorrendering !/ColorRendering findresource
+setcolorrendering}b/G2UBegin{findresource/FontInfo get/GlyphNames2Unicode get
+`}bind d/G2CCBegin{findresource/FontInfo get/GlyphNames2HostCode get `}bind d
+/G2UEnd{E}bind d/AddFontInfoBegin{/FontInfo 8 dict @ `}bind d/AddFontInfo{
+/GlyphNames2Unicode 16 dict d/GlyphNames2HostCode 16 dict d}bind d
+/AddFontInfoEnd{E d}bind d/T0AddCFFMtx2{/CIDFont findresource/Metrics2 get ` d
+E}bind d
+%%EndResource
+end
+%%EndProlog
+
+%%BeginSetup
+statusdict begin (%%[ ProductName: ) print product print ( ]%%)= flush end
+[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec
+featurebegin{
+%%BeginNonPPDFeature: JobTimeout 0
+0 /languagelevel where{pop languagelevel}{1}ifelse 2 ge{1 dict dup/JobTimeout 4 -1 roll put setuserparams}{statusdict/setjobtimeout get exec}ifelse
+%%EndNonPPDFeature
+}featurecleanup
+
+featurebegin{
+%%BeginNonPPDFeature: WaitTimeout 300
+300 /languagelevel where{pop languagelevel}{1}ifelse 2 ge{1 dict dup/WaitTimeout 4 -1 roll put setuserparams}{statusdict/waittimeout 3 -1 roll put}ifelse
+%%EndNonPPDFeature
+}featurecleanup
+
+featurebegin{
+%%BeginFeature: *InputSlot ManualFeed
+
+<< /ManualFeed true /Policies << /ManualFeed 1 >> >> setpagedevice
+%%EndFeature
+}featurecleanup
+featurebegin{
+%%BeginFeature: *Duplex None
+
+<</Duplex false /Tumble false
+ /Policies << /Duplex 1 /Tumble 1 >>
+>> setpagedevice
+%%EndFeature
+}featurecleanup
+featurebegin{
+%%BeginFeature: *PageRegion A4
+<</PageSize [595 842] /ImagingBBox null>> setpagedevice
+%%EndFeature
+}featurecleanup
+featurebegin{
+%%BeginFeature: *Resolution 1200x1200dpi
+
+ 1 dict dup /HWResolution [1200 1200] put setpagedevice
+%%EndFeature
+}featurecleanup
+1 setlinecap 1 setlinejoin
+/mysetup [ 72 1200 V 0 0 -72 1200 V 18 824.0003 ] def
+%%EndSetup
+
+userdict begin /ehsave save def end
+%%Page: 1 1
+%%PageBoundingBox: 18 18 577 824
+%%EndPageComments
+%%BeginPageSetup
+/DeviceRGB dup setcolorspace /colspABC exch def
+mysetup concat colspRefresh
+%%EndPageSetup
+
+0 0 0 1 scol 25200 VM?
+11 dict begin
+/FontName /TTA55o00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb22066084a75e287a6b21
+7d5ead11cee92565651ea4f1d618325c70b09fa582d2eca5e5c5deea3be0
+b1103a2db20dd69d0ed4b12a762ee64108282b8d83f8d25f9b0608098b16
+460b06a011c4da3f1e637f7ceebc2c8c5e93750ddf750a5c367617f3ede0
+a6cce86a134ca76a529adbcaeb6269451c7420c09daca772307efbb571ee
+ca3a4465c4c2c3d07e2e4a4d48c613544563cea572138daa08d3f5cf8000
+48b9a9565dad61504d768972a63af0d028d75c4659f9cca991fb4b69a2bd
+6e431e8b0e6a12e9dcc103601275d759cab9eeadc4460c47826081779cba
+93705992909858e7649b160152d7bf68815571de7b523535e3f769594f22
+6903dcade6a25b8812844738e33c7cb6fcaee97f7e0d8603cd3dc3ff06a8
+773abda4287715d753d213526621e7b9bd20a1d7c760b92a1abcd504356e
+4d33dafc982a531bd06a84380c708eb3650d88f88d440ded48d8d3ce7678
+a965d8469f5931134fe32d1a371bfd25667b18e588de27003a6758c36c0e
+a3d1550756abfd014ccbd822aebd05c03521ded77a70cbc5a58c47def657
+79dab92fed044a48697ae300bc4ea5a33620bfcde234c944b214a9c2d562
+d369051015084e6cbf286344a22b3f1003133679dc6962df21405aa70d6b
+725b8f8a37436c2f12a9cf0eb097dbda2dd417b2c2e6eb0ac571bc00b5e5
+93817cce74217395cc079c8222746172fd669a96cb65e23828a2a4b1ff2c
+93428a8c2738b0c42e14b93725d2907b0352a41c50fef53b7a13daeb06b6
+d1f339ee6f2cd8c8fa1154c733b17a2f3ac716ad02da5459abfc16b83ab3
+9fc018038386e7065f68be925cebb5f86a1112a2657cd4c5a741c5e7b520
+be2a0dfcf072d331964cb6065f51531606db141ad04b59b2aea886c83024
+feccd6a378c41dc2bacf17907885e03384773ce94735dc19022f0d171df4
+4322ad309a02ddf3455ba4c822cddaa3b0b0552dbdd354bbd279223a6b54
+a55fd4b0d5570543709083a26e944bce2feb3c09d9ea02a4851b70bf4a24
+7892c3d0bb0483daae9b9a9dc5acd3955a9e213c7ca9b51bc1a3a97eae3e
+67abaf6e26d68e27bbfd9a05b30474a1ef758ed08ae5423f0e430efdf23a
+6149cf11ecd234c9d48aca961f1cdaafa375f9e488605876fc32ad44b2da
+abb0e23a05b2e35412aef4dc77dbae93b2bc47f7b284d5f3e12dbc56a1fa
+971a5c5be62ef903e4f54edd9dddea7c3908546ff5dd4bda3079624a9a22
+9cbb4c84ac0b4f68a19b24a88d2068b8074c21eb35ef43789a3588b32710
+4558187555465bfed7858029c1f7f30f942ae86dff06d1f8f2da8cf8b330
+a1260fb9bb4648d8fccfc12f295164eac890dea6d03091bd25c91db21856
+e1023ae08ea96af37790bcab40398f35122b6287f3e0ba266b563cd5e09b
+117b848b20d986fc6f08d53a5115263e91e84448ce2052e731ba5ac2274a
+3cfe116473da78d88a3980ab570e9d8afe870905da9620ef3c55b859f825
+a7239fd31d4a6a5ea67381a26e68dd48a07d7b2e9396ebd861b3f55e04a2
+b0cb2a2dc1c20e2919cd3981883acea06c47700adc875197fd05cf4dee96
+e3847d7e7cad37e3d62536f36bf7e9b39fed99c8e18564b030417d7c46d7
+73edfc7c97506df2ee5dadc76b03c19d17444c5d529641aa20fd07d50f62
+85d1ea902c58baa75ed6f2236c1904605a89c333160a190d92068c03982a
+8bfc3b3968487f940314478274337863c0e7c797435dab9758bb85240e4a
+59345b67492edfe7a3c00d6626c663bf7577f4012bcdc438fd37e32f5785
+cd124fab0681605098048f77aec3819aab4de3ba73bfea197c50c4284225
+3008b38a77151400eeeaf84ea6d1e8a26f9463baef55137b53a4460000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA55o00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+Pscript_WinNT_Incr begin
+%%BeginResource: file Pscript_Text 5.0 0
+/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d
+/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^
+length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets
+{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{&
+/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get}
+if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{
+{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get
+StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $
+! ! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ length array copy
+put pd_CoverFCRange}if}{!}? 2 ^ ~ definefont fM 5 4 -1 $ put fM 4 0 put fM
+makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M currentpoint snap M 0 - 0
+Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d/ySP null d/sW null d/sSU{N
+/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N/sW ~ d/ySP ~ d/xSP ~ d}b/sT
+{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix astore concat 0 0 M}b/eR/; , d
+/AddOrigFP{{&/FontInfo known{&/FontInfo get length 6 add}{6}? dict `
+/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d/OrigFontStyle ~ d
+/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS{makefont
+Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 copy ~ sub 1
+add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for & E
+/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}b/mF42{15 dict ` @ 4 1 $
+FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 add 255
+idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for/FDepVector
+Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 Encoding
+length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName length 2
+add string}{FontName length 3 add string}?}? @ 0 FontName @ length string cvs
+putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ putinterval cvn 1 ^
+256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 $ put}for & @ E
+/FontName get ~ definefont ! ! ! mF}b/mF_OTF_V{~ ! ~ ! 4 -1 $ ! findfont 2 ^ ~
+definefont fM @ @ 4 6 -1 $ neg put 5 0 put 90 matrix R matrix concatmatrix
+makefont Pscript_Windows_Font 3 1 $ put}b/mF_TTF_V{3{~ !}repeat 3 -1 $ !
+findfont 1 ^ ~ definefont Pscript_Windows_Font 3 1 $ put}b/UmF{L2?
+{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName
+get undefinefont}forall undefinefont}b
+%%EndResource
+end reinitialize
+F /F0 0 /0 F /TTA55o00 mF
+/F0S64 F0 [100 0 0 -100 0 0 ] mFS
+F0S64 Ji
+4483 738 M <0102030405060708>[61 30 57 35 61 44 39 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA56o00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb2206689a2c7f31c3571c
+8737a397efefad52089b0a63555d3209d1f3499e5f079b0179d26bd1a32a
+7bf160e83323b466debc925db378cff20fe2ba66a466a4d8e1d2a6615e05
+93a54552fe19a6e69b359af73bdf13ed8417dc9fc8dc3f18af93902e4197
+b017bff7f07009d52cf468581f6a23267d555fa25bef058e1ac4f1bf710a
+4067b25bf8ed2fd76a56a21222c35beb89a1e778c0ca1c10db6fad771b1b
+85771340b80523ff61971323b189e5cd4f8666eabccd1bd2aa658224cc84
+a8652949369fd109f7da580efd0ef48637981305ef31dd2654b818529b95
+81188e00d73117aaf12858765156a2ee8b290fc3b1ad7f8500e5fdf3a784
+bcd5a3d1d8613b692b3fc5d88ba80b961c093aca30c05de21307a42665dd
+567218faaf8e7531b8658b777053fa437955fab3db6bcc47bf877b55850b
+26ca2a1d2ae2f655f6939da944107009b124d97feab6b504be5d1d142fd6
+e7a2e0b1e5c51daf94eb93a43ce9ae7ebc4afba0c6dde00967e5ff15f6e7
+87af9d25ee37e13ab42bd3c6163335570877ec27d2e0b8a87083b7bd4e51
+f5a164659aec160554f0cf11eb2f253844b0a6adc1748c633f16f0ab1885
+3f25a36b4e80c4f742f83568920975e061327bf0a3a77e99b0bf948a068d
+18a4723ea71d7048424ac7b39260fd0717446fc6916cd997742d088d4258
+d4301cef2f3cc8c632d9c0aea984131a59c77315ff1e282c26d745f499cb
+4ad480715a91553e4dd0345774bdac173e3db6dab78f559da4b3ec76c473
+5d24af2afecb96535a5a6c956453f5ed7f00fdfff68025fd6667ffa85b3e
+fc5bafa39cfbdba93d1e9054b5581daa9d37bbfba4f602f3766d61f275aa
+7aa663a22d807494bff21a562eae0507e64bc74dc8d1a2f052b626539a73
+5d1a5832e7a89e886eb4db30ccac44725ef80f8215d2115764ff1dec4cf2
+4bfa1f30c36e3da7b69915d30cde7e205e8a9e780bdacc60f3bb715b00e8
+221669692a26d568e581e1b318334ac68fc818b4aae56f9bcb7c4dc7b749
+a083c67c5df50e02ddf9fbe5ab022acd31204913f32d7a8b47242c2de557
+cb452815625cb986e010e03c757188e99acdcff88b435c229c9fa7e762f4
+2823b4b32bbad7aefa65cca11515b4bd335afea1638e7ef8da3fa7f84626
+25c39e1a2ed855c06cc5f62152d2eafe46b9d11dca17173ec0955b1452af
+531f67fabb234bd217a9aba25d1dcd411f90829c70932706ad453c184066
+f3981f10ec9d212029aec5fdbdbc0ee51d1808c0a7d911c3f039d4f5368d
+0b8f0fbe6b67b888119a7f7bc24558be741e57ea649bf1d03f8a555aa600
+a90a69e471b6d8014264f1e3efa6c74e2a2f694c36bcaa713d16a2279073
+748d853fa087e61ef3db613d9112c861655a99de6a3e4a707c8d450eb68a
+0a6959ce43b5437f338ef9f90a4a2f1611ac157c105a68770e2d00af10df
+882fd6b4f100ecc610515e037112a012e306c2e6b684cc837e815971ed26
+6fcc6fa7f2fb5f83cb06d835731a5034e683ceb10e5402f41eddbd8302e1
+df211165be9eff0f2c296eb85d7ea8c667d86fc1a620504f5158dfb898e4
+72f7c46964e2ceaf85c9a892eff29d25bcc1e5297aa679976919f6c839f3
+d0f54de71a531116f4ed682f527c7f53d5c164517db6f807c1d20d37c022
+c5bd5e6a8da424c3e3d47689fb71fa07290f52db51c37d64b83207fca5a6
+9833ba0c2c3ab8c4d8d171c040863605ee1122166d712ad8c04475341da5
+86b1a501e0dae2d6726daac4b640945778ffc53c567618e47993dbba3ffa
+82fbed8bd9f9eb3f0145870cb80b4429e582595ab561bcbb6dc15c889e3e
+ac002d4fef28fd1b9422c142dfe50ababb2be2f385bd343ae40000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA56o00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F1 0 /0 F /TTA56o00 mF
+/F1S75 F1 [117 0 0 -117 0 0 ] mFS
+F1S75 Ji
+4454 869 M <0102030405060708>[70 40 65 39 71 50 47 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA57o00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb2206118c660a9cbf6d8e
+4b94826b96ececa9599a7609dcee16efe1179b77c1b7f46a95a0ab7c17a5
+697836677e08c4eee7e9abfc4070a184ceafafef2726ec95228791901739
+e45003466c73dbc8c43a9c04969dbcfd8dd8cf15a19004cee3a14a49be6e
+b91213a5ee7b0d2d584078f374b74774ed505dcdc8983311c8f8e03e9edb
+9df6842ada6e161ed6a5b011b3f1c7320ded247da6deb3cd17a7ec0f397b
+2415ea072df14348131a70acc1f7c7fbbfd3870b5f41e98d030d413cb08a
+2845f8f1c697e10d8ac363d896f70864686afbee40d592ff2a9e75e3e361
+06444d8ee582de9d325fb883a53b6c68d362eaceeafa7048afa7430ccc45
+572995e53aad2bd2386c32d72665fe9d6964f038c062b01a43757a9ab52e
+2cd852d6146f2232dfa51ead4a2b44b01c5832d54b88ed54c258aed0171b
+b62cc9a580de1309215b9be7403d782f2bf09d2a9edd0f657647fdc4900a
+22c529490ca9a42be2400c61acc09f4db4f7d500159c7a4e4e3ad5d4f112
+0507ba0052d9818e041afe07325886343f03c99f60cc1601307e85a68685
+691790d16bdb7d487a68e6e15d211ebeac2443efbed31a5512d98cacfdff
+e34d638fdb613469cffd654f12c888fb2923930f739325fb86060b4acae3
+c1e5a887d8703feda1156c4d73c0e21813d748154bb54f8c24c1daf24601
+8792c263771d62affb085a58adbf11ab9599cb9dcda256cfe6909ffa616e
+53434e3627483cb07b06d46eef74e18d985429a9e1ab75b933114b58082c
+22cf52f6c86824e52d1ec597c6250f14a100499af35f259be3e328da8e47
+483a34be21f28bc8a3262a528199b63a9791d53121a622873f5e6987e883
+930912abd47d820cb61501acb111bb4b004abc7bd88ab6b8245fb7ed6917
+8a29a82d445ee37eefda5c108e2e5729338da717589f1aaf4bb384d05de0
+f8094fc57f0b38379014638d4e690feb342a7767052f75d630b35a14c266
+846a0a255e7012750b989aec755b5f382e79a9417c6fc1e67dd51ff6db64
+6105edd0f9db04526a56c1dafc9a5c3b2eec3e8b9cc15e6eaf81df891db3
+1e4a1578f50ae8b34485e77abb15bc441dfe8dbe345c23f8378de08d802e
+6b1fd78d7f06217fcaf8737778d271c391cc56f2111f7600b59d683316dd
+dc1c3721f4e1bf984f1c1922b989a852ea83eb7cc9e907fefaffab3777b5
+5b0f4b31ef5995c2e4d1f076a36c6dac984dab1fe574f6c30f9883f3adb3
+8104eba28e817d1c8845c2e339509afb6916f2e74a26335df0f2389652cb
+b97a144bd0b34d282501f1ac84ec15b8ab7208be238220a6d45443928c3e
+678a651ed615ab2419886ecb8170bca1de483c4bf773a2ace74003476dd4
+9cfa70f78ddb9b2d832b6da5cde76b8286c581c6e0855333f24c4a849b3b
+0591099e36178aecee54d3a7d3aee7c2af5c84555f6a2b6d0090938f6a48
+177c4e5d34c0287c6b8c4a0dd59ad7ed951e296d122a8f174da1497fb317
+2426125f25cb184a7e89665539ecbc53e89416e28a146b933ab891ce7291
+db110571cc559ac79a8f06534d3aeb78af1fd90c1a62ee315df8e9ea58e1
+3003e4784c9354d1de15ee86207c70f572629fa6b62cad886aa18a39c2e9
+f2dd802c49542b085b88afcaae2ea3b3aca61ba5ffd9f4e3d2c1e9bdd3cf
+d5669196623887a7a2016ef55d22f6b5d791e1b787bd8c234d2c715ce9b4
+0bcd0dee3a9ddcbb71bb1ddbf2a76cd4fb4f0d7d2b786a28905989ae899a
+669a081cb20699ac39b91b6fc7a98870cabd07f2d54d666e66bf182334a9
+236157ad4379069afadc84bc9438bf76ca41bd153d38f64b5af32421d933
+0f54c7855f00031060c388dc4ef54a67ef866969cf47a6e684367c794f0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA57o00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F2 0 /0 F /TTA57o00 mF
+/F2S85 F2 [133 0 0 -133 0 0 ] mFS
+F2S85 Ji
+4424 1019 M <0102030405060708>[80 45 74 45 81 59 51 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA58o00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb22066a6b46d2cf1728ab
+cda123ebf188b9a6b8b24cbe57d2fdc0fb1465e42a4a57f1b5de50d12264
+c2c52885376894a97a3c08ba53166de08d794b16c034e3260814dc36d7d5
+bd49c3cd5a16d882e9a1adc9ffc8fa13e3d736dd14a0f59c0e23b738cd57
+789aa9c1769a2a0780fc2c19fc708dfc6073d95f7be838edfc03cbae144a
+378d7cf48890570309de33ee5d7cb65a04e574605763d16439afa2291a11
+03067d6228112b327dcf9ec9ffb4b4c5842fb3d130ce409f5838ceea1dfe
+56bf53695ba7e626b7e902e190dea669301951796a841a0bedb5e51d3c09
+3e882413436423ef296308bdbd1ac60b84bc70376ea86c1b07062f7a204c
+573da34342995ae05ec7dbf7853f2e5f9b9842c8ec74fa1d38c508ef3e13
+c69f19b5dfaa844e9cc5e3d791f36fae0adfc6a6e90069792294e2170e4d
+ac265f7c0fdb3301ac4b0ff5ec185b21826fc4ac759a856acb923365268c
+2939a33c5bb257385b099f89737dc9f92a81ffee9fd40483dc6e9e1918ce
+cb7dc0141b3fb52a6f9326e075efd4c5296c39718ff35463da3ad067d02a
+96d8b41a02f84adff5bb4f6950fbca87a3db27261f99d049c78ce3d75510
+788b537af73800fc21501b72ac3cfea52b9d86946fa2d807b50640efc784
+9492f277cbb4a451bccf504badbb0f5e0a8f6bb116d8c16ec3522fcaa2e1
+466cdd96ab803f47d4c8c206b5676909ece2e6db8dd88afacd31b9f5a670
+5daa6dbf84d3f053ba4261a8d3707311fa9d46bda5ae891aea4ad6b70360
+08628f733151a4f2262aadabac443b4dce72ce55c62968cc0205bca2e296
+41c53ad39c339efcc6ff63a56440b6109c071289a18024596d0840bc634b
+fd0076c39db41e96443f89d1d79f6c796b3df419f8d19b9abebd474cba56
+f1b0be6e75199399666b1e5c297418a5e05575a85f4f596615ffdb47ea6f
+79933ed05fba1911a87ec7985fe0acc52c074888943175fa52470b364398
+3a99eead59369a00556ee687c9ceed2e8a95d9dc1790034d2fa6a19919d1
+a43f10bcae5e14ef4ad036c7f44cb63f99f9a2cf4970b5760fa073a6c970
+eefd0ce5d2fa46af1b542149afe26804a834ac0a7f727ef8649d6af07667
+2724e5f7b6b25744e674bf9a5086196b7834df64bc3bcab2cd70a1fcc492
+b3e7afc80f72e3a84aa5d3e5c3c902d6032f41da6ae5e7340944e1f4bfb6
+85fc826248d897cff0897e4c590258f8df6c84c891f3b46abeabe0411cac
+70b9abd20ef4324819bc49b28fb3df7e25381d9d21c276fc908aaabdc532
+6621c5cdcb3dc3dfa758584a9b8f86e7070ade12bfdd54b1f56947eb98a5
+a46745809b0edafabd19192517147c68d4dcd55b2bcd924955d09d8a363c
+596a4e5f0b18e23813e70d5231def676dff793ad0f4af3ca4b279d5276c2
+adcdb87b00531a4ebeed39d836f09861386999c622bffdd5df501c7e7844
+6b559037fce2e95221391d4223368d705bb40bbe7d1a7a7f15c49686a9fe
+418d72a2b9fff5bcd68b058633580ea72709a3d95779a06821f56d70febb
+a767246ff6c567e7d4f3cf63c69551a37652aced5441e9e5df350d931420
+916a69ef9a880108df611eec29d502d08b073b78271c1b151774392639b7
+5cdbdc2045bd3a6f81086d8500e50d195207f3b4c289539cebaa82ee9d83
+05552788b36623ab12f103176a73856bfa4e6be9cc9897fc305b86829b30
+2c0b7287e514ef5e9b10733ed95ecf1b51121b9ad99f9becada0c85c7c1d
+c8fe8e896c083bf9daebb69e529af516c09562c6bc8b50eef72f33b81e7f
+08a88ff5be58bfccbd42f96a582ff3d3ba11218f82d121040d0fc501dd3c
+fef1e5d184c959108f096bbd543980458a682ea0ad0b62ba31ceb3560000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA58o00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F3 0 /0 F /TTA58o00 mF
+/F3S96 F3 [150 0 0 -150 0 0 ] mFS
+F3S96 Ji
+4395 1188 M <0102030405060708>[92 50 83 50 91 68 57 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA59o00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb22061485d7d0c2a0dbf2
+930a8f5918a6862051241b27b50bcdabfaf3447ec6b9abe16f841c5bb191
+f22797fcdf6a8c8ff86f049be5c0235027cd0afec26ca4ec8f456e5fdca3
+48ec1263f3379ff320dac2de3bf289d44a586dbc7321cc21f6970a30ec04
+4c81bfe4cc4aad0c34c941050be71d47d6b71b17cdc52f5f4929234df4ce
+8e8dda53ba1756d68ff2998920764c753c787ce2aad2b7318beedaf154cd
+ed062e47828b15606957a37f2ed31c497b84f23af55a4be8ec19ec290bc0
+8b8a36d4f76ed450f2b6bd24d1ab0cb9733ded98d13d121ed6e61bea7f25
+535d7bb636e41d1e6c85066ad25a4129078090ff449da4901c333fff5a65
+3b109d418559dfcad8a3b95343e32949626ae79e1b9b76f34e85f8ad1d02
+45224ae5469e6de5f8ebe918e4243c58795f146dcd8fdb345ced4febbb37
+49447b9005b7e9da42f5d30c4760fc2fc25f01bd6cabee8635bc3b354b51
+4640db9cc5a1ffc3b043e11b946b86dba33ae4d62a6868a0563918626a9c
+ab48b3a26ac63b32314dd3e73ffdb937da9fd8641213b6e421733bc26d75
+4436a44bb0374923869ba9d9e3ad5d720963b321d55c8a69622f6e513484
+cb56406691e8ebff011186c94bda3ae6d73b1ee31e0ab7a00d1ddc0a0add
+9162daa7d98b701e411ef69cba5bab29143d51a6621fdbbc6c2786715312
+6abed7ad07ee21ea4aa2604ae9801151304692738429383a6be9e2420d35
+36706494a215bbc41a8b0720608803753eb09b8da2232ed01b25984e1ad2
+2ced31325125ae4f61f6c40c003e081c25e1648f36c734b9206e82780ff2
+d6890dfdba56a76379cb87ccd6a207a3e96ea78cf156ef86936224d070be
+a4af0e4c33a1e9016db6a04374dfefe1190ff69f20c89991541c22cbeae9
+d716460f215a5e3cf1b3da78cd2fa5c732024001c91382dfb9cc28268f71
+6097460b697b27d156c66591da3701476c10f4a699da79d411353d984a44
+335227370be063f904c2ed3046c105d07d009f5586a254627bc02cc60086
+5ce2c25952b4ed43a867b1e4de7312dade167ead9739792765d1987c094b
+611be118f5392f62b207aebe1855cf31d6cd93e85627a1314bfe1c99231b
+3f5fcc8cdc99e8c843f553f264d4a676e700104c4f98640d95f912bb5c2f
+21d3fd8ef0fa3759139bf3e24238c7571aae8f3db149822f24233c25d03b
+e95c19deb5e0fb30f5ce473f81cfbcf25a3998b511c61e1c788aa5653bca
+a78621a572a576df9bd271e38ad6de59995df949aa857ec90ddaaa3972bc
+abecf967125d88bf8cd80f5864010b927ee8a77909505e8a0d84ac430ac7
+7c3568384caf36adccc0b4c083fa19dc61f5a35f9f51adef83a1e4410507
+9f1238fe26633516e27aa116a1ed20889fc23c2e803a34d17ca4a328b654
+df8bf4312ed207b24abe6b205f401b2239a29154f251a6ef7a5a8481640c
+c92819cd1aec2d6cec4964d9230d8011a9908efe0a14f825cf3bfbe84d7f
+bbfb539c127c84611cb20e0a59301a13b4a5d279c763a2f7a718f99073ae
+5f18d7c7e8c9d8f4baa8ef33941cf41620bab2ebf6b55d781ec3b2bf7157
+74e3ec25418d93decaf162f96cdf0d6f96e81997358c0e1cab62af3bcb24
+86904a0858a07eabd803e5379b03c650af98500509eadef2b1afcc03dc34
+e669c1b996554c6ef76b1a40f130d9d342411fb9b5ce422e71166545e4c6
+70a2abdaf7a4fd819d3ea3c501917eca68803f09af97fc95618a36048ad9
+93647725ffd4bbc4fbbda3258b92047db2c9309e51efc433257e23c84274
+90d257dfb2ce98ad682743094f1ea6342930f3b9dcda8ce2d665e08f7aa3
+fa4df153a7da21f64c2eeb74351ae8cea832987cf187ad483d67900000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA59o00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F4 0 /0 F /TTA59o00 mF
+/F4SA7 F4 [167 0 0 -167 0 0 ] mFS
+F4SA7 Ji
+4365 1376 M <0102030405060708>[101 57 92 56 102 74 65 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA5Ao00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb22066ef7ec7adad4e5d3
+8b2e433d08a0dc640353a02ece412a4b09d5e6d3465f6bc5e74216dd072f
+3e9e3f8ddd853f280cb37ec60c99e5ebfc757e7be973819b39ff8196497e
+472a63fdfc05e286e46365bf4d55ef237a062467084640c98e5d0dbea864
+ebd8683f644b0d7c6923a28af309cb98a3be6e046ced7cb900f4631b119b
+65be6103be27edf87e4f495d1753cd8bd59e99bbebd2e1d600fe9e2d5ae7
+db029e32176da132e72f490d02728cdfd28b8be9472520c524363b527f9d
+91b3224e223789c3aa5422aaade5dd21796ca05e253143fddcea8d000ef4
+bbfa338c920b5c025a3475b44b9ebf0dec8b8bc9fd1a4f4328f1dcfc041b
+902792f9477fda833b0962748e3261db32d775f63eca2c99bd863edb9c3a
+e5e06bc0886cb9de7e91161055143943d5b9ffe3d69894eff59942c6e6bd
+14f1764dff5ac5f1b0bb60812e6ef1f4935a5443092a15cf32a4b18e21e9
+aa333e356f31f450f888aa11c25480a796202faf03196243a7fa68bac329
+1dbb3b0d7ad4c7f80f66f8462e44d066c558c16e377fe342997ea31c3c00
+c0903389a580aa761d9ae539521a4cc09f2cb49232385ffcc7126415f498
+5289dd79d836c4d11ac344119b7755cb406f12c2bc0c6abd598754be166c
+9e62e0c1f0c55e8e205273db43574b4ce35677439575aa7cce8b1860f212
+3803d6a99b5f928e00536bdb35d7f77b9caac62936e902762921648e9189
+4586de6c61e572732b0d097683bdf4e2f7a0b9332efd48b15de3d934c324
+6d96fd969ba4abcef9b28563b45c266aeac1782cfe4ef1d3baac42796450
+3e0ecef9b80d20a51c757eb8eb8b4cb3832f1bdaf75d336748a3bf5746b5
+48d93f3a13fbd0e29d974ad5991ef5e14ee409d385d59d83fb9413950468
+ea2b09a608b72a0b7bd60ecb9814cce7d920b22d387e867a23cebcf54958
+ac985c6433b3a65b5778543daea52a9beae38bc838995895bb2262772b07
+7a4e0cdb87633287eb320b56d652895b12f39927dd54104579c497fd1c47
+25bc223e54ce3fcaa22faca351346c4979209419ec33264b1578034461b9
+d2b2359f310d3bb0578f30e5b729009d6372fcb1d6430e282de232363d67
+5eac59c4a6704836aa6e274473d2f6220a627c9ab5747fc3115ac948180f
+549b305bcc2895ca1de60aea55332b2b180b36831ab380b7c2f421ca5689
+7b173ac0ceb1e4198cb47b8c626057eb4319bb9b2505f3a6c9f4638f14e3
+f07c1d915d490174d7b6deccda599a3aa67af1adb52192c2b0591f52ae78
+78527f69baf10ad6bea8d1d50898e4f5795717bcc90cd5f9078caeea6760
+ff12a1ca76439be0385cdc3c7af7905a904828638c51121648265d99c5b0
+16781fd791060dcfe4a611b15e5c42e92c1a31fd40f8873c79b438041899
+50070799a04d114ac98dbadf46a8023a4413aad03c2546cda40fdff6afd3
+70572d90a7709336daa37491ef98c376a836250a37818621b0ab50401e5c
+137004bda09e99ab2726dea1b4b17afc11a04c20cbb9e12f70bc3cfe4304
+83bba0e3079cdc0a27ebffd6701cb4908f0e2afc384d7a9ef77170216a6c
+acfb8842c9c700734705a3828d0f43b2bc2d378b16678b9daa7e20a62217
+5e41ce1d9a669d4a4accf73231cb66c4671642c6bc2a5cfeb84e58d51344
+3e4ee31aa83dad85b034293d42f390cb9f6949729a019ef973fd4d2a5bde
+aa3b3d2d41de3daf5b11c02eca9ae7441215e0c44319c090873208fa32f3
+caf24b4b92d67e744e8234207efaf0cd03066ec4d84ac8e0f71138fa5ecf
+d4a87a60a2b5be428d95e0fe40147782a1cb875c53e84ba042387a35a687
+e9e02f0a7a934069d2dc97971f43b809d0a358a5a92991cc279b4d0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA5Ao00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F5 0 /0 F /TTA5Ao00 mF
+/F5SAF F5 [175 0 0 -175 0 0 ] mFS
+F5SAF Ji
+4350 1576 M <0102030405060708>[107 58 97 59 107 77 69 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA5Bo00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb22066baeb5dbea4fa9a3
+71fbf5607f4335673d842c1fb7de714eadcb044948b7458d4cd4d22f303c
+51e1270d84994826f6a1a17ea11bc730d40426ace8a29926f3e4fc00e701
+a90ee9f5cc95cf95beb409d15d258fa32a3a904d0f959273e6eda6f0df7d
+08ac5dc01d384b162e5ca1aa8a3b1f45c0ed44717a8b1d92a54ad496aa6d
+86c578d27a9aa506dcbe25e7181a98e99c355dd06cac8f9f8c2edc1a6278
+1b861b29d71b1ead02638aa086f77942c6cae5fa9678321e48be7a95b860
+56566e58dacbfcaa51dcc09cb1f7c4cc3f34dcbd2f5e33dfe4222fd8b18c
+36bf74b5d48df7344cd4cf4972bc08ffa6f62ca6bc4b0eee26ece563b33f
+5ca6f0c377d134cd7f31c4802763cdd756c01b5ec85fb2a1a641d7aee478
+26402f527ffe707d36f6f6f90c180dd922dcef1c5cc10cd1d26c916f8362
+190f7100cd97d6feca5604bc997f8cd99b7c0b44a5c4660d832949eaa19b
+bf9aa919275db8306def142a4cbdf5689c190b4b9e9d510a319270245dc2
+16e5f52217d490e714fed8e83d29d12c55f7f01e2ad235fd852f2ea19ddf
+ebc7ac1d32552815089539f04b30e775082de5a863ff0365f5607b7bfac8
+2887ef522be1490075f821f4d5ef5ece2687458ac2e87c1d503fbf3795b9
+47ae1ba5d480635a873473d7551abebec664e312e7b242f60c471eeb4e88
+b86d6d27d6d71a55196e112a1bad2d00f428d7258ecf7541a70894b2c812
+db5b402a617cb11d25510f8ed3109a74271835139e732abe651d81c5cfa3
+52703ee63da6b2dcf5929a3724c661f23e316c04cd73a3a2072f56390b79
+a7500ce8575d6fdd9221b5347ec45bb7759729a220a37b6144b41fdd5b3f
+12d49a9caf57421edada1a5752f216108d2c32e40f5cab75fae02f7f3b27
+2834e35707f4788f3c70190d486b5b5baa19ad85e3f694abed01aeab1f05
+2a7b0b54b2531eb9cb1ef43e53eeb0f5969812ca7fec824a63bd8fbfc78f
+46adcf490959cdaa80dafecbc397b558f027a97de9c3fb9b55ed5fde50ae
+324323479715e14a95a4c955116c967c7bda2119923fb71f1f1021a74f1d
+69d17e1ab09ec97586d63f267583c43b22d528f2b57c25c53e4e0b07bf8e
+25bbbf3477821da145bd30c01373afff39e2baef768e0425857900d83ee1
+dd635c2f317258a2fab349a733300a24ada26a77464995e7e0bf2c24de2f
+cd756fba3610d79b0f69be5682362fdb0dd6d159b27578deeea4b892db05
+55f50cfc5390f24fc67ddd9035f72675329677af64cff7b051a1a34288a4
+9ce551925ab6ec27b552fc677d566a2f18c75ad8002b2ffa6b0ec56d20fb
+8f27087eb5ba673deedbb7f3e588c740f85682d3ea2ab618978f7037f659
+7da162957e953a97236acbbd757ac4b73bd8e60d34d178102477c0574175
+28662b96fbecd33dd786db3773f3771459fd92b1e25a149601d8fdbd7a6c
+f1de6aa1a61da61494f8c7a8f8df88b09c72a9d70a51ef10704a324e8756
+5fecf5c04e72193933506c7a0b3d55a6d59e2c6a4ec96ec0070deeaf6abb
+50f0d29fa90b9523fe30374b73444bf11dfa093827100f92fa75909a7fa1
+107d966ea3f4ce988cd246845975e87332e5e277e693f0588f2ca55c1e06
+8b1a6b5e2914a40743a964c92356393c742272e9eec81ea0fd77d8ddf90d
+2a48f011233c6b0d65a1398bc12459cfc161bc15c22ff325a0aa41b29d3a
+0c652a52b449502683b5a11c5a5072af5aab99ca2e7b5be106b03f066826
+5b2bd317ea19358bb92fdad766daad1cf9cbc8c81d33da27c41b0be7c252
+378efa2dd77d639f6eeab6e738ed470c5a9c2ff96956aab708cf0129f182
+19a5599cef850ffd465071e2d44b2347d401f82fade624e4dee38b0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA5Bo00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F6 0 /0 F /TTA5Bo00 mF
+/F6SB7 F6 [183 0 0 -183 0 0 ] mFS
+F6SB7 Ji
+4336 1785 M <0102030405060708>[112 62 101 61 113 80 71 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA5Co00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb220616fc35b8e91f4411
+2ea3e18d75348a1b570035ada3ca7681f0d5845dd9dfec3cd6f29f9d0c50
+ad262fb16bc30f7723e63f783c20889eb90751dc023bfb4ede4165eb655b
+6163541eb0a9d146f382dfcad00d5398d12bb905725708a55921dbcfafc8
+fffddc36649a4d606ea08acc886b1ec07e6d5790eb9723c3b8c8bd327929
+5acebb70c048f1bb55874dd9bbc0815f7617c4031ef813c968dfb3b69a59
+12039471551dfc475d116d9f62ab9713c351ff48ffa5a9b6c0602990b34a
+985e118ccf9b853ec6313649c6ddf17b10ef6ca51360a0c19710daa58695
+4c14858082820bb3985a8117932627679a0ff497e1724d5b0f0994bca28c
+3d9b57615a601a25cfb1496187e3697596c87670600397a0b03d87cfe888
+e5ae783f0ac78a0198392285b47056cd96dad15fa8a95954b0d04fb1cc64
+c39402320e2f365dd118708e1c8f9c0019f4ca95d3a33bbc5fc700cb2806
+02b2b4de764f0a55eebed1277f9b5c71caf3f119ca24285d2f736386aa92
+a2ca367d9a6b3201f578278a52ad274c4478fea87dc93b97df73cdcc7a2b
+b55205f2c859608e06cb37bdf8f2be8e75cf505eb0e77781e321de98f410
+bfb42b5fa970a743ecf7ac2a3d8e49c32db746f11b0c52f823e249843257
+48412382bef94b64cddc4841d3c8214a8e56aec81c12e9d5f456d1641c36
+c477ffc722b09b1b8fa301f977ba6abc218f2fbd39419917d82bdcc1a5bc
+4f781865006f56faab8321f0e3c9b4e358a871dde55e36c46a402005856f
+4f83816a420730bd83e5d894fad1879bf93f10325a8830777decaa17d3aa
+1493a38cc7684235778bdbdb719f1297b854156d101885b96e98b7222c1b
+fc11cfc18c25b03a173b05d53c5f4385aab31a2864f702402ad84ca18eed
+c09937a2b31097d8b07ae55b8d1038a7ce9b3c70b6fc88db42d0bda799fa
+fd17d6868c14ac40abd445c91f03b5b3a13367024e0edd28408aeb40e05e
+732a268432a78cc7095b6807fb6d97562db7fb82b53277cc12062b50b480
+33ed74b2b39e9f35727a6cb20a7b35c92be650a1bc35252c7761aa55c6c8
+8442073108bcdb015fa7d8fabc5ea6ff2bd0c372403feb12da4ef9adf970
+6efc84b2a0b531345ae34d9d3699feb3675889d6ed757255a911d766f0a4
+dd34c57301bbe1265e3883c7697ff7116c5a9cff89e8bf96cb16513a1e86
+f6b1239f76daddfa3ed680db35a2881d3fa08b9ba64f09d1971958ce62ee
+de4a1c4f9e69ee0674dbe1ec200a7d1d76c52ad7f5025d5f812273f18ff8
+6af9f5fa5bff055c25c590e50fe8eddb3feb6ccd8e0d9fd0ac0916658f5c
+0a618bf4cfdaf2d1451f29869de7771b66a4909f7139825334d97db11f15
+a9359cc2d5012c57fc9122b248da66fcd042370313d1729e9ae288203470
+1b92f8e155c72aa48e38f01dd3651f516effdfc5bb75d612072f7d02aafc
+86b606522e2a5f952f9c62762b208b30be4b59130b141db083f35a9d315a
+0578a98ed4d0ecb7c5bbb7ea94d5f66568e12c754a1d91c199c8ccb95299
+c4bc3e6e2e3ffd9384e9bc392900389dda064e849fedb5d38bdddfafd0fc
+7ebaead7941293d3f85ab533a79fcc2286dce859b663142ce0b16a99750b
+e0a02cca5a6e4cd7e0d46fd1fac9c833bbbf33d307c3741f54ab210bb4e2
+ba0077d05abcdc9334e07f77dff7cf6515f2418dc5a93043d4777ac91af8
+f4cf77a24e14042d3046797038b4fbfd7d430563657ac56608c6f98b3769
+2b75a71bdc4781c16bf3f738a1d3ffbd5ae9e99f3c691ea52f311236b669
+d7d0689268d10d2d90ca9d06b88097b2d72ea20c75109f87768b2d489e67
+2330db7f78701b56cfa5e5b02eb6375b2df4e612630504bff664125a0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA5Co00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F7 0 /0 F /TTA5Co00 mF
+/F7SC8 F7 [200 0 0 -200 0 0 ] mFS
+F7SC8 Ji
+4306 2012 M <0102030405060708>[122 67 111 67 122 89 77 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA5Do00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb22066cadc506161c23a7
+07cdaf743386c9822f1c3d4f1494deef8094aecfa106d5bdcefc2934aeea
+6c4639fba0af1e13157a96336c8af33c57c65e0fcefc246506268822e518
+cddff1357a1dac1553af2b7cc7c807b2848594a4ec5eb543f2401ec4a3aa
+5c3198e4b670c8cdbca93390ddfde52b91b320ee408da449cdbbe4b8a5a6
+9160a65140185ee849eac0bbedbac799f4d0a8bcbb61f53c0a60fa06e396
+e2db21c286f13dee961e86c199cb40f7b489412d0e75822c3ebe0db17eed
+df59427be23998af0d97ec9f6e15cf937e9aeeeebc5ac671d2ae3d35819b
+1d21b24d78783e94bd21c2e3f61c52b62d334162bb9a14504c229f656c89
+872fe3863d2e9b6ab97a470713023e22e8f9517cc057c317547c546577c2
+9a4a39657b10568ba08dd8579b011d4bf5ab42a847852edc43d265df501f
+05326c3804b1fad0ffa31e7629b54edce59163ad88f88804675e68747d16
+6286211a0f76666185aec30ca45784112a93bcf0ed930a554114ea2958dc
+be58bb93a657e161193a0114f2d16b2ac7418cbecdddd7b9afc10673c246
+c814cfbbc49e88044ac141baad415809ee06676d000c2c7ac663be935b1f
+04bdf1e27fe903d292f49ed28429a6a8750e734895bd4e681f33f7e0e615
+78282e452fdefdcbd93b89248f3172b927b1563a4b580f303f294847beba
+b5b8ab0693692817badaa8d4ba9bd3a17c5b0db7f8c36f52f388261cd797
+54b5bb730849e083e1cbc9a0c7c4597bc0dad77a79d35fc6f4e0ea162d68
+4fe21b3223dfa8df1137cb37a8bad1f221f869428f779bafa584bce859a3
+646ab50caa39997b3fc3ebedef9109e7b32efd180b3633b5cc562cdd7ee9
+68789ac1dc8a27261c09aaf09f69c61ee63c380913bf4baf6944d8166a5b
+54b8ffdf78fe6875854d17898d53f0fddfe5f913e41f9657452f7c93805a
+ecc771b74975813179e3a181d2f7268c6adfb1c923067e737fca7bd5c060
+c67755410ec3faf0265d0483f5c66a31bdb89ae87239d3bd8bd49b4be079
+2565bd4da3eeacab81135a4fe96733e47faec3fc5c1165e25a5f5c19e24e
+589a1ba2cb960ab30bf2cbf442b12c3a75d752b8cc667aeb891f34329e41
+e6a35cd058c9a5d8d78a6bd7e9687606108239def2530636fa2a02d3091d
+8abd4583482272bf522b3ed2eb217f1c209621fd8eab075683819b077977
+ddc380731182d2d34bffc8f253ba4cdec4c054bc489682c39287cb8e3ebb
+1c49c50617994d8169ce00e67f617d5ebf7a7c5390a3096424bb3854294d
+a66805215beb03aa892ba9019872ac2c3cdd408b7a3f4d9ad3af3cdaa284
+bba725d0d16636c723507f53258a97d77cc8f9dae0eaf1dcb7a6f58c0bce
+5339f3cf6c1e85164624363e4b267f471170d417d307080d11dded682cce
+378cbcf8fb1f98a78960b4a37c917346fe6da893d512ad58b1f33ec6ee88
+201aadcf068877609c68922e6eaf21524367ed9cb711f1b4d225ba8c6302
+dcd23f934979a2cdf99e5f99fa661adc0117169415a20660498de8046bde
+1bf97171d5a06cf380771f4b0356847bf466fbc7ae3998fc87ccfb05e624
+1179a30746391da63a4e2a19a38680c7a5e276ca15712c7eb2afe8430882
+eabd46f019c882f82fbbd86195810899a0c676b9f322309d945cf5010cb5
+bbce1a15392d78c20880a4edf30404c1005656b0bd33dc31b1624ade0b5e
+ebc291cbed766f163e47554522396d59734bc0bdc46f207b9e9b62b94a14
+8039b5a3ed8720863aa1d0774c2738767018cc6469e35aa9f2ae6409842a
+8d18ecc86eb37249e60b6056542f605e123c1276e606b6ca246111b2b5ab
+1ee684f1c915e1b2a8b783e7138f7bbc48542315461ddf686d17970000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA5Do00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F8 0 /0 F /TTA5Do00 mF
+/F8SD9 F8 [217 0 0 -217 0 0 ] mFS
+F8SD9 Ji
+4277 2258 M <0102030405060708>[133 71 121 73 132 96 84 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA5Eo00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb2206689a2c7f31f86d83
+ec215dc15546bab381b4f0b8cf598b3de4c3de3f6a106e539cdb0f64c685
+e8ce98b2286105e954732793d04f8c77bb313fbaa17485daeba6e5c4f6f5
+d01696085413cf6d9ad5a061c2eeb124bbb8b99bc879c0521034f10efed3
+37a6d5850e031ec2caee80822c71fef24a88e5787fe50f5de916d2d6a3a2
+e380f8898b9210c3a198ca0f76bbedf8fded493125b69a924475869668fc
+861cfc389477f13d02bb3d0d067c2e164b56613d248570c4482ef87c54ef
+4d4d50dee5f62984f8581aa288b09bf7e231e844c7f50e25f78f7e6ed700
+18dc53b8a138090dc053e18ddfbff6cd6d885a3703a59e298001310379f9
+be660008ea82c80f1447f0a7945d0745faad0b0830ff465a65c587c5e996
+95495f5911387ba8aca425ea35b80e043de79bce76252042b0cde47cf891
+4efa923553835ff41a7b627bf6123dc1f6206fb88246c428e4983733f82c
+fcb24f89ed1b6607ec6726f43950e1a20ae46bc4181f0abe0ea39caf020a
+6119f6355ecb87c1b45b72b4af80d27a3801a6e1fb792c77fe9db23d751a
+0c0c62f748e06896b179fdcbbfb2a8ee05fb52f687f43a5c018505f0649b
+5f257546b1037a8de164aef8fa06294cd4f6e058aa2f040c3cc1e6440341
+4fd43acafd408d15070730b8d5a49a1f524d57a23730fd79727c21e905f5
+a653c7bedeeeaeba7382fb9cc6b703f29f89ac4da5f8721c0752c884473e
+c3f30e16b7eda908f68fc34f96f25faa76585ac41846682c52e2ff9f40d3
+3a61fddd2ec477641be661f5bc7e51018abde3e7f3dca6c64425c9025bbf
+7577dc758aaeb5e3aeddc592c365d50985ed3d387f80c73b28185997ae1b
+2e1a77b025b36f91df6ad12be854fe79727317fcc10fcff99549233530bc
+22beaca0960ba7e2c092be4e9af0f630b6e7f22fd0d30c1f21cec9418066
+eb5e81abbdcfe85696bfec4cc7746886880c04eb0b333a42fc1f077dd7cf
+7d4d808e690a15cfea75a4998c592c52967a33da837ae0569142330069fe
+babc011d29826fcdd1d64a2cf3112b20d98aa16e1b4d1574bd8e124bd7f0
+169c402f37a7cfc53921608cdecfd58447b3b98447edcbf69e5c5ddd2c8d
+cd73f297c5901858a9552c530528872bbaf2dd6215fe304cb767529af72c
+67b145b0ac5b1308c855a307bd78548fcfcaa6eef3057280ae00a90e0dd6
+fe6c0b5d68783be52dac797c2cb6e7243331d7e9ebab2beb54d02a87571a
+43fda71b3e15f97b5c965bbce78ec8e6efff04ca44fe2c4aaee2d981f02d
+af6c1a696b6c86fd2b8ebfbe5b3dc92813be6ce95a41134640e27643a851
+55ca711bad0cb9a26482e5a8f6ca3b067e43ad332c21c148b0ed92d55bae
+9ef93397577adc025f36f6ae10d59caf488ee9b6d6bbe3c55b6447c7cb7a
+d26e7ebdb2992907b685a7e703d3024baa3b0787e89de76fea8b46d2b473
+d6733b40d4e41923d6b923b190103fdabcedd8e701ccb843a760aeea1096
+212590c5a281a108951ea4cdbc2e6c7114724b5c1021d593605618a4d7fa
+df5bf17a2e5f267bb62ae421b46d3edb9f8856438664637da5bfc861128f
+c5639ea03dc7290c690436bce7820156c0be99100274f97054877a573ddc
+9c0be5dfd7cef8f7c8aba68ac05b9ce1b81180c001bd7841349c9587ba21
+d9b158599b672a7c42238e7eef628da1a88b539886a6b9f6c241a53ff44c
+adadc01d0ef7469509c740afb7fee4eb2a75ef8e78072229b90cd292fa96
+6f94bf659328d23cc7f22253a06cd3b0d2db36646f58084a622904a66fe7
+9b6260f400bac49be0e74934869dca984af60e898905b07ce5e37e729c0e
+5806c2b93ef7a09edbaaec50e5e49e7f9673a9f463df5eb51feb0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA5Eo00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F9 0 /0 F /TTA5Eo00 mF
+/F9SE9 F9 [233 0 0 -233 0 0 ] mFS
+F9SE9 Ji
+4247 2523 M <0102030405060708>[142 78 129 79 141 104 90 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA5Fo00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb22061485d7d0c2a6275d
+8da901d4c90b764c07b7b55a308444fa1e7a528df157b5f3a3c98718c51b
+b8405ef3fea9ef7db06034e263d395c70f718a4b588bc1590b987df93e7a
+72c230091e534b07a2ee7b4cf1641847bfc6d3721c80ad7d67f7b7e7952f
+5297e4c939a240bef9367734ebdb25f95d2e914d53ed710482d6c0ef0e7e
+a5d569ebc4ead0daec244491f71d5c6c5279d1c62599dfcd2e5b8f1a98c0
+883cd198bd7c7cb5d8583f6eb5bdadc1509f1e07e8a60fdd5ac1f91fa8bc
+bd3db3de11f798d327c54f9bab256e9b64ee974c431c601574ba9f16f705
+f849859f9b81fe926d3ad64dc715c4fcdd03547669c72c29ff6d9db7ba0c
+9c8eb6ad87836223789881c8c054a785683e679ff620f747733cf8a65f41
+f41804649ac29633168ee70c441958e03b3d857aef37fe2f4b61a4356640
+8d39bf06df627a1cafbec8c90cd5d4b9e17ddbc0ef8b838887991521beec
+7745da33772b5f1dfee80a89ef3058868878ef1abe7131a1a337abf0c241
+12546185d043c9a89bc0790368cab51d11bde95d9f893797a1bf7da358eb
+b681c63b922a074a5be052b91f0bfc31090ca4d6f266f70f4f4c27ff2774
+475b69301570f64e2a775e961246ba51d1ef37716621dce50b155078fb60
+cd81d9c133641423778e3f899bb102dfc5f28f20894bf5850e57425324a5
+7adf1ee9ed235f80dd53251e24d53992b184dea9bd5644be6d3c7128f61b
+469e5b03866cf5d090fb847d437ca106ceeffd41a20c2feb6f018fe69b81
+d2e1bf7a084a6c95ea8f102ad81b5e02812d7c36395f11ceb3fac49adfe3
+f918e5bcefe4b1425c469dd7e3c57de7a680d6999078510cdf1a2741efaa
+af2995071314fb018448d7dcb5109391cbc69507d206d6eaf1cf74b28403
+00aaf32adeddf5070b80f9831083be56864cb84d7c80f60df6d1f534dd88
+90245a330c13b34b0b487f7c126489e4faebade7b1d12ffc058bbf48baff
+67fb0722a453db48756058436e565969dec48ad212ff410e07d51fa23d54
+f180e530efae113004f42d300251c04eda6317f01db9cc54808622ddb708
+2e4238aed2e5aabad836d08a599bb57a43faef2e1f3e4cabedd2dec9843c
+2eec92fafe755341b5c2b0aa3fa058da19b178a041ac3cdf161f1df3c506
+110fdd73c18af469090aefad97f6732e4478506a901883d1809359513d7c
+bb2aff861ff164e85a79fa1fae05fbcd6c4b3248c4d7d9dcf3ff4ea043b0
+9e9a8b73f108ec6873d7de2af19598798a1e2948797270ca9d680070b2c4
+cff9e32bf2417a6813098943ff603482c834a38ba8d10b16a26e195b41f1
+66dc801fe2ff73ad06165e3c48281bba7c5ac6c6c09774362af43726f85c
+ac8fad3dccff8c7008a3bf70265abe55a724af89b740b3b8f464ad66db80
+06ff96f44b70a5630729600bf74ff96218dd3865fd472776f0cc56bc02f2
+62f60450c4041afbe70d278e7fe87b4956c3a414c9efc1ef733bf317f984
+644729023b633fee715f438df1b36d5f021bb0c018b838570c1ab4a47378
+6cf297596d0831c0ecef9dadb1ce6f90210c8498ddce915d60d9d0ddf317
+0415d5788b83c3883ff9968c9875b2f8f9be67d847b07a4143605e9cdd26
+f84486d0d8014ce92ecfb99bb11ccfc40efe0019383cf75e02f132b9c552
+6da2286619ef4904b9537885b4fc108a295fc33213cfbead8cf919c20b7a
+42e5d1e389899e132428f143d5ad323c4890fd80deea0e1133dd64149eda
+5ac5c123e24807ecc7ec529e5b5fe77fcf4d199f4ac1f2c37fa1f70e36f5
+a52faf5e28918a4dec9abceb374a2167601194c2b5b44beeb01e3203a82a
+0378af4be9359d36b99521b6b93da7a297b1dc05c54edaa035b5b10000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA5Fo00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F10 0 /0 F /TTA5Fo00 mF
+/F10SFA F10 [250 0 0 -250 0 0 ] mFS
+F10SFA Ji
+4218 2806 M <0102030405060708>[153 83 139 83 153 111 97 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA60o00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb220669f64824a95af9e1
+b7462e8101f23040cd414ad1ad5fc3ea20cd2b3e75f6ba5e360e7705bc89
+b2e3bf9d3e15ae90366dd842e27734d8f0e0c27a6a076b2c59fadff0ec12
+8400f2a8d05c969a3b3817ad9f981ccf8ee6cca8c5236ec32d047c5cb595
+b4e3e2bcdb983d7b14810f4c5567975b7decfa08dcb923d4ef76014e6ece
+7119e297986961f7aba4ad98225ea6c1ed25b02f4a2f325595b8cddd4d10
+085bce5d2dbf77aa0a40181d2bcafae4abe0b0128ec44e173da86ed26fd2
+b266135f3566bab3a73a2358120237add2d0efb4b62380f68a275d6ea766
+2305076aabafd83c161527b9200a8c64465680e8d626f3c9662f5aa9927d
+69882070a476dd23399cbdf49c8f6da83cb53ffbc2ab9189fb529a614652
+75d93d4a2af2a4bd529a88a496b70b6abc1a72d91cf0087faf95bb6a9b12
+a1d3f5c69427ec3b5117326196458bebc4a07bf2ac9228381defb84d565a
+104d1a6587062d03ac3c58f6ddbe8979cfa3de980a675af65c303b63e181
+a015445a27b3cb04b1635773e8f0c3b6c95b8a844b69db30b74ee4b6f1d3
+8c9439aa9754161e65b5d4ce67f0809e34167542666410a3f9c56253809a
+8dec6dbcabf721c0d5ca6261144924a302842e973846e6f6f50494bbf814
+4049c7cfac9be4774d06653114914308033c25e328af5a4ab42541699492
+fdc3cb7a1c287c3b623230b9f083ec48e34f2857a7bffd03e90700183d0b
+0f8310b4ada2d2064bae1b46c72cfe83ad9e0e818d1d0f3baf70c228817b
+9ec38a785de8d17ba5093765b4bf6c22d6ba40a9f9d80eadad352b33befa
+92a99829ff3f7d917dff22e221617c80860b8057a91ca0397ec4147f73d7
+7713b73da270437a982c2db0a0a45ea60d7108c3ee6c998c56999226149e
+dc27ff93a4562b508c2b2d36b7504f4ccfa9f27c57aba776456575e451d9
+510ba43a472fe0cf34cbca5b5d83b4976d9390b7fc6dabf21c227f4963c2
+24f01d8f5ce06ed8e31b293a57a762c62db3ae155710d0c792a78014ab1f
+b0d4ba14f48fc5c0150aab1cd18e90e4a1b826a36d25a13d61a73e353db2
+ab6c52f562b648f98112997686d7f9cc9b091e8780e3bfe7695bb967d0c5
+9924aea5d79734572c3568f27a4b53722882803cccb3eb6bf8e71374963a
+3a89239361796eb6432d4dc63601f05b78a250ce6ec031c412c56d5e243a
+7ed5cfb66b44c571d5ecc8b5be209ae1a00acfcb08d949bbc5c382e3de92
+eef300faa0b505282e9b58e82301f42dc79752c3673cdeac3996534c25a9
+56ac8bcaabcd5982f6cad6b059332ab3b7dfeb8e74c4a6fcf11f9f7595e8
+6be17bbfeb1d1f4e1552f684259ef3bf25443dc82c98a4e5670a9da1bc38
+1daa61f7e58e768fb26ac57cf76c1854ab05917d6e3f366d241a3118c31a
+b39e31597d4f8b4591a5725ec081d83ad3c9229db25a508a9fbc5030fecf
+4b86a246d210caf9969a2cf191db0d4ba5944d0dec317f71a58bc7654817
+e703e9af9eb4e6941db44b1344e631067ac9301a3b5639ca77329a8a733d
+e53350ebbaa58635ccb16892e56162a564e59ba132f921477e1bb7f5b84f
+6d9a131024895857a972d3dd125fa7ab1492486dbb3c219b989cdf51f557
+c15999460b08993c599587689f6af0650574123a6d97e293acf6f48b3f84
+2a159a71bebc068ff5a5c890ab433080e70a734d75f2b1a3c4c110f871cf
+8a1a31b8491a83841e02734057361ef04c844da7cb24ab011ccfdfc7e8c0
+5afc3cc8e268965810b6d6a441e2076da2f739651cae11715fc8409f735b
+c4c553c2d12cb4744a448d135031effd4b5b0611810744e162e8b81d512c
+63faf3d2c4c02803cfc42511419ed72b575a70ff89e1e8cdc387ff0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA60o00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F11 0 /0 F /TTA60o00 mF
+/F11S10B F11 [267 0 0 -267 0 0 ] mFS
+F11S10B Ji
+4188 3109 M <0102030405060708>[163 89 148 89 162 119 103 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA61o00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb22066a6b46d2cf1e31c8
+8c173203a6107d2397cabd68bbc408288f57dcdcf1ba25462a21c2a280fd
+4872197251257cb1b5a68147f0eab49c590d0fc4f101316f75d4d0196e5a
+ac34d7d2e9511628ac0fd24e6ff645e5c987e3cd80b41ff91b50316539f1
+945b229cc2b0fd7a67a73172bf84134051c7dbf945bf36c21b55175b1c6b
+b36f0672f5737fffba364f88ea1255b73fa8ee6092bff85991d33cdca1a4
+a4cc23e5faf71e692c5041decff1e6b04eae13e98ece29596770a98c895b
+225dec5dd89035c2f378a13bab71727eefbdc0cbca7c5ef8cb35ce7c1e21
+a20987e02b1872227ac2149890a99f33e4c14ffa2a0f7f6af0b4d8d559b7
+7d52407f6fb4707a7902fb4d0930e09b142a87df214434e7c49a95b20a64
+91cdd7994b2d38bd136500f36657f6ecc27d53eaec93089e292291d9296b
+891d30464a04dee7e4c852933e00e3309305809538c0c3b9a9edd7626aaf
+6ca17228f379260e938512ceda67808ce4982b30312c8c2473d4a1727cc2
+742d35ab6730e4a615192f13708fd9c9e9fb65aa18e78a1698d1390dd1b4
+8d828d743ccaaaba22181d326cae273cfea381ae1305943dcd8fccac4d04
+f7a53d9dc5f61d9c6b34f33c79abceb357e6540cbe4b49b0cfce43f93f59
+8f0efa3ab63f515cefec093c13ec8df9b98f4502475bd4859ae19d8a2a2e
+1ff887cfd300ad50dc620ba7996ab2d06a330c6004fedb3d71958efa0451
+176c4b1e3afcb48c6560f0e4fe8a302c7bbbd2fe83a4bb54a114a1883058
+48dc2965f310a9d6f4ee9ac19a486b987fdd9ff596013b708e29af08ebc0
+44dc8fa57633da7ec675fa00a692161401fa16244c96460f74549e8daebb
+940f454dfc96316f14ebd9fb9c1d86e487175c282f8c5b3008e378695789
+fee70e0ba828400cc3fd62f10bba3e50ae17105c7189ce026e907621fd87
+07a4cd89b4516b5af98a1addbef0ee4bfccd1f306835b2fbe716187f3570
+5ebfb0e16f98cd24a78c82434903f09e5b0e78c02a43d38bbe6f221dc88b
+adf8efdb08e0ebe4608d4f4392d4d9ecfda871039e0049f0881bbd5722d9
+3d3f784c628ee9910cf824854095a75255953ac6376e83dd085b6741d35f
+604b09473df889906ecfd22a9bc759cdc9d1ee7abfc75213b1d495e4663d
+4e722b58de4d50671c19cbc3a4dbd20ed5e0c6567ad69a0c5203a619ff58
+ee3ed1a9d77f10d64a36ba6f89a629f9ffa2a4f1fd2bf2affb4204d5437b
+540625d7daa43bb790183fbf524d914ac18817aeb295da7b40b97d3d4b89
+54977054e0ddb9e00c4679651b905db04b1bbcb4017e4a666154f3c2ac92
+5db40a171cec499af9da1858234e5e15c4c6590c5b2eb366c9d11b3ff86a
+937e896a0b8d42e1aef576893360709ff76bbb3baa4bee49dbf2f56b84e9
+d2ff6ab36add7128d2864d0958598d86c99eaa799662120463dcfe373e94
+c803657a95a5aa31d66e4631f1a09f9a47bd8b287975a71b42900bd8699b
+9730e1bf655c0f68dea05dad22d99852e444d801a2ff17de73e9ad49a996
+c6b23cce82b661b50776d1be87cf5e16c7c88302824f56dd9eb5ece935f4
+f9a43384878fa1d5634f727ac6a6dbadb51afedcede5e3832e91dda9b171
+399d4f7542589aa47f800feb7172c33a426b58499488facaa1a51ed5a8de
+3acf21da23664db141de8dc183042b73a96ed18089c0bb4a890614cd3a2f
+3c4911c131221865dec83302116d31ad9527433038ffc8d0f96f234ef5e8
+ac69c6d1f5b9aeb3f4a0bc248700ba99bf64aeb07bc7f3f368512c77aacb
+5ac234f9386079b6a20d9998967044c40a948a9eb53c6ba443c39797f1b4
+c0f6d1903d61beff8fbb0ff303f0217db50d3bf6b4b8fad466d1ed0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA61o00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F12 0 /0 F /TTA61o00 mF
+/F12S12C F12 [300 0 0 -300 0 0 ] mFS
+F12S12C Ji
+4128 3447 M <0102030405060708>[183 100 167 100 183 132 117 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA62o00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb22066a6b46d2cf1e31c8
+8d680a80f464f13349e5689a189f13dd0689e85869e2bbd27eb19374eb38
+071897af922bc3f8ff6b7c3fca4ab2bbe308e84badd13a5b927c626da36b
+1037fa38a19ada6ac72cbaa7ce1cb85eb111d32a1ef92b11aa069b0a273b
+48c617c3358281f67bd01a76b549470528570b0c4d05b950a91475fe2981
+7a0c2bb0b286c50881f2f950fa93bf9806ec786b46525ecce59f4443e75d
+5d7985890e7128177ef8e802f1813332aa8684a83067f590407c2dde2d71
+73e14b887b636aadc7fab122b657dabd4046c48129a3af1103f40a16259a
+eddaf0f051e1753a1f3e3689e35deb19a06b2f3b85dbcc93ba0d60c5ff6d
+68160e7e1c576a9ffa0ab3bfa64730821ccf4ea1fc95e15fc102c355d570
+338a9b5072b4ccbf1cf9392f81cc77cb641160315c4e0633ba976fd4745b
+687108d2dcbc28a4223c53f842f8f3732d98ccfe0db81dc11ae752887cbf
+9b3a755f12ce22a69d74d5627e1cdfe96f7b6170185a428fbecea6dde1d4
+319929e215abd940ad9817fbd2dafbfcf71a02213753bc2f771deb3397a4
+52bc2eccf72e56e569d6c9d14d3ddb28217c69a621fd8f214394d87cf834
+3f530aa72a28658956515e3a70acdda0f82ac1648b1522aa1c30473fb36f
+b54a6abc080c88bef7463200bc3b84fca38f4d5e1e3fb1f8a7793a202cc4
+44b5ac108f2f5d1fc9330975186f2c35636f0eb5e5c4e8d7e20ec2407ba2
+0ab60aac449ae735447a0bd83c9f649a025f215ca3d2c0a063233d231c80
+f2d81d46c475c8eac6103d9711ce1dd986645286fe0a7d6bdd0b854799c6
+2078e169bc4bdeaf54fe41e9feab27467ea91ce80a9ea2526c0305727a5c
+1f010c7bc04e3e1e2719c2c67f2beec0d90c6248f7062d3a86223dbf2f4e
+6dd858ad111e2fac402858eced9ea7c78d239b791f448448cbff2b9b8fd0
+d7d373837195d94f69ef6acb0b58825d45f9494231f949f9338ea5ac1fe5
+e78a485fe2d456bcfbfc77d6875ad95413cc0b05f2fd0b1d5d87bb45adff
+aa97135b0699ae511381c1092d5c9f658f33bff078fdea96425ffd5320c2
+675fc8b58b96f02b8a63c8b0031843430324f55d36c42d9e4a242afffbf3
+f5f5ef2d79584cd9961d62978d8f5b5ab9394b9ba4e9cef9befe2c720a3a
+15e7a4213221320284bfa64ef6eac7907d86a6c4b4a25747ef60d73f889a
+5fbeb0cfcefd06df792a9221ea8d7a63d331c8c120d95b148eff4395527a
+cd9279d0cfe32ecada854c38c85dae0bd54edc6631aee3a5c563a5553fe1
+487e1b6474dc60916f5c26baf2f306695972475809fadd8178ebe0b3e6b4
+98995f5e2f34779a6bcf317ff8e18af39b8ea02426259c38610fa7d4b994
+247e4d1a70374fbfeaed6fddee1b0814535125d0501ee6d5852181262ae9
+c50e8e99460ce2a96929e426dccf8cedfbebcb7845fdac62512145a65636
+4f48c63755a860ed7f0619f80ba6d057960d0ef012c5c2e8389a89e5d32e
+b8a80d3bf67ef8d84d2c2ceafaaae987ec4030146eb511ad6b2a729bc2ca
+f48cc2d0534b88bca04cd2d60814a46528d0e5e02e933552f1cecb6c5b58
+8fd53c5a53f3092ade44eeb11b399f6a3b90c52fae04861e23ef6d113547
+56f5ead2292e1b05a3fb7c85d6911a556f26a22c15a58c3fa5e46886bae4
+8d0a6baf057d60f763b1901866542e20425cc12e0203575c7f133ab80ffe
+5b222bb798ea64c93abdf1b85010d562e35b3f24064614df3942d90e6c83
+0ed5570bef45451e1d1c5fe32cb9efca3ac8e3a6abacc7c75c02db4ff81a
+51e792507e2d45b4685f270e703d63e15e0c7dabacc30e7ac546fcbb588f
+1043bf9214d0606f29b5e11013bde03b272216c8f7e0b98f8ae9da0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA62o00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F13 0 /0 F /TTA62o00 mF
+/F13S14D F13 [333 0 0 -333 0 0 ] mFS
+F13S14D Ji
+4069 3823 M <0102030405060708>[203 111 185 111 204 147 129 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA63o00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb2206158487fb3119fa92
+a8a86034818e39ec9fc196fd03660d0897479998880acfaf10dbf270706c
+28fa707ce4dad00c8e93cc045f9a10f475da3df377bf5ded23dfbab06e55
+cc7d6cf560ab7dcb7eefb7cf36eb09d88933abf76e7e0394c20619811a51
+443bbfa69c436e08988379dbefa860397a3f0d85b5036475ef5b3ba59810
+143f3e33c935c2c9125c1df9354d17924ca77a47a34ec1c15611c5ac9f6b
+56e9758d7af90235b8ed96875cb14e2323abefd86a36c74bc59eeac84fe0
+d013f3515cc05c7e5f694e9fbbd43f931d6afe14238301aaad0a3c19b198
+b1efec19f875db470cd5db8b58d1a9715b2e1082fcb22755ed511d03db7d
+026c3e0b9897db3d94a72b9cccc5a6460baa0834eb22c9cd4a783353c578
+013ecb0f00144828def066ba832978414b051ff879bd7aa2b1e60ed7b068
+7564600d3b11ee13d514044212f44c470186e217cebcd796acbfb8f18a5a
+b262054a3ae208111ea1daec5d7c42d978501a3a924f6acdcabc5c2483b6
+9a708086b1f1477f78736e10664014b5f7278c223ad56498da95a4be6335
+a2ec179f528e57e99e177cdc7ee01f27e41cd84d37adfac2dc7bdb9272a0
+7ad37ac91ea2c5b6801d3f62417e87cfad0f483e9bd45e55c4cb4911f711
+a55886fea6300530aef55669bf62569d023c1ddd2ba2d038296ba4b6234e
+6a7fd36a75b2a372f98a1ed02aacaf6506c2b8deb73aff137aa589043226
+cb1929a8d09ad7dfff5312d1c5a3c5a13b48af57c294857ccdfbe5fd00fe
+24562fa7040ce5c75ab6ec8362b0fc8de4e7d7e6faeb8b3fecd5928ee6b7
+95c15c7fde8a021278bd25aa236c5e7b91421aaa11710145547210fc9ea4
+5cad7bf0899e082aad912fc701a087a9bd85560095b9fa079316ae4ff508
+e33daca2e55f687982dc50603d7311a9cbe39ab38a73f5ec2b4fd3b46775
+951c0082b5f434756251fb779103b284771c9be4047024d30194d9c338ad
+2b1958e7137e74fd3cf1753a68f030d1e48a99a92131937a7f494fd3bdd0
+e707409d2eec84e68de07225866f2401a10cdbf19d28ce0e2254161604a4
+4e74cf7c6279d55d39a548121129b619067b8d68db383f32a065bb526c24
+b02ef9a9c354d4def81020323ea06c93d647e6fa2f221b047a7ecc8198e3
+cc5e16865013bac7a20500895114c5d97de0c9a3726f288a42254e2204fa
+14ba9d4fb8f1b4bb44841d3d70a6d754b193d701d66543798ab1d3e4dee4
+9e89b21b31f1c07a07ab948a70bde185c4101d3c9e361eb67c255f3bc5a9
+0c89f81def08d4180b0d5e8d0b212e545485fea50427de790af06413e931
+4233d87df73e012d343f71b3a4e0da09ad443e47b0bb230cb7cdeff909ca
+ce2f15b2e2e1807fde167179540fd7e916b69f0d277cf0f91af017925581
+d9a1d66c86d7834f2af841ce657288cbdfcb6c0d07abdf6a0699fb8f73fb
+f5d08ee287c3ce53312842e813ab4675b0d072e1d152f7758cec3abe9f68
+62252ceea015b7587db6c081fed9efae5da5380a3ecac1f0a5391245c28c
+9f6d1f20fa547aea71f89fcba2d979a0215776dd62d4790f202b36db791e
+ad6e7b6dce1612ca4ac3d02d4aaf9322d34ebd6c37e0bdeb11b9c82bdc97
+5ea90afe2d06ef815b2ed0581666f7e3bc9466a68d51e1bd00c8ae6bb94f
+d0fe97fdc276f28d5b9c0200492cc41d53f21336bb0e660e1b2758da5452
+bf6f0638b9e50224c3073622767433c92a9ad7a79b1abcacfab68a0e70cb
+5353fc54f6987b13d84d79b5d954f7b3603ff942fafc4460564d4582bbc1
+3ca21e59a5556335ecc99f3b78a254c52ed6a79ead46d6280e91a5641e67
+a85529b255e42dd69656fdef1ece30227b328d980fe6082bb624960000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA63o00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F14 0 /0 F /TTA63o00 mF
+/F14S16F F14 [367 0 0 -367 0 0 ] mFS
+F14S16F Ji
+4010 4238 M <0102030405060708>[225 121 204 122 223 164 142 0]xS
+4010 4659 M <0102030405060708>[225 121 204 122 223 164 142 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA64o00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb220616fc35b8e91f4411
+23fc68c58b5f46a1f1275e177c6aa9c2eed0243cce590e527cd2227f8444
+14cf47b571f571784ce9573c21d7d38a8b1f3b5c5b80564c328122627f3f
+ac24de4871f2b61b498c1035317868d10aec4be63ce71d6eb7894d350070
+e2d3bb54ff08c43ee722e479e9be36817aeb0f94485e836a5e505477047d
+94ef6bb481178e2636db057ffe2bd6ba3de8544935b3d2c20e99196d9bb1
+847ed930b62c48bee95c908968e4c681545cc28f60f97ed41399a3615689
+6de5fdb9d0a5f0abd2fdb820eaad1a8f08dad1b1f440e099959ed4d516db
+48ae31477b68fa2908927032ac27a55ac3cf78a5e7be83075d2065f47e20
+a3a47beb91299bf9bbae879b26794c0e5cb4e680ec7a6dd1498e36f1fbee
+8a4d52c01ae62ed702f0c1f83b39a7129db168e37b5dae7b92d5622ce8a8
+91120de77d44f809ad1e6cf23ac58bcc4b46524801cee0f6fc7c68d33c86
+0d7ff13d43bc160567ebe1da324107967ed860c79364f8e8ad1ad7f0b0bf
+36f35eb2d1ea1fada92cd8ca58106c9f57f5d9ec3562775df931dd704510
+02b9edb700fbe3f89ecc31417ec84400756e2a243bc34393908dcca3c0b5
+4dec679d743a79ce99a4c11236b9738f04e0cb5af2f57ca5fcc258a0a24d
+60805661bfc9dcad4e514d5089a67ed3f9f73e39b2c1e8e0f9a48d7ae38a
+cf0c1822d730ac58cc5ed4094b96b1d42bd7a4a1493f712a6d160a6d71df
+28e64d9e168b21f188b034c1163c75b0e237fcd7fde9216848d62075c3c0
+3e332de3d9078a9adafb3667a456abb812ff43738c70ab9954d70541a0ad
+823bef3acad4b39195cea348d88a6992440ae3a11e65bac8009eff46d52f
+ab715920e8be65cc950b41190fc3ec3eb9710ef499cdcb28b288771a148c
+2c68140fbe14229148989e5f0f57de39659865c5514eb54cf7960fb50c34
+5fe43eaf66c115e73c8c7c344c0bf8af82c6f3ec5bc2d4804a8c30bb135c
+783b2b4d782235e4734c4cda9fccb033396448b2bb417d58a06168044397
+92b816cab67386e1bee2d4a4fe0f1581ab509613c5658f55e769a7eb49e3
+a89a6d57c389cb0882d32528e2545f8a48eb3838b63974e74181d68d27fb
+91149cb2c362e7c1abaec89872358cd66895a6eda09a1fa84c234ab03c7e
+8bf1e84996115a76012491925771a863d27c46408ffadc375419dd7a90b8
+943b79131747572117d6d98eab875f4a70036f7012be1a9fabd106401489
+e16c198b1fa9fa9b5ed0b0445f00fdbd577ac1534112f51510f74bd87bc2
+73929005be30c102d63b7251697512806da51bdec65b624d8391f29dea66
+9374ff3b6eb2b580e2735de61a835243095fea770d56c0643c0fa15e47ec
+3a2ae9c8deecae7bde01e68ac2ec108fe23f3370c2823598a291cb7dcf13
+e8174b1c55f58b1721904f7f72fd3badd8bd0c65694608b7cc260c5c4801
+53e32fc0d340ab604ac10fa5ce26c0d03745524deb9fd8cc7f9a1bcd050c
+e0cb6a842dfed52761259fae8ca2e2ffa8e52fb637f2db6aeaec66c1017b
+64d6432884399931893f49fc96b719c7650db46ef7743e6ae5e062c39912
+5cc41866ba23c2ce5af2dd0896514145a2aca6d4ff8e71d169b064cacb3f
+2cab77b34b2e7b6efa103a0500bf02453e327ddc59edbc07a8feec4d25e9
+dc9d86f7c65bc872188da32ed8a0edaf431cc32abb5672fb61256d55b6a8
+9da111703d609d59f8bf4a34cfaf1cff1b711314b8cd50b3eb61e99b9fcc
+03e121448636749c1289a892ef822771f7637305eec6f2a799ee0f4ab30d
+f3599ff553d7697408c67abad9f8131e141e2d65623d89574472c5baaacb
+df67ea90065c766f01ef39449eff529461df1673cf8d8d818ac87a760000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA64o00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F15 0 /0 F /TTA64o00 mF
+/F15S190 F15 [400 0 0 -400 0 0 ] mFS
+F15S190 Ji
+3951 5112 M <0102030405060708>[244 133 222 135 243 178 156 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA65o00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb2206179c29b10360f66c
+a9dee7eaab7087c8834ade2a458dcbc6003210ab90663c579b16d5f2ce6c
+289056f18bbbaa7aa904d32ae457b267501aa32481206d0540c6bba57505
+8694477f31f801722d806719a2a318e17e8430363366539a22b2558b1534
+bba96abc799d72b761a18b2c5ca22c2a3c6303914df51cf07491bf3b7244
+369fcc5da2eab0caee099fbbb0e2f438e76541ae37f9f3d119c621e5a51c
+a572a7c5b40ecf16281499ddc4df140e69be0f21ab05feaa553a96fb69c8
+d9b701aa432358791f0efb0ab57c37135b2c1d1012b3a87c88a1e8a1a275
+3eed718bcc969bf3d5875adb9c8b2200564fdea69b4caeb28e464106e61f
+c5187d0970a0e7c36c269bce3bdbfbf22fd4f1bc331689d1530bb268af25
+c45973a5bec46df80df4f0508ec729d165203925c00b1c73901afdee68bd
+1847b34a10e20895dda626c43113a6e11c32bcd477c84badbe23b0ca40a9
+4f0a0701a2edf14b4c675f538f80b98275c1f2c13cafbf673b46324465b3
+544c4a0dd3800d84bbfef594166bddfe875cbaaa9516fe53048319233ad7
+d73686dae086514c82a1d552d1b8f3a6df1b791fd32a6a283bdd970fd71c
+850f34658e75c599798ab218c3156a8605bcf9d515ddc1b8d0005576767f
+a29d14f78c241c98bbfcb13a5cfab805430803fa2c55076ee34a5eb931a6
+a0662c544d59541670e9590e47ff41453b3c561c78d712d270fceafa35b9
+0713c96a1ef5fabcde661f0989d01a640511c47de583b8057d975c2a1730
+9a663389f271616151f02c0eb8e072251bf1146ef961ce587d4a486c6848
+549f331b2ba7c9088f24fa105c4f2389debbb3c7d4368b838809bd4198d4
+b617b420fa507c503ae5c217e416b927495842333a8e251fc075be16e338
+51d62287e9a272f4843f62241e508b952d45ea728574320b996861f06f83
+5e8028a69dc579fc660dcc6afa67f4f47f94455cd2b29d326b7cda83b9ce
+b204d080adce1134af535bfd59b989a29b9b84e3c73b5f1a87068b892236
+23efc8cb6f5677417d1d3cddd5d367fc20895ab7671d1e997b5f12668062
+c18059ecef3fe26c4b8a8103bcaf8767f1311bc2866b2fd0432208e63020
+f41007d7a9a43bf0a30eff53903299c2d88fd59163f9b7415653cbee5a60
+2c50c607edbf1bca3157aa3a013c4377c3b5088ff717e794ba8949e91a85
+e204ffd57976d7de79e70409e3a6cd0c180455719ed09ebc5888a175dc20
+735e3c69484fec32ad88014bdc0100e62455a6ce6be23b6e306948c9ec8d
+98ba3e89a4858f7c4537908e733840cb3897529efe2bdda4192cae694ea7
+80edfc2c1f75d01b1a9c911e839f0776b7556e85348979159c2c1c9f1051
+141da74db4bed5098c80ff84d5187ca88570bc6f512f9a204d093cd6bbfb
+438fe9d062a41575a6f8a5f7b44f9c82faac321ab9f4850c0803148cad84
+b339e314ffdb7c8dec381e0fdf3c3757d83102e26259909c380537f66182
+fbbf656daf939e7db6c69bfcf79fd281931f02ea1f33730f42d735b18496
+d6d9f08ebcfe70c55d966f671b28e9fd10e1b4151782eeeaf357f95a4319
+0d5b124f60c9a9c9af2d2a3f5c594f00628c46f13637d205428c4ce1dc88
+22e4d41e9fde4b177dd60e7be2fcf8d14d1f99a996ffdb71d712f22a91ef
+8060d241b397dccad9198e5134d69c2ebb566cd530fc7c29a7a70d2bcf7a
+d30c7215b65c686e676e1dd88311cb0d35d2e3c13e5a7bc1df44275fb7b0
+8a801c63f17e987643c7ed845713454afda90c825f0af5d8945429115a8f
+cc65d3c2372ee22d1eb7764484ab397862e8c448479d4fdc5ca1d18abf5e
+6b0b717dc116123298a80f59db58fa03af2027b2efbb59e115c30f0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA65o00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F16 0 /0 F /TTA65o00 mF
+/F16S1B1 F16 [433 0 0 -433 0 0 ] mFS
+F16S1B1 Ji
+3892 5602 M <0102030405060708>[264 144 241 145 264 192 169 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTA66o00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb2206689a2c7f31fa5794
+54a6cc5be7a453c42c272f1015ef94322c3929a0ddefb938ab1522150251
+fdd9f6b70f2e773d4f8663aeccb0bfc787064307fa1dd2f8bc4dfd5c7205
+d9853547485a8d4f01ac00b1b09d2057d65671f1ecfa41c8223a5108e94e
+eed8977391d4cdf5cc5898097984dcead7d3ea18561ddcbf4d05252b668a
+16e0b09a7b46807271a79103ee35cd33f3f5562733fc8557b69e1eb31acf
+17667bc44a27417541c228ececeab7e30fbda792ffb1d12490b7a763dd92
+7feae2dd8a29c69e1c33dc198ff3d1cfced187c07e67b604ae0d38df8d9c
+f97994f52049867475193872d41dd75f54fd685f66a9ed9804118499b261
+00ec06d93e56caf1ea7fd932421a7b807451acdfe8b949268673a769babd
+2fe767a6b050b34ff782968242657ff47cb62cf2a1616c809340e4fe22eb
+ad2944863557a13c39e581d23eac63f64dfc9276c0341b148f86cc6d3116
+6bd106f158615eeefc789238bf3b2f9ecfdc343e3afe48ff47146aa2af53
+d3879ea5dd09f2a25db26346d5a113284a48541d9a940e9f8b9ad98596f0
+c788a3dcbf41c177bc55bba52512f887b2c5e8776efb804942e49ecfa60e
+10b3e0a6a136e6da02b00b7a95bf805508eb0275a9e243b68c49a8554717
+3a1f750f860d6b50681d877660e47696b6a9f70ee9642d77678d8513fcc5
+da51a824f7a7a163b3416ae572593eb6e32392e6c4699995a1da11cc29c5
+ef52cbe73f49a3159c031ac87bbb2336e3d2618537c01288ad3c11f8f837
+aea942a32f1a9388126758aed7558987937ba918bb20896e46f8b80493b7
+827603e8e11953a56e2d406baf573f366a6c325d9585a36232356c876d22
+38917e0806d2de7624cfb33d7c2a6da2aae20ad18a8d5738d747b5cea624
+0bd371cfd8e59232a1b8f953aafa3065d393ffc28479fcf15350375753e3
+d8d4169d64023ad9200881d358cad783a45a67ae18f81263f801df120e8c
+a9cd4636fd19024f4d7d50d84a4dbef10941e5b86650d89013c4aadf1206
+411b1c84e45f3baf8b5984fa9c5043dda578b736a14bcbdc7551a0fe7e62
+2e5055da5e7b6df296d868970d9589482e54edfdcd380850b2877f30d6dc
+3fb72877575c1851710095b46311a4c3dd769809e100ab6dba6e80f4313e
+6417460d7d99dbb9002e876ece579b6479c49d248050c5530883c07e5720
+b72e1543a51f7878463a760d7160da57b2c7cdda23684ba394f4fe456487
+8e26926386884961ff02a917786958ace479e4d34b42174558ba65e5feb2
+3708dc192d0ee9ffe2fc272aff62b3caf0276f66d18f838fdc15adea9faf
+86c6e87e48c9997dd940d6a3a46063406a40f2f44758df815aa75453a10d
+254f082d5abf98176fc8340a575a47b93d3bc46bbb2790d9fe6d9fd518a6
+fb3b4fe9331f2ba68762cc21c15e4a429217f86a26e802597785c3354878
+653c0c48ae31cd5eafca143ebe4a5ea475b5f10e658ed07cbc1266547d12
+d0c62598e3f3e802e53d0b99164ce825ac5165aa3e9fd4761c5451182e60
+1937322daaa63777230f33f9d45d638d32f5cf61868cbdbaf3b056cd9bf2
+b496a029387dbf63cd6cc636c2cbf3ce0c07e518c521f7b4fbd7b619f4d0
+7e9ffdeec465771a9ca8e9069f52eaa88cad66d47092ac1f5f52be036aed
+d2d6f36153e22fa251aaf8b10da257dd14cb46163723013df097ffd16c33
+ddb8d3a4dd2fc6545550e4081ae70de8cc65a83f220212744bfb58cd2cd7
+29b17f2b842e4138a307cfa37adaaf9178ee510e2fd3d3f43b7efb0ba3f7
+a59e6ebeb4f2a35e908016cdf0383304b2cbfd02769cfd5ac9d8eba752f2
+ee6b8cf7287ba98fd5b2cb0e61647483659cb6b97f1ac442dac87c0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTA66o00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F17 0 /0 F /TTA66o00 mF
+/F17S1D3 F17 [467 0 0 -467 0 0 ] mFS
+F17S1D3 Ji
+3832 6132 M <0102030405060708>[284 156 259 156 285 207 181 0]xS
+25200 VM?
+11 dict begin
+/FontName /TTBC3E32E0o00 def
+/FontMatrix [1 2048 div 0 0 1 2048 div 0 0 ] def
+/Encoding 256 array 0 1 255 {1 index exch /.notdef put} for def
+/PaintType 0 def
+/FontType 1 def
+/FontBBox { 0 0 0 0 } def
+AddFontInfoBegin
+AddFontInfo
+AddFontInfoEnd
+currentdict
+end
+
+currentfile eexec
+9e67edc6f3ddb54d987dfb0ad4392351758f10eff40ef287a1387512b853
+046f6e589e2c97d48fdb38d54b68757f1dc48a239a5da408c2bfd473eac0
+3ab6b0025b87770e5f3b06904c282a51ee189ce871258447b47d83c5fad2
+326aa26e4c7f0ff21a841a463c859f102729802bbfa6ac0c2766f6b09317
+a247f37b339b99b7588bee2e861ed9de7a8990c512001ce21da50f4516f7
+553cc5df31ac42402c2b4e2b106773ccdac45a8dee89d3d35ce4f9afb022
+79592359efd5293f35df57216c84236a1347e922a61c45691be2c137b65f
+08f4b3113b88e58dce4bd559387db7a00fe16460e5ab8fc835ea6ed9b938
+610bff26bc7ddabb1af7195ef7e654ee14a569bb220669f64824a95d9550
+e6b732d24163e5f1f14c0d8e68bffa74a7e923785ab628ea1b858f9c8898
+aa3a6a215f95d69b979cf88a88e66315daccf6b3e567737c55e3cf437e98
+6959eca072eb5947c0a09809b4d3d5430005f3fa1b9f519f0635d2e185f7
+4e1eec5a19e358c5609375ecd636499ee362b08643e4c00019c76096365d
+ae34a30b033cf6378a4a47f08172f46c61310b971071ca9fcd6dcd1b9ad6
+63809fcecd4cd2183f3a5a9de5c683838022bd1362f59a5b864d29a4d185
+4ca19a30f903bb33d1ca039f71e2039cc453297c2bae1af6d32d72092a4c
+b00fc35b50397d28064e83425bcb8aa2802cb275252b0e70d9983b36eab5
+6caeb1305e4f95ac5edc55b2d2ec626088c80766ae22d5f2ed6bd822b754
+d1c1004291d98617b4ea4915642deb170ab38bcf01dbc7d461b8c4bbde17
+e6745cf0bc1d064418fbed78f744269daef38817c6f073c543dbdf219dd0
+1846e629428c6636dcc0d80038222a8ef4fe9a380b2f0e6e2c4bca8c39fe
+f4a6d3b66af29ba79996bdb5389abf14ec305653c6de8e1b55effb93dcf6
+6bcb0eec3c735bf981b03907a3ffcb25b51f3f6b7632ca38e91975702745
+98993eaef2ad15901aa3ef965171e4a386b664bd21f943b3482afd2c1412
+151ad3e78b340945c8c5faadab4d79d6b3e1017cb933af412dcbfb368b7f
+4790d99ab75ad1715248a31296f12d99ae05aceaa4d28ac45fb01ed9abdf
+c7eb1ecb1de617a14454f6ba1578cbefdadcd3684cc47b453c763c730436
+8f32d78e11012ea6d3d16ca5bf67951a742d405591ac3ee6d5164e890891
+e10c21777eb10661f8c88e5bfa6326d51a8ca574f3321b5cc05631bf331a
+ed2f169a77e8ddecba5e03eb7df19b634f20a0353685b98668fb79295051
+ce2ccd8487a1d0da7d9bb3dd3cb1e3df220fc81841cbd0b3719fbfa27809
+379e5f3e7900be85b9e2bee893085d9bd17b9cb7174367d80bc06d7cb841
+566f2ac1d0e5a1f01dc1cdf58195977393929340b5746f4bc1f3e3ee6f5f
+df3941a5deb99672255cabaac0ea3657a449c28267bc9dbd448fdfe12b52
+fe91ed89405246fe3b6d63c89536f8659fe660ae005adbf01c3c2729913d
+2117f8e2dec91751be554a057dd7998e15b9d02377d6a6d5c83b1091fb8b
+1c7c358f13b4dc00839db3fe4cb9163f5ffc725b1561a2d3e4faab96bd11
+bcc159c4be2dda581cd695dd41635fee2c8b1e5d8dd4b35a59bdcc368ab5
+9bb2ce9799ca98dffa60212f587b7f99b3788f3b052c7a83d31ede5e21cf
+ccedc821552ae0faee16444c26e489d37034f8ba4c811ea5728bc16dcf9a
+217958e8f745e87c917536ff3899b13d00bf631cc449eda3934a726bce8a
+154519d6192fe111443b7d039f3844f6a95bc56142d31970ed4a8e7936b0
+0ff7c795cc2bdb4b82616d7fe32c0a76ed3dc837b238905ebe9cf2d9bb7c
+62bf9ef3fd62d6adbd8928e5cfcc6e01ece9fdc2496b7eaed14d0dd56d31
+123b9ff1712c0e67d00c73ae48d61688a2bb8dcbf8a5a8523aea76f8f107
+554df15d3fc6db019c97efcd6c3cc837a222851ed21e92e0c658a556f7ee
+52268c8787600227471918fa7e32d787c76277b7eda00bfa4fcd5730b724
+20333168b0b79fa2ae46c639399cfae05eb45df153448d831698d38be55e
+1aab21503e8011f9889d8ed64e9d29ac7e298f1136d7cabda06b452c1257
+5d655523016b8302cf0e2d66b310f6ee0cb7e725752b4f2c346b89f98453
+b2abcad50dac1dea9c9d842fd37a409b73621d99599d9d6fc10d2441de0f
+808e63bed2a5d2c2f6b34098aa3facbf6d379b4d1575008ba866446ca1b6
+8aa5d4961e3c2f05b4beb6fc4695f7dea133aba05385434a26db160000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+/TTBC3E32E0o00 findfont /Encoding get
+dup 1 /E put
+dup 2 /I put
+dup 3 /S put
+dup 4 /hyphen put
+dup 5 /T put
+dup 6 /e put
+dup 7 /s put
+dup 8 /t put
+pop
+F /F18 0 /0 F /TTBC3E32E0o00 mF
+/F18S215 F18 [533 0 0 -533 0 0 ] mFS
+F18S215 Ji
+3713 6730 M <0102030405060708>[326 177 296 178 325 238 206 0]xS
+/F18S258 F18 [600 0 0 -600 0 0 ] mFS
+F18S258 Ji
+3595 7407 M <0102030405060708>[366 200 334 200 367 266 232 0]xS
+/F18S29B F18 [667 0 0 -667 0 0 ] mFS
+F18S29B Ji
+3477 8158 M <0102030405060708>[407 222 371 222 407 295 260 0]xS
+/F18S2DD F18 [733 0 0 -733 0 0 ] mFS
+F18S2DD Ji
+3358 8987 M <0102030405060708>[448 243 409 244 447 325 285 0]xS
+/F18S320 F18 [800 0 0 -800 0 0 ] mFS
+F18S320 Ji
+3239 9893 M <0102030405060708>[489 266 445 266 489 355 310 0]xS
+/F18S384 F18 [900 0 0 -900 0 0 ] mFS
+F18S384 Ji
+3062 10906 M <0102030405060708>[549 300 500 300 550 399 350 0]xS
+/F18S3E8 F18 [1000 0 0 -1000 0 0 ] mFS
+F18S3E8 Ji
+2884 12034 M <0102030405060708>[610 334 555 333 611 444 388 0]xS
+LH
+(%%[Page: 1]%%) =
+%%PageTrailer
+
+%%Trailer
+%%BoundingBox: 18 18 577 824
+%%DocumentNeededResources:
+%%DocumentSuppliedResources:
+%%+ procset Pscript_WinNT_ErrorHandler 5.0 0
+%%+ procset Pscript_FatalError 5.0 0
+%%+ procset Pscript_Win_Basic 5.0 0
+%%+ procset Pscript_Win_Utils_L2 5.0 0
+%%+ procset Pscript_Text 5.0 0
+Pscript_WinNT_Incr dup /terminate get exec
+ehsave restore
+%%Pages: 1
+(%%[LastPage]%%) =
+%%EOF
+ \ No newline at end of file
diff --git a/testgraphical/source/CallExternals.pm b/testgraphical/source/CallExternals.pm
new file mode 100644
index 000000000000..a0a3b1ae716a
--- /dev/null
+++ b/testgraphical/source/CallExternals.pm
@@ -0,0 +1,539 @@
+package CallExternals;
+
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+use English;
+use warnings;
+use strict;
+use loghelper;
+
+BEGIN {
+ use Exporter ();
+ our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+ $VERSION = 1.00;
+ # if using RCS/CVS, this may be preferred
+ $VERSION = do { my @r = (q$Revision: 1.29 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
+ @ISA = qw(Exporter);
+ @EXPORT = qw(&callphp &getPHPExecutable &ExecSQL &callperl &getPerlExecutable &calljava &setJavaExecutable &getJavaExecutable &setToolsPath &quote &quoteIfNeed &set_logfile &close_logfile );
+ %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
+ # your exported package globals go here,
+ # as well as any optionally exported functions
+ @EXPORT_OK = ( ); # qw($Var1 %Hashit &func3);
+}
+
+# ------------------------------------------------------------------------------
+# small helper, which replaces the return code
+sub errorAdaption($)
+{
+ my $error = shift;
+ if ($error != 0)
+ {
+ $error = $error / 256;
+ }
+ if ($error > 127)
+ {
+ $error = $error - 256;
+ }
+ return $error;
+}
+# ------------------------------------------------------------------------------
+# helper to call external php with popen
+sub callphp($$$)
+{
+ local *IN_FILE;
+ my $phpexe = shift;
+ my $phpprogram = shift;
+ my $sParams = shift;
+ my $line;
+ my $error;
+ my @result;
+
+ # print "Will send: $phpexe $sParams\n";
+ # log_print("CALLPHP: $phpexe $phpprogram $sParams\n");
+# if (open(IN_FILE, "$phpexe $sParams 2>&1 |"))
+ if (open(IN_FILE, "$phpexe $phpprogram $sParams |"))
+ {
+ while ($line = <IN_FILE>)
+ {
+ chomp($line);
+ # $line .= " ";
+ push(@result, $line);
+ # print "callphp output: $line\n";
+ }
+ close(IN_FILE);
+ $error = errorAdaption($?);
+ }
+ else
+ {
+ print "callphp(): Can't popen '$phpexe' with parameter: '$sParams'\n";
+ $error = 1;
+ }
+ return $error, @result;
+}
+
+# ------------------------------------------------------------------------------
+sub getPHPExecutable()
+{
+ my $phpexe;
+ if ($OSNAME eq "solaris")
+ {
+ $phpexe = "php5";
+ }
+ elsif ($OSNAME eq "linux")
+ {
+ if ( -e "/usr/bin/php5") # Suse :-(
+ {
+ $phpexe = "php5";
+ }
+ elsif ( -e "/usr/bin/php") # Gentoo
+ {
+ $phpexe = "php";
+ }
+ else
+ {
+ print "getPHPExecutable(): no php exec found.\n";
+ }
+ }
+ elsif ( $OSNAME eq "MSWin32" )
+ {
+ $phpexe = "C:/programme/php/php.exe";
+ # add second try (xampp)
+ if (! -e $phpexe)
+ {
+ $phpexe = "C:/xampp/php/php.exe";
+ }
+ }
+ elsif ( $OSNAME eq "cygwin" )
+ {
+ $phpexe = "/cygdrive/c/programme/php/php";
+ }
+ else
+ {
+ print "getPHPExecutable(): unknown environment. ($OSNAME)\n";
+ }
+ if (! $phpexe)
+ {
+ print "getPHPExecutable(): ERROR: php executable not found.\n";
+ exit(1);
+ }
+ return $phpexe;
+}
+# ------------------------------------------------------------------------------
+# helper to call external java with popen
+sub calljava($$$)
+{
+ local *IN_FILE;
+ my $javaexe = shift;
+ my $sParams = shift;
+ my $sDebug = shift;
+ my $line;
+ my $error = 1;
+
+ if (! $javaexe)
+ {
+ log_print("ERROR: javaexe not set.\n");
+ return;
+ }
+ if (! $sDebug)
+ {
+ $sDebug = "";
+ }
+ $javaexe = quoteIfNeed($javaexe);
+ log_print ("CALLJAVA: $javaexe $sDebug $sParams\n");
+ if (open(IN_FILE, "$javaexe $sDebug $sParams 2>&1 |"))
+ {
+ while ($line = <IN_FILE>)
+ {
+ chomp($line);
+ log_print ("- $line\n");
+ }
+ close(IN_FILE);
+ $error = errorAdaption($?);
+ }
+ else
+ {
+ log_print ("calljava(): Can't popen '$javaexe' with parameter '$sParams'\n");
+ $error = 1;
+ }
+ return $error;
+}
+
+# ------------------------------------------------------------------------------
+sub getPerlExecutable()
+{
+ my $perlexe;
+ if ( $ENV{PERL} )
+ {
+ $perlexe = $ENV{PERL};
+ }
+ elsif ( $ENV{PERLEXE} )
+ {
+ $perlexe = $ENV{PERLEXE};
+ }
+ else
+ {
+ if ($OSNAME eq "MSWin32")
+ {
+ $perlexe="C:/xampp/perl/bin/perl.exe";
+ if (! -e $perlexe)
+ {
+ $perlexe="r:/btw/perl/bin/perl";
+ }
+ if (! -e $perlexe)
+ {
+ $perlexe="C:/Programme/Perl/bin/perl.exe";
+ }
+ }
+ elsif ($OSNAME eq "cygwin")
+ {
+ $perlexe = "perl";
+ }
+ elsif ($OSNAME eq "solaris")
+ {
+ $perlexe="/so/env/bt_solaris_intel/bin/perl";
+ }
+ elsif ($OSNAME eq "linux")
+ {
+ $perlexe="/so/env/bt_linux_libc2.32/DEV300/bin/perl";
+ }
+ else
+ {
+ log_print "WARNING: Use only the fallback of perl executable.\n";
+ $perlexe = "perl"; # FALLBACK
+ }
+ }
+ if ( ! -e $perlexe)
+ {
+ log_print "getPerlExecutable(): There exist no perl executable.\n";
+ exit(1);
+ }
+ return $perlexe;
+}
+# ------------------------------------------------------------------------------
+# helper to call external perl with popen
+sub callperl($$$)
+{
+ local *IN_FILE;
+ my $perlexe = shift;
+ my $perlprogram = shift;
+ my $sParams = shift;
+ my $line;
+ my $error;
+
+ log_print("CALLPERL: $perlexe $perlprogram $sParams\n");
+# if (open(IN_FILE, "$perlexe $sParams 2>&1 |"))
+ if (open(IN_FILE, "$perlexe $perlprogram $sParams |"))
+ {
+ while ($line = <IN_FILE>)
+ {
+ chomp($line);
+ log_print ("- $line\n");
+ }
+ close(IN_FILE);
+ $error = errorAdaption($?);
+ }
+ else
+ {
+ log_print ("Can't popen '$perlexe' with parameter: '$sParams'\n");
+ $error = 1;
+ }
+ return $error;
+}
+# ------------------------------------------------------------------------------
+our $sJavaExecutable;
+sub setJavaExecutable($)
+{
+ $sJavaExecutable = shift;
+}
+
+# sub getJava14()
+# {
+# my $sJava14;
+# if ($OSNAME eq "MSWin32")
+# {
+# if ($sJavaExecutable)
+# {
+# $sJava14 = $sJavaExecutable;
+# }
+# else
+# {
+# # HARDCODE!
+# $sJava14 = "C:\\Programme\\Java\\j2re1.4.2_10\\bin\\java.exe";
+# }
+# }
+# else
+# {
+# if ($sJavaExecutable)
+# {
+# $sJava14 = $sJavaExecutable;
+# }
+# else
+# {
+# # HARDCODE!
+# $sJava14 = "/opt/java14/bin/java";
+# }
+# }
+# if ( ! -e $sJava14 )
+# {
+# log_print ("Java14 not found. Is searched in '$sJava14'\n");
+# # exit(1);
+# return "";
+# }
+# return $sJava14;
+# }
+# ------------------------------------------------------------------------------
+sub getJava15()
+{
+ my $sJava15;
+ if ($sJavaExecutable)
+ {
+ $sJava15 = $sJavaExecutable;
+ }
+ else
+ {
+ if ($OSNAME eq "MSWin32")
+ {
+ # HARDCODE!
+ $sJava15 = "C:\\Programme\\Java\\jre1.5.0_22\\bin\\java.exe";
+ if ( ! -e $sJava15)
+ {
+ $sJava15 = "C:\\Program Files\\Java\\jre6\\bin\\java.exe";
+ }
+ if ( ! -e $sJava15)
+ {
+ $sJava15 = "C:\\Java\\jdk1.6\\bin\\java.exe";
+ }
+ }
+ elsif ($OSNAME eq "cygwin")
+ {
+ $sJava15 = "java";
+ }
+ else
+ {
+ # HARDCODE!
+ if ($OSNAME eq "solaris")
+ {
+ $sJava15 = "/usr/bin/java";
+ }
+ else
+ {
+ $sJava15 = "/usr/bin/java";
+ if ( ! -e $sJava15 )
+ {
+ $sJava15 = "/opt/java15/bin/java";
+ }
+ }
+ }
+ if ( ! -e $sJava15 )
+ {
+ log_print ("Java15 not found. Is searched in '$sJava15'\n");
+ # exit(1);
+ return "";
+ }
+ }
+ return $sJava15;
+}
+# ------------------------------------------------------------------------------
+sub getJava16()
+{
+ my $sJava16;
+ if ($sJavaExecutable)
+ {
+ $sJava16 = $sJavaExecutable;
+ }
+ else
+ {
+ if ($OSNAME eq "MSWin32")
+ {
+ # HARDCODE!
+ $sJava16 = "C:\\Programme\\Java\\jre1.6.0_16\\bin\\java.exe";
+ if ( ! -e $sJava16)
+ {
+ $sJava16 = "C:\\Program Files\\Java\\jre6\\bin\\java.exe";
+ }
+ if ( ! -e $sJava16)
+ {
+ $sJava16 = "C:\\Java\\jdk1.6\\bin\\java.exe";
+ }
+ # }
+ }
+ elsif ($OSNAME eq "cygwin")
+ {
+ # $sJava16 = "java";
+ $sJava16 = "C:/Program Files/Java/jdk1.6.0_16/bin/java.exe";
+ }
+ else
+ {
+ # HARDCODE!
+ if ($OSNAME eq "solaris")
+ {
+ $sJava16 = "/usr/bin/java";
+ }
+ else
+ {
+ $sJava16 = "/usr/bin/java";
+ if ( ! -e $sJava16 )
+ {
+ $sJava16 = "/opt/java16/bin/java";
+ }
+ }
+ }
+ if ( ! -e $sJava16 )
+ {
+ log_print ("Java16 not found. Is searched in '$sJava16'\n");
+ # exit(1);
+ return "";
+ }
+ }
+ return $sJava16;
+}
+
+# ------------------------------------------------------------------------------
+sub getJavaExecutable()
+{
+ return getJava16();
+}
+
+# ------------------------------------------------------------------------------
+# this function is a helper for parameters
+# if quotes the whole string with 'STR' or "STR" and replace quotes in it's content for the right.
+sub singleQuote($)
+{
+ my $sStr = shift;
+ if ( $OSNAME eq "MSWin32")
+ {
+ # we are MSWin32 (quote \" stronger)
+ # $sStr =~ s/\'/\"/g;
+ $sStr =~ s/\'/\\\"/g;
+ return "\"" . $sStr . "\"";
+ }
+ else
+ {
+ if (index($sStr, "'") >= 0)
+ {
+ # replace all single quotes ("'") by "\""
+ $sStr =~ s/\'/\"/g;
+ }
+ }
+ return "'" . $sStr . "'";
+}
+
+sub quote($)
+{
+ my $sName = shift;
+ return "\"" . $sName . "\"";
+}
+
+sub quoteIfNeed($)
+{
+ my $sName = shift;
+ if (-1 != index($sName, " "))
+ {
+ return quote($sName);
+ }
+ return $sName;
+}
+
+
+# ------------------------------------------------------------------------------
+our $sToolsPath;
+sub setToolsPath($)
+{
+ my $sNewPath = shift;
+ $sToolsPath = $sNewPath;
+}
+
+sub ExecSQL($)
+{
+ my $sSQL = shift;
+
+ my $error;
+ my @aResult;
+ my $sSQLDirect;
+ if ($sToolsPath)
+ {
+ $sSQLDirect = $sToolsPath;
+ $sSQLDirect .= "/";
+ }
+ $sSQLDirect .= "sql_direct.php";
+
+ # select(undef, undef, undef, 0.060);
+ # log_print("ExecSQL: $sSQL\n");
+ # sleep (1);
+ ($error, @aResult) = callphp(getPHPExecutable(), $sSQLDirect, singleQuote($sSQL));
+ if ($error)
+ {
+ log_print ("ExecSQL: An Error occured.\n");
+ log_print ("PHP: " . getPHPExecutable() . "\n");
+ log_print ("SQL Statement: " . singleQuote($sSQL) . "\n");
+ # exit(1);
+ }
+ # select(undef, undef, undef, 0.125);
+ # sleep (1);
+ return @aResult;
+}
+
+# ------------------------------------------------------------------------------
+# helper to call external php with popen
+# sub callexe($$$)
+# {
+# local *IN_FILE;
+# my $exe = shift;
+# my $program = shift;
+# my $sParams = shift;
+# my $line;
+# my $error;
+# my @result;
+#
+# $exe = quoteIfNeed($exe);
+# $program = quoteIfNeed($program);
+#
+# # print "Will send: $exe $sParams\n";
+# # log_print("CALLEXE: $exe $program $sParams\n");
+# if (open(IN_FILE, "$exe $program $sParams |"))
+# {
+# while ($line = <IN_FILE>)
+# {
+# chomp($line);
+# # $line .= " ";
+# push(@result, $line);
+# # print "callphp output: $line\n";
+# }
+# close(IN_FILE);
+# $error = errorAdaption($?);
+# }
+# else
+# {
+# print "Can't popen '$exe' with parameter: '$sParams'\n";
+# $error = 1;
+# }
+# return $error, @result;
+# }
+
+1;
diff --git a/testgraphical/source/ConvwatchHelper.pm b/testgraphical/source/ConvwatchHelper.pm
new file mode 100644
index 000000000000..8f157641b1f4
--- /dev/null
+++ b/testgraphical/source/ConvwatchHelper.pm
@@ -0,0 +1,574 @@
+package ConvwatchHelper;
+
+use English;
+use warnings;
+use strict;
+use Cwd;
+use Cwd 'chdir';
+
+use CallExternals;
+use stringhelper;
+use filehelper;
+use oshelper;
+use loghelper;
+
+BEGIN {
+ use Exporter ();
+ our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+ $VERSION = 1.00;
+ # if using RCS/CVS, this may be preferred
+ $VERSION = do { my @r = (q$Revision: 1.39 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
+ @ISA = qw(Exporter);
+ @EXPORT = qw(&getQADEVToolsPath &setProjectRoot &getProjectRoot &checkForStop &getSofficeExe &setINPATH);
+ %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
+ # your exported package globals go here,
+ # as well as any optionally exported functions
+ @EXPORT_OK = ( ); # qw($Var1 %Hashit &func3);
+}
+
+# ------------------------------------------------------------------------------
+our $tempprefix;
+
+# sub getTempDir()
+# {
+# my $sTempDir;
+# if (! $tempprefix)
+# {
+# if ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
+# {
+# # $tempdir = "C:/gfxcmp/temp";
+# $tempprefix = "//so-gfxcmp-lin/gfxcmp-data/wntmsci/temp";
+# }
+# elsif ($OSNAME eq "linux")
+# {
+# $tempprefix = "/net/so-gfxcmp-lin/export/gfxcmp/data/unxlngi/temp";
+# }
+# elsif ($OSNAME eq "solaris")
+# {
+# # $tempdir = "/space/gfxcmp/temp";
+# $tempprefix = "/net/so-gfxcmp-lin/export/gfxcmp/data/unxsoli/temp";
+# }
+# else
+# {
+# print "Error: This environment isn't supported yet.\n";
+# exit(1);
+# }
+# }
+# $sTempDir = $tempprefix;
+# return $sTempDir;
+# }
+# ------------------------------------------------------------------------------
+# in filehelper
+# our $programprefix;
+#
+# sub getProgramPrefix($)
+# {
+# my $sDBDistinct = shift;
+#
+# my $sProgramPrefix;
+# if (! $programprefix)
+# {
+# if ($OSNAME eq "MSWin32")
+# {
+# # $programprefix = "C:/gfxcmp/programs";
+# $programprefix = "C:/gp";
+# }
+# elsif ($OSNAME eq "linux")
+# {
+# $programprefix = "/space/gfxcmp/programs";
+# }
+# elsif ($OSNAME eq "solaris")
+# {
+# $programprefix = "/space/gfxcmp/programs";
+# }
+# else
+# {
+# print "Error: This environment isn't supported yet.\n";
+# exit(1);
+# }
+# }
+# $sProgramPrefix = appendPath($programprefix, substr($sDBDistinct, 0, 19));
+# return $sProgramPrefix;
+# }
+# ------------------------------------------------------------------------------
+sub getQADEVToolsPath()
+{
+ my $sNewPath = appendPath(getToolsPrefix(), "qadev");
+ $sNewPath = appendPath($sNewPath, "scripts");
+ $sNewPath = appendPath($sNewPath, "gfxcmp_ui");
+ return $sNewPath;
+}
+
+# in filehelper
+# our $toolsprefix;
+#
+# sub getToolsPrefix()
+# {
+# my $sToolsPrefix;
+# if (! $toolsprefix)
+# {
+# if ($OSNAME eq "MSWin32")
+# {
+# $toolsprefix = "C:/gfxcmp/tools";
+# }
+# elsif ($OSNAME eq "linux")
+# {
+# $toolsprefix = "/space/gfxcmp/tools";
+# }
+# elsif ($OSNAME eq "solaris")
+# {
+# $toolsprefix = "/space/gfxcmp/tools";
+# }
+# else
+# {
+# print "Error: This environment isn't supported yet.\n";
+# exit(1);
+# }
+# }
+# $sToolsPrefix = $toolsprefix;
+# return $sToolsPrefix;
+# }
+# ------------------------------------------------------------------------------
+our $sProjectRoot;
+sub setProjectRoot($)
+{
+ $sProjectRoot = shift;
+ log_print "\$sProjectRoot := $sProjectRoot\n";
+}
+sub getProjectRoot()
+{
+ if ($sProjectRoot)
+ {
+ return $sProjectRoot;
+ }
+ die "setProjectRoot(PATH) not set.\n";
+}
+
+our $sINPATH;
+sub setINPATH($)
+{
+ $sINPATH = shift;
+}
+sub getINPATH()
+{
+ if ($sINPATH)
+ {
+ return $sINPATH;
+ }
+ die "setINPATH(PATH) not set.\n";
+}
+our $dataprefix;
+
+# sub getDataPrefix()
+# {
+# my $sDataPrefix;
+# if (! $dataprefix)
+# {
+# if ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
+# {
+# # $dataprefix = "C:/gfxcmp/data";
+# # $dataprefix = "//so-gfxcmp-lin/gfxcmp-data/wntmsci";
+# $dataprefix = getProjectRoot();
+# }
+# elsif ($OSNAME eq "linux")
+# {
+# # $dataprefix = "/space/gfxcmp/data";
+# # $dataprefix = "/net/so-gfxcmp-lin/export/gfxcmp/data/unxlngi";
+# $dataprefix = getProjectRoot();
+# }
+# elsif ($OSNAME eq "solaris")
+# {
+# # $dataprefix = "/space/gfxcmp/data";
+# # $dataprefix = "/net/so-gfxcmp-lin/export/gfxcmp/data/unxsoli";
+# $dataprefix = getProjectRoot();
+# }
+# else
+# {
+# print "Error: This environment isn't supported yet.\n";
+# exit(1);
+# }
+# $dataprefix = appendPath(getProjectRoot(), getINPATH());
+# $dataprefix = appendPath($dataprefix, "data");
+# }
+# $sDataPrefix = $dataprefix;
+# return $sDataPrefix;
+# }
+
+# ------------------------------------------------------------------------------
+
+# sub _shortsleep($)
+# {
+# # sleep 1;
+# select(undef, undef, undef, 0.333);
+# }
+#
+# sub _waitInSeconds($)
+# {
+# my $nLength = shift;
+# my $i;
+# my $j;
+#
+# for ($j=0;$j<$nLength;$j++)
+# {
+# for ($i=0;$i<$j;$i++)
+# {
+# print ".";
+# }
+# for ($i=$j;$i<$nLength;$i++)
+# {
+# print " ";
+# }
+# _shortsleep( 1 );
+# print "\r";
+# }
+#
+# for ($j=0;$j<=$nLength;$j++)
+# {
+# for ($i=0;$i<$j;$i++)
+# {
+# print " ";
+# }
+# for ($i=$j;$i<$nLength;$i++)
+# {
+# print ".";
+# }
+# _shortsleep( 1 );
+# print "\r";
+# }
+# }
+#
+# sub wait30seconds()
+# {
+# _waitInSeconds(20);
+# _waitInSeconds(20);
+# }
+
+sub checkForStop($)
+{
+ my $sStopFilename = shift;
+ my $sStopFilePath;
+ if ($OSNAME eq "MSWin32")
+ {
+ $sStopFilePath = "C:/temp/";
+ }
+ else
+ {
+ $sStopFilePath = "/tmp/";
+ }
+ my $sStopFile = $sStopFilePath . $sStopFilename;
+ if ( -e "$sStopFile" )
+ {
+ print "Stop of Convwatch tool forced!\n";
+ unlink($sStopFile);
+ exit(2);
+ }
+}
+
+# ----------------------------------------------------------------------------------------
+sub readdirectory($$$);
+
+sub readdirectory($$$)
+{
+ my $startdir = shift;
+ my $sUserParameter = shift;
+ my $hook = shift;
+
+ my $myfile;
+
+ local *DIR;
+ chdir $startdir;
+ cwd();
+
+ my $nCountFiles = 0;
+ if (opendir (DIR, $startdir)) # Directory oeffnen
+ {
+ while ($myfile = readdir(DIR))
+ { # ein filename holen
+ #if (! -l $myfile) # not a link
+ #{
+ if (-d $myfile ) # is a directory
+ {
+ if ( -l $myfile)
+ {
+ next;
+ }
+ # if ( $myfile eq "help" ||
+ # $myfile eq "presets" ||
+ # $myfile eq "registry" ||
+ # $myfile eq "uno_packages" ||
+ # $myfile eq "lib" ||
+ # $myfile eq "user_tree" )
+ # {
+ # next;
+ # }
+
+ if ($myfile ne "." && $myfile ne "..")
+ {
+ my $sNewStartDir = appendPath($startdir, $myfile); # neuen Directorystring erstellen
+ # if ($sNewStartDir =~ "^\/proc" ||
+ # $sNewStartDir =~ "^\/dev" ||
+ # $sNewStartDir =~ "^\/udev" ||
+ # $sNewStartDir =~ "lost+found" )
+ # {
+ # next;
+ # }
+ # my $sNewSUserParameter = $sUserParameter . $myfile ."/";
+ # do a recursive call
+ # $nCountFiles++;
+ my $nFileCount = readdirectory($sNewStartDir, $sUserParameter, $hook);
+ # workOnDir($sNewDir, $nFileCount);
+ $nCountFiles += $nFileCount;
+
+ chdir ($startdir); # zurueckwechseln.
+ cwd();
+ }
+ }
+ else
+ {
+ # File must exist, be a regular file and must not be the $onlyOnFile
+ if (-f $myfile)
+ {
+ # print STDERR " $startdir" . "$myfile\n";
+ $nCountFiles++;
+ # workOnFile($startdir, $myfile, $destdir);
+ $hook->($startdir, $myfile, $sUserParameter);
+ }
+ }
+ #}
+ #else
+ #{
+ # print STDERR "linked file: $dir/$myfile\n";
+ #}
+ }
+ closedir(DIR);
+ }
+ else
+ {
+ print STDERR "could not open $startdir\n";
+ }
+ return $nCountFiles;
+}
+
+our $lcl_sSofficeBinPath;
+our $lcl_sSofficeBinName;
+
+sub searchSofficeBin($$$)
+{
+ my $currentDir = shift;
+ my $currentFile = shift;
+ my $sUserParameter = shift;
+
+ if ($currentFile eq $sUserParameter)
+ {
+ my $sSourceFilename;
+ $sSourceFilename = appendPath($currentDir, $currentFile);
+
+ if ( -e "$sSourceFilename" )
+ {
+ $lcl_sSofficeBinPath = $currentDir;
+ $lcl_sSofficeBinName = $currentFile;
+ }
+ }
+}
+
+# our $lcl_sUnoPkgPath;
+#
+# sub searchUnoPkgBin($$$)
+# {
+# my $currentDir = shift;
+# my $currentFile = shift;
+# my $sUserParameter = shift;
+#
+# if ($currentFile eq $sUserParameter)
+# {
+# my $sSourceFilename;
+# $sSourceFilename = appendPath($currentDir, $currentFile);
+# if ( -e "$sSourceFilename" )
+# {
+# $lcl_sUnoPkgPath = $currentDir;
+# }
+# }
+# }
+
+# our $lcl_sJARPath;
+
+# sub searchJARFile($$$)
+# {
+# my $currentDir = shift;
+# my $currentFile = shift;
+# my $sUserParameter = shift;
+#
+# if ($currentFile eq $sUserParameter)
+# {
+# my $sSourceFilename;
+# $sSourceFilename = appendPath($currentDir, $currentFile);
+# if ( -e "$sSourceFilename" )
+# {
+# $lcl_sJARPath = $currentDir;
+# }
+# }
+# }
+
+# return the PATH, where the file was found
+# sub searchForJAR($$)
+# {
+# my $sPathToInstallOffice = shift;
+# my $sJARFileName = shift;
+#
+# my $sCurrentPath = cwd();
+#
+# $lcl_sJARPath = "";
+# readdirectory(${sPathToInstallOffice}, ${sJARFileName}, \&searchJARFile);
+#
+# chdir $sCurrentPath;
+# cwd();
+#
+# return $lcl_sJARPath;
+# }
+
+# sub getUnoPkg($)
+# {
+# my $sPathToInstallOffice = shift;
+#
+# my $sUnoPkgName = "unopkg.bin";
+# if (isWindowsEnvironment())
+# {
+# $sUnoPkgName = "unopkg.exe";
+# }
+#
+# my $sCurrentPath = cwd();
+#
+# $lcl_sUnoPkgPath = "";
+# readdirectory(${sPathToInstallOffice}, ${sUnoPkgName}, \&searchUnoPkgBin);
+#
+# chdir $sCurrentPath;
+# cwd();
+#
+# return ($lcl_sUnoPkgPath, $sUnoPkgName);
+# }
+
+sub getSofficeExe($)
+{
+ my $sPathToOffice = shift;
+
+ my $sSofficeExeName = "soffice";
+ if (isWindowsEnvironment())
+ {
+ $sSofficeExeName = "soffice.exe";
+ }
+
+ my $sCurrentPath = cwd();
+
+ $lcl_sSofficeBinPath = "";
+ $lcl_sSofficeBinName = "";
+ readdirectory(${sPathToOffice}, ${sSofficeExeName}, \&searchSofficeBin);
+
+ chdir $sCurrentPath;
+ cwd();
+
+ return ($lcl_sSofficeBinPath, $lcl_sSofficeBinName);
+}
+
+# sub checkOfficeAlreadyInstalled($)
+# {
+# my $sOfficePath = shift;
+#
+# my $sCurrentPath = cwd();
+#
+# $lcl_sSofficeBinPath = "";
+# my $sOldOfficePath = appendPath($sOfficePath, "program");
+# if ( -d "$sOldOfficePath" )
+# {
+# $sOldOfficePath = appendPath($sOldOfficePath, "soffice.bin");
+# if ( -e $sOldOfficePath )
+# {
+# return 1;
+# }
+# }
+# else
+# {
+# if (isWindowsEnvironment())
+# {
+# my $sThreeLayerOffice = appendPath($sOfficePath, "Sun");
+# $sThreeLayerOffice = appendPath($sThreeLayerOffice, "StarOffice 9");
+# $sThreeLayerOffice = appendPath($sThreeLayerOffice, "program");
+# $sThreeLayerOffice = appendPath($sThreeLayerOffice, "soffice.bin");
+#
+# if ( -e "$sThreeLayerOffice" )
+# {
+# return 1;
+# }
+# }
+# else
+# {
+# my $sThreeLayerOffice = appendPath($sOfficePath, "staroffice9");
+# $sThreeLayerOffice = appendPath($sThreeLayerOffice, "program");
+# $sThreeLayerOffice = appendPath($sThreeLayerOffice, "soffice.bin");
+# if ( -e "$sThreeLayerOffice" )
+# {
+# return 1;
+# }
+# }
+# }
+#
+# # soffice.bin not found in fast path
+# readdirectory($sOfficePath, "soffice.bin", \&searchSofficeBin);
+# chdir $sCurrentPath;
+# cwd();
+#
+# if ( $lcl_sSofficeBinPath ne "" )
+# {
+# return 1;
+# }
+# return 0;
+# # this is the old check
+# # my $sOfficePathCheck = appendPath(${sPathToInstallOffice}, "program");
+# # $sOfficePathCheck = appendPath($sOfficePathCheck, "soffice.bin");
+# # if ( -e $sOfficePathCheck )
+# # {
+# # return 1;
+# # }
+# #
+# # # check path system of tree layer office
+# # if ( isWindowsEnvironment() )
+# # {
+# # $sOfficePathCheck = appendPath(${sPathToInstallOffice}, "Sun");
+# # if ( ! -e $sOfficePathCheck)
+# # {
+# # # could be an OpenOffice.org
+# # return 0;
+# # }
+# # else
+# # {
+# #
+# # $sOfficePathCheck = appendPath($sOfficePathCheck, "StarOffice 9");
+# # $sOfficePathCheck = appendPath($sOfficePathCheck, "program");
+# # $sOfficePathCheck = appendPath($sOfficePathCheck, "soffice.bin");
+# # if ( -e $sOfficePathCheck )
+# # {
+# # return 1;
+# # }
+# # print "Error: There exist no Office, maybe an unsupported version?\n";
+# # }
+# # }
+# # elsif ( isUnixEnvironment() )
+# # {
+# # $sOfficePathCheck = appendPath(${sPathToInstallOffice}, "staroffice9");
+# # $sOfficePathCheck = appendPath($sOfficePathCheck, "staroffice9");
+# # $sOfficePathCheck = appendPath($sOfficePathCheck, "program");
+# # $sOfficePathCheck = appendPath($sOfficePathCheck, "soffice.bin");
+# # if ( -e $sOfficePathCheck )
+# # {
+# # return 1;
+# # }
+# # print "Error: There exist no Office, maybe an unsupported version?\n";
+# # }
+# # else
+# # {
+# # print "Error: There exist no Office, maybe an unsupported version?\n";
+# # }
+# # return 0;
+# }
+
+1;
diff --git a/testgraphical/source/compare.pl b/testgraphical/source/compare.pl
new file mode 100644
index 000000000000..4aef877dc2b7
--- /dev/null
+++ b/testgraphical/source/compare.pl
@@ -0,0 +1,408 @@
+eval 'exec perl -wS $0 ${1+\"$@\"}'
+ if 0;
+
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+BEGIN
+{
+ # Adding the path of this script file to the include path in the hope
+ # that all used modules can be found in it.
+ $0 =~ /^(.*)[\/\\]/;
+ push @INC, $1;
+ # print "PATH: " . $1 . "\n";
+}
+
+# my $e;
+# foreach $e (keys %ENV)
+# {
+# print "$e := $ENV{$e}" . "\n";
+# }
+
+use strict;
+use graphical_compare;
+use ConvwatchHelper;
+use filehelper;
+use timehelper;
+use loghelper;
+
+use Cwd;
+use File::Basename;
+use Getopt::Long;
+use English; # $OSNAME, ...
+use File::Path;
+use Cwd 'chdir';
+
+our $help; # Help option flag
+our $version; # Version option flag
+# our $test;
+
+# our $MAJOR;
+# our $MINOR;
+# our $cwsname;
+our $pool;
+our $document;
+our $creatortype;
+our $prepareonly = 0;
+our $force;
+our $verbose = 0;
+our $show = 0;
+our $connectionstring;
+
+# Prototypes
+sub print_usage(*);
+sub prepare();
+sub CompareFiles($$);
+
+# flush STDOUT
+# my $old_handle = select (STDOUT); # "select" STDOUT and save # previously selected handle
+# $| = 1; # perform flush after each write to STDOUT
+# select ($old_handle); # restore previously selected handle
+
+$OUTPUT_AUTOFLUSH=1; # works only if use English is used.
+
+our $version_info = 'compare.pl';
+
+GetOptions(
+# "MAJOR=s" => \$MAJOR,
+# "MINOR=s" => \$MINOR,
+# "cwsname=s" => \$cwsname,
+ "pool=s" => \$pool,
+ "document=s" => \$document,
+ "creatortype=s" => \$creatortype,
+ "prepareonly=s" => \$prepareonly,
+ "connectionstring=s" => \$connectionstring,
+
+ "force" => \$force,
+ "verbose" => \$verbose,
+ "show" => \$show,
+
+# "test" => \$test,
+ "help" => \$help,
+ "version" => \$version
+ );
+
+if ($help)
+{
+ print_usage(*STDOUT);
+ exit(0);
+}
+# Check for version option
+if ($version)
+{
+ print STDERR "$version_info\n";
+ exit(0);
+}
+
+if ($prepareonly)
+{
+ $force=1;
+}
+
+prepare();
+if ($connectionstring)
+{
+ setConnectionString($connectionstring);
+}
+
+my $sDocumentPool = appendPath(getProjectRoot(), "document-pool");
+# print "ProjectRoot: " . getProjectRoot() . "\n";
+if ($ENV{DOCUMENTPOOL})
+{
+ if ( -d $ENV{DOCUMENTPOOL})
+ {
+ print "overwrite default Documentpool: '$sDocumentPool'\n";
+ print " with \$ENV{DOCUMENTPOOL}: $ENV{DOCUMENTPOOL}\n";
+ $sDocumentPool = $ENV{DOCUMENTPOOL};
+ }
+ else
+ {
+ print "Given \$DOCUMENTPOOL doesn't exist.\n";
+ }
+}
+
+my $err = 0;
+my $nCompareTime = getTime();
+
+# if we want to check one file, give -pool and -document
+# if we want to check the whole pool, give -pool
+# if we want to check all, call without parameters
+if ($pool)
+{
+ if ($document)
+ {
+ $err = SingleDocumentCompare( $sDocumentPool,
+ $pool,
+ $document,
+ $creatortype,
+ $prepareonly,
+ $show
+ );
+ }
+ else
+ {
+ $err = CompareFiles($sDocumentPool, $pool);
+ }
+}
+else
+{
+ local *DIR;
+ if (opendir (DIR, $sDocumentPool)) # Directory oeffnen
+ {
+ my $myfile;
+ while ($myfile = readdir(DIR))
+ { # ein filename holen
+ if ($myfile eq "." ||
+ $myfile eq "..")
+ {
+ next;
+ }
+ my $sDocumentPath = appendPath($sDocumentPool, $myfile);
+ if ( -d $sDocumentPath )
+ {
+ $err += CompareFiles($sDocumentPool, $myfile);
+ }
+ elsif ( -f $sDocumentPath )
+ {
+ print "Warning: the file '$myfile' will not compared.\n";
+ }
+ }
+ closedir(DIR);
+ }
+ # my $sPool = "eis-chart";
+ # $err += CompareFiles($sDocumentPool, "eis-chart");
+ # $err += CompareFiles($sDocumentPool, "eis-impress");
+ # $err += CompareFiles($sDocumentPool, "eis-writer");
+ # $err += CompareFiles($sDocumentPool, "eis-calc");
+
+}
+
+printTime(endTime($nCompareTime));
+exit ($err);
+
+# ------------------------------------------------------------------------------
+
+sub CompareFiles($$)
+{
+ my $sDocumentPath = shift;
+ my $sPool = shift;
+ my %aFailedHash;
+ my $startdir = appendPath($sDocumentPath, $sPool);
+
+ local *DIR;
+ if (opendir (DIR, $startdir)) # Directory oeffnen
+ {
+ my $myfile;
+ while ($myfile = readdir(DIR))
+ { # ein filename holen
+ if ($myfile eq "knownissues.xcl")
+ {
+ next;
+ }
+ my $sAbsoluteFile = appendPath($startdir, $myfile);
+ if (-f $sAbsoluteFile)
+ {
+ my $nIssue;
+ my $sIssueText;
+ ($nIssue, $sIssueText) = checkForKnownIssue($startdir, $myfile);
+ if ($nIssue == 0)
+ {
+ $err = SingleDocumentCompare(
+ # "/net/so-gfxcmp-documents.germany.sun.com/export/gfxcmp/document-pool", # $documentpoolpath,
+ $sDocumentPool,
+ $sPool, # $documentpool,
+ $myfile, # $documentname);
+ $creatortype, # $destinationcreatortype,
+ $prepareonly,
+ $show
+ );
+ $aFailedHash{$myfile} = $err;
+ }
+ else
+ {
+ print "$myfile [KNOWN ISSUE: #$sIssueText#]\n";
+ }
+ }
+ }
+ closedir(DIR);
+ }
+
+ print "***** State for graphical compare of pool: '$sPool' ******\n";
+ my $nErrorCount = 0;
+ my $file;
+ foreach $file (keys %aFailedHash)
+ {
+ if ($aFailedHash{$file} != 0)
+ {
+ print "Failed: $file\n";
+ $nErrorCount++;
+ }
+ }
+ print "Whole unit: ";
+ if ($nErrorCount > 0)
+ {
+ print "PASSED.FAILED\n";
+ }
+ else
+ {
+ print "PASSED.OK\n";
+ }
+ print "************************************************************\n";
+ return $nErrorCount;
+}
+# ------------------------------------------------------------------------------
+# return issue number if file exists in knownissues.xcl file
+sub checkForKnownIssue($$)
+{
+ my $startdir = shift;
+ my $myfile = shift;
+
+ if ($force)
+ {
+ return 0,"";
+ }
+
+ my $sKnownIssueFile = appendPath($startdir, "knownissues.xcl");
+ my $sIssueText = "unknown";
+ local *ISSUES;
+ my $nIssue = 0;
+ my $sCurrentSection;
+
+ if (open(ISSUES, $sKnownIssueFile))
+ {
+ my $line;
+ while ($line = <ISSUES>)
+ {
+ chomp($line);
+ if ($line =~ /\[(.*)\]/ )
+ {
+ $sCurrentSection = $1;
+ next;
+ }
+ if ($sCurrentSection eq $creatortype)
+ {
+ if ($line =~ /\#\#\# (.*) \#\#\#/ )
+ {
+ $sIssueText = $1;
+ }
+ if ($line =~ /^${myfile}$/ )
+ {
+ $nIssue = 1;
+ last;
+ }
+ }
+ }
+ close(ISSUES);
+ }
+ return $nIssue, $sIssueText;
+}
+# ------------------------------------------------------------------------------
+sub prepare()
+{
+ # directory structure:
+ # documents will be found in
+ # ../document-pool/eis-tests
+
+ # references will be found in
+ # ../references/unxlngi/eis-tests
+ # ../references/wntmsci/eis-tests
+
+ # output goes to
+ # ../unxlngi6.pro/misc
+
+ if ($verbose)
+ {
+ setVerbose();
+ }
+
+ # TEST
+ if (!$ENV{INPATH})
+ {
+ if ($OSNAME eq "linux")
+ {
+ # just for debug
+ setINPATH("unxlngi6.pro");
+ }
+ }
+ else
+ {
+ setINPATH($ENV{INPATH});
+ }
+
+ if (! $creatortype)
+ {
+ $creatortype= "ps";
+ }
+
+ my $cwd = getcwd();
+ print "Current Directory: $cwd\n" if ($verbose);
+ my $sProjectBase;
+ if ($ENV{PRJ})
+ {
+ # print "cwd:=$cwd\n";
+ # print "PRJ:=$ENV{PRJ}\n";
+ $sProjectBase = appendPath($cwd, $ENV{PRJ});
+ }
+ else
+ {
+ $sProjectBase = dirname($cwd);
+ }
+ if ($OSNAME eq "cygwin")
+ {
+ $sProjectBase = `cygpath -w $sProjectBase`;
+ chomp($sProjectBase);
+ $sProjectBase = unixpath($sProjectBase);
+ # print "cygwin patch \$sProjectBase := $sProjectBase\n";
+ }
+ # print "Project base path: $sProjectBase\n";
+ setProjectRoot($sProjectBase);
+
+
+ # TEST TEST TEST
+ # exit (0);
+}
+# ------------------------------------------------------------------------------
+sub print_usage(*)
+{
+ local *HANDLE = $_[0];
+ my $tool_name = basename($0);
+
+ print(HANDLE <<END_OF_USAGE);
+
+Usage: $tool_name [OPTIONS]
+
+ -pool Give pool name out of document-pool directory.
+ But all documents list in knownissues.xcl will not check.
+ -document Give a single document to test, the known issue list will ignored.
+ -creatortype=s s:ps create postscript files via print to file.
+ s:pdf create PDF file via export to pdf.
+ -h, --help Print this help, then exit
+ -v, --version Print version number, then exit
+
+END_OF_USAGE
+;
+}
diff --git a/testgraphical/source/cwstestresult.pl b/testgraphical/source/cwstestresult.pl
new file mode 100644
index 000000000000..63c68c827dbd
--- /dev/null
+++ b/testgraphical/source/cwstestresult.pl
@@ -0,0 +1,208 @@
+:
+eval 'exec perl -wS $0 ${1+"$@"}'
+ if 0;
+
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+#
+# cwstestresult.pl - publish results of CWS tests to EIS
+#
+
+use strict;
+use Getopt::Long;
+use Cwd;
+
+#### module lookup
+my @lib_dirs;
+BEGIN {
+ if ( !defined($ENV{SOLARENV}) ) {
+ die "No environment found (environment variable SOLARENV is undefined)";
+ }
+ push(@lib_dirs, "$ENV{SOLARENV}/bin/modules");
+ push(@lib_dirs, "$ENV{COMMON_ENV_TOOLS}/modules") if defined($ENV{COMMON_ENV_TOOLS});
+}
+use lib (@lib_dirs);
+
+use Cws;
+
+#### global #####
+( my $script_name = $0 ) =~ s/^.*\b(\w+)\.pl$/$1/;
+
+my $is_debug = 1; # enable debug
+my $opt_master; # option: master workspace
+my $opt_child; # option: child workspace
+my $opt_milestone; # option: milestone
+my $opt_testrunName; # option: testrunName
+my $opt_testrunPlatform; # option: testrunPlatfrom
+my $opt_resultPage; # option: resultPage
+
+
+#### main #####
+
+my $arg_status= parse_options();
+testresult($arg_status);
+exit(0);
+
+#### subroutines ####
+
+sub testresult
+{
+ my $status = shift;
+ # get master and child workspace
+ my $masterws = $opt_master ? uc($opt_master) : $ENV{WORK_STAMP};
+ my $milestone = $opt_milestone ? $opt_milestone : $ENV{UPDMINOR};
+ my $childws = $opt_milestone ? undef : ( $opt_child ? $opt_child : $ENV{CWS_WORK_STAMP} );
+
+ if ( !defined($masterws) ) {
+ print_error("Can't determine master workspace environment.\n"
+ . "Please initialize environment with setsolar ...", 1);
+ }
+
+ if ( !defined($childws) && !defined($milestone) ) {
+ print_error("Can't determine child workspace environment or milestone.\n"
+ . "Please initialize environment with setsolar ...", 1);
+ }
+ if ( !defined($opt_resultPage) ) {
+ $opt_resultPage="";
+ }
+ my $cws = Cws->new();
+ if ( defined($childws) ) {
+ $cws->child($childws);
+ }
+ $cws->master($masterws);
+ my $eis = $cws->eis();
+
+ no strict;
+ my $result='';
+
+ if ( defined($childws) ) {
+ $opt_resultPage=SOAP::Data->type(string => $opt_resultPage);
+ my $id = $cws->eis_id();
+ if ( is_valid_cws($cws) ) {
+ $result=$eis->submitTestResult($id,$opt_testrunName,$opt_testrunPlatform, $opt_resultPage, $status);
+ } else {
+ print STDERR "cws is not valid";
+ }
+ } else {
+ $opt_resultPage=SOAP::Data->type(string => $opt_resultPage);
+ $result=$eis->submitTestResultMWS($masterws,$milestone,$opt_testrunName,$opt_testrunPlatform, $opt_resultPage, $status);
+ }
+
+ exit(0)
+}
+
+
+sub is_valid_cws
+{
+ my $cws = shift;
+
+ my $masterws = $cws->master();
+ my $childws = $cws->child();
+ # check if we got a valid child workspace
+ my $id = $cws->eis_id();
+ if ( !$id ) {
+ print_error("Child workspace '$childws' for master workspace '$masterws' not found in EIS database.", 2);
+ }
+ return 1;
+}
+
+sub parse_options
+{
+ # parse options and do some sanity checks
+ Getopt::Long::Configure("no_ignore_case");
+ my $help = 0;
+ my $success = GetOptions('h' => \$help,
+ 'M=s' => \$opt_master,
+ 'm=s' => \$opt_milestone,
+ 'c=s' => \$opt_child,
+ 'n=s' => \$opt_testrunName,
+ 'p=s' => \$opt_testrunPlatform ,
+ 'r=s' => \$opt_resultPage );
+ if ( $help || !$success || $#ARGV < 0 || (!defined($opt_testrunName)) || ( !defined($opt_testrunPlatform)) ) {
+ usage();
+ exit(1);
+ }
+
+ print "$opt_master\n";
+ print "$opt_milestone\n";
+ print "$opt_child\n";
+ print "$opt_testrunName\n";
+ print "$opt_testrunPlatform\n";
+ print "$opt_resultPage\n";
+
+ if ( defined($opt_milestone) && defined($opt_child) ) {
+ print_error("-m and -c are mutually exclusive options",1);
+ }
+
+ return $ARGV[0];
+}
+
+# sub print_message
+# {
+# my $message = shift;
+#
+# print STDERR "$script_name: ";
+# print STDERR "$message\n";
+# return;
+# }
+
+sub print_error
+{
+ my $message = shift;
+ my $error_code = shift;
+
+ print STDERR "$script_name: ";
+ print STDERR "ERROR: $message\n";
+
+ if ( $error_code ) {
+ print STDERR "\nFAILURE: $script_name aborted.\n";
+ exit($error_code);
+ }
+ return;
+}
+
+sub usage
+{
+ print STDERR "Usage: cwstestresult[-h] [-M masterws] [-m milestone|-c childws] <-n testrunName> <-p testrunPlatform> <-r resultPage> statusName\n";
+ print STDERR "\n";
+ print STDERR "Publish result of CWS- or milestone-test to EIS\n";
+ print STDERR "\n";
+ print STDERR "Options:\n";
+ print STDERR "\t-h\t\t\thelp\n";
+ print STDERR "\t-M master\t\toverride MWS specified in environment\n";
+ print STDERR "\t-m milestone\t\toverride milestone specified in environment\n";
+ print STDERR "\t-c child\t\toverride CWS specified in environment\n";
+ print STDERR "\t-n testrunName\t\tspecifiy name of the test\n";
+ print STDERR "\t-p testrunPlatform\tspecify platform where the test ran on\n";
+ print STDERR "\t-r resultPage\t\tspecify name of attachment or hyperlink\n";
+ print STDERR "\t\t\t\tfor resultPage\n";
+
+
+ print STDERR "\nExample:\n";
+ print STDERR "\tcwstestresult -c mycws -n Performance -p Windows -r PerfomanceTestWindows.html ok\n";
+}
diff --git a/testgraphical/source/cwstestresulthelper.pm b/testgraphical/source/cwstestresulthelper.pm
new file mode 100644
index 000000000000..37a5315445af
--- /dev/null
+++ b/testgraphical/source/cwstestresulthelper.pm
@@ -0,0 +1,268 @@
+package cwstestresulthelper;
+
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+use English;
+use warnings;
+use strict;
+use Cwd;
+use Cwd 'chdir';
+
+use stringhelper;
+use loghelper;
+use oshelper;
+use filehelper;
+use CallExternals;
+
+BEGIN {
+ use Exporter ();
+ our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+ $VERSION = 1.00;
+ # if using RCS/CVS, this may be preferred
+ $VERSION = do { my @r = (q$Revision: 1.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
+ @ISA = qw(Exporter);
+ @EXPORT = qw(&cwstestresult);
+ %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
+ # your exported package globals go here,
+ # as well as any optionally exported functions
+ @EXPORT_OK = ( ); # qw($Var1 %Hashit &func3);
+}
+
+sub cwstestresult($$$$$$)
+{
+ my $sStatus = shift;
+ my $sDBdistinct = shift;
+ my $sourceversion = shift;
+ my $destinationversion = shift;
+
+ my $sSOLARENV; # = getSolenvPath();
+ my $nSOLARENV_fake = 0;
+ my $sCOMMON_ENV_TOOLS;
+ my $nCOMMON_ENV_TOOLS_fake = 0;
+
+ my $MAJOR;
+ my $MINOR;
+ # we need an extra state in DB
+ # if this state is given here, we need to add information in cws back.
+ if ( ! $sSOLARENV)
+ {
+ my @MAJORMINOR=split('_', $sourceversion);
+ if ($#MAJORMINOR < 1)
+ {
+ print "Failure with sourceversion '$sourceversion' not splitable.\n";
+ return;
+ }
+ $MAJOR=$MAJORMINOR[0]; # DEV300, OOH310, ...
+ $MINOR=$MAJORMINOR[1]; # m45, ...
+ if (getEnvironment() eq "wntmsci")
+ {
+ $sSOLARENV="o:/$MAJOR/ooo.$MINOR/solenv";
+ if (! -e $sSOLARENV)
+ {
+ # fallback to old before ause103 (treeconfig)
+ $sSOLARENV="o:/$MAJOR/src.$MINOR/solenv";
+ }
+ }
+ elsif (getEnvironment() eq "unxlngi" ||
+ getEnvironment() eq "unxsoli")
+ {
+ $sSOLARENV="/so/ws/$MAJOR/ooo.$MINOR/solenv";
+ # automount
+ system("ls -al $sSOLARENV >/dev/null");
+ sleep(1);
+ if (! -e $sSOLARENV)
+ {
+ # fallback to old before ause103 (treeconfig)
+ $sSOLARENV="/so/ws/$MAJOR/src.$MINOR/solenv";
+ }
+ }
+ else
+ {
+ log_print("cwstestresult(): This environment is not supported.");
+ return;
+ }
+ }
+ if ( !defined($ENV{SOLARENV}) || length($ENV{SOLARENV}) == 0 )
+ {
+ $ENV{SOLARENV} = $sSOLARENV;
+ log_print(" SOLARENV is: $ENV{SOLARENV} faked\n");
+ $nSOLARENV_fake = 1;
+ }
+ if ( ! $sCOMMON_ENV_TOOLS)
+ {
+ if (isWindowsEnvironment())
+ {
+ $sCOMMON_ENV_TOOLS="r:/etools";
+ }
+ elsif (isUnixEnvironment() )
+ {
+ $sCOMMON_ENV_TOOLS="/so/env/etools";
+ # automount
+ system("ls -al $sCOMMON_ENV_TOOLS >/dev/null");
+ sleep(1);
+ }
+ else
+ {
+ log_print("cwstestresult(): This environment is not supported. (variable COMMON_ENV_TOOLS not set.)");
+ return;
+ }
+ }
+ if ( !defined($ENV{COMMON_ENV_TOOLS}) || length($ENV{COMMON_ENV_TOOLS}) == 0 )
+ {
+ $ENV{COMMON_ENV_TOOLS} = $sCOMMON_ENV_TOOLS;
+ log_print( "COMMON_ENV_TOOLS is: $ENV{COMMON_ENV_TOOLS} faked\n");
+ $nCOMMON_ENV_TOOLS_fake = 1;
+ }
+
+ # if ( !defined($ENV{WORK_STAMP}) )
+ # {
+ # $ENV{WORK_STAMP} = $MAJOR;
+ # log_print( " WORK_STAMP is: $ENV{WORK_STAMP} faked\n");
+ # }
+ # if ( !defined($ENV{UPDMINOR}) )
+ # {
+ # $ENV{UPDMINOR} = $MINOR;
+ # log_print( " UPDMINOR is: $ENV{UPDMINOR} faked\n");
+ # }
+
+ my $nWORK_STAMP_fake = 0;
+ my $nUPDMINOR_fake = 0;
+
+ if ( !defined($ENV{WORK_STAMP}) || length($ENV{WORK_STAMP}) == 0 )
+ {
+ $ENV{WORK_STAMP} = $MAJOR;
+ log_print(" WORK_STAMP is: $ENV{WORK_STAMP} faked\n");
+ $nWORK_STAMP_fake = 1;
+ }
+ if ( !defined($ENV{UPDMINOR}) || length($ENV{WORK_STAMP}) == 0 )
+ {
+ $ENV{UPDMINOR} = $MINOR;
+ log_print(" UPDMINOR is: $ENV{UPDMINOR} faked\n");
+ $nUPDMINOR_fake = 1;
+ }
+
+ # my $sStatus = "ok";
+ # if ($nFailure == 0)
+ # {
+ # $sStatus = $sInfo;
+ # }
+ # elsif ($nFailure == 1)
+ # {
+ # $sStatus = "failed";
+ # }
+ # elsif ($nFailure == 2)
+ # {
+ # $sStatus = "incomplete";
+ # }
+
+ # system("cwstestresult -c mycws -n Performance -p Windows ok");
+ my $sPerlProgram = appendPath($sSOLARENV, "bin/cwstestresult.pl");
+ # if ( -e "cwstestresult.pl" )
+ # {
+ # # use a local version instead
+ # $sPerlProgram = "cwstestresult.pl";
+ # }
+ # else
+ # {
+ # my $currentdir =cwd();
+ # log_print( "We are in $currentdir\n");
+ # }
+
+ my $sPerlParam;
+ # $sPerlParam = " -m $MAJOR"; # master CWS
+ $sPerlParam .= " -c $destinationversion"; # name of CWS
+ $sPerlParam .= " -n ConvWatch"; # ConvWatch need to be capitalised for cwstestresult
+ my $sCWSEnv;
+ if (isWindowsEnvironment())
+ {
+ $sCWSEnv = "Windows";
+ }
+ elsif (getEnvironment() eq "unxlngi")
+ {
+ $sCWSEnv = "Linux";
+ }
+ elsif (getEnvironment() eq "unxsoli")
+ {
+ $sCWSEnv = "SolarisX86";
+ }
+ else
+ {
+ log_print("cwstestresult(): This environment is not supported. (getEnvironment() returns wrong value?)");
+ return;
+ }
+ $sPerlParam .= " -p " . $sCWSEnv;
+ $sPerlParam .= " -r http://so-gfxcmp-lin.germany.sun.com/gfxcmp_ui/status_new.php?distinct=$sDBdistinct";
+
+ $sPerlParam .= " ";
+ $sPerlParam .= $sStatus;
+
+
+ # my $sSetcwsAndPerl = "setcws $destinationversion; " . getPerlExecutable();
+
+ my $err = callperl(getPerlExecutable(), $sPerlProgram, $sPerlParam);
+ if ($err != 0)
+ {
+ log_print( "Can't call cwstestresult.pl\n");
+ }
+ if ($nSOLARENV_fake == 1)
+ {
+ $ENV{SOLARENV} = "";
+ undef( $ENV{SOLARENV} );
+ $nSOLARENV_fake = 0;
+ # if ( defined($ENV{SOLARENV}) )
+ # {
+ # print "SOLARENV always defined.\n";
+ # }
+ }
+ if ($nCOMMON_ENV_TOOLS_fake == 1)
+ {
+ $ENV{COMMON_ENV_TOOLS} = "";
+ undef( $ENV{COMMON_ENV_TOOLS} );
+ $nCOMMON_ENV_TOOLS_fake = 0;
+ }
+
+ if ( $nWORK_STAMP_fake == 1 )
+ {
+ # undef($ENV{WORK_STAMP});
+ $ENV{WORK_STAMP} = "";
+ undef($ENV{WORK_STAMP});
+ $nWORK_STAMP_fake = 0;
+ }
+ if ( $nUPDMINOR_fake == 1 )
+ {
+ $ENV{UPDMINOR} = "";
+ undef($ENV{UPDMINOR});
+ $nUPDMINOR_fake = 0;
+ }
+
+
+}
+
+
+1;
diff --git a/testgraphical/source/dbhelper.pm b/testgraphical/source/dbhelper.pm
new file mode 100644
index 000000000000..0f5c0d5bb5ea
--- /dev/null
+++ b/testgraphical/source/dbhelper.pm
@@ -0,0 +1,209 @@
+#
+# # ------------------------------------------------------------------------------
+#
+# sub DB_INSERT_INTO_TABLE_STATUS()
+# {
+# # my $sDocID = shift;
+# # my $sDBDistinct = shift;
+#
+# my $sHostname = hostname;
+#
+# my $sSQL = "INSERT INTO status (docid, dbdistinct2, hostname)";
+# $sSQL .= " VALUES ($docid, '$dbdistinct', '$sHostname')";
+# ExecSQL($sSQL);
+# }
+# sub DB_UPDATE_TABLE_STATUS_SET_INFO($)
+# {
+# # my $sDocID = shift;
+# # my $sDBDistinct = shift;
+# my $sInfo = shift;
+#
+# # my $sHostname = hostname;
+#
+# my $sInsertSQL = "UPDATE status SET info='$sInfo' WHERE docid=$docid AND dbdistinct2='$dbdistinct'";
+# ExecSQL($sInsertSQL);
+# }
+#
+# sub DB_UPDATE_TABLE_DOCUMENTS_SET_STATE_INFO($$)
+# {
+# # my $sDocID = shift;
+# my $sStatus = shift;
+# my $sError = shift;
+#
+# my $sSQL = "UPDATE documents";
+# $sSQL .= " SET state='" . $sStatus . "'";
+# $sSQL .= ",info='" . $sError . "'";
+# $sSQL .= " WHERE docid=$docid";
+# ExecSQL($sSQL);
+# }
+# sub DB_UPDATE_TABLE_STATUS_SET_STATE($)
+# {
+# # my $sDocID = shift;
+# my $sStatus = shift;
+#
+# my $sSQL = "UPDATE status";
+# $sSQL .= " SET state='" . $sStatus . "'";
+# $sSQL .= " WHERE docid=$docid";
+# ExecSQL($sSQL);
+# }
+#
+# # sub DB_UPDATE_TABLE_STATUS_SET_STATE_FAILED()
+# # {
+# # DB_UPDATE_TABLE_STATUS_SET_STATE("FAILED-FAILED");
+# # }
+# # ------------------------------------------------------------------------------
+# # sub getDBConnectionString()
+# # {
+# # # return "server:jakobus,db:jobs_convwatch,user:admin,passwd:admin";
+# # return "server:unoapi,db:jobs_convwatch,user:convwatch,passwd:convwatch";
+# # }
+# # ------------------------------------------------------------------------------
+# sub getSourceInfo($)
+# {
+# my $sDBStr = shift;
+#
+# my $sSourceVersion;
+# if ( $sDBStr =~ / sourceversion='(.*?)',/ )
+# {
+# $sSourceVersion = $1;
+# log_print( "sSourceVersion: $sSourceVersion\n");
+# }
+# if (! $sSourceVersion)
+# {
+# log_print( "Error: no value for sourceversion found.\n");
+# return;
+# }
+# my $sSourceName;
+# if ( $sDBStr =~ / sourcename='(.*?)',/ )
+# {
+# $sSourceName = $1;
+# log_print( "sSourceName: $sSourceName\n");
+# }
+# my $sSourceCreatorType;
+# if ( $sDBStr =~ / sourcecreatortype='(.*?)',/ )
+# {
+# $sSourceCreatorType = $1;
+# log_print( "sSourceCreatorType: $sSourceCreatorType\n");
+# }
+# return $sSourceVersion, $sSourceName, $sSourceCreatorType;
+# }
+# # ------------------------------------------------------------------------------
+# sub getDestinationInfo($)
+# {
+# my $sDBStr = shift;
+#
+# my $sDestinationVersion;
+# if ( $sDBStr =~ / destinationversion='(.*?)',/ )
+# {
+# $sDestinationVersion = $1;
+# log_print( "sDestinationVersion: $sDestinationVersion\n");
+# }
+# if (! $sDestinationVersion)
+# {
+# log_print( "Error: no value for destinationversion found.\n");
+# return;
+# }
+# my $sDestinationName;
+# if ( $sDBStr =~ / destinationname='(.*?)',/ )
+# {
+# $sDestinationName = $1;
+# log_print( "sDestinationName: $sDestinationName\n");
+# }
+# my $sDestinationCreatorType;
+# if ( $sDBStr =~ / destinationcreatortype='(.*?)',/ )
+# {
+# $sDestinationCreatorType = $1;
+# log_print( "sDestinationCreatorType: $sDestinationCreatorType\n");
+# }
+# return $sDestinationVersion, $sDestinationName, $sDestinationCreatorType;
+# }
+# # ------------------------------------------------------------------------------
+# # sub getMailAddress($)
+# # {
+# # my $sDBStr = shift;
+# # my $sMailAddress = "";
+# # if ( $sDBStr =~ / mailfeedback='(.*?)',/ )
+# # {
+# # $sMailAddress = $1;
+# # log_print( "sMailAddress: $sMailAddress\n");
+# # }
+# # return $sMailAddress;
+# # }
+#
+# # sub getDocumentInfo($)
+# # {
+# # my $sDBStr = shift;
+# #
+# # my $sDocumentPoolPath;
+# # if ( $sDBStr =~ / documentpoolpath='(.*?)',/ )
+# # {
+# # $sDocumentPoolPath = $1;
+# # log_print( "sDocumentPoolPath: $sDocumentPoolPath\n");
+# # }
+# # if (! $sDocumentPoolPath)
+# # {
+# # log_print( "Error: no value for documentpoolpath found.\n");
+# # return;
+# # }
+# # my $sDocumentPool;
+# # if ( $sDBStr =~ / documentpool='(.*?)',/ )
+# # {
+# # $sDocumentPool = $1;
+# # log_print( "sDocumentPool: $sDocumentPool\n");
+# # }
+# # if (! $sDocumentPool)
+# # {
+# # log_print( "Error: no value for documentpool found.\n");
+# # return;
+# # }
+# # my $sDocumentName;
+# # if ( $sDBStr =~ / name='(.*?)',/ )
+# # {
+# # $sDocumentName = $1;
+# # log_print( "sDocumentName: $sDocumentName\n");
+# # }
+# # return $sDocumentPoolPath, $sDocumentPool, $sDocumentName;
+# # }
+#
+# sub getDistinct($)
+# {
+# my $sDBStr = shift;
+# my $sDBDistinct;
+# if ( $sDBStr =~ / dbdistinct2='(\S*?)',/ )
+# {
+# $sDBDistinct = $1;
+# log_print( "dbdistinct2: $sDBDistinct\n");
+# }
+# return $sDBDistinct;
+# }
+#
+# sub getIDInfo($)
+# {
+# my $sDBStr = shift;
+# # my $dbdistinct;
+#
+# my $sDBDistinct = getDistinct($sDBStr);
+# # if ( $sDBStr =~ / dbdistinct2='(\S*?)',/ )
+# # {
+# # $sDBDistinct = $1;
+# # log_print( "dbdistinct2: $sDBDistinct\n");
+# # }
+# if (! $sDBDistinct)
+# {
+# log_print( "Error: no dbdistinct given.\n");
+# return;
+# }
+# my $sDocID;
+# if ( $sDBStr =~ / docid=(\S*?),/ )
+# {
+# $sDocID = $1;
+# log_print( "docid: $sDocID\n");
+# }
+# if (! $sDocID)
+# {
+# log_print( "Error: no docid given.\n");
+# return;
+# }
+# return $sDBDistinct, $sDocID;
+# }
+#
diff --git a/testgraphical/source/filehelper.pm b/testgraphical/source/filehelper.pm
new file mode 100644
index 000000000000..ed1be35cf124
--- /dev/null
+++ b/testgraphical/source/filehelper.pm
@@ -0,0 +1,358 @@
+package filehelper;
+
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+use strict;
+use warnings;
+use strict;
+use English; # $OSNAME, ...
+use stringhelper;
+
+BEGIN {
+ use Exporter ();
+ our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+ $VERSION = 1.00;
+ # if using RCS/CVS, this may be preferred
+ $VERSION = do { my @r = (q$Revision: 1.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
+ @ISA = qw(Exporter);
+ @EXPORT = qw(&dospath &unixpath &appendPath &appendClass &setPrefix &getToolsPrefix &rmkdir &getJavaPathSeparator &getJavaFileDirSeparator &getFromPathes &convertCygwinPath);
+ %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
+ # your exported package globals go here,
+ # as well as any optionally exported functions
+ @EXPORT_OK = ( ); # qw($Var1 %Hashit &func3);
+}
+
+
+# ------------------------------------------------------------------------------
+# helper, to change all file separators
+sub dospath($)
+{
+ my $sPath = shift;
+ if ($OSNAME eq "MSWin32")
+ {
+ # make out of '/' a '\'
+ $sPath =~ s/\//\\/g;
+ }
+ else
+ {
+ }
+ return $sPath;
+}
+
+sub unixpath($)
+{
+ my $sPath = shift;
+ if ($OSNAME ne "MSWin32")
+ {
+ # make out of '\' a '/'
+ $sPath =~ s/\\/\//g;
+ }
+ else
+ {
+ }
+ return $sPath;
+}
+
+# ------------------------------------------------------------------------------
+# sub getGlobalInstSet()
+# {
+# my $sJumbo;
+# if ($OSNAME eq "MSWin32")
+# {
+# # $sJumbo = "\\\\so-gfxcmp-lin\\jumbo_ship\\install";
+# $sJumbo = "\\\\jumbo.germany.sun.com\\ship\\install";
+# }
+# elsif ($OSNAME eq "cygwin")
+# {
+# $sJumbo = "//jumbo.germany.sun.com/ship/install";
+# }
+# else
+# {
+# $sJumbo = "/net/jumbo.germany.sun.com/ship/install";
+# }
+# return $sJumbo;
+# }
+
+# ------------------------------------------------------------------------------
+# sub getSolarisLockFile()
+# {
+# my $sSolarisLockFile = "/tmp/.ai.pkg.zone.lock-afdb66cf-1dd1-11b2-a049-000d560ddc3e";
+# return $sSolarisLockFile;
+# }
+#
+# sub checkForSolarisLock()
+# {
+# if ($OSNAME eq "solaris")
+# {
+# # wait until the internal installer lock is gone
+# while ( -e getSolarisLockFile() )
+# {
+# while ( -e getSolarisLockFile() )
+# {
+# log_print( "Warning: Wait active until installer lock is gone. \n");
+# sleep 1;
+# }
+# sleep 5;
+# }
+# log_print( "[ok], lock is gone.\n");
+# }
+# }
+#
+# sub deleteSolarisLock()
+# {
+# if ($OSNAME eq "solaris")
+# {
+# sleep 1;
+# unlink getSolarisLockFile();
+#
+# sleep 1;
+# if ( -e getSolarisLockFile() )
+# {
+# # try delete the file as super user?
+# `sudo rm -f getSolarisLockFile()`;
+# sleep 1;
+# }
+# }
+# }
+
+# ------------------------------------------------------------------------------
+sub appendPath($$)
+{
+ my $sPath = shift;
+ my $sAddPath = shift;
+ if ($sPath && $sAddPath)
+ {
+ if (! endswith($sPath, "/") &&
+ ! endswith($sPath, "\\"))
+ {
+ # getJavaFileDirSeparator();
+ $sPath .= "/";
+ }
+ $sPath .= $sAddPath;
+ }
+ return $sPath;
+}
+
+sub appendClass($$)
+{
+ my $sPath = shift;
+ my $sAddPath = shift;
+
+ my $sSeparator = getJavaPathSeparator();
+ if ($sPath && $sAddPath)
+ {
+ if (! endswith($sPath, $sSeparator))
+ {
+ # getJavaFileDirSeparator();
+ $sPath .= $sSeparator;
+ }
+ $sPath .= $sAddPath;
+ }
+ return $sPath;
+}
+
+# ------------------------------------------------------------------------------
+
+our $sPrefix;
+sub setPrefix($)
+{
+ $sPrefix = shift;
+}
+
+sub getPrefix()
+{
+ return $sPrefix;
+}
+
+# ------------------------------------------------------------------------------
+our $programprefix;
+
+# sub getProgramPrefix($)
+# {
+# my $sDBDistinct = shift;
+#
+# my $sProgramPrefix;
+# if (! $programprefix)
+# {
+# if ($OSNAME eq "MSWin32")
+# {
+# # $programprefix = "C:/gfxcmp/programs";
+# $programprefix = "C:";
+# if (getPrefix() eq "performance")
+# {
+# $programprefix = "D:";
+# }
+# $programprefix = appendPath($programprefix, "gp");
+# }
+# elsif ($OSNAME eq "linux")
+# {
+# $programprefix = "/space/" . getPrefix() . "/programs";
+# }
+# elsif ($OSNAME eq "solaris")
+# {
+# $programprefix = "/space/" . getPrefix() . "/programs";
+# }
+# else
+# {
+# print "Error: This environment isn't supported yet.\n";
+# exit(1);
+# }
+# }
+# $sProgramPrefix = appendPath($programprefix, substr($sDBDistinct, 0, 19));
+# return $sProgramPrefix;
+# }
+# ------------------------------------------------------------------------------
+our $toolsprefix;
+
+sub getToolsPrefix()
+{
+ my $sToolsPrefix;
+ if (! $toolsprefix)
+ {
+ if ($OSNAME eq "MSWin32")
+ {
+ $toolsprefix = "C:";
+ if (getPrefix() eq "performance")
+ {
+ $toolsprefix = "D:";
+ }
+ }
+ elsif ($OSNAME eq "linux")
+ {
+ $toolsprefix = "/space";
+ }
+ elsif ($OSNAME eq "solaris")
+ {
+ $toolsprefix = "/space";
+ }
+ else
+ {
+ print "Error: This environment isn't supported yet.\n";
+ exit(1);
+ }
+ $toolsprefix = appendPath($toolsprefix, getPrefix());
+ $toolsprefix = appendPath($toolsprefix, "tools");
+ }
+ $sToolsPrefix = $toolsprefix;
+ return $sToolsPrefix;
+}
+
+# also Windows safe
+sub rmkdir($)
+{
+ my($tpath) = shift;
+ my $dir;
+ my $accum = "";
+
+ my @dirs = split(/\//, $tpath);
+ if ( $#dirs eq 0 )
+ {
+ @dirs = split("\\\\", $tpath);
+ }
+
+ foreach $dir (@dirs)
+ {
+ $accum = "$accum$dir/";
+ if($dir ne "")
+ {
+ if(! -d "$accum")
+ {
+ mkdir ($accum);
+ chmod (0777,$accum);
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------------------
+sub getJavaPathSeparator()
+{
+ my $ps = ":";
+ if ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
+ {
+ $ps = ";";
+ }
+ return $ps;
+}
+# ------------------------------------------------------------------------------
+sub getJavaFileDirSeparator()
+{
+ my $sfs = "/";
+ if ($OSNAME eq "MSWin32")
+ {
+ $sfs = "\\";
+ }
+ return $sfs;
+}
+# ------------------------------------------------------------------------------
+sub getFromPathes($$)
+{
+ my $sPathesIni = shift;
+ my $searchvalue = shift;
+ my $sResult;
+ if ( -e $sPathesIni)
+ {
+ local *PATHES;
+ if (open(PATHES, "$sPathesIni"))
+ {
+ my $line;
+ while ($line = <PATHES>)
+ {
+ chomp($line);
+ if ($line =~ /^$searchvalue=(.*)$/)
+ {
+ $sResult = $1;
+ }
+ }
+ close(PATHES);
+ }
+ }
+ return $sResult;
+}
+
+sub convertCygwinPath($)
+{
+ my $sPath = shift;
+
+ if ($OSNAME eq "cygwin")
+ {
+ # print "Cygwin Path Patch.\n" if ($verbose);
+ if ($sPath =~ /\/cygdrive\/(.)/)
+ {
+ my $Letter = $1;
+ $sPath =~ s/\/cygdrive\/${Letter}/${Letter}\:/;
+ # print "Cygwin Path Patch: '$sPath'\n" if ($verbose);
+ }
+ }
+ return $sPath;
+}
+
+
+
+1;
diff --git a/testgraphical/source/fill_documents_loop.pl b/testgraphical/source/fill_documents_loop.pl
new file mode 100644
index 000000000000..c1b8174fefe5
--- /dev/null
+++ b/testgraphical/source/fill_documents_loop.pl
@@ -0,0 +1,423 @@
+eval 'exec perl -wS $0 ${1+\"$@\"}'
+ if 0;
+
+# This program has to start for the new convwatch,
+# once on Windows environment and once on Linux environment
+# Solaris is handled by the linux also.
+#
+# This program polls the database (documentcompare) every 60s for new jobs
+# it runs over the given directory from documentpoolpath and pool, and create for every file
+# a new database entry in documents.
+#
+
+BEGIN
+{
+ # Adding the path of this script file to the include path in the hope
+ # that all used modules can be found in it.
+ $0 =~ /^(.*)[\/\\]/;
+ push @INC, $1;
+}
+
+use ConvwatchHelper;
+use CallExternals;
+use stringhelper;
+use filehelper;
+use oshelper;
+use timehelper;
+use cwstestresulthelper;
+
+use strict;
+use Cwd;
+use File::Basename;
+use English; # $OSNAME, ...
+use Getopt::Long;
+use File::Path;
+use Cwd 'chdir';
+
+my $cwd = getcwd();
+
+our $help; # Help option flag
+our $version; # Version option flag
+our $test;
+
+our $version_info = 'convwatch.pl $Revision: 1.24 $ ';
+
+our $SOLARENV;
+our $COMMON_ENV_TOOLS;
+
+
+our $documentpoolname;
+our $documentpoolpath;
+our $dbdistinct;
+our $sParentDistinct;
+our $sCurrentDocumentPool;
+
+our $fs;
+our @aEntries;
+
+# Prototypes
+# sub getJavaFileDirSeparator();
+sub readdirectory($$$);
+sub putDocumentInDB($$$);
+
+# flush STDOUT
+my $old_handle = select (STDOUT); # "select" STDOUT and save # previously selected handle
+$| = 1; # perform flush after each write to STDOUT
+select ($old_handle); # restore previously selected handle
+
+setPrefix("gfxcmp");
+
+if (!GetOptions(
+ "test" => \$test,
+ "help" => \$help,
+ "version" => \$version
+ ))
+{
+ print_usage(*STDERR);
+ exit(1);
+}
+if ($help)
+{
+ print_usage(*STDOUT);
+ exit(0);
+}
+# Check for version option
+if ($version)
+{
+ print STDERR "$version_info\n";
+ exit(0);
+}
+
+# ------------------------------------------------------------------------------
+# within mysql it is better to use only '/'
+$fs = "/"; # getJavaFileDirSeparator();
+# ------------------------------------------------------------------------------
+sub readdirectory($$$)
+{
+ my $startdir = shift;
+ my $sValues = shift;
+ my $hook = shift;
+
+ my $myfile;
+
+ local *DIR;
+ chdir $startdir;
+ cwd();
+ if (! endswith($startdir, $fs))
+ {
+ $startdir .= $fs;
+ }
+
+ my $nCountFiles = 0;
+ if (opendir (DIR, $startdir)) # Directory oeffnen
+ {
+ while ($myfile = readdir(DIR))
+ { # ein filename holen
+ #if (! -l $myfile) # not a link
+ #{
+ if (-d $myfile ) # is a directory
+ {
+ if ( -l $myfile)
+ {
+ next;
+ }
+ if ($myfile ne "." && $myfile ne "..")
+ {
+ my $sNewStartDir = $startdir . $myfile ."/"; # neuen Directorystring erstellen
+ if ($sNewStartDir =~ "^\/proc" ||
+ $sNewStartDir =~ "^\/dev" ||
+ $sNewStartDir =~ "^\/udev" ||
+ $sNewStartDir =~ "lost+found" )
+ {
+ next;
+ }
+ # my $sNewDestDir = $destdir . $myfile ."/";
+ # do a recursive call
+ # $nCountFiles++;
+ my $nFileCount = readdirectory($sNewStartDir, $sValues, $hook);
+ # workOnDir($sNewDir, $nFileCount);
+ $nCountFiles += $nFileCount;
+
+ chdir ($startdir); # zurueckwechseln.
+ cwd();
+ }
+ }
+ else
+ {
+ # File must exist, be a regular file and must not be the $onlyOnFile
+ if (-f $myfile)
+ {
+ # print " $startdir" . "$myfile\n";
+ $nCountFiles++;
+ # workOnFile($startdir, $myfile, $destdir);
+ $hook->($startdir, $myfile, $sValues);
+ }
+ }
+ #}
+ #else
+ #{
+ # print "linked file: $dir/$myfile\n";
+ #}
+ }
+ closedir(DIR);
+ }
+ else
+ {
+ print "could not open $startdir\n";
+ }
+ return $nCountFiles;
+}
+# ------------------------------------------------------------------------------
+sub putDocumentInDB($$$)
+{
+ my $currentDir = shift;
+ my $currentFile = shift;
+ my $sValues = shift;
+
+ my $sSourceFilename = $currentDir . $currentFile;
+ # we cut down all the previous names like documentpoolpath and the documentpoolname
+ $sSourceFilename = substr($sSourceFilename, length($sCurrentDocumentPool . $fs));
+
+ my $sSQL = "INSERT INTO documents (dbdistinct2, name, pagecount, priority, parentdistinct) VALUES";
+ $sSQL .= "('" . $dbdistinct . "', '" . $sSourceFilename . "', 0, 1, '". $sParentDistinct . "')";
+ # print $sSQL . "\n";
+
+ push(@aEntries, $sSQL);
+ # ExecSQL($sSQL);
+}
+
+# ------------------------------------------------------------------------------
+sub createDBEntriesForEveryDocument($)
+{
+ my $sStr = shift;
+ if ($sStr =~ /^MySQL-Error/ )
+ {
+ # we don't do anything if an error occured
+ return;
+ }
+
+ # interpret the follows string
+ # documentpoolpath='//so-gfxcmp-documents/doc-pool', documentpool='demo_lla', dbdistinct=62,
+
+ # my $sDocumentPoolDir;
+ if ( $sStr =~ /documentpoolpath='(.*?)',/ )
+ {
+ $documentpoolpath = $1;
+ }
+ if (! $documentpoolpath)
+ {
+ print "Error: no value for documentpoolpath found.\n";
+ return;
+ }
+
+ # my $sDocumentPool;
+ if ( $sStr =~ /documentpool='(.*?)',/ )
+ {
+ $documentpoolname = $1;
+ }
+ if (! $documentpoolname)
+ {
+ print "Error: no value for documentpool found.\n";
+ return;
+ }
+ # my $dbdistinct;
+ if ( $sStr =~ /dbdistinct2='(\S*?)',/ )
+ {
+ $dbdistinct = $1;
+ }
+ if (! $dbdistinct)
+ {
+ print "Error: no dbdistinct given.\n";
+ return;
+ }
+
+ if (! -d $documentpoolpath )
+ {
+ my $sEnv = getEnvironment();
+ if ( isUnixEnvironment() )
+ {
+ $documentpoolpath = "/net/so-gfxcmp-documents" . $documentpoolpath;
+ }
+ if ( -d $documentpoolpath )
+ {
+ print "Warning: given documentpoolpath seems to be local, fix to '$documentpoolpath'\n";
+ my $sSQL = "UPDATE documentcompare SET documentpoolpath='$documentpoolpath' WHERE dbdistinct2='$dbdistinct'";
+ print "$sSQL\n";
+ ExecSQL($sSQL);
+ }
+ else
+ {
+ print "Error: documentpoolpath '$documentpoolpath' not found. Don't insert anything.\n";
+ my $sSQL = "UPDATE documentcompare SET state='failed',info='documentpoolpath not found.' WHERE dbdistinct2='$dbdistinct'";
+ print "$sSQL\n";
+ ExecSQL($sSQL);
+ return;
+ }
+ }
+ # create the documentpool directory, to run through
+ $sCurrentDocumentPool = $documentpoolpath;
+ if (! endswith($sCurrentDocumentPool, $fs))
+ {
+ $sCurrentDocumentPool .= $fs;
+ }
+ $sCurrentDocumentPool .= $documentpoolname;
+
+ if ( -d $sCurrentDocumentPool )
+ {
+ if ( $sStr =~ /parentdistinct='(.*?)',/ )
+ {
+ $sParentDistinct = $1;
+ }
+ else
+ {
+ $sParentDistinct = "";
+ }
+
+ # remove any doubles, if any
+ my $sSQL = "DELETE FROM documents WHERE dbdistinct2='$dbdistinct'";
+ print "$sSQL\n";
+ ExecSQL($sSQL);
+
+ # run over the whole given document pool and store every found document name in the database
+ readdirectory($sCurrentDocumentPool, "", \&putDocumentInDB);
+
+ chdir $cwd;
+ cwd();
+
+ foreach $sSQL (@aEntries)
+ {
+ # print "# $sSQL\n";
+ print "$sSQL\n";
+ ExecSQL($sSQL);
+ }
+
+ my $sSQL = "UPDATE documentcompare SET state='inprogress' WHERE dbdistinct2='$dbdistinct'";
+ print "$sSQL\n";
+ ExecSQL($sSQL);
+ print "----------------------------------------------------------------------\n";
+ $sParentDistinct = "";
+ @aEntries = ();
+ }
+ else
+ {
+ print "Error: Given document pool '$sCurrentDocumentPool' doesn't exists.\n";
+ my $sSQL = "UPDATE documentcompare SET state='cancelled' WHERE dbdistinct2='$dbdistinct'";
+ ExecSQL($sSQL);
+ return;
+ }
+ # Send Mail, due to startconvwatch now
+ sendMail($sStr, $documentpoolname, $dbdistinct);
+}
+
+# ------------------------------------------------------------------------------
+sub sendMail($$$)
+{
+ my $sStr = shift;
+ my $documentpool = shift;
+ my $dbdistinct = shift;
+ my $sourceversion;
+ if ( $sStr =~ /sourceversion='(.*?)',/ )
+ {
+ $sourceversion = $1;
+ }
+ if (! $sourceversion)
+ {
+ print "Warning: no value for sourceversion found.\n";
+ return;
+ }
+ my $destinationversion;
+ if ( $sStr =~ /destinationversion='(.*?)',/ )
+ {
+ $destinationversion = $1;
+ }
+ if (! $destinationversion)
+ {
+ print "Warning: no value for destinationversion found.\n";
+ return;
+ }
+ my $mailaddress;
+ if ( $sStr =~ /mailfeedback='(.*?)',/ )
+ {
+ $mailaddress = $1;
+ }
+ if (! $mailaddress)
+ {
+ print "Warning: no value for mailfeedback found.\n";
+ return;
+ }
+
+ # state is 'inprogress', so send a mail
+ # my $sMailAddress = getMailAddress($sDoneStr);
+ my $sParams = "$sourceversion";
+ $sParams .= " $destinationversion";
+ $sParams .= " $documentpool";
+ $sParams .= " $dbdistinct";
+ $sParams .= " $mailaddress";
+ $sParams .= " starts"; # run through state of convwatch
+
+ my $sMailProgram = appendPath(getQADEVToolsPath(), "mailsend.php");
+
+ my $err;
+ my @lines;
+ my $sLine;
+ ($err, @lines) = callphp(getPHPExecutable(), $sMailProgram, $sParams);
+ foreach $sLine (@lines)
+ {
+ log_print( "Mail: $sLine\n");
+ }
+
+ if ($documentpool eq "EIS-tests")
+ {
+ cwstestresult("running", $dbdistinct, $sourceversion, $destinationversion, $SOLARENV, $COMMON_ENV_TOOLS);
+ }
+}
+# ------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------
+
+my $sEnvironmentCondition;
+if (isWindowsEnvironment())
+{
+ $sEnvironmentCondition = "environment='" . getEnvironment() . "'";
+}
+elsif (isUnixEnvironment())
+{
+ # $sEnvironmentCondition = " ( environment='unxlngi' OR environment='unxsoli' ) ";
+ $sEnvironmentCondition = " environment='" . getEnvironment() . "'";
+}
+else
+{
+ print "Error: wrong environment.\n";
+ exit(1);
+}
+my $sWhereClause = "WHERE ";
+if ($sEnvironmentCondition)
+{
+ $sWhereClause .= $sEnvironmentCondition . " AND ";
+}
+$sWhereClause .= " state='new'";
+
+setToolsPath(getQADEVToolsPath());
+
+# ---------------------------------- main loop ----------------------------------
+while (1)
+{
+ my @aResult;
+ my $sSQL = "SELECT documentpoolpath,documentpool,dbdistinct2,sourceversion,destinationversion,mailfeedback,parentdistinct FROM documentcompare $sWhereClause";
+ @aResult = ExecSQL($sSQL);
+
+ my $aValue;
+ foreach $aValue (@aResult)
+ {
+ # print "# $nValue\n";
+ createDBEntriesForEveryDocument($aValue);
+ }
+ if ($test)
+ {
+ last;
+ }
+
+ # wait 30sec.
+ # wait30seconds();
+ waitAMinute();
+ checkForStop("stop_fill_documents_loop");
+}
diff --git a/testgraphical/source/graphical_compare.pm b/testgraphical/source/graphical_compare.pm
new file mode 100644
index 000000000000..5cde8d64ea01
--- /dev/null
+++ b/testgraphical/source/graphical_compare.pm
@@ -0,0 +1,586 @@
+package graphical_compare;
+
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+use CallExternals;
+use stringhelper;
+use timehelper;
+use filehelper;
+use loghelper;
+use oshelper;
+use cwstestresulthelper;
+use solarenvhelper;
+use ConvwatchHelper;
+
+use strict;
+use Cwd;
+# use File::Basename;
+use Getopt::Long;
+use English; # $OSNAME, ...
+use File::Path;
+use Cwd 'chdir';
+use Sys::Hostname;
+use Time::localtime;
+
+# my $cwd = getcwd();
+
+BEGIN {
+ use Exporter ();
+ our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+ $VERSION = 1.00;
+ # if using RCS/CVS, this may be preferred
+ $VERSION = do { my @r = (q$Revision: 1.2 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
+ @ISA = qw(Exporter);
+ @EXPORT = qw(&SingleDocumentCompare &setPrefix &setConnectionString);
+ %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
+ # your exported package globals go here,
+ # as well as any optionally exported functions
+ @EXPORT_OK = ( ); # qw($Var1 %Hashit &func3);
+}
+
+
+our $nTimeOut = 300 * 1000;
+our $viewable = 1;
+our $port;
+our $resolution;
+our $overwritereference;
+our $fixreference;
+our $sConncectionString;
+
+sub setConnectionString($)
+{
+ $sConncectionString=shift;
+}
+
+sub getOOoRunnerClasspath()
+{
+ my $sSourceRoot;
+ my $sUPDExtensions = "";
+ if (defined ($ENV{SOL_TMP}) && defined ($ENV{SOLARVERSION}))
+ {
+ $sSourceRoot = $ENV{SOLARVERSION};
+ }
+ elsif (defined $ENV{SOURCE_ROOT})
+ {
+ $sSourceRoot = $ENV{SOURCE_ROOT};
+ $sSourceRoot = appendPath($sSourceRoot, $ENV{WORK_STAMP});
+ }
+ else
+ {
+ $sSourceRoot = $ENV{SOLARVERSION};
+ $sUPDExtensions = ".$ENV{UPDMINOR}";
+ }
+ $sSourceRoot = appendPath($sSourceRoot, $ENV{INPATH});
+ my $sSourceRootBin = appendPath($sSourceRoot, "bin" . $sUPDExtensions);
+ my $sSourceRootLib = appendPath($sSourceRoot, "lib" . $sUPDExtensions);
+
+ if (! -d $sSourceRoot )
+ {
+ log_print( "SourceRoot not found, search it in '$sSourceRoot'\n");
+ return "";
+ }
+
+ my $sOOoRunnerPath = $sSourceRootBin;
+ my $sUnoilPath = $sSourceRootBin;
+ my $sRidlPath = $sSourceRootBin;
+ my $sJurtPath = $sSourceRootBin;
+ my $sJuhPath = $sSourceRootBin;
+ my $sJavaUnoPath = $sSourceRootBin;
+
+ my $sOOoRunnerClasspath =
+ appendPath( $sRidlPath, "ridl.jar") . getJavaPathSeparator() .
+ appendPath( $sUnoilPath, "unoil.jar") . getJavaPathSeparator() .
+ appendPath( $sJurtPath, "jurt.jar") . getJavaPathSeparator() .
+ appendPath( $sJuhPath, "juh.jar") . getJavaPathSeparator() .
+ appendPath( $sJavaUnoPath, "java_uno.jar") . getJavaPathSeparator() .
+ appendPath( $sOOoRunnerPath, "OOoRunnerLight.jar");
+ if (isWindowsEnvironment())
+ {
+ $sOOoRunnerClasspath .= getJavaPathSeparator() . $sSourceRootBin;
+ }
+ else
+ {
+ $sOOoRunnerClasspath .= getJavaPathSeparator() . $sSourceRootLib;
+ }
+ return $sOOoRunnerClasspath;
+}
+
+# ------------------------------------------------------------------------------
+sub getTempPath()
+{
+ my $sTempPath;
+ if (isWindowsEnvironment())
+ {
+ $sTempPath = "C:/temp";
+ }
+ elsif (isUnixEnvironment())
+ {
+ $sTempPath = "/tmp";
+ }
+ else
+ {
+ die "getTempPath() Failed, due to unsupported environment.\n";
+ }
+ return $sTempPath;
+}
+# ------------------------------------------------------------------------------
+
+sub getProjectOutput()
+{
+ my $sOutput = appendPath(getProjectRoot(), $ENV{INPATH});
+ $sOutput = appendPath($sOutput, "misc");
+ return $sOutput;
+}
+
+# ------------------------------------------------------------------------------
+sub getProjectOutputReference()
+{
+ my $sOutput = appendPath(getProjectRoot(), $ENV{INPATH});
+ $sOutput = appendPath($sOutput, "reference");
+ return $sOutput;
+}
+
+
+sub searchForReference($)
+{
+ my $sFile = shift;
+ if ( -e $sFile )
+ {
+ return 0;
+ }
+ if ( -e $sFile . ".ps")
+ {
+ return 0;
+ }
+ if ( -e $sFile . ".pdf")
+ {
+ return 0;
+ }
+ return 1;
+}
+# ------------------------------------------------------------------------------
+
+# my $sOfficeName = $officeprefixname . $officename;
+sub SingleDocumentCompare($$$$$$)
+{
+ # get all about the document to compare
+ my $sDocumentPoolPath = shift;
+ my $sDocumentPool = shift;
+ my $sDocumentName = shift;
+ my $sDebug = "";
+
+ # get all about the destination office
+ my $sCreatorType = shift;
+ if (! $sCreatorType)
+ {
+ # log_print( "parameter -creatortype not given. Use 'OOo'\n");
+ $sCreatorType = "ps";
+ }
+ my $prepareonly = shift;
+ my $show = shift;
+
+ # my $nSimpleCompareTime = getTime();
+
+ my $nConvwatchFailed = 0;
+ set_logfile( appendPath(getProjectOutput(), $sDocumentName . ".txt" ));
+
+ print("$sDocumentName");
+ log_print("\n");
+ log_print("Graphical compare on document: '$sDocumentName'\n");
+ # ------------------------------------------------------------------------------
+ # create postscript or pdf from first installed office
+ # ------------------------------------------------------------------------------
+
+ my $sOOoRunnerClasspath = quoteIfNeed(getOOoRunnerClasspath());
+ if ($OSNAME eq "cygwin")
+ {
+ if (!startswith($sOOoRunnerClasspath, "\""))
+ {
+ $sOOoRunnerClasspath = quote($sOOoRunnerClasspath);
+ }
+ }
+ if (length($sOOoRunnerClasspath) == 0)
+ {
+ $nConvwatchFailed == 1;
+ }
+ # ------------------------------------------------------------------------------
+ # create postscript or pdf from second installed office
+ # ------------------------------------------------------------------------------
+
+ my $sPathesIni = appendPath(getProjectOutput(), "pathes.ini");
+ my $gspath = getFromPathes($sPathesIni, "gs.path");
+ my $gsexe = getFromPathes($sPathesIni, "gs.exe");
+ my $impath = getFromPathes($sPathesIni, "imagemagick.path");
+ my $javaexe = getFromPathes($sPathesIni, "java.exe");
+ setJavaExecutable($javaexe);
+
+ log_print("----- CREATE POSTSCRIPT OR PDF WITH RUNNING OFFICE -----\n");
+ # my $nPrepareSecondPostscriptTime = getTime();
+ if ($nConvwatchFailed == 0)
+ {
+ my $sInputPath = $sDocumentPoolPath;
+ $sInputPath = appendPath($sInputPath, $sDocumentPool);
+ $sInputPath = appendPath($sInputPath, $sDocumentName);
+
+ if (! -f $sInputPath )
+ {
+ $nConvwatchFailed = 1;
+ log_print("ERROR: File '$sInputPath' doesn't exists.\n");
+ }
+ else
+ {
+ my $sOutputPath = getProjectOutput();
+ my $sPropertyFile = appendPath(getProjectOutput() , $sDocumentName . ".build.props");
+
+ local *PROPERTYFILE;
+ if (open(PROPERTYFILE, ">$sPropertyFile"))
+ {
+ print PROPERTYFILE "# This file is automatically created by graphical_compare.pl\n";
+ print PROPERTYFILE "DOC_COMPARATOR_PRINT_MAX_PAGE=9999\n";
+ print PROPERTYFILE "DOC_COMPARATOR_GFX_OUTPUT_DPI_RESOLUTION=180\n";
+ print PROPERTYFILE "DOC_COMPARATOR_REFERENCE_CREATOR_TYPE=$sCreatorType\n";
+ print PROPERTYFILE "TEMPPATH=" . getTempPath() . "\n";
+ if ($sConncectionString)
+ {
+ print PROPERTYFILE "ConnectionString=$sConncectionString\n";
+ }
+ else
+ {
+ print PROPERTYFILE "ConnectionString=pipe,name=" . getUsername() . "\n";
+ }
+ print PROPERTYFILE "OFFICE_VIEWABLE=true\n";
+ print PROPERTYFILE "CREATE_DEFAULT_REFERENCE=true\n";
+ print PROPERTYFILE "DOC_COMPARATOR_INPUT_PATH=$sInputPath\n";
+ print PROPERTYFILE "DOC_COMPARATOR_OUTPUT_PATH=$sOutputPath\n";
+ if (isWindowsEnvironment())
+ {
+ print PROPERTYFILE "DOC_COMPARATOR_PRINTER_NAME=CrossOffice Generic Printer\n";
+ }
+ print PROPERTYFILE "NoOffice=true\n";
+
+ close(PROPERTYFILE);
+ }
+ else
+ {
+ print "Can't open '$sPropertyFile' for write.\n";
+ }
+ if ( -e "$sPropertyFile")
+ {
+ # start OOoRunner
+ # sleep 10;
+ # $sOOoRunnerClasspathFromDestinationName = quoteIfNeed(getOOoRunnerClasspath());
+ my $sParams;
+ if ( $ENV{PERL} )
+ {
+ $sParams = "-Dperl.exe=" . convertCygwinPath($ENV{PERL});
+ }
+
+ $sParams .= " -cp " . $sOOoRunnerClasspath .
+ " org.openoffice.Runner" .
+ " -TimeOut $nTimeOut" .
+ " -tb java_complex" .
+ " -ini $sPropertyFile" .
+ " -o graphical.PostscriptCreator";
+ # $sParams .= " -cs pipe,name=$USER";
+
+ # $sDebug = "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=9001,suspend=y";
+ my $err = calljava(getJavaExecutable(), $sParams, $sDebug);
+ $sDebug = "";
+ log_print( "\n\n");
+ if ($err != 0)
+ {
+ my $sFailure = "Failed after try to create Postscript/pdf document for " . $sDocumentName;
+ log_print("ERROR: $sFailure\n");
+ $nConvwatchFailed = 1;
+ }
+ }
+ else
+ {
+ my $sFailure = "There is no propertyfile: $sPropertyFile";
+ log_print( "ERROR: $sFailure\n");
+ $nConvwatchFailed=1;
+ }
+ }
+
+ # set prepareonly and it is possible to only create ps or pdf files
+ if ($prepareonly)
+ {
+ print(" [only create ");
+ if ($sCreatorType eq "ps" || $sCreatorType eq "pdf")
+ {
+ print(" $sCreatorType");
+ }
+ else
+ {
+ print(" (${sCreatorType}?)");
+ }
+ if ($nConvwatchFailed == 0)
+ {
+ print(" ok");
+ }
+ else
+ {
+ print(" failed")
+ }
+ print("]\n");
+ return $nConvwatchFailed;
+ }
+
+
+ # ------------------------------------------------------------------------------
+ # create jpeg from postscript or pdf from second installed office
+ # ------------------------------------------------------------------------------
+
+ if ($nConvwatchFailed == 0)
+ {
+ log_print("----- CREATE JPEG FROM POSTSCRIPT OR PDF FROM RUNNING OFFICE -----\n");
+ # start OOoRunner
+ my $sInputPath = getProjectOutput();
+ $sInputPath = appendPath($sInputPath, $sDocumentName);
+
+ my $sOutputPath = getProjectOutput();
+
+ my $sParams = "-cp " . $sOOoRunnerClasspath .
+ " org.openoffice.Runner" .
+ " -TimeOut $nTimeOut" .
+ " -tb java_complex" .
+ " -DOC_COMPARATOR_INPUT_PATH " . quoteIfNeed($sInputPath) .
+ " -DOC_COMPARATOR_OUTPUT_PATH " . quoteIfNeed($sOutputPath) .
+ " -DOC_COMPARATOR_REFERENCE_CREATOR_TYPE $sCreatorType" .
+ " -NoOffice" .
+ " -NoSmallPictures" .
+ " -o graphical.JPEGCreator";
+ if ($gspath)
+ {
+ $sParams .= " -gs.path " . quoteIfNeed($gspath);
+ }
+ if ($gsexe)
+ {
+ $sParams .= " -gs.exe $gsexe";
+ }
+
+ # $sDebug = "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=9001,suspend=y";
+ my $err = calljava(getJavaExecutable(), $sParams, $sDebug);
+ $sDebug = "";
+ # log_print( "\n\n");
+ if ($err != 0)
+ {
+ my $sFailure = "Failed after try to create JPEG from Postscript/pdf document for " . $sDocumentName;
+ log_print("ERROR: $sFailure\n");
+ $nConvwatchFailed = 1;
+ }
+ }
+ }
+
+ # ------------------------------------------------------------------------------
+ # create jpeg from postscript or pdf from references
+ # ------------------------------------------------------------------------------
+
+ if ($nConvwatchFailed == 0)
+ {
+ log_print("----- CREATE JPEG FROM POSTSCRIPT OR PDF FROM REFERENCE -----\n");
+
+ # start OOoRunner
+ my $sInputPath = appendPath(getProjectRoot(), "references");
+ $sInputPath = appendPath($sInputPath, getEnvironment());
+ $sInputPath = appendPath($sInputPath, $sDocumentPool);
+ $sInputPath = appendPath($sInputPath, $sDocumentName);
+
+ my $err = searchForReference($sInputPath);
+ if ($err != 0)
+ {
+ log_print("ERROR: Can't find Postscript or PDF reference for '$sInputPath'\n");
+ $nConvwatchFailed = 1;
+ }
+ else
+ {
+ my $sOutputPath = getProjectOutputReference();
+ rmkdir $sOutputPath;
+
+ my $sIndexFile = appendPath($sOutputPath, "index.ini");
+ # we need the index.ini for better run through
+ local *INDEXINI;
+ if ( ! -e $sIndexFile)
+ {
+ if (open(INDEXINI, ">$sIndexFile"))
+ {
+ # print INDEXINI "[$sDocumentName]\n";
+ close(INDEXINI);
+ }
+ }
+ my $sParams = "-cp " . $sOOoRunnerClasspath .
+ " org.openoffice.Runner" .
+ " -TimeOut $nTimeOut" .
+ " -tb java_complex" .
+ " -DOC_COMPARATOR_INPUT_PATH " . quoteIfNeed($sInputPath) .
+ " -DOC_COMPARATOR_OUTPUT_PATH " . quoteIfNeed($sOutputPath) .
+ " -DOC_COMPARATOR_REFERENCE_CREATOR_TYPE $sCreatorType" .
+ " -NoOffice" .
+ " -NoSmallPictures" .
+ " -o graphical.JPEGCreator";
+ if ($gspath)
+ {
+ $sParams .= " -gs.path " . quoteIfNeed($gspath);
+ }
+ if ($gsexe)
+ {
+ $sParams .= " -gs.exe $gsexe";
+ }
+
+ # $sDebug = "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=9001,suspend=y";
+ my $err = calljava(getJavaExecutable(), $sParams, $sDebug);
+ $sDebug = "";
+ # log_print( "\n\n");
+ if ($err != 0)
+ {
+ my $sFailure = "Failed after try to create JPEG from Postscript/pdf document for references.";
+ log_print("ERROR: $sFailure\n");
+ $nConvwatchFailed = 1;
+ }
+ }
+ }
+ # ------------------------------------------------------------------------------
+ # compare JPEGs
+ # ------------------------------------------------------------------------------
+
+ if ($nConvwatchFailed == 0)
+ {
+ log_print("----- COMPARE JPEGS -----\n");
+ my $sInputPath = appendPath(getProjectOutputReference(), $sDocumentName);
+
+ my $sOutputPath = getProjectOutput();
+
+ my $sParams = "-Xmx512m" .
+ " -cp " . $sOOoRunnerClasspath .
+ " org.openoffice.Runner" .
+ " -TimeOut $nTimeOut" .
+ " -tb java_complex" .
+ " -DOC_COMPARATOR_INPUT_PATH " . quoteIfNeed($sInputPath) .
+ " -DOC_COMPARATOR_OUTPUT_PATH " . quoteIfNeed($sOutputPath) .
+ " -NoOffice" .
+ " -NoSmallPictures" .
+ " -o graphical.JPEGComparator";
+ if ($impath)
+ {
+ $sParams .= " -imagemagick.path " . quoteIfNeed($impath);
+ }
+
+ # start OOoRunner
+ # $sDebug = "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=9001,suspend=y";
+ my $err = calljava(getJavaExecutable(), $sParams, $sDebug);
+ $sDebug = "";
+ log_print( "\n\n");
+ if ($err != 0)
+ {
+ my $sFailure = "Failed after compare JPEGs $sDocumentName\n";
+ log_print("ERROR: $sFailure\n");
+ $nConvwatchFailed = 1;
+
+ if ($show)
+ {
+ # try to execute new java tool to show graphical compare
+ my $sJavaProgram = appendPath(getProjectRoot(), $ENV{INPATH});
+ $sJavaProgram = appendPath($sJavaProgram, "class");
+ $sJavaProgram = appendPath($sJavaProgram, "ConvwatchGUIProject.jar");
+ if ( -e "$sJavaProgram")
+ {
+ my $sInputPath = appendPath(getProjectOutput(), $sDocumentName . ".ps.ini");
+ if (! -e $sInputPath)
+ {
+ $sInputPath = appendPath(getProjectOutput(), $sDocumentName . ".pdf.ini");
+ if (! -e $sInputPath)
+ {
+ $sInputPath = 0;
+ }
+ }
+ if ($sInputPath)
+ {
+ my $sParams = "-Xms128m -Xmx512m -jar $sJavaProgram $sInputPath";
+ # $sParams .= " -cs pipe,name=$USER";
+ # my $sJavaExe = "C:/Program Files/Java/jdk1.6.0_16/bin/java.exe"; # getJavaExecutable()
+ my $sJavaExe = getJavaExecutable();
+ # $sDebug = "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=9001,suspend=y";
+ my $err = calljava($sJavaExe, $sParams, $sDebug);
+ # $sDebug = "";
+ # log_print( "\n\n");
+ # if ($err != 0)
+ # {
+ # my $sFailure = "Failed after try to create Postscript/pdf document for " . $sDocumentName;
+ # log_print("ERROR: $sFailure\n");
+ # $nConvwatchFailed = 1;
+ # }
+ }
+ }
+ else
+ {
+ print "WARNING: The show program '$sJavaProgram' doesn't exists.\n";
+ }
+ }
+ }
+ }
+
+ log_print( "\n\n");
+ close_logfile();
+
+ if ($nConvwatchFailed == 0)
+ {
+ print(" [ok]\n");
+ }
+ else
+ {
+ print(" [FAILED]\n");
+ print("\nPrint output of test: $sDocumentName\n");
+ my $sLogFile = appendPath(getProjectOutput(), $sDocumentName . ".txt");
+ showFile($sLogFile);
+ }
+ # printTime(endTime($nSimpleCompareTime));
+
+ return $nConvwatchFailed;
+}
+
+# ------------------------------------------------------------------------------
+# cat $file
+sub showFile($)
+{
+ my $logfile = shift;
+ local *LOGFILE;
+ if (open(LOGFILE, "$logfile"))
+ {
+ my $line;
+ while ($line = <LOGFILE>)
+ {
+ chomp($line);
+ print $line ."\n";
+ }
+ close(LOGFILE);
+ }
+}
+
+
+1;
diff --git a/testgraphical/source/loghelper.pm b/testgraphical/source/loghelper.pm
new file mode 100644
index 000000000000..6dad31c7761a
--- /dev/null
+++ b/testgraphical/source/loghelper.pm
@@ -0,0 +1,94 @@
+package loghelper;
+
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+use strict;
+
+BEGIN {
+ use Exporter ();
+ our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+ $VERSION = 1.00;
+ # if using RCS/CVS, this may be preferred
+ $VERSION = do { my @r = (q$Revision: 1.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
+ @ISA = qw(Exporter);
+ @EXPORT = qw(&set_logfile &close_logfile &log_print &setVerbose);
+ %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
+ # your exported package globals go here,
+ # as well as any optionally exported functions
+ @EXPORT_OK = ( ); # qw($Var1 %Hashit &func3);
+}
+
+# ------------------------------- Log into a file -------------------------------
+local *LOGFILE;
+our $nGlobalLog = 0;
+our $nGlobalVerbose = 0;
+
+sub setVerbose()
+{
+ $nGlobalVerbose = 1;
+}
+
+sub set_logfile($)
+{
+ my $sLogFile = shift;
+
+ if (open(LOGFILE, ">$sLogFile"))
+ {
+ $nGlobalLog = 1;
+ }
+}
+sub close_logfile()
+{
+ close(LOGFILE);
+ $nGlobalLog = 0;
+}
+
+sub log_print($)
+{
+ my $sLine = shift;
+ if ($nGlobalLog)
+ {
+ print LOGFILE $sLine;
+ }
+ if ($nGlobalVerbose == 1)
+ {
+ print $sLine;
+ }
+ else
+ {
+ # In this special case for NetBeans, which show if a debugger can access.
+ # The Line should print anyway.
+ if ($sLine =~ /Listening for transport/)
+ {
+ print $sLine;
+ }
+ }
+}
+
+1;
diff --git a/testgraphical/source/makefile.mk b/testgraphical/source/makefile.mk
new file mode 100644
index 000000000000..619fd7786f93
--- /dev/null
+++ b/testgraphical/source/makefile.mk
@@ -0,0 +1,112 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..
+
+PRJNAME=gfxcmp
+TARGET=notargetyet
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+# call with PDF=1 to use office pdf exporter instead of the XPrinter API
+.IF "$(PDF)"!=""
+ CREATORTYPE="-creatortype" pdf
+.ELSE
+ CREATORTYE="-creatortype" ps
+.ENDIF
+
+.IF "$(SHOW)"!=""
+ P_SHOW=-show
+.ENDIF
+
+
+# call with PREPARE=1 to only create new reference files
+# copy these files by hand into the corresponding directories
+.IF "$(PREPARE)"!=""
+ PREPAREONLY="-prepareonly" 1
+.ELSE
+ PREPAREONLY=
+.ENDIF
+
+.IF "$(DOCUMENTPOOL)"==""
+ DOCUMENTPOOL=$PRJ$/document-pool
+.ENDIF
+
+# PERLDEBUG=-d:ptkdb
+ALLTAR: selftest
+# pwd
+# $(PERL) $(PERLDEBUG) compare.pl -MAJOR $(WORK_STAMP) -MINOR $(UPDMINOR) -cwsname "$(CWS_WORK_STAMP)"
+# $(PERL) $(PERLDEBUG) compare.pl -pool singletest
+
+# $(PRJ)$/util$/makefile.pmk contains ALLTAR stuff
+
+# selftest is the default run through at the moment and use pdf export to create output.
+# dmake
+selftest:
+ $(PERL) $(PERLDEBUG) compare.pl -creatortype pdf $(PREPAREONLY) -pool singletest -document eis-test.odt $(P_SHOW)
+
+# selftest_ps is like the default run through but use always postscript print out
+# dmake selftest_ps
+selftest_ps:
+ $(PERL) $(PERLDEBUG) compare.pl -creatortype ps $(PREPAREONLY) -pool singletest -document eis-test.odt $(P_SHOW)
+
+#
+#
+# The follows are demonstration targets, DO NOT DELETE
+#
+#
+
+# dmake demo SHOW=1
+demo:
+ $(PERL) $(PERLDEBUG) compare.pl $(CREATORTYPE) $(PREPAREONLY) -pool $@ $(P_SHOW)
+
+# failtest is a demonstration of a failure, with SHOW=1 it should open a java windows which shows 3 pictures,
+# the current document, the reference document and the difference between both.
+# dmake failtest SHOW=1
+# dmake failtest PREPARE=1
+# This test will most the time fail, it is just a demonstration.
+failtest:
+ $(PERL) $(PERLDEBUG) compare.pl $(CREATORTYPE) $(PREPAREONLY) -force -pool demo -document CurrentTime.ods $(P_SHOW)
+
+# manual runs through all documents found in document-pool
+# dmake manual
+# dmake manual PDF=1 SHOW=1
+# dmake manual PREPARE=1 PDF=1
+# should help to create a lot of references at one time.
+manual:
+ $(PERL) $(PERLDEBUG) compare.pl $(CREATORTYPE) $(PREPAREONLY) -force $(P_SHOW)
+
+# msoffice:
+# $(PERL) $(PERLDEBUG) compare.pl -creatortype msoffice $(PREPAREONLY) -pool msoffice -document calc_cellformat_import_biff8.xls $(P_SHOW)
+
+clean:
diff --git a/testgraphical/source/oshelper.pm b/testgraphical/source/oshelper.pm
new file mode 100644
index 000000000000..3f2ed1c44e38
--- /dev/null
+++ b/testgraphical/source/oshelper.pm
@@ -0,0 +1,110 @@
+package oshelper;
+
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+use English;
+use warnings;
+use strict;
+
+BEGIN {
+ use Exporter ();
+ our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+ $VERSION = 1.00;
+ # if using RCS/CVS, this may be preferred
+ $VERSION = do { my @r = (q$Revision: 1.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
+ @ISA = qw(Exporter);
+ @EXPORT = qw(&getEnvironment &isWindowsEnvironment &isUnixEnvironment &getUsername);
+ %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
+ # your exported package globals go here,
+ # as well as any optionally exported functions
+ @EXPORT_OK = ( ); # qw($Var1 %Hashit &func3);
+}
+
+
+# ------------------------------------------------------------------------------
+sub getEnvironment()
+{
+ my $sEnvironment;
+ if ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
+ {
+ $sEnvironment = "wntmsci";
+ }
+ elsif ( $OSNAME eq "linux")
+ {
+ $sEnvironment = "unxlngi";
+ }
+ elsif ( $OSNAME eq "solaris")
+ {
+ $sEnvironment = "unxsoli";
+ }
+ else
+ {
+ print "Unknown Environment please check OSNAME: '$OSNAME'\n";
+ $sEnvironment = "unknown";
+ }
+ return $sEnvironment;
+}
+
+# ------------------------------------------------------------------------------
+
+sub isWindowsEnvironment()
+{
+ if ($OSNAME eq "MSWin32" ||
+ $OSNAME eq "cygwin")
+ {
+ return 1;
+ }
+ return 0;
+}
+
+sub isUnixEnvironment()
+{
+ if ($OSNAME eq "linux" ||
+ $OSNAME eq "solaris")
+ {
+ return 1;
+ }
+ return 0;
+}
+
+sub getUsername()
+{
+ my $sUser = $ENV{USER};
+ if (!$sUser)
+ {
+ $sUser = $ENV{USERNAME};
+ }
+ if (!$sUser)
+ {
+ die "Username not set.\n";
+ }
+ return $sUser;
+}
+
+1;
diff --git a/testgraphical/source/solarenvhelper.pm b/testgraphical/source/solarenvhelper.pm
new file mode 100644
index 000000000000..f8ec17ece12b
--- /dev/null
+++ b/testgraphical/source/solarenvhelper.pm
@@ -0,0 +1,63 @@
+package solarenvhelper;
+
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+use strict;
+use warnings;
+
+BEGIN {
+ use Exporter ();
+ our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+ $VERSION = 1.00;
+ # if using RCS/CVS, this may be preferred
+ $VERSION = do { my @r = (q$Revision: 1.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
+ @ISA = qw(Exporter);
+ @EXPORT = qw(&setSolenvPath &getSolenvPath);
+ %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
+ # your exported package globals go here,
+ # as well as any optionally exported functions
+ @EXPORT_OK = ( ); # qw($Var1 %Hashit &func3);
+}
+
+our $sSolenvPath;
+sub setSolenvPath($)
+{
+ $sSolenvPath = shift;
+}
+sub getSolenvPath()
+{
+ if ($sSolenvPath)
+ {
+ return $sSolenvPath;
+ }
+ print "INTERNAL ERROR: You must set the solenv path to the performancetest, by call setSolenvPath()\n";
+ exit 1;
+}
+
+1;
diff --git a/testgraphical/source/stringhelper.pm b/testgraphical/source/stringhelper.pm
new file mode 100644
index 000000000000..e7d19256bf1b
--- /dev/null
+++ b/testgraphical/source/stringhelper.pm
@@ -0,0 +1,69 @@
+package stringhelper;
+
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+use strict;
+
+BEGIN {
+ use Exporter ();
+ our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+ $VERSION = 1.00;
+ # if using RCS/CVS, this may be preferred
+ $VERSION = do { my @r = (q$Revision: 1.2 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
+ @ISA = qw(Exporter);
+ @EXPORT = qw(&endswith &startswith);
+ %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
+ # your exported package globals go here,
+ # as well as any optionally exported functions
+ @EXPORT_OK = ( ); # qw($Var1 %Hashit &func3);
+}
+
+# string helper like java endsWith
+sub endswith($$)
+{
+ my $string = shift;
+ my $search = shift;
+ if ( $string =~ /${search}$/ )
+ {
+ return 1;
+ }
+ return 0;
+}
+sub startswith($$)
+{
+ my $string = shift;
+ my $search = shift;
+ if ( $string =~ /^${search}/ )
+ {
+ return 1;
+ }
+ return 0;
+}
+
+1;
diff --git a/testgraphical/source/timehelper.pm b/testgraphical/source/timehelper.pm
new file mode 100644
index 000000000000..38bd56fc4b20
--- /dev/null
+++ b/testgraphical/source/timehelper.pm
@@ -0,0 +1,99 @@
+package timehelper;
+
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+use POSIX qw(strftime);
+use POSIX qw(time difftime);
+# use POSIX qw(localtime);
+use strict;
+# use Time::localtime;
+use loghelper;
+
+BEGIN {
+ use Exporter ();
+ our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+ $VERSION = 1.00;
+ # if using RCS/CVS, this may be preferred
+ $VERSION = do { my @r = (q$Revision: 1.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
+ @ISA = qw(Exporter);
+ @EXPORT = qw(&getTime &endTime &printTime &waitAMinute );
+ %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
+ # your exported package globals go here,
+ # as well as any optionally exported functions
+ @EXPORT_OK = ( ); # qw($Var1 %Hashit &func3);
+}
+
+
+# ------------------------------------------------------------------------------
+# our $starttime;
+sub getTime()
+{
+ my $nValue;
+ # $nValue = localtime->sec();
+ # $nValue += 60 * localtime->min();
+ # $nValue += 3600 * localtime->hour();
+ $nValue = time();
+ return $nValue;
+}
+# sub startTime()
+# {
+# $starttime = getTime();
+# }
+sub endTime($)
+{
+ my $starttime = shift;
+
+ my $endtime = getTime();
+ my $nTime = difftime($endtime, $starttime);
+ # my $nTime = $endtime - $starttime;
+ # if ($nTime < 0)
+ # {
+ # $nTime += 24 * 3600; # add 24 hours
+ # }
+ return $nTime;
+}
+sub printTime($)
+{
+ my $nTime = shift;
+ print( "Time: " . $nTime . " seconds.\n\n");
+}
+
+
+# sub waitAMinute()
+# {
+# # _waitInSeconds(20);
+# # _waitInSeconds(20);
+# my $now_string = strftime "%a %b %e %H:%M:%S %Y", localtime;
+# print $now_string . "\n";
+# # print getCurrentDateString() . "\n";
+# sleep(60);
+# }
+#
+
+1;
diff --git a/testgraphical/ui/java/ConvwatchGUIProject/build.xml b/testgraphical/ui/java/ConvwatchGUIProject/build.xml
new file mode 100644
index 000000000000..e4d82212f35d
--- /dev/null
+++ b/testgraphical/ui/java/ConvwatchGUIProject/build.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See commented blocks below for -->
+<!-- some examples of how to customize the build. -->
+<!-- (If you delete it and reopen the project it will be recreated.) -->
+<!-- By default, only the Clean and Build commands use this build script. -->
+<!-- Commands such as Run, Debug, and Test only use this build script if -->
+<!-- the Compile on Save feature is turned off for the project. -->
+<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
+<!-- in the project's Project Properties dialog box.-->
+<project name="ConvwatchGUIProject" default="default" basedir=".">
+ <description>Builds, tests, and runs the project ConvwatchGUIProject.</description>
+ <import file="nbproject/build-impl.xml"/>
+ <!--
+
+ There exist several targets which are by default empty and which can be
+ used for execution of your tasks. These targets are usually executed
+ before and after some main targets. They are:
+
+ -pre-init: called before initialization of project properties
+ -post-init: called after initialization of project properties
+ -pre-compile: called before javac compilation
+ -post-compile: called after javac compilation
+ -pre-compile-single: called before javac compilation of single file
+ -post-compile-single: called after javac compilation of single file
+ -pre-compile-test: called before javac compilation of JUnit tests
+ -post-compile-test: called after javac compilation of JUnit tests
+ -pre-compile-test-single: called before javac compilation of single JUnit test
+ -post-compile-test-single: called after javac compilation of single JUunit test
+ -pre-jar: called before JAR building
+ -post-jar: called after JAR building
+ -post-clean: called after cleaning build products
+
+ (Targets beginning with '-' are not intended to be called on their own.)
+
+ Example of inserting an obfuscator after compilation could look like this:
+
+ <target name="-post-compile">
+ <obfuscate>
+ <fileset dir="${build.classes.dir}"/>
+ </obfuscate>
+ </target>
+
+ For list of available properties check the imported
+ nbproject/build-impl.xml file.
+
+
+ Another way to customize the build is by overriding existing main targets.
+ The targets of interest are:
+
+ -init-macrodef-javac: defines macro for javac compilation
+ -init-macrodef-junit: defines macro for junit execution
+ -init-macrodef-debug: defines macro for class debugging
+ -init-macrodef-java: defines macro for class execution
+ -do-jar-with-manifest: JAR building (if you are using a manifest)
+ -do-jar-without-manifest: JAR building (if you are not using a manifest)
+ run: execution of project
+ -javadoc-build: Javadoc generation
+ test-report: JUnit report generation
+
+ An example of overriding the target for project execution could look like this:
+
+ <target name="run" depends="ConvwatchGUIProject-impl.jar">
+ <exec dir="bin" executable="launcher.exe">
+ <arg file="${dist.jar}"/>
+ </exec>
+ </target>
+
+ Notice that the overridden target depends on the jar target and not only on
+ the compile target as the regular run target does. Again, for a list of available
+ properties which you can use, check the target you are overriding in the
+ nbproject/build-impl.xml file.
+
+ -->
+</project>
diff --git a/testgraphical/ui/java/ConvwatchGUIProject/dist/ConvwatchGUIProject.jar b/testgraphical/ui/java/ConvwatchGUIProject/dist/ConvwatchGUIProject.jar
new file mode 100644
index 000000000000..3b0ac20afa74
--- /dev/null
+++ b/testgraphical/ui/java/ConvwatchGUIProject/dist/ConvwatchGUIProject.jar
Binary files differ
diff --git a/testgraphical/ui/java/ConvwatchGUIProject/makefile.mk b/testgraphical/ui/java/ConvwatchGUIProject/makefile.mk
new file mode 100644
index 000000000000..5cb16f1d4c31
--- /dev/null
+++ b/testgraphical/ui/java/ConvwatchGUIProject/makefile.mk
@@ -0,0 +1,71 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=../../..
+
+PRJNAME=gfxcmp_ui_java_convwatchgui
+TARGET=notargetyet
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+# --- ANT build environment ---------------------------------------
+
+.INCLUDE : antsettings.mk
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+.IF "$(SHOW)" == ""
+nothing .PHONY:
+
+.ELSE
+
+
+ALLTAR: dist/ConvwatchGUIProject.jar
+
+dist/ConvwatchGUIProject.jar: src/ConvwatchGUI.java src/IniFile.java
+# .if $(JDK_VERSION) < 160
+# echo "You need at least java 6"
+# error
+# .endif
+#
+.IF "$(GUI)"=="WNT"
+ $(ANT)
+.ELSE
+ ant
+.END
+
+.END
+
+.INCLUDE : $(PRJ)$/util$/makefile.pmk
+
+clean:
+ $(ANT) clean
+
diff --git a/testgraphical/ui/java/ConvwatchGUIProject/manifest.mf b/testgraphical/ui/java/ConvwatchGUIProject/manifest.mf
new file mode 100644
index 000000000000..328e8e5bc3b7
--- /dev/null
+++ b/testgraphical/ui/java/ConvwatchGUIProject/manifest.mf
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+X-COMMENT: Main-Class will be added automatically by build
+
diff --git a/testgraphical/ui/java/ConvwatchGUIProject/nbproject/build-impl.xml b/testgraphical/ui/java/ConvwatchGUIProject/nbproject/build-impl.xml
new file mode 100644
index 000000000000..e493afec4fc3
--- /dev/null
+++ b/testgraphical/ui/java/ConvwatchGUIProject/nbproject/build-impl.xml
@@ -0,0 +1,805 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+ - initialization
+ - compilation
+ - jar
+ - execution
+ - debugging
+ - javadoc
+ - junit compilation
+ - junit execution
+ - junit debugging
+ - applet
+ - cleanup
+
+ -->
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="ConvwatchGUIProject-impl">
+ <fail message="Please build using Ant 1.7.1 or higher.">
+ <condition>
+ <not>
+ <antversion atleast="1.7.1"/>
+ </not>
+ </condition>
+ </fail>
+ <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+ <!--
+ ======================
+ INITIALIZATION SECTION
+ ======================
+ -->
+ <target name="-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init" name="-init-private">
+ <property file="nbproject/private/config.properties"/>
+ <property file="nbproject/private/configs/${config}.properties"/>
+ <property file="nbproject/private/private.properties"/>
+ </target>
+ <target depends="-pre-init,-init-private" name="-init-user">
+ <property file="${user.properties.file}"/>
+ <!-- The two properties below are usually overridden -->
+ <!-- by the active platform. Just a fallback. -->
+ <property name="default.javac.source" value="1.4"/>
+ <property name="default.javac.target" value="1.4"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-user" name="-init-project">
+ <property file="nbproject/configs/${config}.properties"/>
+ <property file="nbproject/project.properties"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+ <available file="${manifest.file}" property="manifest.available"/>
+ <condition property="main.class.available">
+ <and>
+ <isset property="main.class"/>
+ <not>
+ <equals arg1="${main.class}" arg2="" trim="true"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class">
+ <and>
+ <isset property="manifest.available"/>
+ <isset property="main.class.available"/>
+ </and>
+ </condition>
+ <condition property="do.mkdist">
+ <and>
+ <isset property="libs.CopyLibs.classpath"/>
+ <not>
+ <istrue value="${mkdist.disabled}"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class+mkdist.available">
+ <and>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </and>
+ </condition>
+ <condition property="manifest.available+mkdist.available">
+ <and>
+ <istrue value="${manifest.available}"/>
+ <isset property="do.mkdist"/>
+ </and>
+ </condition>
+ <condition property="manifest.available-mkdist.available">
+ <or>
+ <istrue value="${manifest.available}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="manifest.available+main.class-mkdist.available">
+ <or>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="have.tests">
+ <or>
+ <available file="${test.src.dir}"/>
+ </or>
+ </condition>
+ <condition property="have.sources">
+ <or>
+ <available file="${src.dir}"/>
+ </or>
+ </condition>
+ <condition property="netbeans.home+have.tests">
+ <and>
+ <isset property="netbeans.home"/>
+ <isset property="have.tests"/>
+ </and>
+ </condition>
+ <condition property="no.javadoc.preview">
+ <and>
+ <isset property="javadoc.preview"/>
+ <isfalse value="${javadoc.preview}"/>
+ </and>
+ </condition>
+ <property name="run.jvmargs" value=""/>
+ <property name="javac.compilerargs" value=""/>
+ <property name="work.dir" value="${basedir}"/>
+ <condition property="no.deps">
+ <and>
+ <istrue value="${no.dependencies}"/>
+ </and>
+ </condition>
+ <property name="javac.debug" value="true"/>
+ <property name="javadoc.preview" value="true"/>
+ <property name="application.args" value=""/>
+ <property name="source.encoding" value="${file.encoding}"/>
+ <property name="runtime.encoding" value="${source.encoding}"/>
+ <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+ <and>
+ <isset property="javadoc.encoding"/>
+ <not>
+ <equals arg1="${javadoc.encoding}" arg2=""/>
+ </not>
+ </and>
+ </condition>
+ <property name="javadoc.encoding.used" value="${source.encoding}"/>
+ <property name="includes" value="**"/>
+ <property name="excludes" value=""/>
+ <property name="do.depend" value="false"/>
+ <condition property="do.depend.true">
+ <istrue value="${do.depend}"/>
+ </condition>
+ <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
+ <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
+ <length length="0" string="${endorsed.classpath}" when="greater"/>
+ </condition>
+ <property name="javac.fork" value="false"/>
+ </target>
+ <target name="-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
+ <fail unless="src.dir">Must set src.dir</fail>
+ <fail unless="test.src.dir">Must set test.src.dir</fail>
+ <fail unless="build.dir">Must set build.dir</fail>
+ <fail unless="dist.dir">Must set dist.dir</fail>
+ <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+ <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+ <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+ <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+ <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+ <fail unless="dist.jar">Must set dist.jar</fail>
+ </target>
+ <target name="-init-macrodef-property">
+ <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-javac">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <sequential>
+ <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </depend>
+ </sequential>
+ </macrodef>
+ <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <sequential>
+ <fail unless="javac.includes">Must set javac.includes</fail>
+ <pathconvert pathsep="," property="javac.includes.binary">
+ <path>
+ <filelist dir="@{destdir}" files="${javac.includes}"/>
+ </path>
+ <globmapper from="*.java" to="*.class"/>
+ </pathconvert>
+ <delete>
+ <files includes="${javac.includes.binary}"/>
+ </delete>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-junit">
+ <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="**" name="testincludes"/>
+ <sequential>
+ <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true" tempdir="${build.dir}">
+ <batchtest todir="${build.test.results.dir}">
+ <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+ <filename name="@{testincludes}"/>
+ </fileset>
+ </batchtest>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ </junit>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+ <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="name"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <attribute default="" name="stopclassname"/>
+ <sequential>
+ <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </nbjpdastart>
+ </sequential>
+ </macrodef>
+ <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${build.classes.dir}" name="dir"/>
+ <sequential>
+ <nbjpdareload>
+ <fileset dir="@{dir}" includes="${fix.classes}">
+ <include name="${fix.includes}*.class"/>
+ </fileset>
+ </nbjpdareload>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-debug-args">
+ <property name="version-output" value="java version &quot;${ant.java.version}"/>
+ <condition property="have-jdk-older-than-1.4">
+ <or>
+ <contains string="${version-output}" substring="java version &quot;1.0"/>
+ <contains string="${version-output}" substring="java version &quot;1.1"/>
+ <contains string="${version-output}" substring="java version &quot;1.2"/>
+ <contains string="${version-output}" substring="java version &quot;1.3"/>
+ </or>
+ </condition>
+ <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+ <istrue value="${have-jdk-older-than-1.4}"/>
+ </condition>
+ <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+ <os family="windows"/>
+ </condition>
+ <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+ <isset property="debug.transport"/>
+ </condition>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-debug">
+ <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg line="${debug-args-line}"/>
+ <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-java">
+ <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${run.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-presetdef-jar">
+ <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <jar compress="${jar.compress}" jarfile="${dist.jar}">
+ <j2seproject1:fileset dir="${build.classes.dir}"/>
+ </jar>
+ </presetdef>
+ </target>
+ <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar" name="init"/>
+ <!--
+ ===================
+ COMPILATION SECTION
+ ===================
+ -->
+ <target name="-deps-jar-init" unless="built-jar.properties">
+ <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
+ <delete file="${built-jar.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
+ <echo level="warn" message="Cycle detected: ConvwatchGUIProject was already built"/>
+ </target>
+ <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-jar.properties}" verbose="false"/>
+ <property file="${built-jar.properties}" prefix="already.built.jar."/>
+ <antcall target="-warn-already-built-jar"/>
+ <propertyfile file="${built-jar.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ </target>
+ <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
+ <target depends="init" name="-check-automatic-build">
+ <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
+ </target>
+ <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
+ <antcall target="clean"/>
+ </target>
+ <target depends="init,deps-jar" name="-pre-pre-compile">
+ <mkdir dir="${build.classes.dir}"/>
+ </target>
+ <target name="-pre-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-depend">
+ <pathconvert property="build.generated.subdirs">
+ <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </pathconvert>
+ <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile">
+ <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
+ <copy todir="${build.classes.dir}">
+ <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+ <target name="-pre-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile/>
+ <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
+ </target>
+ <target name="-post-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+ <!--
+ ====================
+ JAR BUILDING SECTION
+ ====================
+ -->
+ <target depends="init" name="-pre-pre-jar">
+ <dirname file="${dist.jar}" property="dist.jar.dir"/>
+ <mkdir dir="${dist.jar.dir}"/>
+ </target>
+ <target name="-pre-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" name="-do-jar-without-manifest" unless="manifest.available-mkdist.available">
+ <j2seproject1:jar/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class-mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}"/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}">
+ <j2seproject1:manifest>
+ <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
+ </j2seproject1:manifest>
+ </j2seproject1:jar>
+ <echo>To run this application from the command line without Ant, try:</echo>
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <pathconvert property="run.classpath.with.dist.jar">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+ </pathconvert>
+ <echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries">
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <pathconvert property="run.classpath.without.build.classes.dir">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to=""/>
+ </pathconvert>
+ <pathconvert pathsep=" " property="jar.classpath">
+ <path path="${run.classpath.without.build.classes.dir}"/>
+ <chainedmapper>
+ <flattenmapper/>
+ <globmapper from="*" to="lib/*"/>
+ </chainedmapper>
+ </pathconvert>
+ <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+ <copylibs compress="${jar.compress}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+ <fileset dir="${build.classes.dir}"/>
+ <manifest>
+ <attribute name="Main-Class" value="${main.class}"/>
+ <attribute name="Class-Path" value="${jar.classpath}"/>
+ </manifest>
+ </copylibs>
+ <echo>To run this application from the command line without Ant, try:</echo>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <echo>java -jar "${dist.jar.resolved}"</echo>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+mkdist.available" name="-do-jar-with-libraries-without-mainclass" unless="main.class.available">
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <pathconvert property="run.classpath.without.build.classes.dir">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to=""/>
+ </pathconvert>
+ <pathconvert pathsep=" " property="jar.classpath">
+ <path path="${run.classpath.without.build.classes.dir}"/>
+ <chainedmapper>
+ <flattenmapper/>
+ <globmapper from="*" to="lib/*"/>
+ </chainedmapper>
+ </pathconvert>
+ <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+ <copylibs compress="${jar.compress}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+ <fileset dir="${build.classes.dir}"/>
+ <manifest>
+ <attribute name="Class-Path" value="${jar.classpath}"/>
+ </manifest>
+ </copylibs>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.mkdist" name="-do-jar-with-libraries-without-manifest" unless="manifest.available">
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <pathconvert property="run.classpath.without.build.classes.dir">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to=""/>
+ </pathconvert>
+ <pathconvert pathsep=" " property="jar.classpath">
+ <path path="${run.classpath.without.build.classes.dir}"/>
+ <chainedmapper>
+ <flattenmapper/>
+ <globmapper from="*" to="lib/*"/>
+ </chainedmapper>
+ </pathconvert>
+ <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+ <copylibs compress="${jar.compress}" jarfile="${dist.jar}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+ <fileset dir="${build.classes.dir}"/>
+ <manifest>
+ <attribute name="Class-Path" value="${jar.classpath}"/>
+ </manifest>
+ </copylibs>
+ </target>
+ <target name="-post-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-do-jar-with-libraries-without-mainclass,-do-jar-with-libraries-without-manifest,-post-jar" description="Build JAR." name="jar"/>
+ <!--
+ =================
+ EXECUTION SECTION
+ =================
+ -->
+ <target depends="init,compile" description="Run a main class." name="run">
+ <j2seproject1:java>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <target name="-do-not-recompile">
+ <property name="javac.includes.binary" value=""/>
+ </target>
+ <target depends="init,compile-single" name="run-single">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}"/>
+ </target>
+ <target depends="init,compile-test-single" name="run-test-with-main">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+ </target>
+ <!--
+ =================
+ DEBUGGING SECTION
+ =================
+ -->
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+ <j2seproject1:nbjpdastart name="${debug.class}"/>
+ </target>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+ </target>
+ <target depends="init,compile" name="-debug-start-debuggee">
+ <j2seproject3:debug>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+ <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+ </target>
+ <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}"/>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+ <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
+ <target depends="init" name="-pre-debug-fix">
+ <fail unless="fix.includes">Must set fix.includes</fail>
+ <property name="javac.includes" value="${fix.includes}.java"/>
+ </target>
+ <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+ <j2seproject1:nbjpdareload/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+ <!--
+ ===============
+ JAVADOC SECTION
+ ===============
+ -->
+ <target depends="init" name="-javadoc-build">
+ <mkdir dir="${dist.javadoc.dir}"/>
+ <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+ <classpath>
+ <path path="${javac.classpath}"/>
+ </classpath>
+ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+ <filename name="**/*.java"/>
+ </fileset>
+ <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="**/*.java"/>
+ </fileset>
+ </javadoc>
+ </target>
+ <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+ <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+ </target>
+ <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+ <!--
+ =========================
+ JUNIT COMPILATION SECTION
+ =========================
+ -->
+ <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+ <mkdir dir="${build.test.classes.dir}"/>
+ </target>
+ <target name="-pre-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-test-depend">
+ <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+ <j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+ <target name="-pre-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+ <j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+ <!--
+ =======================
+ JUNIT EXECUTION SECTION
+ =======================
+ -->
+ <target depends="init" if="have.tests" name="-pre-test-run">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+ <j2seproject3:junit testincludes="**/*Test.java"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init" if="have.tests" name="test-report"/>
+ <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+ <target depends="init" if="have.tests" name="-pre-test-run-single">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+ <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+ <j2seproject3:junit excludes="" includes="${test.includes}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+ <!--
+ =======================
+ JUNIT DEBUGGING SECTION
+ =======================
+ -->
+ <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
+ <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+ <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
+ <delete file="${test.report.file}"/>
+ <mkdir dir="${build.test.results.dir}"/>
+ <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
+ <customize>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <arg value="${test.class}"/>
+ <arg value="showoutput=true"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+ <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+ <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+ <!--
+ =========================
+ APPLET EXECUTION SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" name="run-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject1:java classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <!--
+ =========================
+ APPLET DEBUGGING SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject3:debug classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+ <!--
+ ===============
+ CLEANUP SECTION
+ ===============
+ -->
+ <target name="-deps-clean-init" unless="built-clean.properties">
+ <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
+ <delete file="${built-clean.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
+ <echo level="warn" message="Cycle detected: ConvwatchGUIProject was already built"/>
+ </target>
+ <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-clean.properties}" verbose="false"/>
+ <property file="${built-clean.properties}" prefix="already.built.clean."/>
+ <antcall target="-warn-already-built-clean"/>
+ <propertyfile file="${built-clean.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ </target>
+ <target depends="init" name="-do-clean">
+ <delete dir="${build.dir}"/>
+ <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
+ </target>
+ <target name="-post-clean">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+ <target name="-check-call-dep">
+ <property file="${call.built.properties}" prefix="already.built."/>
+ <condition property="should.call.dep">
+ <not>
+ <isset property="already.built.${call.subproject}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
+ <ant antfile="${call.script}" inheritall="false" target="${call.target}">
+ <propertyset>
+ <propertyref prefix="transfer."/>
+ <mapper from="transfer.*" to="*" type="glob"/>
+ </propertyset>
+ </ant>
+ </target>
+</project>
diff --git a/testgraphical/ui/java/ConvwatchGUIProject/nbproject/genfiles.properties b/testgraphical/ui/java/ConvwatchGUIProject/nbproject/genfiles.properties
new file mode 100644
index 000000000000..9f120781c97e
--- /dev/null
+++ b/testgraphical/ui/java/ConvwatchGUIProject/nbproject/genfiles.properties
@@ -0,0 +1,9 @@
+# x-no-translate
+build.xml.data.CRC32=d17eccb2
+build.xml.script.CRC32=a183e208
+build.xml.stylesheet.CRC32=958a1d3e@1.32.1.45
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=d17eccb2
+nbproject/build-impl.xml.script.CRC32=ea0e5dc9
+nbproject/build-impl.xml.stylesheet.CRC32=576378a2@1.32.1.45
diff --git a/testgraphical/ui/java/ConvwatchGUIProject/nbproject/private/config.properties b/testgraphical/ui/java/ConvwatchGUIProject/nbproject/private/config.properties
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/testgraphical/ui/java/ConvwatchGUIProject/nbproject/private/config.properties
diff --git a/testgraphical/ui/java/ConvwatchGUIProject/nbproject/private/private.properties b/testgraphical/ui/java/ConvwatchGUIProject/nbproject/private/private.properties
new file mode 100644
index 000000000000..23e517d892d7
--- /dev/null
+++ b/testgraphical/ui/java/ConvwatchGUIProject/nbproject/private/private.properties
@@ -0,0 +1,8 @@
+# x-no-translate
+application.args=D:\\sources\\gfxcmp02\\DEV300\\ooo\\testgraphical\\wntmsci12.pro\\misc\\CurrentTime.ods.ps.ini
+compile.on.save=true
+do.depend=false
+do.jar=true
+javac.debug=true
+javadoc.preview=true
+user.properties.file=C:\\Documents and Settings\\ll93751\\.netbeans\\6.8\\build.properties
diff --git a/testgraphical/ui/java/ConvwatchGUIProject/nbproject/private/private.xml b/testgraphical/ui/java/ConvwatchGUIProject/nbproject/private/private.xml
new file mode 100644
index 000000000000..c1f155a782bd
--- /dev/null
+++ b/testgraphical/ui/java/ConvwatchGUIProject/nbproject/private/private.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
+ <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
+</project-private>
diff --git a/testgraphical/ui/java/ConvwatchGUIProject/nbproject/project.properties b/testgraphical/ui/java/ConvwatchGUIProject/nbproject/project.properties
new file mode 100644
index 000000000000..3a6731d3bcf6
--- /dev/null
+++ b/testgraphical/ui/java/ConvwatchGUIProject/nbproject/project.properties
@@ -0,0 +1,72 @@
+# x-no-translate
+application.desc=This Program shows three pictures in one line.
+application.title=ConvwatchGUIProject
+application.vendor=Oracle and/or its affiliates
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+# Uncomment to specify the preferred debugger connection transport:
+#debug.transport=dt_socket
+debug.classpath=\
+ ${run.classpath}
+debug.test.classpath=\
+ ${run.test.classpath}
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/ConvwatchGUIProject.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
+excludes=
+includes=**
+jar.compress=false
+javac.classpath=
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.source=1.5
+javac.target=1.5
+javac.test.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}:\
+ ${libs.junit.classpath}:\
+ ${libs.junit_4.classpath}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+jnlp.codebase.type=local
+jnlp.descriptor=application
+jnlp.enabled=false
+jnlp.offline-allowed=false
+jnlp.signed=false
+main.class=ConvwatchGUI
+manifest.file=manifest.mf
+meta.inf.dir=${src.dir}/META-INF
+platform.active=default_platform
+run.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}
+# Space-separated list of JVM arguments used when running the project
+# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
+# or test-sys-prop.name=value to set system properties for unit tests):
+run.jvmargs=
+run.test.classpath=\
+ ${javac.test.classpath}:\
+ ${build.test.classes.dir}
+source.encoding=UTF-8
+src.dir=src
+test.src.dir=test
diff --git a/testgraphical/ui/java/ConvwatchGUIProject/nbproject/project.xml b/testgraphical/ui/java/ConvwatchGUIProject/nbproject/project.xml
new file mode 100644
index 000000000000..0bc513904c86
--- /dev/null
+++ b/testgraphical/ui/java/ConvwatchGUIProject/nbproject/project.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+ <type>org.netbeans.modules.java.j2seproject</type>
+ <configuration>
+ <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
+ <name>ConvwatchGUIProject</name>
+ <source-roots>
+ <root id="src.dir"/>
+ </source-roots>
+ <test-roots>
+ <root id="test.src.dir"/>
+ </test-roots>
+ </data>
+ </configuration>
+</project>
diff --git a/testgraphical/ui/java/ConvwatchGUIProject/src/ConvwatchGUI.form b/testgraphical/ui/java/ConvwatchGUIProject/src/ConvwatchGUI.form
new file mode 100644
index 000000000000..ad0552d1efd5
--- /dev/null
+++ b/testgraphical/ui/java/ConvwatchGUIProject/src/ConvwatchGUI.form
@@ -0,0 +1,286 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <Events>
+ <EventHandler event="componentResized" listener="java.awt.event.ComponentListener" parameters="java.awt.event.ComponentEvent" handler="formComponentResized"/>
+ <EventHandler event="propertyChange" listener="java.beans.PropertyChangeListener" parameters="java.beans.PropertyChangeEvent" handler="formPropertyChange"/>
+ </Events>
+ <AuxValues>
+ <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ </AuxValues>
+
+ <Layout>
+ <DimensionLayout dim="0">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="1" attributes="0">
+ <EmptySpace max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="1" attributes="0">
+ <Component id="jPanel5" alignment="0" max="32767" attributes="0"/>
+ <Component id="jPanel4" alignment="0" max="32767" attributes="0"/>
+ <Group type="102" alignment="1" attributes="0">
+ <Component id="jPanelOriginal" max="32767" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="jPanelReference" max="32767" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="jPanelDifference" max="32767" attributes="0"/>
+ </Group>
+ </Group>
+ <EmptySpace max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ <DimensionLayout dim="1">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="1" attributes="0">
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="jPanel5" min="-2" max="-2" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="1" attributes="0">
+ <Component id="jPanelReference" alignment="1" max="32767" attributes="1"/>
+ <Component id="jPanelOriginal" alignment="1" max="32767" attributes="1"/>
+ <Component id="jPanelDifference" alignment="0" max="32767" attributes="1"/>
+ </Group>
+ <EmptySpace min="-2" max="-2" attributes="0"/>
+ <Component id="jPanel4" min="-2" max="-2" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ </Layout>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="jPanelOriginal">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="Picture"/>
+ </Border>
+ </Property>
+ </Properties>
+
+ <Layout>
+ <DimensionLayout dim="0">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="0" attributes="0">
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="jLabelOriginalImage" pref="299" max="32767" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ <DimensionLayout dim="1">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="0" attributes="0">
+ <Component id="jLabelOriginalImage" pref="514" max="32767" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="jLabelOriginalImage">
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="jPanelReference">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="Reference Picture"/>
+ </Border>
+ </Property>
+ </Properties>
+
+ <Layout>
+ <DimensionLayout dim="0">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="0" attributes="0">
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="jLabelReferenceImage" pref="299" max="32767" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ <DimensionLayout dim="1">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="0" attributes="0">
+ <Component id="jLabelReferenceImage" pref="514" max="32767" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="jLabelReferenceImage">
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="jPanelDifference">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="Difference"/>
+ </Border>
+ </Property>
+ </Properties>
+
+ <Layout>
+ <DimensionLayout dim="0">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="0" attributes="0">
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="jLabelDifferenceImage" pref="298" max="32767" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ <DimensionLayout dim="1">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="0" attributes="0">
+ <Component id="jLabelDifferenceImage" pref="514" max="32767" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="jLabelDifferenceImage">
+ <Properties>
+ <Property name="name" type="java.lang.String" value="DifferenceImage" noResource="true"/>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="jPanel4">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="Action"/>
+ </Border>
+ </Property>
+ </Properties>
+
+ <Layout>
+ <DimensionLayout dim="0">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="1" attributes="0">
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="jButton2" min="-2" max="-2" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="jButton3" min="-2" max="-2" attributes="0"/>
+ <EmptySpace type="separate" max="-2" attributes="0"/>
+ <Component id="jLabelCurrentPage" min="-2" pref="107" max="-2" attributes="0"/>
+ <EmptySpace pref="614" max="32767" attributes="0"/>
+ <Component id="jButton1" min="-2" max="-2" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ <DimensionLayout dim="1">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="1" attributes="0">
+ <EmptySpace max="32767" attributes="0"/>
+ <Group type="103" groupAlignment="3" attributes="0">
+ <Component id="jButton1" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="jButton2" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="jButton3" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="jLabelCurrentPage" alignment="3" min="-2" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JButton" name="jButton1">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Close"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton1ActionPerformed"/>
+ </Events>
+ </Component>
+ <Component class="javax.swing.JButton" name="jButton2">
+ <Properties>
+ <Property name="label" type="java.lang.String" value="prev page"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton2ActionPerformed"/>
+ </Events>
+ </Component>
+ <Component class="javax.swing.JButton" name="jButton3">
+ <Properties>
+ <Property name="label" type="java.lang.String" value="next page"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton3ActionPerformed"/>
+ </Events>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabelCurrentPage">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Current page: 1"/>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="jPanel5">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+ <TitledBorder title="Information"/>
+ </Border>
+ </Property>
+ </Properties>
+
+ <Layout>
+ <DimensionLayout dim="0">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="1" attributes="0">
+ <EmptySpace max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="1" attributes="0">
+ <Component id="jLabel1" alignment="0" pref="972" max="32767" attributes="0"/>
+ <Component id="jLabelDocumentName" alignment="0" pref="972" max="32767" attributes="0"/>
+ </Group>
+ <EmptySpace max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ <DimensionLayout dim="1">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="0" attributes="0">
+ <Component id="jLabel1" pref="50" max="32767" attributes="0"/>
+ <EmptySpace min="-2" max="-2" attributes="0"/>
+ <Component id="jLabelDocumentName" min="-2" pref="19" max="-2" attributes="0"/>
+ <EmptySpace min="-2" max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="jLabel1">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="&lt;html&gt;Here you see a graphical compare by pictures created with a current running office, a stored reference picture and the difference between those both pictures created by ImageMagicks &apos;composite&apos;.&#xa;&lt;/html&gt;" noResource="true"/>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabelDocumentName">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="jLabel2"/>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/testgraphical/ui/java/ConvwatchGUIProject/src/ConvwatchGUI.java b/testgraphical/ui/java/ConvwatchGUIProject/src/ConvwatchGUI.java
new file mode 100644
index 000000000000..625e7b80c6e0
--- /dev/null
+++ b/testgraphical/ui/java/ConvwatchGUIProject/src/ConvwatchGUI.java
@@ -0,0 +1,535 @@
+
+import java.awt.Dimension;
+import java.awt.Image;
+import java.io.File;
+import javax.swing.ImageIcon;
+import javax.swing.JLabel;
+import javax.swing.SwingWorker;
+
+/*
+**************************************************************************
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2000, 2010 Oracle and/or its affiliates.
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* This file is part of OpenOffice.org.
+*
+* OpenOffice.org is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License version 3
+* only, as published by the Free Software Foundation.
+*
+* OpenOffice.org is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License version 3 for more details
+* (a copy is included in the LICENSE file that accompanied this code).
+*
+* You should have received a copy of the GNU Lesser General Public License
+* version 3 along with OpenOffice.org. If not, see
+* <http://www.openoffice.org/license.html>
+* for a copy of the LGPLv3 License.
+*
+**************************************************************************
+ */
+
+/*
+ * Simple windows, which should show differences if there are some
+ */
+
+public class ConvwatchGUI extends javax.swing.JFrame
+{
+ private ImageIcon[] m_aImageIcon;
+ private String m_sInifile;
+ private int m_nMaxPages;
+ private int m_nCurrentPage;
+
+ /** Creates new form ConvwatchGUI
+ * @param args
+ */
+
+ private ConvwatchGUI(String args[])
+ {
+ if (args.length > 0)
+ {
+ if (args[0].endsWith(".ini"))
+ {
+ m_sInifile = args[0];
+ fillImageIconsFromInifile();
+ }
+ else
+ {
+ fillImageIcons(args);
+ }
+ }
+
+ String sVersion = System.getProperty("java.version");
+ Float f = Float.valueOf(sVersion.substring(0,3));
+ if (f.floatValue() < (float)1.6)
+ {
+ System.out.println("You need at least Java version 1.6");
+ System.exit(1);
+ }
+
+ initComponents();
+ jLabelDocumentName.setText("Document: " + m_sInifile);
+ }
+
+ void fillImageIconsFromInifile()
+ {
+ File aFile = new File(m_sInifile);
+ if (!aFile.exists())
+ {
+ GlobalLogWriter.println("Inifile '" + m_sInifile + "' not found.");
+ printUsage();
+ System.exit(1);
+ }
+
+ IniFile aIniFile = new IniFile(aFile);
+ int nPages = aIniFile.getIntValue("global", "pages", 0);
+ if (nPages < 1)
+ {
+ System.out.println("No pages found.");
+ }
+ m_nMaxPages = nPages;
+ m_nCurrentPage = 1;
+ fillImageIcons();
+ }
+
+ private void fillImageIcons()
+ {
+ File aFile = new File(m_sInifile);
+ IniFile aIniFile = new IniFile(aFile);
+ String sSection = "page" + m_nCurrentPage;
+ String[] files = new String[3];
+ files[0] = aIniFile.getValue(sSection, "newgfx"); // current created picture
+ files[1] = aIniFile.getValue(sSection, "oldgfx"); // reference picture
+ files[2] = aIniFile.getValue(sSection, "diffgfx");
+ fillImageIcons(files);
+ }
+
+ /**
+ * Give 3 file names
+ * @param args
+ */
+ private void fillImageIcons(String args[])
+ {
+ boolean bLoadImages = false;
+ m_aImageIcon = new ImageIcon[3];
+ for (int i=0;i<3;i++)
+ {
+ if (args.length > i && args[i] != null)
+ {
+ File aFile = new File(args[i]);
+ if (aFile.exists())
+ {
+ // TODO: Load images
+ // Image aImage = new BufferedImage(100,100, BufferedImage.TYPE_INT_RGB);
+ // aImage.
+ m_aImageIcon[i] = new ImageIcon(args[i]);
+ if (m_aImageIcon[i] != null)
+ {
+ bLoadImages = true;
+ }
+ }
+ else
+ {
+ System.out.println("Can't read file: " + aFile.getName());
+ bLoadImages = false;
+ }
+ }
+ else
+ {
+ System.out.println("There is no #" + (i + 1) + " image given.");
+ bLoadImages = false;
+ }
+ }
+// if (!bLoadImages)
+// {
+// printUsage();
+// System.exit(1);
+// }
+
+
+
+ // TODO: Set images.
+
+ // formComponentResized(null);
+ }
+
+ private void printUsage()
+ {
+ System.out.println("Usage:");
+ System.out.println(" ConvwatchGUI <pic1> <pic2> <pic3>");
+ System.out.println("or ConvwatchGUI <inifile>");
+ }
+
+// private int m_nOldWidth;
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ @SuppressWarnings("unchecked")
+ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ jPanelOriginal = new javax.swing.JPanel();
+ jLabelOriginalImage = new javax.swing.JLabel();
+ jPanelReference = new javax.swing.JPanel();
+ jLabelReferenceImage = new javax.swing.JLabel();
+ jPanelDifference = new javax.swing.JPanel();
+ jLabelDifferenceImage = new javax.swing.JLabel();
+ jPanel4 = new javax.swing.JPanel();
+ jButton1 = new javax.swing.JButton();
+ jButton2 = new javax.swing.JButton();
+ jButton3 = new javax.swing.JButton();
+ jLabelCurrentPage = new javax.swing.JLabel();
+ jPanel5 = new javax.swing.JPanel();
+ jLabel1 = new javax.swing.JLabel();
+ jLabelDocumentName = new javax.swing.JLabel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ addComponentListener(new java.awt.event.ComponentAdapter() {
+ public void componentResized(java.awt.event.ComponentEvent evt) {
+ formComponentResized(evt);
+ }
+ });
+ addPropertyChangeListener(new java.beans.PropertyChangeListener() {
+ public void propertyChange(java.beans.PropertyChangeEvent evt) {
+ formPropertyChange(evt);
+ }
+ });
+
+ jPanelOriginal.setBorder(javax.swing.BorderFactory.createTitledBorder("Picture"));
+
+ javax.swing.GroupLayout jPanelOriginalLayout = new javax.swing.GroupLayout(jPanelOriginal);
+ jPanelOriginal.setLayout(jPanelOriginalLayout);
+ jPanelOriginalLayout.setHorizontalGroup(
+ jPanelOriginalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanelOriginalLayout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jLabelOriginalImage, javax.swing.GroupLayout.DEFAULT_SIZE, 299, Short.MAX_VALUE)
+ .addContainerGap())
+ );
+ jPanelOriginalLayout.setVerticalGroup(
+ jPanelOriginalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanelOriginalLayout.createSequentialGroup()
+ .addComponent(jLabelOriginalImage, javax.swing.GroupLayout.DEFAULT_SIZE, 514, Short.MAX_VALUE)
+ .addContainerGap())
+ );
+
+ jPanelReference.setBorder(javax.swing.BorderFactory.createTitledBorder("Reference Picture"));
+
+ javax.swing.GroupLayout jPanelReferenceLayout = new javax.swing.GroupLayout(jPanelReference);
+ jPanelReference.setLayout(jPanelReferenceLayout);
+ jPanelReferenceLayout.setHorizontalGroup(
+ jPanelReferenceLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanelReferenceLayout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jLabelReferenceImage, javax.swing.GroupLayout.DEFAULT_SIZE, 299, Short.MAX_VALUE)
+ .addContainerGap())
+ );
+ jPanelReferenceLayout.setVerticalGroup(
+ jPanelReferenceLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanelReferenceLayout.createSequentialGroup()
+ .addComponent(jLabelReferenceImage, javax.swing.GroupLayout.DEFAULT_SIZE, 514, Short.MAX_VALUE)
+ .addContainerGap())
+ );
+
+ jPanelDifference.setBorder(javax.swing.BorderFactory.createTitledBorder("Difference"));
+
+ jLabelDifferenceImage.setName("DifferenceImage"); // NOI18N
+
+ javax.swing.GroupLayout jPanelDifferenceLayout = new javax.swing.GroupLayout(jPanelDifference);
+ jPanelDifference.setLayout(jPanelDifferenceLayout);
+ jPanelDifferenceLayout.setHorizontalGroup(
+ jPanelDifferenceLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanelDifferenceLayout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jLabelDifferenceImage, javax.swing.GroupLayout.DEFAULT_SIZE, 298, Short.MAX_VALUE)
+ .addContainerGap())
+ );
+ jPanelDifferenceLayout.setVerticalGroup(
+ jPanelDifferenceLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanelDifferenceLayout.createSequentialGroup()
+ .addComponent(jLabelDifferenceImage, javax.swing.GroupLayout.DEFAULT_SIZE, 514, Short.MAX_VALUE)
+ .addContainerGap())
+ );
+
+ jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder("Action"));
+
+ jButton1.setText("Close");
+ jButton1.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jButton1ActionPerformed(evt);
+ }
+ });
+
+ jButton2.setLabel("prev page");
+ jButton2.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jButton2ActionPerformed(evt);
+ }
+ });
+
+ jButton3.setLabel("next page");
+ jButton3.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jButton3ActionPerformed(evt);
+ }
+ });
+
+ jLabelCurrentPage.setText("Current page: 1");
+
+ javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
+ jPanel4.setLayout(jPanel4Layout);
+ jPanel4Layout.setHorizontalGroup(
+ jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jButton2)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jButton3)
+ .addGap(18, 18, 18)
+ .addComponent(jLabelCurrentPage, javax.swing.GroupLayout.PREFERRED_SIZE, 107, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 614, Short.MAX_VALUE)
+ .addComponent(jButton1)
+ .addContainerGap())
+ );
+ jPanel4Layout.setVerticalGroup(
+ jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup()
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jButton1)
+ .addComponent(jButton2)
+ .addComponent(jButton3)
+ .addComponent(jLabelCurrentPage))
+ .addContainerGap())
+ );
+
+ jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder("Information"));
+
+ jLabel1.setText("<html>Here you see a graphical compare by pictures created with a current running office, a stored reference picture and the difference between those both pictures created by ImageMagicks 'composite'.\n</html>"); // NOI18N
+
+ jLabelDocumentName.setText("jLabel2");
+
+ javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
+ jPanel5.setLayout(jPanel5Layout);
+ jPanel5Layout.setHorizontalGroup(
+ jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 972, Short.MAX_VALUE)
+ .addComponent(jLabelDocumentName, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 972, Short.MAX_VALUE))
+ .addContainerGap())
+ );
+ jPanel5Layout.setVerticalGroup(
+ jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanel5Layout.createSequentialGroup()
+ .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 50, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jLabelDocumentName, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addContainerGap())
+ );
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+ getContentPane().setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(jPanel5, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(jPanel4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(jPanelOriginal, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jPanelReference, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jPanelDifference, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
+ .addContainerGap())
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jPanel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(jPanelReference, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(jPanelOriginal, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(jPanelDifference, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addContainerGap())
+ );
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ private boolean bAdd = false;
+
+ private void formComponentResized(java.awt.event.ComponentEvent evt)//GEN-FIRST:event_formComponentResized
+ {//GEN-HEADEREND:event_formComponentResized
+ // TODO add your handling code here:
+ // we need to set icons to null
+ // if we don't do this, icons can only grow, but not shrink :-(
+
+ initialiseImages();
+ }
+ private void initialiseImages()
+ {
+ if (jLabelOriginalImage.getIcon() != null)
+ {
+ jLabelOriginalImage.setIcon(null);
+ jLabelReferenceImage.setIcon(null);
+ jLabelDifferenceImage.setIcon(null);
+
+ int w = getWidth();
+ int h = getHeight();
+ if (bAdd)
+ {
+ this.setSize(w, h + 1);
+ bAdd = false;
+ }
+ else
+ {
+ this.setSize(w, h - 1);
+ bAdd = true;
+ }
+ }
+ else
+ {
+ new ResizeImage(jLabelOriginalImage, m_aImageIcon[0]).execute();
+ new ResizeImage(jLabelReferenceImage, m_aImageIcon[1]).execute();
+ new ResizeImage(jLabelDifferenceImage, m_aImageIcon[2]).execute();
+ }
+ int dummy=0;
+ }//GEN-LAST:event_formComponentResized
+
+ private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButton1ActionPerformed
+ {//GEN-HEADEREND:event_jButton1ActionPerformed
+ // TODO add your handling code here:
+ System.exit(1);
+ }//GEN-LAST:event_jButton1ActionPerformed
+
+ private void formPropertyChange(java.beans.PropertyChangeEvent evt)//GEN-FIRST:event_formPropertyChange
+ {//GEN-HEADEREND:event_formPropertyChange
+ // TODO add your handling code here:
+ int dummy = 0;
+ }//GEN-LAST:event_formPropertyChange
+
+ private void jButton2ActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButton2ActionPerformed
+ {//GEN-HEADEREND:event_jButton2ActionPerformed
+ // TODO add your handling code here:
+ int nOldPage = m_nCurrentPage;
+ if (m_nCurrentPage > 1)
+ {
+ m_nCurrentPage--;
+ }
+ if (nOldPage != m_nCurrentPage)
+ {
+ jLabelCurrentPage.setText("Current page: " + m_nCurrentPage);
+ fillImageIcons();
+ initialiseImages();
+ }
+ }//GEN-LAST:event_jButton2ActionPerformed
+
+ private void jButton3ActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButton3ActionPerformed
+ {//GEN-HEADEREND:event_jButton3ActionPerformed
+ // TODO add your handling code here:
+ int nOldPage = m_nCurrentPage;
+ if (m_nCurrentPage < m_nMaxPages)
+ {
+ m_nCurrentPage++;
+ }
+ if (nOldPage != m_nCurrentPage)
+ {
+ jLabelCurrentPage.setText("Current page: " + m_nCurrentPage);
+ fillImageIcons();
+ initialiseImages();
+ }
+ }//GEN-LAST:event_jButton3ActionPerformed
+
+ class ResizeImage extends SwingWorker <ImageIcon, Object>
+ {
+ private JLabel m_jLabel;
+ private ImageIcon m_aImageIcon;
+ private int w;
+ private int h;
+
+ public ResizeImage(JLabel _aLabel, ImageIcon _aImageIcon)
+ {
+ m_jLabel = _aLabel;
+ m_aImageIcon = _aImageIcon;
+ w = _aLabel.getWidth();
+ h = _aLabel.getHeight();
+ }
+
+ // dont access here anything to "Event Swing Thread"
+ @Override
+ public ImageIcon doInBackground()
+ {
+ Image aImage = m_aImageIcon.getImage().getScaledInstance(w, h, Image.SCALE_AREA_AVERAGING); // SCALE_SMOOTH
+ final ImageIcon aIcon = new ImageIcon(aImage);
+ // m_jLabel.setIcon(aIcon);
+ return aIcon;
+ }
+
+ @Override
+ protected void done()
+ {
+ try
+ {
+ m_jLabel.setIcon(get());
+ }
+ catch (Exception e)
+ {}
+ }
+
+ }
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(final String args[])
+ {
+
+ // Start GUI
+
+ java.awt.EventQueue.invokeLater(new Runnable()
+ {
+
+ public void run()
+ {
+ ConvwatchGUI aGUI = new ConvwatchGUI(args);
+ aGUI.setTitle("Graphical Compare");
+ aGUI.setPreferredSize(new Dimension(1024, 768));
+
+ aGUI.setVisible(true);
+ }
+ });
+ }
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton jButton1;
+ private javax.swing.JButton jButton2;
+ private javax.swing.JButton jButton3;
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JLabel jLabelCurrentPage;
+ private javax.swing.JLabel jLabelDifferenceImage;
+ private javax.swing.JLabel jLabelDocumentName;
+ private javax.swing.JLabel jLabelOriginalImage;
+ private javax.swing.JLabel jLabelReferenceImage;
+ private javax.swing.JPanel jPanel4;
+ private javax.swing.JPanel jPanel5;
+ private javax.swing.JPanel jPanelDifference;
+ private javax.swing.JPanel jPanelOriginal;
+ private javax.swing.JPanel jPanelReference;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/testgraphical/ui/java/ConvwatchGUIProject/src/IniFile.java b/testgraphical/ui/java/ConvwatchGUIProject/src/IniFile.java
new file mode 100644
index 000000000000..20cede5b1c33
--- /dev/null
+++ b/testgraphical/ui/java/ConvwatchGUIProject/src/IniFile.java
@@ -0,0 +1,718 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+import java.io.File;
+import java.io.RandomAccessFile;
+import java.util.ArrayList;
+import java.util.Enumeration;
+
+
+/**
+ * Simple implementation of a inifile manager
+ */
+class GlobalLogWriter
+{
+ public static void println(String _s)
+ {
+ System.out.println(_s);
+ }
+}
+
+/**
+ Helper class to give a simple API to read/write windows like ini files
+*/
+
+/* public */ // is only need, if we need this class outside package convwatch
+public class IniFile implements Enumeration
+{
+
+ /**
+ * internal representation of the ini file content.
+ * Problem, if ini file changed why other write something difference, we don't realise this.
+ */
+ private String m_sFilename;
+ // private File m_aFile;
+ private ArrayList<String> m_aList;
+ boolean m_bListContainUnsavedChanges = false;
+ private int m_aEnumerationPos = 0;
+
+ /**
+ open a ini file by it's name
+ @param _sFilename string a filename, if the file doesn't exist, a new empty ini file will create.
+ write back to disk only if there are really changes.
+ */
+ public IniFile(String _sFilename)
+ {
+ m_sFilename = _sFilename;
+ // m_aFile = new File(_sFilename);
+ m_aList = loadLines();
+ m_aEnumerationPos = findNextSection(0);
+ }
+
+ /**
+ open a ini file by it's name
+ @param _aFile a java.io.File object, if the file doesn't exist, a new empty ini file will create.
+ write back to disk only if there are really changes.
+ */
+ public IniFile(File _aFile)
+ {
+ m_sFilename = _aFile.getAbsolutePath();
+ m_aList = loadLines();
+ m_aEnumerationPos = findNextSection(0);
+ }
+
+ public void insertFirstComment(String[] _aList)
+ {
+ if (m_aList.size() == 0)
+ {
+ // can only insert if there is nothing else already in the ini file
+ for (int i = 0; i < _aList.length; i++)
+ {
+ m_aList.add(_aList[i]);
+ }
+ }
+ }
+
+ private ArrayList<String> loadLines()
+ {
+ ArrayList<String> aLines = new ArrayList<String>();
+ File aFile = new File(m_sFilename);
+ if (!aFile.exists())
+ {
+ // GlobalLogWriter.println("couldn't find file '" + m_sFilename + "', will be created.");
+ // DebugHelper.exception(BasicErrorCode.SbERR_FILE_NOT_FOUND, "");
+ // m_bListContainUnsavedChanges = false;
+ return aLines;
+ }
+ RandomAccessFile aReader = null;
+ // BufferedReader aReader;
+ try
+ {
+ aReader = new RandomAccessFile(aFile, "r");
+ String aLine = "";
+ while (aLine != null)
+ {
+ aLine = aReader.readLine();
+ if (aLine != null && aLine.length() > 0)
+ {
+ aLines.add(aLine);
+ }
+ }
+ }
+ catch (java.io.FileNotFoundException fne)
+ {
+ GlobalLogWriter.println("couldn't open file " + m_sFilename);
+ GlobalLogWriter.println("Message: " + fne.getMessage());
+ // DebugHelper.exception(BasicErrorCode.SbERR_FILE_NOT_FOUND, "");
+ }
+ catch (java.io.IOException ie)
+ {
+ GlobalLogWriter.println("Exception occurs while reading from file " + m_sFilename);
+ GlobalLogWriter.println("Message: " + ie.getMessage());
+ // DebugHelper.exception(BasicErrorCode.SbERR_INTERNAL_ERROR, ie.getMessage());
+ }
+ try
+ {
+ aReader.close();
+ }
+ catch (java.io.IOException ie)
+ {
+ GlobalLogWriter.println("Couldn't close file " + m_sFilename);
+ GlobalLogWriter.println("Message: " + ie.getMessage());
+ // DebugHelper.exception(BasicErrorCode.SbERR_INTERNAL_ERROR, ie.getMessage());
+ }
+ return aLines;
+ }
+
+ /**
+ * @return true, if the ini file contain some readable data
+ */
+ public boolean is()
+ {
+ return m_aList.size() > 1 ? true : false;
+ }
+
+ /**
+ * Check if a given Section and Key exists in the ini file
+ * @param _sSectionName
+ * @param _sKey
+ * @return true if the given Section, Key exists, now you can get the value
+ */
+ public boolean hasValue(String _sSectionName, String _sKey)
+ {
+ int n = findKey(_sSectionName, _sKey);
+ if (n > 0)
+ {
+ return true;
+ }
+ return false;
+ }
+ // -----------------------------------------------------------------------------
+
+ private boolean isRemark(String _sLine)
+ {
+ if (((_sLine.length() < 2)) ||
+ (_sLine.startsWith("#")) ||
+ (_sLine.startsWith(";")))
+ {
+ return true;
+ }
+ return false;
+ }
+
+ private String getItem(int i)
+ {
+ return m_aList.get(i);
+ }
+
+ private String buildSectionName(String _sSectionName)
+ {
+ String sFindSection = "[" + _sSectionName + "]";
+ return sFindSection;
+ }
+
+ private String sectionToString(String _sSectionName)
+ {
+ String sKeyName = _sSectionName;
+ if (sKeyName.startsWith("[") &&
+ sKeyName.endsWith("]"))
+ {
+ sKeyName = sKeyName.substring(1, sKeyName.length() - 1);
+ }
+ return sKeyName;
+ }
+
+ private String toLowerIfNeed(String _sName)
+ {
+ return _sName.toLowerCase();
+ }
+
+ // return the number where this section starts
+ private int findSection(String _sSection)
+ {
+ String sFindSection = toLowerIfNeed(buildSectionName(_sSection));
+ // ----------- find _sSection ---------------
+ int i;
+ for (i = 0; i < m_aList.size(); i++)
+ {
+ String sLine = toLowerIfNeed(getItem(i).trim());
+ if (isRemark(sLine))
+ {
+ continue;
+ }
+ if (sFindSection.equals("[]"))
+ {
+ // special case, empty Section.
+ return i - 1;
+ }
+ if (sLine.startsWith(sFindSection))
+ {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Checks if a given section exists in the ini file
+ * @param _sSection
+ * @return true if the given _sSection was found
+ */
+ public boolean hasSection(String _sSection)
+ {
+ int i = findSection(_sSection);
+ if (i == -1)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ // return the line number, where the key is found.
+ private int findKey(String _sSection, String _sKey)
+ {
+ int i = findSection(_sSection);
+ if (i == -1)
+ {
+ // Section not found, therefore the value can't exist
+ return -1;
+ }
+ return findKeyFromKnownSection(i, _sKey);
+ }
+
+ // i must be the index in the list, where the well known section starts
+ private int findKeyFromKnownSection(int _nSectionIndex, String _sKey)
+ {
+ _sKey = toLowerIfNeed(_sKey);
+ for (int j = _nSectionIndex + 1; j < m_aList.size(); j++)
+ {
+ String sLine = getItem(j).trim();
+
+ if (isRemark(sLine))
+ {
+ continue;
+ }
+ if (sLine.startsWith("[") /* && sLine.endsWith("]") */)
+ {
+ // TODO: due to the fact we would like to insert an empty line before new sections
+ // TODO: we should check if we are in an empty line and if, go back one line.
+
+ // found end.
+ break;
+ }
+
+ int nEqual = sLine.indexOf("=");
+ if (nEqual >= 0)
+ {
+ String sKey = toLowerIfNeed(sLine.substring(0, nEqual).trim());
+ if (sKey.equals(_sKey))
+ {
+ return j;
+ }
+ }
+ }
+ return -1;
+ }
+
+ // i must be the index in the list, where the well known section starts
+ private int findLastKnownKeyIndex(int _nSectionIndex, String _sKey)
+ {
+ _sKey = toLowerIfNeed(_sKey);
+ int i = _nSectionIndex + 1;
+ for (int j = i; j < m_aList.size(); j++)
+ {
+ String sLine = getItem(j).trim();
+
+ if (isRemark(sLine))
+ {
+ continue;
+ }
+
+ if (sLine.startsWith("[") /* && sLine.endsWith("]") */)
+ {
+ // found end.
+ return j;
+ }
+
+ int nEqual = sLine.indexOf("=");
+ if (nEqual >= 0)
+ {
+ String sKey = toLowerIfNeed(sLine.substring(0, nEqual).trim());
+ if (sKey.equals(_sKey))
+ {
+ return j;
+ }
+ }
+ }
+ return i;
+ }
+
+ private String getValue(int _nIndex)
+ {
+ String sLine = getItem(_nIndex).trim();
+ if (isRemark(sLine))
+ {
+ return "";
+ }
+ int nEqual = sLine.indexOf("=");
+ if (nEqual >= 0)
+ {
+ String sKey = sLine.substring(0, nEqual).trim();
+ String sValue = sLine.substring(nEqual + 1).trim();
+ return sValue;
+ }
+ return "";
+ }
+
+ /**
+ @param _sSection string
+ @param _sKey string
+ @return the value found in the inifile which is given by the section and key parameter
+ */
+ // private int m_nCurrentPosition;
+ // private String m_sOldKey;
+ public String getValue(String _sSection, String _sKey)
+ {
+ String sValue = "";
+ int m_nCurrentPosition = findKey(_sSection, _sKey);
+ if (m_nCurrentPosition == -1)
+ {
+ // Section not found, therefore the value can't exist
+ return "";
+ }
+
+ // m_sOldKey = _sKey;
+ sValue = getValue(m_nCurrentPosition);
+
+ return sValue;
+ }
+
+// private String getNextValue()
+// {
+// if (m_nCurrentPosition >= 0)
+// {
+// ++m_nCurrentPosition;
+// String sValue = getValue(m_nCurrentPosition);
+// return sValue;
+// }
+// return "";
+// }
+ /**
+ * Returns the value at Section, Key converted to an integer
+ * Check with hasValue(Section, Key) to check before you get into trouble.
+ * @param _sSection
+ * @param _sKey
+ * @param _nDefault if there is a problem, key not found... this value will return
+ * @return the value as integer if possible to convert, if not return default value.
+ */
+ public int getIntValue(String _sSection, String _sKey, int _nDefault)
+ {
+ String sValue = getValue(_sSection, _sKey);
+ int nValue = _nDefault;
+ if (sValue.length() > 0)
+ {
+ try
+ {
+ nValue = Integer.valueOf(sValue).intValue();
+ }
+ catch (java.lang.NumberFormatException e)
+ {
+ GlobalLogWriter.println("IniFile.getIntValue(): Caught a number format exception, return the default value.");
+ }
+ }
+ return nValue;
+ }
+
+/**
+ * close a open inifile.
+ * If there are changes, all changes will store back to disk.
+ */
+ public void close()
+ {
+ store();
+ }
+
+ /**
+ write back the ini file to the disk, only if there exist changes
+ * @deprecated use close() instead!
+ */
+
+ // TODO: make private
+ private void store()
+ {
+ if (m_bListContainUnsavedChanges == false)
+ {
+ // nothing has changed, so no need to store
+ return;
+ }
+
+ File aFile = new File(m_sFilename);
+ if (aFile.exists())
+ {
+ // System.out.println("couldn't find file " + m_sFilename);
+ // TODO: little bit unsafe here, first rename, after write is complete, delete the old.
+ aFile.delete();
+ if (aFile.exists())
+ {
+ GlobalLogWriter.println("Couldn't delete the file " + m_sFilename);
+ return;
+ // DebugHelper.exception(BasicErrorCode.SbERR_INTERNAL_ERROR, "Couldn't delete the file " + m_sFilename);
+ }
+ }
+ // if (! aFile.canWrite())
+ // {
+ // System.out.println("Couldn't write to file " + m_sFilename);
+ // DebugHelper.exception(BasicErrorCode.SbERR_INTERNAL_ERROR, "");
+ // }
+ try
+ {
+ RandomAccessFile aWriter = new RandomAccessFile(aFile, "rw");
+ for (int i = 0; i < m_aList.size(); i++)
+ {
+ String sLine = getItem(i);
+ if (sLine.startsWith("["))
+ {
+ // write an extra empty line before next section.
+ aWriter.writeByte((int) '\n');
+ }
+ aWriter.writeBytes(sLine);
+ aWriter.writeByte((int) '\n');
+ }
+ aWriter.close();
+ }
+ catch (java.io.FileNotFoundException fne)
+ {
+ GlobalLogWriter.println("couldn't open file for writing " + m_sFilename);
+ GlobalLogWriter.println("Message: " + fne.getMessage());
+ // DebugHelper.exception(BasicErrorCode.SbERR_FILE_NOT_FOUND, "");
+ }
+ catch (java.io.IOException ie)
+ {
+ GlobalLogWriter.println("Exception occurs while writing to file " + m_sFilename);
+ GlobalLogWriter.println("Message: " + ie.getMessage());
+ // DebugHelper.exception(BasicErrorCode.SbERR_INTERNAL_ERROR, ie.getMessage());
+ }
+ }
+
+ public void insertValue(String _sSection, String _sKey, int _nValue)
+ {
+ insertValue(_sSection, _sKey, String.valueOf(_nValue));
+ }
+
+ public void insertValue(String _sSection, String _sKey, long _nValue)
+ {
+ insertValue(_sSection, _sKey, String.valueOf(_nValue));
+ }
+
+ /**
+ insert a value
+ there are 3 cases
+ 1. section doesn't exist, goto end and insert a new section, insert a new key value pair
+ 2. section exist but key not, search section, search key, if key is -1 get last known key position and insert new key value pair there
+ 3. section exist and key exist, remove the old key and insert the key value pair at the same position
+ * @param _sSection
+ * @param _sKey
+ * @param _sValue
+ */
+ public void insertValue(String _sSection, String _sKey, String _sValue)
+ {
+ int i = findSection(_sSection);
+ if (i == -1)
+ {
+ // case 1: section doesn't exist
+ String sFindSection = buildSectionName(_sSection);
+
+ // TODO: before create a new Section, insert a empty line
+ m_aList.add(sFindSection);
+ if (_sKey.length() > 0)
+ {
+ String sKeyValuePair = _sKey + "=" + _sValue;
+ m_aList.add(sKeyValuePair);
+ }
+ m_bListContainUnsavedChanges = true;
+ return;
+ }
+ int j = findKeyFromKnownSection(i, _sKey);
+ if (j == -1)
+ {
+ // case 2: section exist, but not the key
+ j = findLastKnownKeyIndex(i, _sKey);
+ if (_sKey.length() > 0)
+ {
+ String sKeyValuePair = _sKey + "=" + _sValue;
+ m_aList.add(j, sKeyValuePair);
+ m_bListContainUnsavedChanges = true;
+ }
+ return;
+ }
+ else
+ {
+ // case 3: section exist, and also the key
+ String sKeyValuePair = _sKey + "=" + _sValue;
+ m_aList.set(j, sKeyValuePair);
+ m_bListContainUnsavedChanges = true;
+ }
+ }
+ // -----------------------------------------------------------------------------
+ // String replaceEvaluatedValue(String _sSection, String _sValue)
+ // {
+ // String sValue = _sValue;
+ // int nIndex = 0;
+ // while (( nIndex = sValue.indexOf("$(", nIndex)) >= 0)
+ // {
+ // int nNextIndex = sValue.indexOf(")", nIndex);
+ // if (nNextIndex >= 0)
+ // {
+ // String sKey = sValue.substring(nIndex + 2, nNextIndex);
+ // String sNewValue = getValue(_sSection, sKey);
+ // if (sNewValue != null && sNewValue.length() > 0)
+ // {
+ // String sRegexpKey = "\\$\\(" + sKey + "\\)";
+ // sValue = sValue.replaceAll(sRegexpKey, sNewValue);
+ // }
+ // nIndex = nNextIndex;
+ // }
+ // else
+ // {
+ // nIndex += 2;
+ // }
+ // }
+ // return sValue;
+ // }
+ // -----------------------------------------------------------------------------
+
+ // public String getLocalEvaluatedValue(String _sSection, String _sKey)
+ // {
+ // String sValue = getValue(_sSection, _sKey);
+ // sValue = replaceEvaluatedValue(_sSection, sValue);
+ // return sValue;
+ // }
+
+ // -----------------------------------------------------------------------------
+
+ // this is a special behaviour.
+ // public String getGlobalLocalEvaluatedValue(String _sSection, String _sKey)
+ // {
+ // String sGlobalValue = getKey("global", _sKey);
+ // String sLocalValue = getKey(_sSection, _sKey);
+ // if (sLocalValue.length() == 0)
+ // {
+ // sGlobalValue = replaceEvaluatedKey(_sSection, sGlobalValue);
+ // sGlobalValue = replaceEvaluatedKey("global", sGlobalValue);
+ // return sGlobalValue;
+ // }
+ // sLocalValue = replaceEvaluatedKey(_sSection, sLocalValue);
+ // sLocalValue = replaceEvaluatedKey("global", sLocalValue);
+ //
+ // return sLocalValue;
+ // }
+ public void removeSection(String _sSectionToRemove)
+ {
+ // first, search for the name
+ int i = findSection(_sSectionToRemove);
+ if (i == -1)
+ {
+ // Section to remove not found, do nothing.
+ return;
+ }
+ // second, find the next section
+ int j = findNextSection(i + 1);
+ if (j == -1)
+ {
+ // if we are at the end, use size() as second section
+ j = m_aList.size();
+ }
+ // remove all between first and second section
+ for (int k = i; k < j; k++)
+ {
+ m_aList.remove(i);
+ }
+ // mark the list as changed
+ m_bListContainUnsavedChanges = true;
+ }
+
+ /**
+ * some tests for this class
+ */
+// public static void main(String[] args)
+// {
+// String sTempFile = System.getProperty("java.io.tmpdir");
+// sTempFile += "inifile";
+//
+//
+// IniFile aIniFile = new IniFile(sTempFile);
+// String sValue = aIniFile.getValue("Section", "Key");
+// // insert a new value to a already exist section
+// aIniFile.insertValue("Section", "Key2", "a new value in a existing section");
+// // replace a value
+// aIniFile.insertValue("Section", "Key", "replaced value");
+// // create a new value
+// aIniFile.insertValue("New Section", "Key", "a new key value pair");
+// aIniFile.insertValue("New Section", "Key2", "a new second key value pair");
+//
+// String sValue2 = aIniFile.getValue("Section2", "Key");
+//
+// aIniFile.removeSection("Section");
+// aIniFile.removeSection("New Section");
+//
+// aIniFile.close();
+// }
+
+ /**
+ * Enumeration Interface
+ * @return true, if there are more Key values
+ */
+ public boolean hasMoreElements()
+ {
+ if (m_aEnumerationPos >= 0 &&
+ m_aEnumerationPos < m_aList.size())
+ {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Find the next line, which starts with '['
+ * @param i start position
+ * @return the line where '[' found or -1
+ */
+ private int findNextSection(int i)
+ {
+ if (i >= 0)
+ {
+ while (i < m_aList.size())
+ {
+ String sLine = m_aList.get(i);
+ if (sLine.startsWith("["))
+ {
+ return i;
+ }
+ i++;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Enumeration Interface
+ * @return a key without the enveloped '[' ']'
+ */
+ public Object nextElement()
+ {
+ int nLineWithSection = findNextSection(m_aEnumerationPos);
+ if (nLineWithSection != -1)
+ {
+ String sSection = m_aList.get(nLineWithSection);
+ m_aEnumerationPos = findNextSection(nLineWithSection + 1);
+ sSection = sectionToString(sSection);
+ return sSection;
+ }
+ else
+ {
+ m_aEnumerationPos = m_aList.size();
+ }
+ return null;
+ }
+
+ /**
+ * Helper to count the occurence of Sections
+ * @return returns the count of '^['.*']$' Elements
+ */
+ public int getElementCount()
+ {
+ int nCount = 0;
+ int nPosition = 0;
+ while ((nPosition = findNextSection(nPosition)) != -1)
+ {
+ nCount++;
+ nPosition++;
+ }
+ return nCount;
+ }
+}
+
diff --git a/testgraphical/ui/java/makefile.mk b/testgraphical/ui/java/makefile.mk
new file mode 100644
index 000000000000..134787a17a08
--- /dev/null
+++ b/testgraphical/ui/java/makefile.mk
@@ -0,0 +1,53 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..
+
+PRJNAME=gfxcmp_ui_java
+TARGET=notargetyet
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+.IF "$(SHOW)" == ""
+nothing .PHONY:
+
+.ELSE
+
+# PERLDEBUG=-d:ptkdb
+ALLTAR:
+ $(COPY) ConvwatchGUIProject$/dist/ConvwatchGUIProject.jar $(CLASSDIR)
+
+.END
+
+.INCLUDE : $(PRJ)$/util$/makefile.pmk
+
diff --git a/testgraphical/util/makefile.pmk b/testgraphical/util/makefile.pmk
new file mode 100644
index 000000000000..98b94dca0779
--- /dev/null
+++ b/testgraphical/util/makefile.pmk
@@ -0,0 +1,34 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+# this file will include by other makefiles only
+
+demo: ALLTAR
+selftest: ALLTAR
+failtest: ALLTAR
+
+clean: clean_all