Spreadsheet-Read-0.93/0000755000031300001440000000000014766041535014035 5ustar00merijnusersSpreadsheet-Read-0.93/t/0000755000031300001440000000000014766041535014300 5ustar00merijnusersSpreadsheet-Read-0.93/t/413_misc.t0000644000031300001440000000251013733610070015772 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ParseODS"; } my $tests = 5; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $pt = Spreadsheet::Read::parses ("ods") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_ODS}"; my $pv = $pt->VERSION; $pv lt "0.25" and plan skip_all => "$pt-$pv won't reliably read the test file"; my $ods; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $ods = ReadData ("files/misc.ods", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($ods, "Open with options"); is ($ods->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $ods = ReadData ("files/misc.ods", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } ok ($ods, "Open with options"); is ($ods->[1]{cell}[1], undef, "undef works as option value for 'rc'"); ok (!exists $ods->[1]{A1}, "undef works as option value for 'cells'"); #unless ($ENV{AUTOMATED_TESTING}) { # Test::NoWarnings::had_no_warnings (); # $tests++; # } done_testing ($tests); Spreadsheet-Read-0.93/t/212_csv.t0000644000031300001440000000255114734726717015656 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_XS"; } my $tests = 4; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; # EOF without \r my (%opt, $csv) = $Text::CSV_XS::VERSION ge "1.58" ? (strict_eol => 0) : (); ok ($csv = ReadData ("files/macosx.csv", %opt), "Read/Parse csv file"); is ($csv->[1]{maxrow}, 16, "Last row"); is ($csv->[1]{maxcol}, 15, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "", "Last field"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); __END__ ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); Spreadsheet-Read-0.93/t/622_fmt.t0000644000031300001440000000436112543027365015644 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 40; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); my $parser = $xls->[0]{parser}; SKIP: { ok (my $fmt = $xls->[$xls->[0]{sheet}{Format}], "format"); $fmt->{attr}[2][2]{merged} or skip "$parser $xls->[0]{version} does not reliably support attributes yet", 38; # The return value for the invisible part of merged cells differs for # the available parsers my $mcrv = $parser =~ m/::XLSX/ ? undef : ""; is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, $mcrv, "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], $mcrv, "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, 0, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 0, "Unlocked cell not hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, 0, "Hidden cell not merged"); foreach my $r (1 .. 12) { is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, undef, "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String foreach my $r (2 .. 9, 11, 12) { isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } # Not yet. needs more digging #foreach my $r (2 .. 12) { # ok (defined $fmt->{attr}[1][$r]{format}, "Defined format A$r"); # } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/51_sc.t0000644000031300001440000000322613746002122015364 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 26; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("sc") or plan skip_all => "No SquirrelCalc parser found"; sub ReadDataStream { my $file = shift; open my $fh, "<", $file or return undef; ReadData ($fh, parser => "sc", @_); } # ReadDataStream { my $ref; $ref = ReadDataStream ("no_such_file.sc"); ok (!defined $ref, "Nonexistent file"); $ref = ReadDataStream ("files/empty.sc"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $sc, "<", "files/test.sc" or die "files/test.sc: $!\n"; binmode $sc; $content = <$sc>; close $sc; isnt ($content, undef, "Content is defined"); isnt ($content, "", "Content is filled"); } foreach my $clip (0, 2) { my $sc; ok ($sc = ReadDataStream ("files/test.sc", clip => $clip, strip => 2), "Read/Parse sc file ".($clip?"clipped":"unclipped")); ok (1, "Base values"); is (ref $sc, "ARRAY", "Return type"); is ($sc->[0]{type}, "sc", "Spreadsheet type"); is ($sc->[0]{sheets}, 1, "Sheet count"); is (ref $sc->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$sc->[0]{sheet}}, 1, "Sheet list count"); is ($sc->[0]{version}, $Spreadsheet::Read::VERSION, "Parser version"); is ($sc->[1]{maxcol}, 10 - $clip, "Columns"); is ($sc->[1]{maxrow}, 28 - $clip, "Rows"); is ($sc->[1]{cell}[1][22], " Workspace", "Just checking one cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/620_xlsx.t0000644000031300001440000001423013234273527016047 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 116; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.xlsx"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.xlsx"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xlsx" or die "files/test.xlsx: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xlsx", "Read/Parse xlsx file" ], # [ $content, "Parse xlsx data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); cmp_ok ($xls->[0]{version}, ">=", 0.07, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # Tests for empty thingies ok ($xls = ReadData ("files/values.xlsx"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.xlsx", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.xlsx has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/30_xls.t0000644000031300001440000002040713231317773015574 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser; if ($parser = Spreadsheet::Read::parses ("xls")) { print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; plan tests => 272; Test::NoWarnings->import; } else { plan skip_all => "No M\$-Excel parser found"; } { my $ref; $ref = ReadData ("no_such_file.xls"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.xls"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xls" or die "files/test.xls: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xls", "Read/Parse xls file" ], [ $content, "Parse xls data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xls", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); cmp_ok ($xls->[0]{version}, ">=", 0.26, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # This files is generated under Mac OS/X Tiger ok (1, "XLS File fom Mac OS X"); ok ($xls = ReadData ("files/macosx.xls", clip => 0), "Read/Parse Mac OS X xls file"); ok (1, "Base values"); is ($xls->[0]{sheets}, 3, "Sheet count"); is ($xls->[0]{sheet}{Sheet3}, 3, "Sheet labels"); is ($xls->[1]{maxrow}, 25, "MaxRow"); is ($xls->[1]{maxcol}, 3, "MaxCol"); is ($xls->[2]{label}, "Sheet2", "Sheet label"); is ($xls->[2]{maxrow}, 0, "Empty sheet maxrow"); is ($xls->[2]{maxcol}, 0, "Empty sheet maxcol"); ok (1, "Content"); is ($#{$xls->[1]{cell}[3]}, $xls->[1]{maxrow}, "cell structure"); ok (defined $xls->[1]{cell}[$xls->[1]{maxcol}][$xls->[1]{maxrow}], "last cell"); foreach my $x (1 .. 17) { my $cell = cr2cell (1, $x); is ($xls->[1]{$cell}, $x, "Cell $cell"); is ($xls->[1]{cell}[1][$x], $x, "Cell 1, $x"); } foreach my $x (1 .. 25) { my $cell = cr2cell (3, $x); is ($xls->[1]{$cell}, $x, "Cell $cell"); is ($xls->[1]{cell}[3][$x], $x, "Cell 3, $x"); } foreach my $cell (qw( A18 B1 B6 B20 C26 D14 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Cell $cell"); is ($xls->[1]{$cell}, undef, "Cell $c, $r"); } eval { eval "use ".$parser."::FmtDefault"; my ($pm) = map { $INC{$_} } grep m{FmtDefault.pm$}i => keys %INC; if (open my $ph, "<", $pm) { my $l; $l = <$ph> for 1 .. 68; close $ph; if ($l =~ m/'C\*'/) { print STDERR "\n", "# If the next tests give warnings like\n", "# Character in 'C' format wrapped in pack at\n", "# $pm line 68\n", "# Change C* to U* in line 68\n", "# patch -p0 ; s/\bPM\b/$pm/ for @patch; open $ph, ">", "SPE68.diff" or die "SPE68.diff: $!\n"; print $ph @patch; close $ph; } } }; # Tests for empty thingies ok ($xls = ReadData ("files/values.xls"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.xls", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.xls has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.xls", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 2, "maxrow 2"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xls", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 2, "maxrow 2"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.xls", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 2, "maxrow 2"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xls", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 2, "maxrow 2"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xls", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 2, "maxrow 2"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xls", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xls", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xls", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xls", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xls", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } __END__ --- PM 2005-09-15 14:16:36.163623616 +0200 +++ PM 2005-09-15 14:11:56.289171000 +0200 @@ -65,7 +65,7 @@ sub new($;%) { sub TextFmt($$;$) { my($oThis, $sTxt, $sCode) =@_; return $sTxt if((! defined($sCode)) || ($sCode eq '_native_')); - return pack('C*', unpack('n*', $sTxt)); + return pack('U*', unpack('n*', $sTxt)); } #------------------------------------------------------------------------------ # FmtStringDef (for Spreadsheet::ParseExcel::FmtDefault) Spreadsheet-Read-0.93/t/610_xlsx.t0000644000031300001440000001614714562640027016055 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 178; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.xlsx"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.xlsx"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xlsx" or die "files/test.xlsx: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xlsx", "Read/Parse xlsx file" ], [ "files/hidden.xlsx", "Read/Parse xlsx file with hidden sheet" ], # [ $content, "Parse xlsx data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); my $xvsn = $xls->[0]{version}; $xvsn =~ s/_[0-9]+$//; # remove beta part cmp_ok ($xvsn, ">=", 0.07, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); is ($xls->[1]{hidden}, 0, "Sheet 1 is not hidden"); if ($txt =~ m/hidden/) { is ($xls->[2]{hidden}, 1, "Sheet 2 is hidden"); } else { is ($xls->[2]{hidden}, 0, "Sheet 2 is not hidden"); } } # Tests for empty thingies ok ($xls = ReadData ("files/values.xlsx"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.xlsx", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.xlsx has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } { sub chk_test { my ($msg, $xls) = @_; is (ref $xls, "ARRAY", "Return type for $msg"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type XLSX"); is ($xls->[0]{sheets}, 2, "Sheet count"); } # chk_test my $data = $content; open my $fh, "<", "files/test.xlsx"; chk_test ( " FH parser", ReadData ( $fh, parser => "xlsx")); close $fh; chk_test ("\\DATA parser", ReadData (\$data, parser => "xlsx")); chk_test ( " DATA no parser", ReadData ( $data )); chk_test ( " DATA parser", ReadData ( $data, parser => "xlsx")); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/612_fmt.t0000644000031300001440000000436612543027355015647 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 40; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); my $parser = $xls->[0]{parser}; SKIP: { ok (my $fmt = $xls->[$xls->[0]{sheet}{Format}], "format"); $fmt->{attr}[2][2]{merged} or skip "$parser $xls->[0]{version} does not reliably support attributes yet", 38; # The return value for the invisible part of merged cells differs for # the available parsers my $mcrv = $parser =~ m/::XLSX/ ? undef : ""; is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, $mcrv, "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], $mcrv, "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, 0, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 0, "Unlocked cell not hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, 0, "Hidden cell not merged"); foreach my $r (1 .. 12) { is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, undef, "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String foreach my $r (2 .. 9, 11, 12) { isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } # Not yet. needs more digging #foreach my $r (2 .. 12) { # ok (defined $fmt->{attr}[1][$r]{format}, "Defined format A$r"); # } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/222_csv.t0000644000031300001440000000244612543027300015634 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP"; } my $tests = 4; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; my $csv; ok ($csv = ReadData ("files/macosx.csv"), "Read/Parse csv file"); #use DP; DDumper $csv; is ($csv->[1]{maxrow}, 16, "Last row"); is ($csv->[1]{maxcol}, 15, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "", "Last field"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); __END__ ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); Spreadsheet-Read-0.93/t/201_csv.t0000644000031300001440000000171512524343302015631 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 12; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse csv file (;)"); is ($csv->[0]{sepchar}, ";", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_t.csv", quote => "'"), "Read/Parse csv file (tabs)"); is ($csv->[0]{sepchar}, "\t", "{sepchar}"); is ($csv->[0]{quote}, "'", "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/603_misc.t0000644000031300001440000000220413231321663015773 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 5; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; my $xls; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[1]{cell}[1], undef, "undef works as option value for 'rc'"); ok (!exists $xls->[1]{A1}, "undef works as option value for 'cells'"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/203_csv.t0000644000031300001440000000720513144611370015635 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 125; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; sub ReadDataStream { my $file = shift; open my $fh, "<", $file or return undef; ReadData ($fh, parser => "csv", @_); } # ReadDataStream { my $ref; $ref = ReadDataStream ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadDataStream ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataStream ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_m.csv", sep => ";"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } my $data = "a,b,c\n1,2,3\n"; ok ($csv = ReadData ( $data, parser => "csv"), "Parse from plain string"); is ($csv->[1]{C2}, 3, "C2 = 3"); ok ($csv = ReadData (\$data, parser => "csv"), "Parse from ref to plain string"); is ($csv->[1]{C2}, 3, "C2 = 3"); open my $rh, "<", \$data; ok ($csv = ReadData ($rh, parser => "csv"), "Parse from data-ref"); is ($csv->[1]{C2}, 3, "C2 = 3"); if (open my $dh, ">", $data) { print $dh $data; close $dh; ok ($csv = ReadData ($data, parser => "csv"), "Parse from file with bad name"); is ($csv->[1]{C2}, 3, "C2 = 3"); unlink $data; } else { ok (1, "Using a badly named file not allowed: GOOD!"); ok (1, "Using a badly named file not allowed: GOOD!"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/200_csv.t0000644000031300001440000001534214015676306015643 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 295; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } foreach my $attr ("strip", "trim") { { # RT#74976 - Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.csv", $attr => $strip); ok ($ref, "File with no content - $attr $strip"); } } # blank.csv has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.csv", clip => 0, $attr => 0); ok ($ref, "!clip $attr 0"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 0, $attr => 1); ok ($ref, "!clip $attr 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, $attr => 1, cells => 0); ok ($ref, "!clip $attr 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, $attr => 2, rc => 0); ok ($ref, "!clip $attr 2"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.csv", clip => 0, $attr => 3, cells => 0, rc => 0); ok ($ref, "!clip $attr 3"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, $attr => 0); ok ($ref, " clip $attr 0"); is ($ref->[1]{maxrow}, 1, "maxrow 3"); is ($ref->[1]{maxcol}, 1, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 1, $attr => 1); ok ($ref, " clip $attr 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, $attr => 1, cells => 0); ok ($ref, " clip $attr 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, $attr => 2, rc => 0); ok ($ref, " clip $attr 2"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, $attr => 3, cells => 0, rc => 0); ok ($ref, " clip $attr 3"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } } foreach my $attr ("pivot", "transpose") { ok ($csv = ReadData ("files/test.csv", $attr => 1), "Read/Parse csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$r][$c], $cell, "Unformatted cell $cell"); my $llec = cr2cell ($r, $c); is ($csv->[1]{$llec}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$r][$c], "", "Unformatted cell $cell"); my $llec = cr2cell ($r, $c); is ($csv->[1]{$llec}, "", "Formatted cell $cell"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/34_dates.t0000644000031300001440000000447612266462015016077 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 103; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $xls; ok ($xls = ReadData ("files/Dates.xls", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); my %fmt = ( A1 => [ "8-Aug", undef ], A2 => [ "12-Aug", undef ], A3 => [ "8-Dec", undef ], A4 => [ "13-Aug", undef ], A6 => [ "Short: dd-MM-yyyy", undef ], A7 => [ "2008-08-13", "yyyy-mm-dd" ], B1 => [ 20080808, "yyyymmdd" ], B2 => [ 20080812, "yyyymmdd" ], B3 => [ 20081208, "yyyymmdd" ], B4 => [ 20080813, "yyyymmdd" ], B6 => [ "Long: ddd, dd MMM yyyy", undef ], B7 => [ "Wed, 13 Aug 2008", "ddd, dd mmm yyyy" ], C1 => [ "2008-08-08", "yyyy-mm-dd" ], C2 => [ "2008-08-12", "yyyy-mm-dd" ], C3 => [ "2008-12-08", "yyyy-mm-dd" ], C4 => [ "2008-08-13", "yyyy-mm-dd" ], C6 => [ "Default format 0x0E", undef ], C7 => [ "8/13/08", "m/d/yy" ], D1 => [ "08/08/2008", "mm/dd/yyyy" ], D2 => [ "08/12/2008", "mm/dd/yyyy" ], D3 => [ "12/08/2008", "mm/dd/yyyy" ], D4 => [ "08/13/2008", "mm/dd/yyyy" ], E1 => [ "08 Aug 2008", undef ], E2 => [ "12 Aug 2008", undef ], E3 => [ "08 Dec 2008", undef ], E4 => [ "13 Aug 2008", undef ], ); ok (my $ss = $xls->[1], "sheet"); ok (my $attr = $ss->{attr}, "attr"); my @date = (undef, 39668, 39672, 39790, 39673); my @fmt = (undef, undef, "yyyymmdd", "yyyy-mm-dd", "mm/dd/yyyy"); foreach my $r (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{type}, "date", "Date type row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{format}, $fmt[$_], "Date format row $r col $_") for 1 .. 4; } foreach my $r (1..4,6..7) { foreach my $c (1..5) { my $cell = cr2cell ($c, $r); my $fmt = $ss->{attr}[$c][$r]{format}; defined $ss->{$cell} or next; is ($ss->{$cell}, $fmt{$cell}[0], "$cell content"); is ($fmt, $fmt{$cell}[1], "$cell format"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/633_misc.t0000644000031300001440000000236214520406472016007 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Excel::ValueReader::XLSX"; } my $tests = 5; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } #use DP;diag DDumper $xls; ok ($xls, "Open with options"); is ($xls->[1]{cell}[1], undef, "undef works as option value for 'rc'"); ok (!exists $xls->[1]{A1}, "undef works as option value for 'cells'"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/31_clr.t0000644000031300001440000000247413411413207015540 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 256; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; my $xls; ok ($xls = ReadData ("files/attr.xls", attr => 1), "Excel Attributes testcase"); my $clr = $xls->[$xls->[0]{sheet}{Colours}]; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/631_clr.t0000644000031300001440000000126214520222432015620 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Excel::ValueReader::XLSX"; } my $tests = 3; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); SKIP: { ok (my $clr = $xls->[$xls->[0]{sheet}{Colours}], "colors"); is ($clr->{attr}[2][2]{fgcolor}, undef, "$xls->[0]{parser} does not support colors"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/205_csv.t0000644000031300001440000002614314757631465015663 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; # OO version of 200_csv.t my $tests = 271; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; { my $ref; is (Spreadsheet::Read->new ("no_such_file.csv"), undef, "Open nonexisting file"); ok ($@, "No sheets read: $@"); # No such file or directory is (Spreadsheet::Read->new ("files/empty.csv"), undef, "Open empty file"); is ($@, "files/empty.csv is empty", "No sheets read"); } my $csv; ok ($csv = Spreadsheet::Read->new ("files/test.csv"), "Read/Parse csv file"); ok ($csv->parses ("CSV"), "Parses CSV"); is ($csv->cr2cell (1, 1), "A1", "method cr2cell"); ok (1, "Base values"); is (ref $csv, "Spreadsheet::Read", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is_deeply ([$csv->cellrow (1, 1)], ["A1","B1","","D1",(undef) x 15], "row 1"); is ($csv->cellrow (1, 255), undef, "No such row 255"); is ($csv->cellrow (1, -55), undef, "No such row -55"); is ($csv->cellrow (1, 0), undef, "No such row 0"); is ($csv->cellrow (0, 1), undef, "No such sheet 0"); is ($csv->cellrow (-2, 1), undef, "Wrong sheet -2"); is ($csv->cellrow (-20, 1), undef, "No such sheet -20"); is_deeply ([$csv->row (1, 1)], ["A1","B1","","D1",(undef) x 15], "row 1"); is ($csv->row (1, 255), undef, "No such row 255"); is ($csv->row (1, -55), undef, "No such row -55"); is ($csv->row (1, 0), undef, "No such row 0"); is ($csv->row (0, 1), undef, "No such sheet 0"); is ($csv->row (-2, 1), undef, "Wrong sheet -2"); is ($csv->row (-20, 1), undef, "No such sheet -20"); is ($csv->sheet ( 0), undef, "Sheet 0"); is ($csv->sheet (255), undef, "Sheet 255"); is ($csv->sheet (-55), undef, "Sheet -55"); is ($csv->sheet ("="), undef, "Sheet '='"); is (Spreadsheet::Read::sheet (undef, 1), undef, "Don't be silly"); is (Spreadsheet::Read::sheet ($csv, -9), undef, "Don't be silly"); ok (my $sheet = $csv->sheet (1), "Sheet 1"); is ($sheet->maxrow, 5, "Last row"); is ($sheet->maxcol, 19, "Last column"); is ($sheet->cell ($sheet->maxcol, $sheet->maxrow), "LASTFIELD", "Last field"); is_deeply ([$sheet->cellrow (1)], ["A1","B1","","D1",(undef) x 15], "row 1"); is ($sheet->cellrow (255), undef, "No such row 255"); is ($sheet->cellrow (-55), undef, "No such row -55"); is ($sheet->cellrow ( 0), undef, "No such row 0"); is_deeply ([$sheet->row (1)], ["A1","B1","","D1",(undef) x 15], "row 1"); is ($sheet->row (255), undef, "No such row 255"); is ($sheet->row (-55), undef, "No such row -55"); is ($sheet->row ( 0), undef, "No such row 0"); is_deeply ([$sheet->cellcolumn (1)], ["A1","A2","A3","A4",""], "col 1"); is ($sheet->cellcolumn (255), undef, "No such col 255"); is ($sheet->cellcolumn (-55), undef, "No such col -55"); is ($sheet->cellcolumn ( 0), undef, "No such col 0"); is_deeply ([$sheet->column (1)], ["A1","A2","A3","A4",""], "col 1"); is ($sheet->column (255), undef, "No such col 255"); is ($sheet->column (-55), undef, "No such col -55"); is ($sheet->column ( 0), undef, "No such col 0"); ok (my @rows = $sheet->rows, "All rows"); is ($rows[0][0], "A1", "A1"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = $csv->cell2cr ($cell); is ($sheet->{cell}[$c][$r], $cell, "Unformatted cell $cell direct"); is ($sheet->{$cell}, $cell, "Formatted cell $cell direct"); is ($sheet->cell ($c, $r), $cell, "Unformatted cell $cell method"); is ($sheet->cell ($cell), $cell, "Formatted cell $cell method"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = $csv->cell2cr ($cell); is ($sheet->{cell}[$c][$r], "", "Unformatted cell $cell direct"); is ($sheet->{$cell}, "", "Formatted cell $cell direct"); is ($sheet->cell ($c, $r), "", "Unformatted cell $cell method"); is ($sheet->cell ($cell), "", "Formatted cell $cell method"); } ok ($csv = Spreadsheet::Read->new ("files/test_m.csv"), "Read/Parse M\$ csv file"); ok ($sheet = $csv->sheet (1), "Sheet 1"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = $sheet->cell2cr ($cell); is ($sheet->cell ($c, $r), $cell, "Unformatted cell $cell"); is ($sheet->cell ($cell), $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = $sheet->cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = Spreadsheet::Read->new ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } { # RT#74976 - Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = Spreadsheet::Read->new ("files/blank.csv", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.csv has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.csv", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 3"); is ($ref->[1]{maxcol}, 1, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } ok ($csv = Spreadsheet::Read->new ("files/test.csv"), "Read/Parse csv file"); ok ($csv->add ("files/test.csv"), "Add the same file"); is ($csv->sheets, 2, "Two sheets"); is_deeply ([ $csv->sheets ], [qw( files/test.csv files/test.csv[2] )], "Sheet names"); is_deeply ($csv->sheet ("files/test.csv"), $csv->sheet (2), "Compare sheets"); ok (my $sheet2 = $csv->sheet (2), "The new sheet"); is ($sheet2->label, "files/test.csv", "Original label"); is ($sheet2->label ("Hello"), "Hello", "New label"); ok (my $sheet3 = $csv->sheet ("Hello"), "Found by new label"); is_deeply ($sheet2, $sheet3, "Compare sheets"); ok ($csv->add ("files/test.csv", label => "Test"), "Add with label"); is_deeply ([ $csv->sheets ], [qw( files/test.csv files/test.csv[2] Test )], "Sheet names"); is ($csv->col2label (4), "D", "col2label as book method"); is ($csv->sheet (1)->col2label (27), "AA", "col2label as sheet method"); is_deeply ($csv->sheet (1)->range ("A2:B3"), { A2 => "A2", A3 => "A3", B2 => "B2", B3 => "" }, "range (A2:B3)"); is_deeply ($csv->sheet (1)->range ("S5:V12"), { S5 => "LASTFIELD" }, "range (S5:V12)"); is_deeply ($csv->sheet (1)->range (1, 2, 2, 3), { A2 => "A2", A3 => "A3", B2 => "B2", B3 => "" }, "range (1, 2, 2, 3)"); is_deeply ($csv->sheet (1)->range (19, 5, 22, 12), { S5 => "LASTFIELD" }, "range (19, 5, 22, 12)"); is_deeply ($csv->sheet (1)->range (-1, -1, -1, -1), { S5 => "LASTFIELD" }, "range (-1, -1, -1, -1)"); is_deeply ($csv->sheet (1)->cellrange ("A2:B3"), [ [ "A2", "A3"], [ "B2", "" ]], "cellrange (A2:B3)"); is_deeply ($csv->sheet (1)->cellrange ("S5:V12"), [ [ "LASTFIELD" ]], "cellrange (S5:V12)"); is_deeply ($csv->sheet (1)->cellrange (1, 2, 2, 3), [ [ "A2", "A3"], [ "B2", "" ]], "cellrange (1, 2, 2, 3)"); is_deeply ($csv->sheet (1)->cellrange (19, 5, 22, 12), [ [ "LASTFIELD" ]], "cellrange (19, 5, 22, 12)"); is_deeply ($csv->sheet (1)->cellrange (-1, -1, -1, -1), [ [ "LASTFIELD" ]], "cellrange (-1, -1, -1, -1)"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/224_csv.t0000644000031300001440000000602213016541274015637 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP"; } my $tests = 118; use Test::More; require Test::NoWarnings; use Spreadsheet::Read qw( ReadData cell2cr row cellrow ); my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; sub ReadDataCSV { ReadData (@_, parser => "csv"); } # ReadDataCSV { my $ref; $ref = ReadDataCSV ("files/empty.txt"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataCSV ("files/test.txt"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } my @row = ("A3", "", "C3", "D3", (undef) x 15); is_deeply ([ row ($csv->[1], 3) ], \@row, "Formatted row 3"); is_deeply ([ cellrow ($csv->[1], 3) ], \@row, "Unformatted row 3"); ok ($csv = ReadDataCSV ("files/test_m.txt"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataCSV ("files/test_x.txt", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/214_csv.t0000644000031300001440000000602214757626601015651 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_XS"; } my $tests = 118; use Test::More; require Test::NoWarnings; use Spreadsheet::Read qw( ReadData cell2cr row cellrow ); my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; sub ReadDataCSV { ReadData (@_, parser => "csv"); } # ReadDataCSV { my $ref; $ref = ReadDataCSV ("files/empty.txt"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataCSV ("files/test.txt"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } my @row = ("A3", "", "C3", "D3", (undef) x 15); is_deeply ([ row ($csv->[1], 3) ], \@row, "Formatted row 3"); is_deeply ([ cellrow ($csv->[1], 3) ], \@row, "Unformatted row 3"); ok ($csv = ReadDataCSV ("files/test_m.txt"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataCSV ("files/test_x.txt", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/420_sxc.t0000644000031300001440000000756613701337130015650 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 301; use Test::More; require Test::NoWarnings; BEGIN { $ENV{SPREADSHEET_READ_SXC} = "Spreadsheet::ReadSXC"; } use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("sxc") or plan skip_all => "No SXC parser found"; my $pv = $parser->VERSION; $pv >= "0.25" and plan skip_all => "Use Spreadsheet::ParseODS instead please"; diag ("# Parser: $parser-$pv"); my $content; { local $/; open my $xml, "<", "files/content.xml" or die "files/content.xml: $!\n"; binmode $xml; $content = <$xml>; close $xml; } { my $ref; $ref = ReadData ("no_such_file.sxc"); ok (!defined $ref, "Nonexistent file"); # Too noisy #eval { $ref = ReadData ("files/empty.sxc") }; #ok (!defined $ref, "Empty file"); #like ($@, qr/too short/); } my @base = ( [ "files/test.sxc", "Read/Parse sxc file" ], [ "files/content.xml", "Read/Parse xml file" ], [ $content, "Parse xml data" ], ); if ($parser->VERSION > 0.23) { open my $fh, "<", "files/test.sxc" or die "files/test.sxc: $!\n"; push @base => [ $fh, "Parse sxc file handle" ]; $tests += 100; } foreach my $base (@base) { my ($txt, $msg) = @$base; my $sxc; my @options = ref $txt ? (parser => "sxc") : (); ok ($sxc = ReadData ($txt, @options), $msg); ok (1, "Base values"); is (ref $sxc, "ARRAY", "Return type"); is ($sxc->[0]{type}, "sxc", "Spreadsheet type"); is ($sxc->[0]{sheets}, 2, "Sheet count"); is (ref $sxc->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$sxc->[0]{sheet}}, 2, "Sheet list count"); # This should match the version required in Makefile.PL's PREREQ_PM cmp_ok ($sxc->[0]{version}, ">=", 0.12, "Parser version"); ok (1, "Sheet 1"); # Simple sheet with cells filled with the cell label: # -- -- -- -- # A1 B1 D1 # A2 B2 # A3 C3 D3 # A4 B4 C4 ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Nonexistent fields"); foreach my $cell (qw( A9 X6 B17 AB4 BE33 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Sheet 2"); # Sheet with merged cells and notes/annotations # x x x # x x # x x x ok (1, "Defined fields"); foreach my $cell (qw( A1 C1 E1 B2 D2 A3 C3 E3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], "x", "Unformatted cell $cell"); is ($sxc->[2]{$cell}, "x", "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B1 D1 A2 C2 E2 B3 D3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[2]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Nonexistent fields"); foreach my $cell (qw( A9 X6 B17 AB4 BE33 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[2]{$cell}, undef, "Formatted cell $cell"); } # Sheet order ok (exists $sxc->[0]{sheet}{Sheet1}, "Sheet labels in metadata"); my @sheets = map { $sxc->[$_]{label} } 1 .. $sxc->[0]{sheets}; SKIP: { $sxc->[0]{version} < 0.20 and skip "Not supported", 1; is ("@sheets", "@{['Sheet1','Second Sheet']}", "Sheet order"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/601_clr.t0000644000031300001440000000273112564056346015636 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 257; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); SKIP: { ok (my $clr = $xls->[$xls->[0]{sheet}{Colours}], "colors"); defined $clr->{attr}[2][2]{fgcolor} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support colors yet", 255; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/614_dates.t0000644000031300001440000000510612543027701016147 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 103; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $xls; ok ($xls = ReadData ("files/Dates.xlsx", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); my %fmt = ( A1 => [ "8-Aug", "d-mmm" ], A2 => [ "12-Aug", "d-mmm" ], A3 => [ "8-Dec", "d-mmm" ], A4 => [ "13-Aug", "d-mmm" ], A6 => [ "Short: dd-MM-yyyy", undef ], A7 => [ "2008-08-13", "yyyy-mm-dd" ], B1 => [ 20080808, "yyyymmdd" ], B2 => [ 20080812, "yyyymmdd" ], B3 => [ 20081208, "yyyymmdd" ], B4 => [ 20080813, "yyyymmdd" ], B6 => [ "Long: ddd, dd MMM yyyy", undef ], B7 => [ "Wed, 13 Aug 2008", "ddd, dd mmm yyyy" ], C1 => [ "2008-08-08", "yyyy-mm-dd" ], C2 => [ "2008-08-12", "yyyy-mm-dd" ], C3 => [ "2008-12-08", "yyyy-mm-dd" ], C4 => [ "2008-08-13", "yyyy-mm-dd" ], C6 => [ "Default format 0x0E", undef ], C7 => [ "8/13/08", "m/d/yy" ], D1 => [ "08/08/2008", "mm/dd/yyyy" ], D2 => [ "08/12/2008", "mm/dd/yyyy" ], D3 => [ "12/08/2008", "mm/dd/yyyy" ], D4 => [ "08/13/2008", "mm/dd/yyyy" ], E1 => [ "08 Aug 2008", undef ], E2 => [ "12 Aug 2008", undef ], E3 => [ "08 Dec 2008", undef ], E4 => [ "13 Aug 2008", undef ], ); SKIP: { ok (my $ss = $xls->[1], "sheet"); ok (my $attr = $ss->{attr}, "attr"); defined $attr->[2][1]{format} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support formats", 100; my @date = (undef, 39668, 39672, 39790, 39673); my @fmt = (undef, "d-mmm", "yyyymmdd", "yyyy-mm-dd", "mm/dd/yyyy"); foreach my $r (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{type}, "date", "Date type row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{format}, $fmt[$_], "Date format row $r col $_") for 1 .. 4; } foreach my $r (1..4,6..7) { foreach my $c (1..5) { my $cell = cr2cell ($c, $r); my $fmt = $ss->{attr}[$c][$r]{format}; defined $ss->{$cell} or next; is ($ss->{$cell}, $fmt{$cell}[0], "$cell content"); is ($fmt, $fmt{$cell}[1], "$cell format"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/627_merged.t0000644000031300001440000000020313701561424016311 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; ok (1, "No merged cell support in Spreadsheet::XLSX"); done_testing; Spreadsheet-Read-0.93/t/625_perc.t0000644000031300001440000000226112643415517016010 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/perc.xlsx", attr => 1), "Excel Percentage testcase"); my $ss = $xls->[1]; my $attr = $ss->{attr}; foreach my $row (1 .. 19) { is ($ss->{attr}[1][$row]{type}, "numeric", "Type A$row numeric"); ok ($ss->{attr}[2][$row]{type} eq "numeric" || $ss->{attr}[2][$row]{type} eq "percentage", "Type B$row percentage"); is ($ss->{attr}[3][$row]{type}, "percentage", "Type C$row percentage"); SKIP: { $ss->{B18} =~ m/[.]/ and skip "$xls->[0]{parser} $xls->[0]{version} has format problems", 1; my $i = int $ss->{"A$row"}; # Allow edge case. rounding .5 will be different in -Duselongdouble perl my $f = $ss->{"B$row"}; $row == 11 && $f eq "1%" and $i = 1; is ($f, "$i%", "Formatted values for row $row\n"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/701_clr.t0000644000031300001440000000263214374661032015632 0ustar00merijnusers#!perl use strict; use warnings; my $tests = 257; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("gnumeric") or plan skip_all => "No Gnumeric parser found"; my $book; ok ($book = ReadData ("files/attr.gnumeric", attr => 1), "Gnumeric attributes testcase"); ok (my $clr = $book->[$book->[0]{sheet}{Colours}], "have the 'Colours' sheet"); is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, "#000000", "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, "#FFFFFF", "Unspecified fill color"); my @clr = ( [], ["auto", undef], ["red", "#FF0000"], ["green", "#008000"], ["blue", "#0000FF"], ["white", "#FFFFFF"], ["yellow", "#FFFF00"], ["lightgreen", "#00FF00"], ["lightblue", "#00CCFF"], ["gray", "#808080"], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1] || "#FFFFFF"; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1] || "#000000"; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/411_clr.t0000644000031300001440000000474313733607341015636 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ParseODS"; } my $tests = 266; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("ods") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_ODS}"; my $ods; ok ($ods = ReadData ("files/attr.ods", attr => 1), "Excel Attributes testcase"); SKIP: { ok (my $clr = $ods->[$ods->[0]{sheet}{Colours}], "colors"); defined $clr->{attr}[2][2]{fgcolor} or skip "$ods->[0]{parser} $ods->[0]{version} does not reliably support colors yet", 255; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } } SKIP: { ok ($ods = Spreadsheet::Read->new ("files/attr.ods", attr => 1), "Attributes OO"); defined $ods->[1]{attr}[3][3]{fgcolor} or skip "$ods->[0]{parser} $ods->[0]{version} does not reliably support colors yet", 5; is ($ods->[1]{attr}[3][3]{fgcolor}, "#008000", "C3 Forground color direct"); is ($ods->sheet (1)->attr (3, 3)->{fgcolor},"#008000", "C3 Forground color OO rc hash"); is ($ods->sheet (1)->attr ("C3")->{fgcolor},"#008000", "C3 Forground color OO cell hash"); is ($ods->sheet (1)->attr (3, 3)->fgcolor, "#008000", "C3 Forground color OO rc method"); is ($ods->sheet (1)->attr ("C3")->fgcolor, "#008000", "C3 Forground color OO cell method"); } is ($ods->[1]{attr}[3][3]{bogus_attribute}, undef, "C3 bogus attribute direct"); is ($ods->sheet (1)->attr ("C3")->{bogus_attr}, undef, "C3 bogus attribute OO hash"); is ($ods->sheet (1)->attr ("C3")->bogus_attr, undef, "C3 bogus attribute OO method"); #unless ($ENV{AUTOMATED_TESTING}) { # Test::NoWarnings::had_no_warnings (); # $tests++; # } done_testing ($tests); Spreadsheet-Read-0.93/t/615_perc.t0000644000031300001440000000250613110546002015771 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/perc.xlsx", attr => 1), "Excel Percentage testcase"); my $ss = $xls->[1]; my $attr = $ss->{attr}; foreach my $row (1 .. 19) { my @type = map { $ss->{attr}[$_][$row]{type} } 0 .. 3; is ($ss->{attr}[1][$row]{type}, "numeric", "Type A$row numeric"); foreach my $col (2, 3) { my $cell = ("A".."C")[$col - 1].$row; my $xvsn = $xls->[0]{version}; $xvsn =~ s/_[0-9]+$//; # remove beta part my $expect = $xvsn < 0.23 && $type[$col] eq "numeric" ? "numeric" : "percentage"; is ($type[$col], $expect, "Type $cell percentage"); } SKIP: { $ss->{B18} =~ m/[.]/ and skip "$xls->[0]{parser} $xls->[0]{version} has format problems", 1; my $i = int $ss->{"A$row"}; # Allow edge case. rounding .5 will be different in -Duselongdouble perl my $f = $ss->{"B$row"}; $row == 11 && $f eq "1%" and $i = 1; is ($f, "$i%", "Formatted values for row $row\n"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/617_merged.t0000644000031300001440000000536113701561237016324 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; $parser eq "Spreadsheet::XLSX" and plan skip_all => "No merged cell support in $parser"; ok (my $ss = ReadData ("files/merged.xlsx", attr => 1)->[1], "Read merged xlsx"); is ($ss->{attr}[1][1]{merged}, 0, "unmerged A1"); is ($ss->{attr}[2][1]{merged}, 1, " merged B1"); is ($ss->{attr}[3][1]{merged}, 1, " merged C1"); is ($ss->{attr}[1][2]{merged}, 1, " merged A2"); is ($ss->{attr}[2][2]{merged}, 1, " merged B2"); is ($ss->{attr}[3][2]{merged}, 1, " merged C2"); is ($ss->{attr}[1][3]{merged}, 1, " merged A3"); is ($ss->{attr}[2][3]{merged}, 0, "unmerged B3"); is ($ss->{attr}[3][3]{merged}, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); ok ($ss = Spreadsheet::Read->new ("files/merged.xlsx", attr => 1, merge => 1)->sheet (1), "Read merged xlsx"); is ($ss->attr (1, 1)->merged, 0, "unmerged A1"); is ($ss->attr (2, 1)->merged, "B1", " merged B1"); is ($ss->attr (3, 1)->merged, "B1", " merged C1"); is ($ss->attr (1, 2)->merged, "A2", " merged A2"); is ($ss->attr (2, 2)->merged, "B1", " merged B2"); is ($ss->attr (3, 2)->merged, "B1", " merged C2"); is ($ss->attr (1, 3)->merged, "A2", " merged A3"); is ($ss->attr (2, 3)->merged, 0, "unmerged B3"); is ($ss->attr (3, 3)->merged, 0, "unmerged C3"); is ($ss->attr ("A1")->merged, 0, "unmerged A1"); is ($ss->attr ("B1")->merged, "B1", " merged B1"); is ($ss->attr ("C1")->merged, "B1", " merged C1"); is ($ss->attr ("A2")->merged, "A2", " merged A2"); is ($ss->attr ("B2")->merged, "B1", " merged B2"); is ($ss->attr ("C2")->merged, "B1", " merged C2"); is ($ss->attr ("A3")->merged, "A2", " merged A3"); is ($ss->attr ("B3")->merged, 0, "unmerged B3"); is ($ss->attr ("C3")->merged, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); is ($ss->merged_from ("A1"), "", "merged_from (A1)"); is ($ss->merged_from (1, 1), "", "merged_from (1, 1)"); is ($ss->merged_from ("B1"), "B1", "merged_from (B1)"); is ($ss->merged_from (2, 1), "B1", "merged_from (2, 1)"); is ($ss->merged_from ("C2"), "B1", "merged_from (C2)"); is ($ss->merged_from (3, 2), "B1", "merged_from (3, 2)"); # out of range is ($ss->merged_from ("E5"), undef, "merged_from (E5)"); # illegal ID is ($ss->merged_from (999), undef, "merged_from (999)"); is ($ss->merged_from ("9X"), undef, "merged_from (9X)"); is ($ss->merged_from (999, 99), undef, "merged_from (999, 99)"); is ($ss->merged_from (9, 9, 9), undef, "merged_from (9, 9, 9)"); done_testing; Spreadsheet-Read-0.93/t/624_dates.t0000644000031300001440000000510112543027367016153 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 103; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $xls; ok ($xls = ReadData ("files/Dates.xlsx", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); my %fmt = ( A1 => [ "8-Aug", "d-mmm" ], A2 => [ "12-Aug", "d-mmm" ], A3 => [ "8-Dec", "d-mmm" ], A4 => [ "13-Aug", "d-mmm" ], A6 => [ "Short: dd-MM-yyyy", undef ], A7 => [ "2008-08-13", "yyyy-mm-dd" ], B1 => [ 20080808, "yyyymmdd" ], B2 => [ 20080812, "yyyymmdd" ], B3 => [ 20081208, "yyyymmdd" ], B4 => [ 20080813, "yyyymmdd" ], B6 => [ "Long: ddd, dd MMM yyyy", undef ], B7 => [ "Wed, 13 Aug 2008", "ddd, dd mmm yyyy" ], C1 => [ "2008-08-08", "yyyy-mm-dd" ], C2 => [ "2008-08-12", "yyyy-mm-dd" ], C3 => [ "2008-12-08", "yyyy-mm-dd" ], C4 => [ "2008-08-13", "yyyy-mm-dd" ], C6 => [ "Default format 0x0E", undef ], C7 => [ "8/13/08", "m/d/yy" ], D1 => [ "08/08/2008", "mm/dd/yyyy" ], D2 => [ "08/12/2008", "mm/dd/yyyy" ], D3 => [ "12/08/2008", "mm/dd/yyyy" ], D4 => [ "08/13/2008", "mm/dd/yyyy" ], E1 => [ "08 Aug 2008", undef ], E2 => [ "12 Aug 2008", undef ], E3 => [ "08 Dec 2008", undef ], E4 => [ "13 Aug 2008", undef ], ); SKIP: { ok (my $ss = $xls->[1], "sheet"); ok (my $attr = $ss->{attr}, "attr"); defined $attr->[2][1]{format} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support formats", 100; my @date = (undef, 39668, 39672, 39790, 39673); my @fmt = (undef, "d-mmm", "yyyymmdd", "yyyy-mm-dd", "mm/dd/yyyy"); foreach my $r (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{type}, "date", "Date type row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{format}, $fmt[$_], "Date format row $r col $_") for 1 .. 4; } foreach my $r (1..4,6..7) { foreach my $c (1..5) { my $cell = cr2cell ($c, $r); my $fmt = $ss->{attr}[$c][$r]{format}; defined $ss->{$cell} or next; is ($ss->{$cell}, $fmt{$cell}[0], "$cell content"); is ($fmt, $fmt{$cell}[1], "$cell format"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/211_csv.t0000644000031300001440000000202712543027246015636 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_XS"; } my $tests = 12; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse csv file (;)"); is ($csv->[0]{sepchar}, ";", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_t.csv", quote => "'"), "Read/Parse csv file (tabs)"); is ($csv->[0]{sepchar}, "\t", "{sepchar}"); is ($csv->[0]{quote}, "'", "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/37_merged.t0000644000031300001440000000507613701561751016244 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; ok (my $ss = ReadData ("files/merged.xls", attr => 1)->[1], "Read merged xls"); is ($ss->{attr}[1][1]{merged}, 0, "unmerged A1"); is ($ss->{attr}[2][1]{merged}, 1, " merged B1"); is ($ss->{attr}[3][1]{merged}, 1, " merged C1"); is ($ss->{attr}[1][2]{merged}, 1, " merged A2"); is ($ss->{attr}[2][2]{merged}, 1, " merged B2"); is ($ss->{attr}[3][2]{merged}, 1, " merged C2"); is ($ss->{attr}[1][3]{merged}, 1, " merged A3"); is ($ss->{attr}[2][3]{merged}, 0, "unmerged B3"); is ($ss->{attr}[3][3]{merged}, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); ok ($ss = Spreadsheet::Read->new ("files/merged.xls", attr => 1, merge => 1)->sheet (1), "Read merged xls"); is ($ss->attr (1, 1)->merged, 0, "unmerged A1"); is ($ss->attr (2, 1)->merged, "B1", " merged B1"); is ($ss->attr (3, 1)->merged, "B1", " merged C1"); is ($ss->attr (1, 2)->merged, "A2", " merged A2"); is ($ss->attr (2, 2)->merged, "B1", " merged B2"); is ($ss->attr (3, 2)->merged, "B1", " merged C2"); is ($ss->attr (1, 3)->merged, "A2", " merged A3"); is ($ss->attr (2, 3)->merged, 0, "unmerged B3"); is ($ss->attr (3, 3)->merged, 0, "unmerged C3"); is ($ss->attr ("A1")->merged, 0, "unmerged A1"); is ($ss->attr ("B1")->merged, "B1", " merged B1"); is ($ss->attr ("C1")->merged, "B1", " merged C1"); is ($ss->attr ("A2")->merged, "A2", " merged A2"); is ($ss->attr ("B2")->merged, "B1", " merged B2"); is ($ss->attr ("C2")->merged, "B1", " merged C2"); is ($ss->attr ("A3")->merged, "A2", " merged A3"); is ($ss->attr ("B3")->merged, 0, "unmerged B3"); is ($ss->attr ("C3")->merged, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); is ($ss->merged_from ("A1"), "", "merged_from (A1)"); is ($ss->merged_from (1, 1), "", "merged_from (1, 1)"); is ($ss->merged_from ("B1"), "B1", "merged_from (B1)"); is ($ss->merged_from (2, 1), "B1", "merged_from (2, 1)"); is ($ss->merged_from ("C2"), "B1", "merged_from (C2)"); is ($ss->merged_from (3, 2), "B1", "merged_from (3, 2)"); # out of range is ($ss->merged_from ("E5"), undef, "merged_from (E5)"); # illegal ID is ($ss->merged_from (999), undef, "merged_from (999)"); is ($ss->merged_from ("9X"), undef, "merged_from (9X)"); is ($ss->merged_from (999, 99), undef, "merged_from (999, 99)"); is ($ss->merged_from (9, 9, 9), undef, "merged_from (9, 9, 9)"); done_testing; Spreadsheet-Read-0.93/t/999_fail.t0000644000031300001440000000054214663305445016012 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Test::More"; } my $tests = 2; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; is (Spreadsheet::Read::parses ("xlsx"), 0, "Invalid module name for xlsx"); like ($@, qr/^Test::More is not supported/, "Error reason"); done_testing ($tests); Spreadsheet-Read-0.93/t/220_csv.t0000644000031300001440000001430713231317266015641 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP"; } my $tests = 171; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } { # RT#74976 - Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.csv", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.csv has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.csv", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 3"); is ($ref->[1]{maxcol}, 1, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/33_misc.t0000644000031300001440000000275313231321026015712 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 6; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; my $xls; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xls", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xls", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[1]{cell}[1], undef, "undef works as option value for 'rc'"); ok (!exists $xls->[1]{A1}, "undef works as option value for 'cells'"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc_ws.xls", # No cells generated, but we strip whitespace. We don't want any warning cells => 0, strip => 3, debug => 5, ); } ok ($xls, "Open with options, let's see if we get any warnings"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/613_misc.t0000644000031300001440000000232513231322512015772 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 5; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[1]{cell}[1], undef, "undef works as option value for 'rc'"); ok (!exists $xls->[1]{A1}, "undef works as option value for 'cells'"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/223_csv.t0000644000031300001440000000577013016541271015644 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP"; } my $tests = 117; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; sub ReadDataStream { my $file = shift; open my $fh, "<", $file or return undef; ReadData ($fh, parser => "csv", @_); } # ReadDataStream { my $ref; $ref = ReadDataStream ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadDataStream ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataStream ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_m.csv", sep => ";"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/36_xls.t0000644000031300001440000001516014562636556015615 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser; if ($parser = Spreadsheet::Read::parses ("xls")) { plan tests => 191; Test::NoWarnings->import; } else { plan skip_all => "No M\$-Excel parser found"; } sub ReadDataStream { my $file = shift; open my $fh, "<", $file or return undef; ReadData ($fh, parser => "xls", @_); } # ReadDataStream { my $ref; $ref = ReadDataStream ("no_such_file.xls"); ok (!defined $ref, "Nonexistent file"); $ref = ReadDataStream ("files/empty.xls"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xls" or die "files/test.xls: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xls", "Read/Parse xls file" ], # [ $content, "Parse xls data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadDataStream ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xls", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); cmp_ok ($xls->[0]{version}, ">=", 0.26, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # This files is generated under Mac OS/X Tiger ok (1, "XLS File fom Mac OS X"); ok ($xls = ReadDataStream ("files/macosx.xls", clip => 0), "Read/Parse Mac OS X xls file"); ok (1, "Base values"); is ($xls->[0]{sheets}, 3, "Sheet count"); is ($xls->[0]{sheet}{Sheet3}, 3, "Sheet labels"); is ($xls->[1]{maxrow}, 25, "MaxRow"); is ($xls->[1]{maxcol}, 3, "MaxCol"); is ($xls->[2]{label}, "Sheet2", "Sheet label"); is ($xls->[2]{maxrow}, 0, "Empty sheet maxrow"); is ($xls->[2]{maxcol}, 0, "Empty sheet maxcol"); ok (1, "Content"); is ($#{$xls->[1]{cell}[3]}, $xls->[1]{maxrow}, "cell structure"); ok (defined $xls->[1]{cell}[$xls->[1]{maxcol}][$xls->[1]{maxrow}], "last cell"); foreach my $x (1 .. 17) { my $cell = cr2cell (1, $x); is ($xls->[1]{$cell}, $x, "Cell $cell"); is ($xls->[1]{cell}[1][$x], $x, "Cell 1, $x"); } foreach my $x (1 .. 25) { my $cell = cr2cell (3, $x); is ($xls->[1]{$cell}, $x, "Cell $cell"); is ($xls->[1]{cell}[3][$x], $x, "Cell 3, $x"); } foreach my $cell (qw( A18 B1 B6 B20 C26 D14 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Cell $cell"); is ($xls->[1]{$cell}, undef, "Cell $c, $r"); } eval { eval "use ".$parser."::FmtDefault"; my ($pm) = map { $INC{$_} } grep m{FmtDefault.pm$}i => keys %INC; if (open my $ph, "<", $pm) { my $l; $l = <$ph> for 1 .. 68; close $ph; if ($l =~ m/'C\*'/) { print STDERR "\n", "# If the next tests give warnings like\n", "# Character in 'C' format wrapped in pack at\n", "# $pm line 68\n", "# Change C* to U* in line 68\n", "# patch -p0 ; s/\bPM\b/$pm/ for @patch; open $ph, ">", "SPE68.diff" or die "SPE68.diff: $!\n"; print $ph @patch; close $ph; } } }; # Tests for empty thingies ok ($xls = ReadDataStream ("files/values.xls"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); # Test extended attributes (active & hidden) ok ($xls = Spreadsheet::Read->new ("files/Active2.xls", attr => 1), "Active sheet"); is ($xls->sheets, 3, "Book has 3 sheets"); SKIP: { my $v = $xls->[0]{version}; $v < 0.61 and skip "$xls->[0]{parser}-$v does not support the active flag", 3; is ($xls->sheet (1)->{active}, 0, "Sheet 1 is not active"); is ($xls->[2]{active}, 1, "Sheet 2 is active"); is ($xls->sheet (3)->active, 0, "Sheet 3 is not active"); is ($xls->sheet (1)->{hidden}, 0, "Sheet 1 is not hidden"); is ($xls->[2]{hidden}, 0, "Sheet 2 is not hidden"); is ($xls->sheet (3)->hidden, 0, "Sheet 3 is not hidden"); } is ($xls->sheet (1)->attr ("A1")->{type}, "text", "Attr through method A1"); is ($xls->sheet (1)->attr (2, 2)->{type}, "text", "Attr through method B2"); ok ($xls = Spreadsheet::Read->new ("files/attr.xls", attr => 1), "Attributes OO"); is ($xls->[1]{attr}[3][3]{fgcolor}, "#008000", "C3 Forground color direct"); is ($xls->sheet (1)->attr (3, 3)->{fgcolor}, "#008000", "C3 Forground color OO rc hash"); is ($xls->sheet (1)->attr ("C3")->{fgcolor}, "#008000", "C3 Forground color OO cell hash"); is ($xls->sheet (1)->attr (3, 3)->fgcolor, "#008000", "C3 Forground color OO rc method"); is ($xls->sheet (1)->attr ("C3")->fgcolor, "#008000", "C3 Forground color OO cell method"); is ($xls->[1]{attr}[3][3]{bogus_attribute}, undef, "C3 bogus attribute direct"); is ($xls->sheet (1)->attr ("C3")->{bogus_attr}, undef, "C3 bogus attribute OO hash"); is ($xls->sheet (1)->attr ("C3")->bogus_attr, undef, "C3 bogus attribute OO method"); __END__ --- PM 2005-09-15 14:16:36.163623616 +0200 +++ PM 2005-09-15 14:11:56.289171000 +0200 @@ -65,7 +65,7 @@ sub new($;%) { sub TextFmt($$;$) { my($oThis, $sTxt, $sCode) =@_; return $sTxt if((! defined($sCode)) || ($sCode eq '_native_')); - return pack('C*', unpack('n*', $sTxt)); + return pack('U*', unpack('n*', $sTxt)); } #------------------------------------------------------------------------------ # FmtStringDef (for Spreadsheet::ParseExcel::FmtDefault) Spreadsheet-Read-0.93/t/425_ods.t0000644000031300001440000000756713701337225015653 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 301; use Test::More; require Test::NoWarnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ReadSXC"; } use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("ods") or plan skip_all => "No SXC parser found"; my $pv = $parser->VERSION; $pv >= "0.25" and plan skip_all => "Use Spreadsheet::ParseODS instead please"; diag ("# Parser: $parser-$pv"); my $content; { local $/; open my $xml, "<", "files/content.xml" or die "files/content.xml: $!\n"; binmode $xml; $content = <$xml>; close $xml; } { my $ref; $ref = ReadData ("no_such_file.ods"); ok (!defined $ref, "Nonexistent file"); # Too noisy #eval { $ref = ReadData ("files/empty.ods") }; #ok (!defined $ref, "Empty file"); #like ($@, qr/too short/); } my @base = ( [ "files/test.ods", "Read/Parse ods file" ], [ "files/content.xml", "Read/Parse xml file" ], [ $content, "Parse xml data" ], ); if ($parser->VERSION > 0.24) { open my $fh, "<", "files/test.ods" or die "files/test.ods: $!\n"; push @base => [ $fh, "Parse ods file handle" ]; $tests += 100; } foreach my $base (@base) { my ($txt, $msg) = @$base; my $sxc; my @options = ref $txt ? (parser => "ods") : (); ok ($sxc = ReadData ($txt, @options), $msg); ok (1, "Base values"); is (ref $sxc, "ARRAY", "Return type"); is ($sxc->[0]{type}, "sxc", "Spreadsheet type"); is ($sxc->[0]{sheets}, 2, "Sheet count"); is (ref $sxc->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$sxc->[0]{sheet}}, 2, "Sheet list count"); # This should match the version required in Makefile.PL's PREREQ_PM cmp_ok ($sxc->[0]{version}, ">=", 0.12, "Parser version"); ok (1, "Sheet 1"); # Simple sheet with cells filled with the cell label: # -- -- -- -- # A1 B1 D1 # A2 B2 # A3 C3 D3 # A4 B4 C4 ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Nonexistent fields"); foreach my $cell (qw( A9 X6 B17 AB4 BE33 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[1]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Sheet 2"); # Sheet with merged cells and notes/annotations # x x x # x x # x x x ok (1, "Defined fields"); foreach my $cell (qw( A1 C1 E1 B2 D2 A3 C3 E3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], "x", "Unformatted cell $cell"); is ($sxc->[2]{$cell}, "x", "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B1 D1 A2 C2 E2 B3 D3 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[2]{$cell}, undef, "Formatted cell $cell"); } ok (1, "Nonexistent fields"); foreach my $cell (qw( A9 X6 B17 AB4 BE33 )) { my ($c, $r) = cell2cr ($cell); is ($sxc->[2]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($sxc->[2]{$cell}, undef, "Formatted cell $cell"); } # Sheet order ok (exists $sxc->[0]{sheet}{Sheet1}, "Sheet labels in metadata"); my @sheets = map { $sxc->[$_]{label} } 1 .. $sxc->[0]{sheets}; SKIP: { $sxc->[0]{version} < 0.20 and skip "Not supported", 1; is ("@sheets", "@{['Sheet1','Second Sheet']}", "Sheet order"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/213_csv.t0000644000031300001440000000577013016541245015644 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_XS"; } my $tests = 117; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; sub ReadDataStream { my $file = shift; open my $fh, "<", $file or return undef; ReadData ($fh, parser => "csv", @_); } # ReadDataStream { my $ref; $ref = ReadDataStream ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadDataStream ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataStream ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_m.csv", sep => ";"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataStream ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/623_misc.t0000644000031300001440000000232013231322235015770 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 5; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed rc => 0, cells => 0, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[0]{sheets}, 3, "Sheet Count"); { local *STDERR; # We want the debug activated, but not shown open STDERR, ">", "/dev/null" or die "/dev/null: $!\n"; $xls = ReadData ("files/misc.xlsx", # All defaults reversed, but undef rc => undef, cells => undef, attr => 1, clip => 1, debug => 5, ); } ok ($xls, "Open with options"); is ($xls->[1]{cell}[1], undef, "undef works as option value for 'rc'"); ok (!exists $xls->[1]{A1}, "undef works as option value for 'cells'"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/210_csv.t0000644000031300001440000001430713231317045015633 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_XS"; } my $tests = 171; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.csv"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.csv"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadData ("files/test_x.csv", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } { # RT#74976 - Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.csv", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.csv has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.csv", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.csv", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 3, "maxrow 3"); is ($ref->[1]{maxcol}, 4, "maxcol 4"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 3"); is ($ref->[1]{maxcol}, 1, "maxcol 4"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.csv", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 0"); is ($ref->[1]{maxcol}, 0, "maxcol 0"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/702_fmt.t0000644000031300001440000000361414374661056015650 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 30; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("gnumeric") or plan skip_all => "No Gnumeric parser found"; my $book; ok ($book = ReadData ("files/attr.gnumeric", attr => 1), "Gnumeric attributes testcase"); { ok (my $fmt = $book->[$book->[0]{sheet}{Format}], "have 'Format' sheet"); is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, undef, "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], undef, "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, undef, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 1, "Unlocked cell is hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, undef, "Hidden cell not merged"); foreach my $r (1 .. 12) { is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, "General", "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String # There's no point in testing the formatted values here, because Gnumeric # gives them to us unformatted only. } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/412_fmt.t0000644000031300001440000000517313733616250015642 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ParseODS"; } my $tests = 40; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("ods") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_ODS}"; my $ods; ok ($ods = ReadData ("files/attr.ods", attr => 1), "Excel Attributes testcase"); my $parser = $ods->[0]{parser}; SKIP: { ok (my $fmt = $ods->[$ods->[0]{sheet}{Format}], "format"); $fmt->{attr}[2][2]{merged} or skip "$parser $ods->[0]{version} does not reliably support attributes yet", 38; # The return value for the invisible part of merged cells differs for # the available parsers my $mcrv = $parser =~ m/::ParseODS/ ? undef : ""; is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, $mcrv, "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], $mcrv, "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, 0, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 0, "Unlocked cell not hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, 0, "Hidden cell not merged"); foreach my $r (1 .. 4, 7 .. 12) { # 1 .. 12 when date/time fixed is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } foreach my $r (5, 6) { local $TODO = "Date/time value representation is not yet unified"; is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, undef, "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String foreach my $r (2 .. 9, 11) { # 2 .. 12 when date/time fixed isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } foreach my $r (12) { local $TODO = "Date/time value representation is not yet unified"; isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } # Not yet. needs more digging #foreach my $r (2 .. 12) { # ok (defined $fmt->{attr}[1][$r]{format}, "Defined format A$r"); # } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/221_csv.t0000644000031300001440000000202712543027277015643 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP"; } my $tests = 12; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("csv") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_CSV}"; my $csv; ok ($csv = ReadData ("files/test.csv"), "Read/Parse csv file"); is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_m.csv"), "Read/Parse csv file (;)"); is ($csv->[0]{sepchar}, ";", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); ok ($csv = ReadData ("files/test_t.csv", quote => "'"), "Read/Parse csv file (tabs)"); is ($csv->[0]{sepchar}, "\t", "{sepchar}"); is ($csv->[0]{quote}, "'", "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/632_fmt.t0000644000031300001440000000127614520406704015642 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Excel::ValueReader::XLSX"; } my $tests = 3; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); my $parser = $xls->[0]{parser}; ok (my $fmt = $xls->[$xls->[0]{sheet}{Format}], "format"); is ($fmt->{attr}[2][2]{merged}, undef, "$xls->[0]{parser} does not support attributes"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/202_csv.t0000644000031300001440000000252614734727101015643 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 4; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $p = Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; my (%opt, $csv); # EOF without \r $p eq "Text::CSV_XS" && $Text::CSV_XS::VERSION ge "1.58" and $opt{strict_eol} = 0; ok ($csv = ReadData ("files/macosx.csv", %opt), "Read/Parse csv file"); #use DP; DDumper $csv; is ($csv->[1]{maxrow}, 16, "Last row"); is ($csv->[1]{maxcol}, 15, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "", "Last field"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); __END__ ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } is ($csv->[0]{sepchar}, ",", "{sepchar}"); is ($csv->[0]{quote}, '"', "{quote}"); is ($csv->[1]{C3}, "C3", "cell C3"); Spreadsheet-Read-0.93/t/630_xlsx.t0000644000031300001440000001524514522520475016055 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Excel::ValueReader::XLSX"; } my $tests = 121; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.xlsx"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.xlsx"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xlsx" or die "files/test.xlsx: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xlsx", "Read/Parse xlsx file" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); my $xvsn = $xls->[0]{version}; $xvsn =~ s/_[0-9]+$//; # remove beta part cmp_ok ($xvsn, ">=", 0.07, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # Tests for empty thingies ok ($xls = ReadData ("files/values.xlsx"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.xlsx", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.xlsx has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } { sub chk_test { my ($msg, $xls) = @_; is (ref $xls, "ARRAY", "Return type for $msg"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type XLSX"); is ($xls->[0]{sheets}, 2, "Sheet count"); } # chk_test my $data = $content; open my $fh, "<", "files/test.xlsx"; chk_test ( " FH parser", ReadData ( $fh, parser => "xlsx")); close $fh; SKIP: { skip "No support for data ref", 1; ok (0) }; SKIP: { skip "No support for data string", 1; ok (0) }; } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/11_call.t0000644000031300001440000000256514521157352015703 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; use Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("sc") or plan skip_all => "No SquirrelCalc parser found"; plan tests => 243; # Base attributes foreach my $prs ([], [ parser => "sc" ], [ parser => "Spreadsheet::Read" ]) { foreach my $onoff (0, 1) { for ( [ ], [ rc => $onoff ], [ cell => $onoff ], [ rc => 0, cell => $onoff ], [ rc => 1, cell => $onoff ], [ clip => $onoff ], [ cell => 0, clip => $onoff ], [ cell => 1, clip => $onoff ], [ attr => $onoff ], [ cell => 0, attr => $onoff ], ) { my @attr = (@$_, @$prs); my $ref = ReadData ("files/test.sc", @attr); ok ($ref, "Open with options ( @attr )"); ok (ref $ref, "Valid ref"); $ref = ReadData ("files/test.sc", { @attr }); ok ($ref, "Open with options { @attr }"); ok (ref $ref, "Valid ref"); } } } { my @err; local $SIG{__DIE__} = sub { push @err => @_ }; my $p = eval { ReadData ("files/test.sc", parser => "Spreadsheet::Stupid"); }; is ($p, undef, "Cannot use unsupported parser"); s/[\s\r\n]+at[\s\r\n]+\S+\s+line\s+\d+.*//s for @err; is_deeply (\@err, [ "I can open file files/test.sc, but I do not know how to parse it" ], "Cannot parse"); } # TODO: test and catch unsupported option. # Currently they are silently ignored Spreadsheet-Read-0.93/t/50_sc.t0000644000031300001440000000305713746002117015371 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 48; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("sc") or plan skip_all => "No SquirrelCalc parser found"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.sc"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.sc"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $sc, "<", "files/test.sc" or die "files/test.sc: $!\n"; binmode $sc; $content = <$sc>; close $sc; isnt ($content, undef, "Content is defined"); isnt ($content, "", "Content is filled"); } foreach my $txt ("files/test.sc", $content) { foreach my $clip (0, 2) { my $sc; ok ($sc = ReadData ($txt, clip => $clip, strip => 2), "Read/Parse sc file ".($clip?"clipped":"unclipped")); ok (1, "Base values"); is (ref $sc, "ARRAY", "Return type"); is ($sc->[0]{type}, "sc", "Spreadsheet type"); is ($sc->[0]{sheets}, 1, "Sheet count"); is (ref $sc->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$sc->[0]{sheet}}, 1, "Sheet list count"); is ($sc->[0]{version}, $Spreadsheet::Read::VERSION, "Parser version"); is ($sc->[1]{maxcol}, 10 - $clip, "Columns"); is ($sc->[1]{maxrow}, 28 - $clip, "Rows"); is ($sc->[1]{cell}[1][22], " Workspace", "Just checking one cell"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/600_xlsx.t0000644000031300001440000001412113231322052016025 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 116; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; { my $ref; $ref = ReadData ("no_such_file.xlsx"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.xlsx"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $xls, "<", "files/test.xlsx" or die "files/test.xlsx: $!"; binmode $xls; $content = <$xls>; close $xls; } my $xls; foreach my $base ( [ "files/test.xlsx", "Read/Parse xlsx file" ], # [ $content, "Parse xlsx data" ], ) { my ($txt, $msg) = @$base; ok ($xls = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $xls, "ARRAY", "Return type"); is ($xls->[0]{type}, "xlsx", "Spreadsheet type"); is ($xls->[0]{sheets}, 2, "Sheet count"); is (ref $xls->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$xls->[0]{sheet}}, 2, "Sheet list count"); like ($xls->[0]{version}, qr{[0-9]}, "Has version with digit"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($xls->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($xls->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($xls->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($xls->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # Tests for empty thingies ok ($xls = ReadData ("files/values.xlsx"), "True/False values"); ok (my $ss = $xls->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space"); is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0"); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space"); is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.xlsx", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.xlsx has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, "", "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1"); $ref = ReadData ("files/blank.xlsx", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 0); ok ($ref, " clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '"); is ($ref->[1]{A1}, " ", "A1 = ' '"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.xlsx", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/426_clr.t0000644000031300001440000000024513701341075015627 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; require Test::NoWarnings; ok (1, "Spreadsheet::ReadSXC never supported colors"); done_testing (1); Spreadsheet-Read-0.93/t/602_fmt.t0000644000031300001440000000424612545741253015645 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 40; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); my $parser = $xls->[0]{parser}; SKIP: { ok (my $fmt = $xls->[$xls->[0]{sheet}{Format}], "format"); $fmt->{attr}[2][2]{merged} or skip "$parser $xls->[0]{version} does not reliably support attributes yet", 38; # The return value for the invisible part of merged cells differs for # the available parsers my $mcrv = $parser =~ m/::XLSX$/ ? undef : ""; is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, $mcrv, "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], $mcrv, "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, 0, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 0, "Unlocked cell not hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, 0, "Hidden cell not merged"); foreach my $r (1 .. 12) { is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, undef, "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String foreach my $r (2 .. 9, 11, 12) { isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } # Not yet. needs more digging #foreach my $r (2 .. 12) { # ok (defined $fmt->{attr}[1][$r]{format}, "Defined format A$r"); # } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/604_dates.t0000644000031300001440000000476512543027450016161 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 103; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $xls; ok ($xls = ReadData ("files/Dates.xlsx", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); my %fmt = ( A1 => [ "8-Aug", "d-mmm" ], A2 => [ "12-Aug", "d-mmm" ], A3 => [ "8-Dec", "d-mmm" ], A4 => [ "13-Aug", "d-mmm" ], A6 => [ "Short: dd-MM-yyyy", undef ], A7 => [ "2008-08-13", "yyyy-mm-dd" ], B1 => [ 20080808, "yyyymmdd" ], B2 => [ 20080812, "yyyymmdd" ], B3 => [ 20081208, "yyyymmdd" ], B4 => [ 20080813, "yyyymmdd" ], B6 => [ "Long: ddd, dd MMM yyyy", undef ], B7 => [ "Wed, 13 Aug 2008", "ddd, dd mmm yyyy" ], C1 => [ "2008-08-08", "yyyy-mm-dd" ], C2 => [ "2008-08-12", "yyyy-mm-dd" ], C3 => [ "2008-12-08", "yyyy-mm-dd" ], C4 => [ "2008-08-13", "yyyy-mm-dd" ], C6 => [ "Default format 0x0E", undef ], C7 => [ "8/13/08", "m/d/yy" ], D1 => [ "08/08/2008", "mm/dd/yyyy" ], D2 => [ "08/12/2008", "mm/dd/yyyy" ], D3 => [ "12/08/2008", "mm/dd/yyyy" ], D4 => [ "08/13/2008", "mm/dd/yyyy" ], E1 => [ "08 Aug 2008", undef ], E2 => [ "12 Aug 2008", undef ], E3 => [ "08 Dec 2008", undef ], E4 => [ "13 Aug 2008", undef ], ); SKIP: { ok (my $ss = $xls->[1], "sheet"); ok (my $attr = $ss->{attr}, "attr"); defined $attr->[2][1]{format} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support formats", 100; my @date = (undef, 39668, 39672, 39790, 39673); my @fmt = (undef, "d-mmm", "yyyymmdd", "yyyy-mm-dd", "mm/dd/yyyy"); foreach my $r (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{type}, "date", "Date type row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{format}, $fmt[$_], "Date format row $r col $_") for 1 .. 4; } foreach my $r (1..4,6..7) { foreach my $c (1..5) { my $cell = cr2cell ($c, $r); my $fmt = $ss->{attr}[$c][$r]{format}; defined $ss->{$cell} or next; is ($ss->{$cell}, $fmt{$cell}[0], "$cell content"); is ($fmt, $fmt{$cell}[1], "$cell format"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/635_perc.t0000644000031300001440000000114514520414722016002 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Excel::ValueReader::XLSX"; } my $tests = 3; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; ok (my $xls = ReadData ("files/perc.xlsx", attr => 1), "Excel Percentage testcase"); ok (my $ss = $xls->[1], "We have a sheet"); ok (1, "No percentage support in $xls->[0]{parser}"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/32_fmt.t0000644000031300001440000000340311163712315015544 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 39; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; my $xls; ok ($xls = ReadData ("files/attr.xls", attr => 1), "Excel Attributes testcase"); my $fmt = $xls->[$xls->[0]{sheet}{Format}]; is ($fmt->{B2}, "merged", "Merged cell left formatted"); is ($fmt->{C2}, "", "Merged cell right formatted"); is ($fmt->{cell}[2][2], "merged", "Merged cell left unformatted"); is ($fmt->{cell}[3][2], "", "Merged cell right unformatted"); is ($fmt->{attr}[2][2]{merged}, 1, "Merged cell left merged"); is ($fmt->{attr}[3][2]{merged}, 1, "Merged cell right merged"); is ($fmt->{B3}, "unlocked", "Unlocked cell"); is ($fmt->{attr}[2][3]{locked}, 0, "Unlocked cell not locked"); is ($fmt->{attr}[2][3]{merged}, 0, "Unlocked cell not merged"); is ($fmt->{attr}[2][3]{hidden}, 0, "Unlocked cell not hidden"); is ($fmt->{B4}, "hidden", "Hidden cell"); is ($fmt->{attr}[2][4]{hidden}, 1, "Hidden cell hidden"); is ($fmt->{attr}[2][4]{merged}, 0, "Hidden cell not merged"); foreach my $r (1 .. 12) { is ($fmt->{cell}[1][$r], 12345, "Unformatted valued A$r"); } is ($fmt->{attr}[1][1]{format}, undef, "Default format"); is ($fmt->{cell}[1][1], $fmt->{A1}, "Formatted valued A1"); is ($fmt->{cell}[1][10], $fmt->{A10}, "Formatted valued A10"); # String foreach my $r (2 .. 9, 11, 12) { isnt ($fmt->{cell}[1][$r], $fmt->{"A$r"}, "Unformatted valued A$r"); } # Not yet. needs more digging #foreach my $r (2 .. 12) { # ok (defined $fmt->{attr}[1][$r]{format}, "Defined format A$r"); # } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/637_merged.t0000644000031300001440000000120014520414573016312 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Excel::ValueReader::XLSX"; } my $tests = 2; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; # No merged cell support does not mean I should not be able to parse the file ok (my $xls = ReadData ("files/merged.xlsx", attr => 1), "Read merged xlsx"); ok (1, "No merged cell support in $parser"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/605_perc.t0000644000031300001440000000226112730716541016004 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; my $xls; ok ($xls = ReadData ("files/perc.xlsx", attr => 1), "Excel Percentage testcase"); my $ss = $xls->[1]; my $attr = $ss->{attr}; foreach my $row (1 .. 19) { my @type = map { $ss->{attr}[$_][$row]{type} } 0 .. 3; is ($type[1], "numeric", "Type A$row numeric"); foreach my $col (2, 3) { # Allow numeric for percentage in main test my $cell = ("A".."C")[$col - 1].$row; my $expect = $type[$col] eq "numeric" ? "numeric" : "percentage"; is ($type[$col], $expect, "Type B$row percentage"); } SKIP: { $ss->{B18} =~ m/[.]/ and skip "$xls->[0]{parser} $xls->[0]{version} has format problems", 1; my $i = int $ss->{"A$row"}; # Allow edge case. rounding .5 will be different in -Duselongdouble perl my $f = $ss->{"B$row"}; $row == 11 && $f eq "1%" and $i = 1; is ($f, "$i%", "Formatted values for row $row\n"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/634_dates.t0000644000031300001440000000133114520407262016146 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Excel::ValueReader::XLSX"; } my $tests = 4; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } ok (my $xls = ReadData ("files/Dates.xlsx", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); ok (my $ss = $xls->[1], "sheet"); is ($ss->{attr}, undef, "attr"); ok (1, "$xls->[0]{parser} $xls->[0]{version} does not support formats"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/607_merged.t0000644000031300001440000000526413701561677016335 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 22; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("xlsx") or plan skip_all => "No MS-Excel parser found"; $parser eq "Spreadsheet::XLSX" and plan skip_all => "No merged cell support in $parser"; ok (my $ss = ReadData ("files/merged.xlsx", attr => 1)->[1], "Read merged xlsx"); is ($ss->{attr}[1][1]{merged}, 0, "unmerged A1"); is ($ss->{attr}[2][1]{merged}, 1, " merged B1"); is ($ss->{attr}[3][1]{merged}, 1, " merged C1"); is ($ss->{attr}[1][2]{merged}, 1, " merged A2"); is ($ss->{attr}[2][2]{merged}, 1, " merged B2"); is ($ss->{attr}[3][2]{merged}, 1, " merged C2"); is ($ss->{attr}[1][3]{merged}, 1, " merged A3"); is ($ss->{attr}[2][3]{merged}, 0, "unmerged B3"); is ($ss->{attr}[3][3]{merged}, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); ok ($ss = Spreadsheet::Read->new ("files/merged.xlsx", attr => 1, merge => 1)->sheet (1), "Read merged xlsx"); is ($ss->attr (1, 1)->merged, 0, "unmerged A1"); is ($ss->attr (2, 1)->merged, "B1", " merged B1"); is ($ss->attr (3, 1)->merged, "B1", " merged C1"); is ($ss->attr (1, 2)->merged, "A2", " merged A2"); is ($ss->attr (2, 2)->merged, "B1", " merged B2"); is ($ss->attr (3, 2)->merged, "B1", " merged C2"); is ($ss->attr (1, 3)->merged, "A2", " merged A3"); is ($ss->attr (2, 3)->merged, 0, "unmerged B3"); is ($ss->attr (3, 3)->merged, 0, "unmerged C3"); is ($ss->attr ("A1")->merged, 0, "unmerged A1"); is ($ss->attr ("B1")->merged, "B1", " merged B1"); is ($ss->attr ("C1")->merged, "B1", " merged C1"); is ($ss->attr ("A2")->merged, "A2", " merged A2"); is ($ss->attr ("B2")->merged, "B1", " merged B2"); is ($ss->attr ("C2")->merged, "B1", " merged C2"); is ($ss->attr ("A3")->merged, "A2", " merged A3"); is ($ss->attr ("B3")->merged, 0, "unmerged B3"); is ($ss->attr ("C3")->merged, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); is ($ss->merged_from ("A1"), "", "merged_from (A1)"); is ($ss->merged_from (1, 1), "", "merged_from (1, 1)"); is ($ss->merged_from ("B1"), "B1", "merged_from (B1)"); is ($ss->merged_from (2, 1), "B1", "merged_from (2, 1)"); is ($ss->merged_from ("C2"), "B1", "merged_from (C2)"); is ($ss->merged_from (3, 2), "B1", "merged_from (3, 2)"); # out of range is ($ss->merged_from ("E5"), undef, "merged_from (E5)"); # illegal ID is ($ss->merged_from (999), undef, "merged_from (999)"); is ($ss->merged_from ("9X"), undef, "merged_from (9X)"); is ($ss->merged_from (999, 99), undef, "merged_from (999, 99)"); is ($ss->merged_from (9, 9, 9), undef, "merged_from (9, 9, 9)"); done_testing; Spreadsheet-Read-0.93/t/35_perc.t0000644000031300001440000000151311163712567015723 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xls") or plan skip_all => "No M\$-Excel parser found"; my $xls; ok ($xls = ReadData ("files/perc.xls", attr => 1), "Excel Percentage testcase"); my $ss = $xls->[1]; my $attr = $ss->{attr}; foreach my $row (1 .. 19) { is ($ss->{attr}[1][$row]{type}, "numeric", "Type A$row numeric"); is ($ss->{attr}[2][$row]{type}, "percentage", "Type B$row percentage"); is ($ss->{attr}[3][$row]{type}, "percentage", "Type C$row percentage"); my $i = int $ss->{"A$row"}; is ($ss->{"B$row"}, "$i%", "Formatted values for row $row\n"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/410_ods.t0000644000031300001440000001652413733615702015642 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ParseODS"; } my $tests = 128; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("ods") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_ODS}"; my $pv = $parser->VERSION; print STDERR "# Parser: $parser-$pv\n"; my $notyet = $pv lt "0.25" and $tests -= 10; { my $ref; $ref = ReadData ("no_such_file.ods"); ok (!defined $ref, "Nonexistent file"); $ref = ReadData ("files/empty.ods"); ok (!defined $ref, "Empty file"); } my $content; { local $/; open my $ods, "<", "files/test.ods" or die "files/test.ods: $!"; binmode $ods; $content = <$ods>; close $ods; } my $ods; foreach my $base ( [ "files/test.ods", "Read/Parse ods file" ], # [ $content, "Parse ods data" ], ) { my ($txt, $msg) = @$base; ok ($ods = ReadData ($txt), $msg); ok (1, "Base values"); is (ref $ods, "ARRAY", "Return type"); is ($ods->[0]{type}, "ods", "Spreadsheet type"); is ($ods->[0]{sheets}, 2, "Sheet count"); is (ref $ods->[0]{sheet}, "HASH", "Sheet list"); unless (is (scalar keys %{$ods->[0]{sheet}}, 2, "Sheet list count")) { diag $_ for keys %{$ods->[0]{sheet}}; diag Spreadsheet::Read::_dump ("List count fail", $ods); } my $xvsn = $ods->[0]{version}; $xvsn =~ s/_[0-9]+$//; # remove beta part cmp_ok ($xvsn, ">=", 0.07, "Parser version"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($ods->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell") or diag Spreadsheet::Read::_dump ("Unformatted cell", $ods->[1]); is ($ods->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($ods->[1]{cell}[$c][$r], undef, "Unformatted cell $cell"); is ($ods->[1]{$cell}, undef, "Formatted cell $cell"); } my @row = Spreadsheet::Read::rows ($ods->[1]); is (scalar @row, 4, "Row'ed rows"); is (scalar @{$row[3]}, 4, "Row'ed columns"); is ($row[0][3], "D1", "Row'ed value D1"); is ($row[3][2], "C4", "Row'ed value C4"); } # Tests for empty thingies ok ($ods = ReadData ("files/values.ods"), "True/False values"); ok (my $ss = $ods->[1], "first sheet"); is ($ss->{cell}[1][1], "A1", "unformatted plain text"); is ($ss->{cell}[2][1], " ", "unformatted space") unless $notyet; is ($ss->{cell}[3][1], undef, "unformatted empty"); is ($ss->{cell}[4][1], "0", "unformatted numeric 0") or diag Spreadsheet::Read::_dump ("Unformatted numeric 0", $ss->{cell}->[4]->[1]); is ($ss->{cell}[5][1], "1", "unformatted numeric 1"); is ($ss->{cell}[6][1], "'", "unformatted a single '"); is ($ss->{A1}, "A1", "formatted plain text"); is ($ss->{B1}, " ", "formatted space") unless $notyet; is ($ss->{C1}, undef, "formatted empty"); is ($ss->{D1}, "0", "formatted numeric 0"); is ($ss->{E1}, "1", "formatted numeric 1"); is ($ss->{F1}, "'", "formatted a single '"); { # RT#74976] Error Received when reading empty sheets foreach my $strip (0 .. 3) { my $ref = ReadData ("files/blank.ods", strip => $strip); ok ($ref, "File with no content - strip $strip"); } } # blank.ods has only one sheet with A1 filled with ' ' { my $ref = ReadData ("files/blank.ods", clip => 0, strip => 0); ok ($ref, "!clip strip 0"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '") unless $notyet; is ($ref->[1]{A1}, " ", "A1 = ' '") unless $notyet; $ref = ReadData ("files/blank.ods", clip => 0, strip => 1); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)") unless $notyet; is ($ref->[1]{A1}, "", "undef A1") unless $notyet; $ref = ReadData ("files/blank.ods", clip => 0, strip => 1, cells => 0); ok ($ref, "!clip strip 1"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], "", "blank (1, 1)") unless $notyet; is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.ods", clip => 0, strip => 2, rc => 0); ok ($ref, "!clip strip 2"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, "", "blank A1") unless $notyet; $ref = ReadData ("files/blank.ods", clip => 0, strip => 3, cells => 0, rc => 0); ok ($ref, "!clip strip 3"); is ($ref->[1]{maxrow}, 1, "maxrow 1"); is ($ref->[1]{maxcol}, 1, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "undef (1, 1)"); is ($ref->[1]{A1}, undef, "undef A1"); $ref = ReadData ("files/blank.ods", clip => 1, strip => 0); ok ($ref, " clip strip 0"); my ($_mxr, $_mxc) = $pv lt "0.25" ? (0, 0) : (1, 1); is ($ref->[1]{maxrow}, $_mxr, "maxrow 1") or Spreadsheet::Read::_dump ("Maxrow 1", $ref); is ($ref->[1]{maxcol}, $_mxc, "maxcol 1"); is ($ref->[1]{cell}[1][1], " ", "(1, 1) = ' '") unless $notyet; is ($ref->[1]{A1}, " ", "A1 = ' '") unless $notyet; $ref = ReadData ("files/blank.ods", clip => 1, strip => 1); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "empty (1, 1)"); is ($ref->[1]{A1}, undef, "empty A1"); $ref = ReadData ("files/blank.ods", clip => 1, strip => 1, cells => 0); ok ($ref, " clip strip 1"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "empty (1, 1)"); is ($ref->[1]{A1}, undef, "empty A1"); $ref = ReadData ("files/blank.ods", clip => 1, strip => 2, rc => 0); ok ($ref, " clip strip 2"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "empty (1, 1)"); is ($ref->[1]{A1}, undef, "empty A1"); $ref = ReadData ("files/blank.ods", clip => 1, strip => 3, cells => 0, rc => 0); ok ($ref, " clip strip 3"); is ($ref->[1]{maxrow}, 0, "maxrow 1"); is ($ref->[1]{maxcol}, 0, "maxcol 1"); is ($ref->[1]{cell}[1][1], undef, "empty (1, 1)"); is ($ref->[1]{A1}, undef, "empty A1"); } { sub chk_test { my ($msg, $ods) = @_; is (ref $ods, "ARRAY", "Return type for $msg"); is ($ods->[0]{type}, "ods", "Spreadsheet type ODS"); is ($ods->[0]{sheets}, 2, "Sheet count") } # chk_test my $data = $content; open my $fh, "<", "files/test.ods"; binmode $fh; chk_test ( " FH parser", ReadData ( $fh, parser => "ods")); close $fh; chk_test ("\\DATA parser", ReadData (\$data, parser => "ods")); chk_test ( " DATA no parser", ReadData ( $data )); chk_test ( " DATA parser", ReadData ( $data, parser => "ods")); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/621_clr.t0000644000031300001440000000304512564056336015636 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::XLSX"; } my $tests = 257; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); SKIP: { ok (my $clr = $xls->[$xls->[0]{sheet}{Colours}], "colors"); defined $clr->{attr}[2][2]{fgcolor} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support colors yet", 255; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/704_dates.t0000644000031300001440000000132514374661070016155 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 18; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("gnumeric") or plan skip_all => "Cannot use Spreadsheet::ReadGnumeric"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $gnumeric; ok ($gnumeric = ReadData ("files/Dates.gnumeric"), "Gnumeric date tests"); { ok (my $ss = $gnumeric->[1], "have sheet"); my @date = (undef, 39668, 39672, 39790, 39673); foreach my $r (1 .. 4) { for (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_"); } } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/414_dates.t0000644000031300001440000000510513733607341016152 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ParseODS"; } my $tests = 103; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("ods") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_ODS}"; BEGIN { delete @ENV{qw( LANG LC_ALL LC_DATE )}; } my $ods; ok ($ods = ReadData ("files/Dates.ods", attr => 1, dtfmt => "yyyy-mm-dd"), "Excel Date testcase"); my %fmt = ( A1 => [ "8-Aug", "d-mmm" ], A2 => [ "12-Aug", "d-mmm" ], A3 => [ "8-Dec", "d-mmm" ], A4 => [ "13-Aug", "d-mmm" ], A6 => [ "Short: dd-MM-yyyy", undef ], A7 => [ "2008-08-13", "yyyy-mm-dd" ], B1 => [ 20080808, "yyyymmdd" ], B2 => [ 20080812, "yyyymmdd" ], B3 => [ 20081208, "yyyymmdd" ], B4 => [ 20080813, "yyyymmdd" ], B6 => [ "Long: ddd, dd MMM yyyy", undef ], B7 => [ "Wed, 13 Aug 2008", "ddd, dd mmm yyyy" ], C1 => [ "2008-08-08", "yyyy-mm-dd" ], C2 => [ "2008-08-12", "yyyy-mm-dd" ], C3 => [ "2008-12-08", "yyyy-mm-dd" ], C4 => [ "2008-08-13", "yyyy-mm-dd" ], C6 => [ "Default format 0x0E", undef ], C7 => [ "8/13/08", "m/d/yy" ], D1 => [ "08/08/2008", "mm/dd/yyyy" ], D2 => [ "08/12/2008", "mm/dd/yyyy" ], D3 => [ "12/08/2008", "mm/dd/yyyy" ], D4 => [ "08/13/2008", "mm/dd/yyyy" ], E1 => [ "08 Aug 2008", undef ], E2 => [ "12 Aug 2008", undef ], E3 => [ "08 Dec 2008", undef ], E4 => [ "13 Aug 2008", undef ], ); SKIP: { ok (my $ss = $ods->[1], "sheet"); ok (my $attr = $ss->{attr}, "attr"); defined $attr->[2][1]{format} or skip "$ods->[0]{parser} $ods->[0]{version} does not reliably support formats", 100; my @date = (undef, 39668, 39672, 39790, 39673); my @fmt = (undef, "d-mmm", "yyyymmdd", "yyyy-mm-dd", "mm/dd/yyyy"); foreach my $r (1 .. 4) { is ($ss->{cell}[$_][$r], $date[$r], "Date value row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{type}, "date", "Date type row $r col $_") for 1 .. 4; is ($attr->[$_][$r]{format}, $fmt[$_], "Date format row $r col $_") for 1 .. 4; } foreach my $r (1..4,6..7) { foreach my $c (1..5) { my $cell = cr2cell ($c, $r); my $fmt = $ss->{attr}[$c][$r]{format}; defined $ss->{$cell} or next; is ($ss->{$cell}, $fmt{$cell}[0], "$cell content"); is ($fmt, $fmt{$cell}[1], "$cell format"); } } } #unless ($ENV{AUTOMATED_TESTING}) { # Test::NoWarnings::had_no_warnings (); # $tests++; # } done_testing ($tests); Spreadsheet-Read-0.93/t/204_csv.t0000644000031300001440000000571013016541232015632 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; my $tests = 118; use Test::More; require Test::NoWarnings; use Spreadsheet::Read qw( ReadData cell2cr row cellrow ); my $parser = Spreadsheet::Read::parses ("csv") or plan skip_all => "No CSV parser found"; sub ReadDataCSV { ReadData (@_, parser => "csv"); } # ReadDataCSV { my $ref; $ref = ReadDataCSV ("files/empty.txt"); ok (!defined $ref, "Empty file"); } my $csv; ok ($csv = ReadDataCSV ("files/test.txt"), "Read/Parse csv file"); ok (1, "Base values"); is (ref $csv, "ARRAY", "Return type"); is ($csv->[0]{type}, "csv", "Spreadsheet type"); is ($csv->[0]{sheets}, 1, "Sheet count"); is (ref $csv->[0]{sheet}, "HASH", "Sheet list"); is (scalar keys %{$csv->[0]{sheet}}, 1, "Sheet list count"); cmp_ok ($csv->[0]{version}, ">=", 0.01, "Parser version"); is ($csv->[1]{maxrow}, 5, "Last row"); is ($csv->[1]{maxcol}, 19, "Last column"); is ($csv->[1]{cell}[$csv->[1]{maxcol}][$csv->[1]{maxrow}], "LASTFIELD", "Last field"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } my @row = ("A3", "", "C3", "D3", (undef) x 15); is_deeply ([ row ($csv->[1], 3) ], \@row, "Formatted row 3"); is_deeply ([ cellrow ($csv->[1], 3) ], \@row, "Unformatted row 3"); ok ($csv = ReadDataCSV ("files/test_m.txt"), "Read/Parse M\$ csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } ok ($csv = ReadDataCSV ("files/test_x.txt", sep => "=", quote => "_"), "Read/Parse strange csv file"); ok (1, "Defined fields"); foreach my $cell (qw( A1 A2 A3 A4 B1 B2 B4 C3 C4 D1 D3 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], $cell, "Unformatted cell $cell"); is ($csv->[1]{$cell}, $cell, "Formatted cell $cell"); } ok (1, "Undefined fields"); foreach my $cell (qw( B3 C1 C2 D2 D4 )) { my ($c, $r) = cell2cr ($cell); is ($csv->[1]{cell}[$c][$r], "", "Unformatted cell $cell"); is ($csv->[1]{$cell}, "", "Formatted cell $cell"); } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/707_merged.t0000644000031300001440000000534514374661203016327 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; require Test::NoWarnings; my $tests = 41; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("gnumeric") or plan skip_all => "Cannot use Spreadsheet::ReadGnumeric"; ok (my $ss = ReadData ("files/merged.gnumeric", attr => 1)->[1], "Read merged gnumeric"); is_deeply ($ss->{merged}, [[1, 2, 1, 3], [2, 1, 3, 2]], "Merged areas"); ok (!$ss->{attr}[1][1], "unmerged A1"); is ( $ss->{attr}[2][1]{merged}, 1, " merged B1"); is ( $ss->{attr}[3][1]{merged}, 1, " merged C1"); is ( $ss->{attr}[1][2]{merged}, 1, " merged A2"); is ( $ss->{attr}[2][2]{merged}, 1, " merged B2"); is ( $ss->{attr}[3][2]{merged}, 1, " merged C2"); is ( $ss->{attr}[1][3]{merged}, 1, " merged A3"); ok (!$ss->{attr}[2][3]{merged}, "unmerged B3"); ok (!$ss->{attr}[3][3]{merged}, "unmerged C3"); ok ($ss = Spreadsheet::Read->new ( "files/merged.gnumeric", attr => 1, merge => 1 )->sheet (1), "Read merged gnumeric" ); is ( $ss->attr (2, 1)->merged, "B1", " merged B1"); is ( $ss->attr (3, 1)->merged, "B1", " merged C1"); is ( $ss->attr (1, 2)->merged, "A2", " merged A2"); is ( $ss->attr (2, 2)->merged, "B1", " merged B2"); is ( $ss->attr (3, 2)->merged, "B1", " merged C2"); is ( $ss->attr (1, 3)->merged, "A2", " merged A3"); ok (!$ss->attr (2, 3)->merged, "unmerged B3"); ok (!$ss->attr (3, 3)->merged, "unmerged C3"); ok (!$ss->attr ("A1"), "no A1 attributes without content"); is ( $ss->attr ("B1")->merged, "B1", " merged B1"); is ( $ss->attr ("C1")->merged, "B1", " merged C1"); is ( $ss->attr ("A2")->merged, "A2", " merged A2"); is ( $ss->attr ("B2")->merged, "B1", " merged B2"); is ( $ss->attr ("C2")->merged, "B1", " merged C2"); is ( $ss->attr ("A3")->merged, "A2", " merged A3"); ok (!$ss->attr ("B3")->merged, "unmerged B3"); ok (!$ss->attr ("C3")->merged, "unmerged C3"); is_deeply ($ss->{merged}, [[1, 2, 1, 3], [2, 1, 3, 2]], "Merged areas"); ok (!$ss->merged_from ("A1"), "merged_from (A1)"); is ( $ss->merged_from (1, 1), "", "merged_from (1, 1)"); is ( $ss->merged_from ("B1"), "B1", "merged_from (B1)"); is ( $ss->merged_from (2, 1), "B1", "merged_from (2, 1)"); is ( $ss->merged_from ("C2"), "B1", "merged_from (C2)"); is ( $ss->merged_from (3, 2), "B1", "merged_from (3, 2)"); # out of range is ( $ss->merged_from ("E5"), undef, "merged_from (E5)"); # illegal ID is ( $ss->merged_from (999), undef, "merged_from (999)"); is ( $ss->merged_from ("9X"), undef, "merged_from (9X)"); is ( $ss->merged_from (999, 99), undef, "merged_from (999, 99)"); is ( $ss->merged_from (9, 9, 9), undef, "merged_from (9, 9, 9)"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/417_merged.t0000644000031300001440000000561613733616427016334 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ParseODS"; } my $tests = 22; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("ods") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_ODS}"; my $pv = $parser->VERSION; # ReadSXC is in transition to ParseODS by CORION $parser eq "Spreadsheet::ParseODS" && $pv lt "0.25" and plan skip_all => "No merged cell support in $parser-$pv"; ok (my $ss = ReadData ("files/merged.ods", attr => 1)->[1], "Read merged ods"); is ($ss->{attr}[1][1]{merged}, 0, "unmerged A1"); is ($ss->{attr}[2][1]{merged}, 1, "unmerged B1"); is ($ss->{attr}[3][1]{merged}, 1, "unmerged C1"); is ($ss->{attr}[1][2]{merged}, 1, "unmerged A2"); is ($ss->{attr}[2][2]{merged}, 1, "unmerged B2"); is ($ss->{attr}[3][2]{merged}, 1, "unmerged C2"); is ($ss->{attr}[1][3]{merged}, 1, "unmerged A3"); is ($ss->{attr}[2][3]{merged}, 0, "unmerged B3"); is ($ss->{attr}[3][3]{merged}, 0, "unmerged C3"); # A2:A3 B1:C2 is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); ok ($ss = Spreadsheet::Read->new ("files/merged.ods", attr => 1, merge => 1)->sheet (1), "Read merged ods"); is ($ss->attr (1, 1)->merged, 0, "unmerged A1"); is ($ss->attr (2, 1)->merged, "B1", " merged B1"); is ($ss->attr (3, 1)->merged, "B1", " merged C1"); is ($ss->attr (1, 2)->merged, "A2", " merged A2"); is ($ss->attr (2, 2)->merged, "B1", " merged B2"); is ($ss->attr (3, 2)->merged, "B1", " merged C2"); is ($ss->attr (1, 3)->merged, "A2", " merged A3"); is ($ss->attr (2, 3)->merged, 0, "unmerged B3"); is ($ss->attr (3, 3)->merged, 0, "unmerged C3"); is ($ss->attr ("A1")->merged, 0, "unmerged A1"); is ($ss->attr ("B1")->merged, "B1", " merged B1"); is ($ss->attr ("C1")->merged, "B1", " merged C1"); is ($ss->attr ("A2")->merged, "A2", " merged A2"); is ($ss->attr ("B2")->merged, "B1", " merged B2"); is ($ss->attr ("C2")->merged, "B1", " merged C2"); is ($ss->attr ("A3")->merged, "A2", " merged A3"); is ($ss->attr ("B3")->merged, 0, "unmerged B3"); is ($ss->attr ("C3")->merged, 0, "unmerged C3"); is_deeply ($ss->{merged}, [[1,2,1,3],[2,1,3,2]], "Merged areas"); is ($ss->merged_from ("A1"), "", "merged_from (A1)"); is ($ss->merged_from (1, 1), "", "merged_from (1, 1)"); is ($ss->merged_from ("B1"), "B1", "merged_from (B1)"); is ($ss->merged_from (2, 1), "B1", "merged_from (2, 1)"); is ($ss->merged_from ("C2"), "B1", "merged_from (C2)"); is ($ss->merged_from (3, 2), "B1", "merged_from (3, 2)"); # out of range is ($ss->merged_from ("E5"), undef, "merged_from (E5)"); # illegal ID is ($ss->merged_from (999), undef, "merged_from (999)"); is ($ss->merged_from ("9X"), undef, "merged_from (9X)"); is ($ss->merged_from (999, 99), undef, "merged_from (999, 99)"); is ($ss->merged_from (9, 9, 9), undef, "merged_from (9, 9, 9)"); done_testing; Spreadsheet-Read-0.93/t/10_basics.t0000644000031300001440000001070114545077214016226 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More tests => 118; use Test::NoWarnings; use Spreadsheet::Read qw(:DEFAULT parses rows ); is (Spreadsheet::Read::Version (), $Spreadsheet::Read::VERSION, "Version check"); ok (my @ext = parses (undef), "No sheet type"); is_deeply ([ grep m/^sc/ => @ext ], [ "sc" ], "Supports Squirrelcalc"); is (parses ("zzz0"), 0, "Unknown sheet type"); is (parses ("zzz1"), 0, "Too old sheet type"); is (parses ("zzz2"), "Z20::Just::For::Testing", "Testing sheet type"); is (parses ("zzz3"), 0, "Unsupported sheet type"); is (parses ("xls"), parses ("excel"), "Excel alias type"); is (parses ("ods"), parses ("oo"), "OpenOffice alias type 1"); is (parses ("ods"), parses ("OpenOffice"), "OpenOffice alias type 2"); is (parses ("sc"), parses ("scalc"), "SquirrelCalc alias type"); foreach my $x ([ "A1", 1, 1 ], [ "Z26", 26, 26 ], [ "AB12", 28, 12 ], [ "A", 0, 0 ], [ "19", 0, 0 ], [ "a9", 1, 9 ], [ "aAa9", 703, 9 ], [ "", 0, 0 ], [ undef, 0, 0 ], [ "x444444", 24, 444444 ], [ "xxxxxx4", 296559144, 4 ], ) { my $cell = $x->[0]; my ($c, $r) = cell2cr ($x->[0]); defined $cell or $cell = ""; is ($c, $x->[1], "Col for $cell"); is ($r, $x->[2], "Row for $cell"); } foreach my $x ([ 1, 1, "A", "A1" ], [ 26, 26, "Z", "Z26" ], [ 28, 12, "AB", "AB12" ], [ 0, 0, "", "" ], [ -2, 0, "", "" ], [ 0, -12, "", "" ], [ 1, -12, "A", "" ], [ undef, 1, "", "" ], [ 2, undef, "B", "" ], [ 1, 9, "A", "A9" ], [ 703, 9, "AAA", "AAA9" ], [ 24, 444444, "X", "X444444" ], [ 296559144, 4, "XXXXXX", "XXXXXX4" ], ) { my $cell = cr2cell ($x->[0], $x->[1]); my ($c, $r) = map { defined $_ ? $_ : "--undef--" } $x->[0], $x->[1]; is ($cell, $x->[3], "Cell for ($c, $r)"); is (Spreadsheet::Read::col2label ($x->[0]), $x->[2], "Col $c eq $x->[2]"); } # Some illegal rows () calls for (undef, "", " ", 0, 1, [], {}) { my @rows = rows ($_); my $arg = defined $_ ? $_ : "-- undef --"; is (scalar @rows, 0, "Illegal rows ($arg)"); } for (undef, "", " ", 0, 1, [], {}) { my @rows = rows ({ cell => $_}); my $arg = defined $_ ? $_ : "-- undef --"; is (scalar @rows, 0, "Illegal rows ({ cell => $arg})"); } for (undef, "", " ", 0, 1, [], {}) { my @rows = rows ({ maxrow => 1, cell => $_}); my $arg = defined $_ ? $_ : "-- undef --"; is (scalar @rows, 0, "Illegal rows ({ maxrow => 1, cell => $arg })"); } for (undef, "", " ", 0, 1, [], {}) { my @rows = rows ({ maxcol => 1, cell => $_}); my $arg = defined $_ ? $_ : "-- undef --"; is (scalar @rows, 0, "Illegal rows ({ maxcol => 1, cell => $arg })"); } # Some illegal ReadData () calls for (undef, "", " ", 0, 1, [], {}) { my $ref = ReadData ($_); my $arg = defined $_ ? $_ : "-- undef --"; is ($ref, undef, "Illegal ReadData ($arg)"); } for (undef, "", " ", 0, 1, [], {}) { my $ref = ReadData ([ $_ ]); my $arg = defined $_ ? $_ : "-- undef --"; is ($ref, undef, "Illegal ReadData ([ $arg ])"); } SKIP: { -c "/dev/null" or skip "/dev/null cannot be used for tests", 7; for (undef, "", " ", 0, 1, [], {}) { my $ref = ReadData ("/dev/null", separator => $_); my $arg = defined $_ ? $_ : "-- undef --"; is ($ref, undef, "Illegal ReadData ({ $arg })"); } } for (undef, "", " ", 0, 1, [], {}) { my $ref; eval { $ref = ReadData ("Read.pm", sep => $_); }; my $arg = defined $_ ? $_ : "-- undef --"; is ($ref, undef, "Illegal ReadData ({ $arg })"); } my $sr = "Spreadsheet::Read"; ok (my @p = $sr->parsers (), "Parser info"); is_deeply ((grep { $_->{ext} eq "sc" } @p)[0], { ext => "sc", min => "0.01", mod => $sr, vsn => $sr->VERSION, def => "*" }, "SquirrelCalc is internal"); Spreadsheet-Read-0.93/t/700_gnumeric.t0000644000031300001440000000512614374660764016676 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; my $parser = Spreadsheet::Read::parses ("gnumeric") or plan skip_all => "No Gnumeric parser found"; print STDERR "# Parser: $parser-", $parser->VERSION, "\n"; sub test_source { # 7 tests per file version. my ($source, $source_name, @options) = @_; ok (ref ($source) || Spreadsheet::Read::_txt_is_xml ($source, "http://www.gnumeric.org/v10.dtd"), "$source_name contains Gnumeric XML"); my $book = ReadData ($source, @options); ok ($book, "have gnumeric book"); ok (@$book == 4, "it has length 4"); ok ($book->[0]{sheets} == 3, "it has 3 sheets"); ok (my $b1 = $book->[1], "first sheet"); is ($b1->{C30}, "monthly maintenance fee", "cell C30 matches via col/row name"); is ($b1->{cell}[3][30], "monthly maintenance fee", "cell C30 matches via array indices"); } sub test_oo_source { # 5 tests per file version. my ($source, $source_name, @options) = @_; my $book = Spreadsheet::Read->new ($source, @options); ok ($book, "OO $source_name: have gnumeric book"); is (scalar $book->sheets, 3, "OO book has 3 sheets"); ok (my $b1 = $book->sheet (1), "OO first sheet"); is ($b1->cell ("C30"), "monthly maintenance fee", "OO cell C30 matches via col/row name"); is ($b1->cell (3, 30), "monthly maintenance fee", "OO cell C30 matches via array indices"); } # test_source ### Main code. ## Source tests. for my $file (qw(files/gnumeric.xml files/gnumeric.gnumeric)) { test_source ($file, "file $file"); test_oo_source ($file, "file $file"); open my $in, "<", $file or die "oops: $!"; test_source ($in, "stream $file", parser => "gnumeric"); open $in, "<", $file or die "oops: $!"; test_oo_source ($in, "stream $file", parser => "gnumeric"); open $in, "<", $file or die "oops again: $!"; my $data = do { local $/; <$in> }; test_source ($data, "scalar $file"); test_oo_source ($data, "scalar $file"); } ## Other basic tests. # Check that the rc and cells flags are obeyed. my $source = "files/gnumeric.gnumeric"; my $book = ReadData ($source, rc => 0, cells => 1); ok ($book, "Have book from $source"); is ($book->[1]{B3}, "Date", "B3 is filled in"); ok (!exists $book->[1]{cell}, "{cell} is not there"); $book = ReadData ($source, rc => 1, cells => 0); ok ($book, "Have book from $source"); ok (!exists $book->[1]{B3}, "B3 is not there"); is ($book->[1]{cell}[2][3], "Date", "{cell}[2][3] is filled in"); done_testing (6 + 2 * 3 * (7 + 5)); Spreadsheet-Read-0.93/t/611_clr.t0000644000031300001440000000447314520221624015627 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_XLSX} = "Spreadsheet::ParseXLSX"; } my $tests = 266; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("xlsx") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_XLSX}"; my $xls; ok ($xls = ReadData ("files/attr.xlsx", attr => 1), "Excel Attributes testcase"); SKIP: { ok (my $clr = $xls->[$xls->[0]{sheet}{Colours}], "colors"); defined $clr->{attr}[2][2]{fgcolor} or skip "$xls->[0]{parser} $xls->[0]{version} does not reliably support colors yet", 255; is ($clr->{cell}[1][1], "auto", "Auto"); is ($clr->{attr}[1][1]{fgcolor}, undef, "Unspecified font color"); is ($clr->{attr}[1][1]{bgcolor}, undef, "Unspecified fill color"); my @clr = ( [], [ "auto", undef ], [ "red", "#ff0000" ], [ "green", "#008000" ], [ "blue", "#0000ff" ], [ "white", "#ffffff" ], [ "yellow", "#ffff00" ], [ "lightgreen", "#00ff00" ], [ "lightblue", "#00ccff" ], [ "gray", "#808080" ], ); foreach my $col (1 .. $#clr) { my $bg = $clr[$col][1]; is ($clr->{cell}[$col][1], $clr[$col][0], "Column $col header"); foreach my $row (1 .. $#clr) { my $fg = $clr[$row][1]; is ($clr->{cell}[1][$row], $clr[$row][0], "Row $row header"); is ($clr->{attr}[$col][$row]{fgcolor}, $fg, "FG ($col, $row)"); is ($clr->{attr}[$col][$row]{bgcolor}, $bg, "BG ($col, $row)"); } } } ok ($xls = Spreadsheet::Read->new ("files/attr.xlsx", attr => 1), "Attributes OO"); is ($xls->[1]{attr}[3][3]{fgcolor}, "#008000", "C3 Forground color direct"); is ($xls->sheet (1)->attr (3, 3)->{fgcolor}, "#008000", "C3 Forground color OO rc hash"); is ($xls->sheet (1)->attr ("C3")->{fgcolor}, "#008000", "C3 Forground color OO cell hash"); is ($xls->sheet (1)->attr (3, 3)->fgcolor, "#008000", "C3 Forground color OO rc method"); is ($xls->sheet (1)->attr ("C3")->fgcolor, "#008000", "C3 Forground color OO cell method"); is ($xls->[1]{attr}[3][3]{bogus_attribute}, undef, "C3 bogus attribute direct"); is ($xls->sheet (1)->attr ("C3")->{bogus_attr}, undef, "C3 bogus attribute OO hash"); is ($xls->sheet (1)->attr ("C3")->bogus_attr, undef, "C3 bogus attribute OO method"); unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/t/415_perc.t0000644000031300001440000000224313701335444016001 0ustar00merijnusers#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{SPREADSHEET_READ_ODS} = "Spreadsheet::ParseODS"; } my $tests = 77; use Test::More; require Test::NoWarnings; use Spreadsheet::Read; Spreadsheet::Read::parses ("ods") or plan skip_all => "Cannot use $ENV{SPREADSHEET_READ_ODS}"; my $ods; ok ($ods = ReadData ("files/perc.ods", attr => 1), "Excel Percentage testcase"); my $ss = $ods->[1]; my $attr = $ss->{attr}; foreach my $row (1 .. 19) { my @type = map { $ss->{attr}[$_][$row]{type} } 0 .. 3; is ($ss->{attr}[1][$row]{type}, "numeric", "Type A$row numeric"); foreach my $col (2, 3) { my $cell = ("A".."C")[$col - 1].$row; is ($type[$col], "percentage", "Type $cell percentage"); } SKIP: { $ss->{B18} =~ m/[.]/ and skip "$ods->[0]{parser} $ods->[0]{version} has format problems", 1; my $i = int $ss->{"A$row"}; # Allow edge case. rounding .5 will be different in -Duselongdouble perl my $f = $ss->{"B$row"}; $row == 11 && $f eq "1%" and $i = 1; is ($f, "$i%", "Formatted values for row $row\n"); } } unless ($ENV{AUTOMATED_TESTING}) { Test::NoWarnings::had_no_warnings (); $tests++; } done_testing ($tests); Spreadsheet-Read-0.93/files/0000755000031300001440000000000014766041535015137 5ustar00merijnusersSpreadsheet-Read-0.93/files/macosx.csv0000644000031300001440000000164311123134730017132 0ustar00merijnusers"'\'\\'\\\'""\""\\""\\\""",,,,,,,,,,,,,, Exported 12/16/2008 10:30 AM,,,,,,Category,Category name,,,,,Category name 2,, Username,Last Name,First Name M.,Section/Group,Status,Notes,Assignment,Category name 1,Category name 2,Category name 3,woot!,dqwdqwd,Category name 2 1,Total Score,Class Grade ,,,,,,Grading scale,Points,Points,Points,Points,Points,Points,, ,,,,,,Points possible,11,11,11,11,11,11,, dcwalker,,,,Dropped,,,1,34,1,,,,109, jdr99,,,devs,Active,"qwd qwd qwd",,12,0,1,,,,39, jlaney,,,devs,Active,,,,2,23,,,,114, mcrawfor,,,devs,Active,"line 1 line 2 line 3 XX fwe and so on yea!",,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,Mean,6.5,12.0,8.33,#DIV/0!,#DIV/0!,#DIV/0!,87.33, ,,,,,,Median,6.5,2.0,1.0,#NUM!,#NUM!,#NUM!,109.0, ,,,,,,Mode,#N/A,#N/A,1.0,#N/A,#N/A,#N/A,#N/A, ,,,,,,Min,1.0,0.0,1.0,0.0,0.0,0.0,39.0, ,,,,,,Max,12.0,34.0,23.0,0.0,0.0,0.0,114.0, ,,,,,,Std. Dev.,7.78,19.08,12.7,#DIV/0!,#DIV/0!,#DIV/0!,41.93,Spreadsheet-Read-0.93/files/example.xlsx0000644000031300001440000001261713502622245017507 0ustar00merijnusersPK2ÔN _rels/.rels­’ÁNÃ0 †ï{Š*÷5Ý@¡¦»LH»!4À$nµ‰£ÄƒòöD ²ÃŽq~þb¥ÞLn,Þ0&K^‰UY‰½&c}§ÄËþqy/6Í¢~Æ8GRoC*rOJôÌáAʤ{tJ èóMKÑçcìd=@‡r]Uw2þdˆæ„YìŒqgV¢Ø¼„Mmk5nIz>3âW"“!vÈJL£|§8¼ e† yÞe}¹Ëßï” 0HM—!æîÈÓ·Ž!ý”Ë阘º¹ærpbôͼ„0gt{M#}HLîŸ3_J‹ZžüËæPK…š4šîÎPK2ÔNxl/sharedStrings.xml5ŽÁj1 Dïý ¡Cn‰·=”’xh!÷@ûbWÍÖ²kÉ!ýû8…‡áͼ¥®\5fñy7 °LyŽrñëó´}CP#™iÍÂ#þ²â1TÛ))xVd’8›™ €y("‡ÙQÃ9m@ ÊOôA‰°ee ü¤ ‚XÚ-þºž›½‰œhöƒ [\8ãG‹î{“ÔtþKPRd®rjbÞÁˆ˜ýx?ŽÆÉdõ¢e8è…ázÔû0Žzé:MivÉ*™¦?IYuFOråoÑÐoòåæBÛ=Çl}ÎA.'ŸÒ®oGÍïT±øPK`:I‹þrPK2ÔN xl/styles.xmlíY]OÛ0}߯°¬½BÒÒ/¦4¨:MZ&4Ê´ xp§ñpìÈq¡å×ÏŽ›4éŒA˜šÇ×÷Ü{rìÜ:®s4‹)¸Å"%œõac߆3Ÿ„Múðb4ÜëAJÄD9Ã}8Ç)Œ¤L>XVêG8Fé>O0S#!1’ª+&VšŒ‚Tƒbj5m»cň0è:lc™ŸO™ìÃva¦ù(n&Ü)•˜a(´6:·«Î—ï÷ZöáõàjÏó¼-NòC]ž7lñînLàYK·€zUç]YƒÁU°B¸NÈÙR4×IïÁ-¢*R#K€blúŸ±”â#—Q£ NFz,D1¡s3jkƒ!‘ªé2ø,›‰¹Ù®F>Äh¼°ŽðYø'ú6爥À㌯F:øaÆf@Š)ÖcÕT>§\1÷áph««g?'ƒ¬Ñ«PZ¬†&4×I”X°¡ê€Åýhž¨uÅÔ»jÂd~¿ñž4o4Û%@Ö¨¼c.UòÌ ˜›@@Є3D/’> M1,L~Çr£ëPJXI¤[ÉK‘’Çê&ÇèÔ&rq£Òû˜Òs]h¾‡Ë§·UÐY¸^XÖQõKs_ÜšH‹J:r$›Lc8É\*¦cJ&,Æ+Žg‚KìˬNff×A¹#ˆ¸ ÷*´žÀÉ¢.é²*‰¯Mæy!x&¿r‰LÅéN d¤Œ…ˆ„Yb5–F‚°›’bXÉ”4åþ r’ ´äiÍÂ¥ì¥N§ê´à¹*TÙ\V*_o‡LsGf ™'¿[;2;2;2;2;2O!Ó:¨Ó/e«Q+6­Z±iÖ‰Íá+“±ÊÛw³™/íã»OÝÆÏÂuæe>Iý­íé+²µ'ÛóMøÛS­ýªmùz|X4ýÁ\VÌWXÔ@±Î¤˜ÉóëÖU°\ G½–/"Y¯®’eçWuT¬TýÛµRl}‘½^%³›Ò‘båp½°}rÛ‡_ô=-É6ž* 3=kpÊãåþvp°.íëÔ©€:AS!0óç¦[Á´ÂTrõ*¸î&Üz¾ Èab‹—bªÎò!÷PKˆŽPVPK2ÔNdocProps/custom.xmlµÓMo‚0ðû>EÓ;PPT `4;,™ñíÞ•"dÐ6mu3˾ûÊÍNK6í©oùÿž¶i8y¯+p¤R•œEе”ž•lÁífa P³ WœÑž¨‚“ø!\J.¨Ô%UÀ$0ÁBk1vE Zce›efVr.k¬ÍPîžç%¡)'‡š2íx rPš×–¸ÄÁ6o|ÔÌ8iªS»ÍI˜¼8<‡Ÿ@^ë2‹àGê'iê#ßòæAb¹ÈYA/Zh„7ó’E0B šÍ ׿äS!ví=™È£WâMi»žL ëTètâ?í^g'¼˜~ÀËÕs²]MÁÌÞÙwÑûn®wMÉA–ú\AÙÛ›ÎÍ8¿ãͳɪd¯*)0ÛÓ¬E_8¯Îìw÷f𠃟s+6<ÅšÞvèšàŠ&&êÎàèX6?æwϹ~òø PK©OŸW)PK2ÔNdocProps/core.xml}RÁnÂ0 ½ï+ªÜÛ¤0D¥HlB; iE›vËRam%Âß/-±&å`û½<ûÅIÆû²v ¨äÅAH^åB®Fh‘Mà Œe2gE%a„`Ð8½K¸¢¼Òðª+Ú 0’†r5BkkÅØð5”ÌDŽ!¸¬tɬKõ +Æ¿Ø p‡>.Á²œY†ÁPyEt’̹—T[]´9ÇP@ ÒG1þáZÐ¥¹y¡E.˜¥°7©gг÷Fxb]×QÝm©nþ¿Ï^æ­ÕPÈæ©8 49 B¹f!œ=¶;#oÝǧlŠR§1Ýé 3ò@»÷´7üHðŸûà1®túÍ@‹ &Ú-¦áz¨¡å`¸ʺ¦-ø«àò‚ÉÕÖ= 2\Ì[Š/5‹-˜±3÷–òÉáªÝ5û-OµíÆÃôÃÉÈ€Æ}JzvÏív¢ù—iÜ6õiãÁl?7ÀíÑ O\l…-àX>‡W5ýPK$0Eõy÷PK2ÔNdocProps/app.xmlM‹Â0†ïû+JðÚ¤)"iD]ö$(Reo%›L5KóA“Jûï7î²êÙÃÀ¼ï Ï|Ðå Ûä WÖ”hŠ3”€V*s.ѱúHç(ñÉ[k D#x´dotßY]Pà“H0¾D—Ü‚/. ¹Ç±lb¥±æ!ÊîLlÓ(ïVôL y–†F‚L݈þˆ‹kx*­¸íçOÕè"Ñ ´kyFÉ#­làm¥4°i´ï‚®œk•à!~„mÕW»ß¤À9žÅÈ&[eú¡þœu1KžZêxÄ7ˆÛ“u¯Z™æ”<ãèÆjÇÍÈö‡ÝæxX%k|”ü»”<ÞÊ~PK,3¬"ÿ›PK2ÔN[Content_Types].xml½”ËNÃ0E÷ýŠ([»eJÛ%T¢¬‘±'‰iüí–öï'‰úP#V–=sï™[ΧkU'+p^=NGd˜& ¹R—ãôeþ]§ÓÉ Ÿo,øsµ§Uö†RÏ+PÌcAc¤0N±€[WRËø‚•@/‡Ã+Ê C¢G:Éï `Ë:$÷k·¨>•ˆÖg÷ ñ£ ~³9m~éÉ'PKà YgÔPK2ÔN…š4šîÎ _rels/.relsPK2ÔNÔm¼²Ü'xl/sharedStrings.xmlPK2ÔNOðùzÒ%xl/_rels/workbook.xml.relsPK2ÔNŽzyƒª5xl/worksheets/sheet1.xmlPK2ÔN`:I‹þrþxl/workbook.xmlPK2ÔNˆŽPV 9 xl/styles.xmlPK2ÔN©OŸW)Ä docProps/custom.xmlPK2ÔN$0Eõy÷\docProps/core.xmlPK2ÔN,3¬"ÿ›docProps/app.xmlPK2ÔNà YgÔQ[Content_Types].xmlPK €ùSpreadsheet-Read-0.93/files/Dates.xlsx0000644000031300001440000002311511130422501017073 0ustar00merijnusersPK!È£Í4vÝ[Content_Types].xml ¢Ù( ¬TÉnÂ0½Wê?D¾VÄÐCUU]Ž-ôLßT bˆ 4–TÙ4DÃŒqDl …œŒ?Øt4’™Šô®*f;+‰@{¥ì¡—ˆì®FùŸio{SúmAÌgâ`ñ2k? Ly²Ù–&`CwvÝ™|ù¸^z¿¾v*uÒJwÐ}®\¡Yô%®·¨­ACB$ÇÌÎqskïMmQ6§þ-<­Æ¿+֥РçÄ_Îêêõüݥ㸋ÜG¸|‡ÎÖÓg6 ›ØäÿÿPK!µU0#õL Î_rels/.rels ¢Ê( Œ’ÏNÃ0 ÆïH¼CäûênH¡¥»LH»!TÀ$îµ£$@÷ö„‚JcÛÑöçÏ?[ÞîæiTb/Nú(A±3b{×jx­ŸV b"giÇŽaWÝÞl_x¤”›b×û¨²‹‹º”ü#b4O ñìr¥‘0QÊahÑ“¨eÜ”å=†¿P-<ÕÁj{ª>ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK!>”—ôºxl/_rels/workbook.xml.rels ¢( ¬’ÏJÄ0Æï‚ïænÓ®""›îE„½j}€L›²m2㟾½¡¢Û…e½ôøfÈ÷ý2™íîkÄ&êƒWP%ô&ØÞw Þšç›ÄÚ[= &$ØÕ×WÛ4çKäúH"»xRà˜ã£”dŽšŠÑçNÒ¨9ËÔɨÍAw(7ey/ÓÒêO±· ÒÞÞ‚h¦˜“ÿ÷mÛ| æ}DÏg"$ñ4äˆF§YÁ.2#Èóñ›5ã9é³”óY]b¨Ödø é@‘%’sç"ÌÝš0ätBûÊ)¯Ûò[–åßÉÈ“«¿ÿÿPK!bú´LGxl/workbook.xmlŒQËNÃ0¼#ñÖÞijJT5©„ ¢Ä¡´go«ŽÙiÿž«@¹qÚ§Ç3³«õ¹Uì ­“FÌb`¨+#¤>ð±{yÈ9ϵàÊh,à‚ÖåýÝj0öôỉ€v4ÞwË(rUƒ-w3Ó¡¦ImlË=•ö¹Î"®Aô­ŠÒ8^D-—®Kû Sײ©úµ¿‚XTÜ}×ÈÎA¹ª¥ÂýUã]÷Æ[â}VÀwþYH¢€9•fÀ? ÛwO½Tã4‹•?"ß-Xó^ùÉ›Ðɯtž¦as´b/qp¿Æ’R 3@Æ^¦|AÅú)|C8ygSïå±ñäY$¢ìàý"ÓAÚ†{Ü‘:Ôèí–ø'ÀìRRb·" ÓÊ«ŠÔŒ!,¦Ùcš…é å7ÿÿPK!÷Ò%áõ xl/sharedStrings.xmltÁjÃ0 †ïƒ½ƒðy­ÝF(ŽKi·Sƒm`b51$r)£}û¹”1(­é×§É®}?8rLTªÅÜ(@ªSˆÔ”êëómV(`ñ|—KuBVk÷ø`™2K\ªVdXiÍu‹½çy²rHcï%—c£yÑn¥ïôÒ˜ÝûH ê4‘”*›L¿'ÜþÕÎrtVœ)`35‘ÂjqVŸÛi±¼+ej‡õmêù.µOµïEòù ‰@ÚÈð¾½¶þhÓ(+aVU³SŽë}¢æ¬‡§œ ª*¸5µÃƒŸ:Ë«ÀÍëÿ"?ì~ÿÿPK!;m2KÁB#xl/worksheets/_rels/sheet1.xml.rels„ÁŠÂ0E÷þCx{“Ö… CS7"¸UçbúÚÛ—÷ý{³eÀååpÏå6›û<©f‘,Ôº…äch°ð{Ú-¿A±8êÜ -æÙI‰y0Éù‹Ьªjmò_´/Nµï,ä}Wƒ:=RYþìŽ}¢H9ÈEíò€bAëwöžk}¦mÌËóö ÿÿPK!iÀRŠVxl/theme/theme1.xmlìYMoE¾#ñF{oc'vGuªØ±[HÓF±[Ôãx=Þfvg53NêjHHˆ‚¸ q J­Ä¥üš@©wfv×;ñ˜&%õ!ñÎ>ï÷Ǽ3¾zíAÂÐ’ò´Ô/×DÒiµƒ;Ãþ¥I…Ó1f<%í`FdpmëÝw®âM“„  Oå&n±RÙæÊŠ aËË<#)¼›p‘`"Z | |¶²Z«­¯$˜¦JqloO&4$—4KlÌ{ $¤Jê…‰fMrŠ]œ*Î…ë"g²Ë:¬€ 1?’*@ K/ÚAÍ|‚•­«+x3'bj m…®o>9]N0>\52E4*…ÖûÖ•’¿0µˆëõzÝ^½äg8 ÁT«K•g£¿Qï<+ ûu‘w·Ö¬5\|…ÿڂέN§ÓlåºX¦d¿6ðµõÆöªƒ7 ‹o.àínwÝÁů/àûWZë o@1£éáZ´ßϹ— g7¼ð €oÔrøÙP¦—1á©Zšl ¾ÏEɰ¢)R³ŒLpyÜÅÉHP¬%àM‚+oìR(–´0$CA3ÕÞÏ0ÔĜ߫çß¾zþ½zþää᳓‡?œþÌ—UüÏß}ôÓŸúPBs^|þä—gO^|ññ¯ß<öÀ·UáCš‰n‘ctÀ°Í8ÆÕœŒÄù(†1¦Ž·‡uOÅðÖ 3®C\çÝÐ=|ÀëÓûŽ®ƒXLõHÞ¸Ç9ëpáuÀ®–UñðpšF~ábZÅ`|ä“ÝÅ©ÚÞ4ƒ¾Y$¥ãûnL5÷tU‘”(¤ßñCB<ÖÝ£Ôñë —|¢Ð=Š:˜z]2¤#'‘æD7hq™ùl†P;¾Ù»‹:œù¬Þ!G. 3òCÂ7^ÇS…Ë!NXÕá7±Š}Jf"¬âzRA¤#Â8ꉔ>šÛì­}CÃò†}Í)=ôñ¼‰9¯"wøa7ÆIæÃhW±ïÉCHQŒö¹òÁ÷¸[!úâ€Ó¥á¾K‰î×7‚;4rTš'ˆ~3:–Щþ›ÐôÏš1£Ðm¼mÆí`¶&_IÜ8Õ‚—áþ…wOÓ}¹¾¸ñ¼í»oûnðŸï»Ëjù¬ÝvÞ`¡÷êáÁÆfLN–OÉÊØ@͹)Í ,a·÷aQš3")MY _óîîà" \}@U<ˆqCv=ÐL"™³Ž$ʸ„ÓYöòÖxÔ•=6õ©Á6‰ÕÛå5½\J6fωÌ´´¦œUØÚ•œ)˜ý&ÂêZ©3K«ÕL¯s¤•&CMƒÅÒ›0† ^ÀËëpJ×¢áp‚k¿Û¸‹‰ÂE†HÆxLòi»cT7A*rÅÜ@îxb¤Oz¯ñZEZK³ý ÒΤª¸ÆqEôþJ”Š žGIî©rdiµ8YŠŽÛA«¹Ú Pˆ³v0s-|M2ˆºÔ“f\…ÊÞ·8EZ¦“ œ-fSåóh¶ ÃÜ"¨Ã]…õû‚ÁŽˆLHµƒel%˜Wy °TK²ú¯6Á­e€Íô7Ðbm’áÓü膖L&$TÕ`WV´ïìcÞJùT1ˆÇÇhĦâCøuª‚=c*ázÂtý—iÚÛæ•Ûœó¢«^aœ]Ç,‹qÞnu‰•lᦎKÌSE=°Í«»1îü¦˜’¿ Sªiü?3Eï'p_°6Öá2W`¤ëµp¡b](‹iØ09˜-².dá5$\)›ÿ‚éÿ¶æ,SÖpìS4B‚Â~¤bAÈ>´%“}¯aVÏ÷.Ë’åŒLFUÔ•™U{DŽê¸®÷öÅꦛämÀàNçŸûœWÐ(ÒCNµÞœâm–ž^S4ï ž|l1ƒ<·›¦ð©¢gWµô†¼Ø{Owýù˜Õ(ª„U¶‚V^öo¨Â9·ZÛ±,^mÊA-†År ÊàÖé?°ÿQ2bÒXo¨C~½Á¯ š¤ dõ%;x Ý íâ'»hã¬YY׿£“vçßïRî)gkÍÎïs:»Î\qN-^¤³s;¾¶kK] ‘=]¢°4)N2&0懭êoO|t½wüS¦¤I&øaI`=¦ ø­DCºõÿÿPK!zÜÅü7 xl/styles.xmlÌWKÓ0¾#ñ,Ÿ4Ý7J²¤"¤­´Eâ°7vZ#?‚ã¬ÚýõŒí6–¦]„Úí!µÏ7ß<<'×K)Ð3×*Åñ»FLåšr5Oñ÷éäí%F•%Š¡KñŠUø:{ý*©ìJ°»c„ªR¼°¶|EU¾`’TïtÉ|)´‘ÄÂÔÌ£ª4ŒÐÊ IG£óH®p–¨ZN¤­P®keS|Ú¼BáË ä.ƸOš:.ð“’Rmz«Oú«¥¼(½œÔ‰Ó¾…åoî<‘i4 yÖ—”=NK´¶,K ­úºYR=¢"ÀºØ“"’…ù ³Ö|ÖvÑÇ©‡ á9ì¾h®…6ˆ+Ê–Ìyër^A$« í䉂 ø‚ÙmÞ6:‘wø Ñ$ÈĽȒ’XËŒšÀ­ÇÓU Ù¡ _ƒU~ÝŽÕsCVñø¬#y…Y2Ó†Âþؤf šÃ«,¬°Ãç ÷ou Ï™¶VKPNæZÃh#±TY’3!îÜúQô°—E'‰a7:ë]ö»!²¼0qø]´€Ý…½ÎÏÇEË¢QГŽÏ÷¡Õˆ#R–bõ­–3f&¾@v:G÷AÃîÞeìÔ ëƒàs%™«$.\d3E mø#8Ôm8<ìJŸå¹›Cô|ô—Å‹`æ¢ú”НP‡óQ>df›[|=¿Í¶p9Ž_öËž£¸i?jþ@=\ÿÜrƒéuô²»8vT‡Ù9°?ëÊò"4@/¥ˆuvÄ0½£‡v^§%ˆ·¶í)ù«Ö–ÝVð¥; Ãù8#°íuZ®Ó­ãÄ¡ìt™ø÷¾¥%é„=Iµöøâ…—a8\åýçð¹2÷¬ðmºQè?;Mn¯ÅmšU¤àº“â;¿$†â6%f5–«¦m;\€¥Ë¶g¹ŽÀ’\F]7Ý(‚¤¬ µ°ÓæcŠÛñWFy-¯šU·üA[‘âv|ãZ{èwUí7û ÿÿPK!sÙÓ 2xl/worksheets/sheet1.xml”U]oÚ0}Ÿ´ÿ`ù}$H "©Ú@µ>LšÖm}v‡XMìÌ6´Ý¯ßµ E/ûßs?î]^¿¶ ÚQ©˜à)BŒ(/DÉø&Å¿~Þ}¹ÂHiÂKÒNSüF¾Î>Z¾ù¬jJ5‚\¥¸Öº[*jÚ5å€TB¶DÃPnÕIJJ»¨m‚( ã %Œca!ÿ'†¨*VЕ(¶-åÚ‘´!òW5ëΖ%ÌB’V)¾/Ö ²¥UþÍè‹:øFš<=Іš–°cOB<â=L…QY‚‰H Ív4§M“â<½ùc5à¯pø½W»³[ñ]¢’VdÛèâå+e›ZƒìÌ,/D\øE-3‡QK^S<ƒœX©ëGá(Ž`Xl•í£›[e·Öꯈ&ÙRŠ; ATGÌùŒ°ÒˆMàŒ]/ þ1t³([î²É<ޝ–Á¼=~Ûãg yOˆÎEXõ„É9º'L1‚\Íqî²Ðg€-ï-ºÌ›¡xK"Õz¿u¸ÏüÏï?ÅWOÎáë^ÿÐØØ§pdlr™1CŒ%óa»œ1‡_õ‰½Ãs‡ÏÏá«>¾yæV¼ °î ‡Î†Í=r”K®£¡Îâdâ÷Ë9s¸¿K§xîð©?’“õ+‡ÏÎáë^þü]Bƒ·u‰1CcP\}àé‰7O1…åðÚÇ—I:HA8/5;‘ú€Sò(‰§¥gŠâÇÐS¼¿|ïØáãáÙ `ï€-ÂàoxwÁå媲«Š-•[½*Ä–ÃŽ˜Rægû†1[ÜÚ‚xêrWCÔ¬€^ ®]k@ú­ƒ®ÈE.xßEM9îȆ~#røB ­@&%pÒ•{7Т3òèIh¨æö³†þH¡‡# WBèý ù@õ¶Cé¨|`AxŽ‘ :¡m€)î„Ô’0 •æÿBž¤Yu,ÅÓh>ÇI4‡·*¬L±¼/mëpšwV ‘†mø#ÓuŸ½iæþùnŸýÿÿPK!ú" 'xl/printerSettings/printerSettings1.binìUÁrãDm'[Ø*È‘#7NPN6ÙâË–ãÍz-$/,U9ìÄÛÚŒ5ªÑ(ÄœòA¹ð/œ8rá–îÍH²·¨­‚*8`—4óº_÷ôt÷Œ®áRXÀ)œás — A ä}½GðÁ¯ðóãä‡^>‚ß?–G)ôàSxup€ã«ƒC|?ÿÔû:þ ^¯ÖÑx€Ã»&Q<ùö·þ®ôïãÏŒ‹ã/è@ý½>:{ìæ»ãa-x€c¸¾:„uðÈSzïØÁ/?}ry†´÷Ió6vT's£³të;Þ»GgE±5ñ9î‡nRoáíŽäøOgÀUÄù}}LçÏCt4Äóº€ sn%ž¯Ïë³ü%ŽçøÐøú( A«˜—RT:“9<í÷Ó"ƒQ8Nò—%‡ |[\η‡2·‚@Þq‘Êr*™kÚ³›d-µ7 ¤j*S²ñóá(D3t¡2£l¡F­×\}§#òMz»„1ÛlX‹ap—­eÙb´RÌót˜-h•ö>^XkœXa’m*ÁLÎFa¼2)8OÑUfj³JGJ.3AÙh@mUHm–§H¬2ª¶¸EŸ[Õ@ÜÎîŠ@+ºXe 7%¹ 2ù¢\Ír±+¶ ¦ß_¡U[C/¼·-!©nJ¯ëLS&+¥_k®XQdùÊ ©4àF1}”†D³B`#9˜–¢Òƒ,‡‹JË„ n 3Ù°¿Ù*÷L#z™g&ùbÍ)m¡iW Ö,=[.K®ŸÉâ6Àn(ªÐË(]ù7‚K)x»ïC¶àCùCN‹ÕSkn¢I6Rêµ` ²ÕZç¼,¡ßÿªßG#Cåk–/h÷mhýPÅZÐq|!Õ†‰o*&2½Ev ‹Œ7§Ék8²,/Ò7UÙzÎïõxyOjgè%f¥n%|Xaþï}ÌxêU,5çäë¾—Æ“h å­àoÂæÀ SplC"Q¨ìEQß$X;w•Ø]‘¢í>à9FI3ÍÒÔœ˜š(ŽçÑõK-ŒyZaF窢´NYŽ[ÞÙÙ”§3µ¼È·Ø3Øf‰ºÛg´Óf\ß/’ˆ¬(×¼µ{/I²9<çšRŠÝìˆ&)ô:§phå íGÜyŸ5Þ%R­Étzb lsоŒË\32Fìers²Ç;myBÊéáI—ðdpÖ%œíê]ºÈÎ;„KÎî¶­íX¼OiÅi(Ý@#ÁðR0ɤe ìøˆÛϰØRÌgÊ” ïOº inUØNØìS{(ê.ÅCÐDÑK‹*×vÆIÍ©]ZDN#¼«Ú}A8æ+:ÒØ*,Å®6û†ÿ—Ç n2 G§øüqþ ÿÿPK!ˆž O`docProps/core.xml ¢( |’AKÃ0†ï‚ÿ¡äÞ¦Ù¬n¡í`Êðà@°¢x É·-Ú¦!‰vû÷¦íV;¡—ä}óäÉGÓž*ƒ/0VÖ*C$ŠQŠ×Bªm†ž‹U8CuL VÖ 2t‹ùåEÊ5åµGSk0N‚ Zƒ‘ï*X?È¢vŒ%³ní'¾‘ –‡?Š­ƒë,0¿â¡ÚtˆRt´êP‘ YÔ¿ÓØ–,{†ˆ=NÉ:,%¬Þ6†ÚøHAþÂðòl F+x2ŒâPνóZ’‹ÁŠkc0‚¤Æ5b¥É`|l6èÄ‹9ñÀ0òŽ8÷@Xa¤w„ãÓ]¥¯]ëÁžåæéq½{ºË¾æû\ðI?´}‰;_¹>wîµ(¶GX§ÿ1õ/‚xHs ¦YÁ°ž<ïý*ìÇ}—‹e^¤oØ€Iü²ÙòÿÿPK-!È£Í4v[Content_Types].xmlPK-!µU0#õL „_rels/.relsPK-!>”—ôºpxl/_rels/workbook.xml.relsPK-!bú´LG¤xl/workbook.xmlPK-!÷Ò%áõ  xl/sharedStrings.xmlPK-!;m2KÁB#? xl/worksheets/_rels/sheet1.xml.relsPK-!iÀRŠVA xl/theme/theme1.xmlPK-!zÜÅü7 üxl/styles.xmlPK-!sÙÓ 2#xl/worksheets/sheet1.xmlPK-!ú" 'fxl/printerSettings/printerSettings1.binPK-!ˆž O`¿docProps/core.xmlPK-!SòÌ`–E docProps/app.xmlPK &#Spreadsheet-Read-0.93/files/Dates.gnumeric0000644000031300001440000000474314370414470017733 0ustar00merijnusers‹í\msâ8þ>¿Â竺OËûK—°E’p$Næfjª(Å mq’H`ýµ$Û€1IœdwH˜ÌTÊjµº[ý´Z­`qôûÜsÌ8¡þ±YÈæMû6uˆ?>6o¬óLÍü½ñåhì{õ¯”ÝßQzoÀŸ×tlN„˜Ös¹ÇÇÇìØŸy˜;KÙ8÷PÈgá˜5ÞÇ’â*æó…Ü»=ÁÊŸ äÛFqRçŠØ¡6ʶ­ª³sî˜/†¡Ì¼Õ“1ZSjO`J¦ÑEPOEx$¾|¬À4Ïg®+g\(f¡™‹Æ7…`än&0—¤8QÓª<ÜÝrKðc½Î'ôq8¡ŒüI}Ü!·uÝ;ÄŽrшUÈá†Õ¿iiÝÖŠs š_a  +ˆ½¶øT`I tÇŠ¢™ C›zSËÐú)f>œ2p†-°ó¤çÍÎàEÄH*zèhDl “¶aÅø"ãa‚5©»ŽÍóëq•¼.ì:b?R_宫¬i—ø÷I«ºpxx˜S½!«cG|Ós—cç°‹¥žƒE˜ y¥…/5Jò®šD)Ivmt˜jÊ9Ý6`2+i¯h~ º¤ä Ç®Û #AY¼¼ÒZap J3ùB&_± •zá ^)|WToÈ­¬žqÌ2;†¢È‰›À<ݹ„O03u‡‚=#Sèæ€®?6×ý«Ó›~Ó8ÉÞfr_¦kÌGu Ï8„‰E‚:ˆW#ßlŒËñ›qÈ@ø/Ví#‰¹ ³‘V¾‚‚"ZËÀÿâ¡•?¨—ÊõÊá÷@Ä:ãš âA› Ãä2Û…Ýêß8aÈw‚ñq¦ÍrîòyýfÄn§ä±ó×yUéLÃε_¯ç([Wa-3E{ð)r홫ü »·?CnCü@µÞòы۳ 2P[ü<"p ä/"X`#“… ÏBÉ{¿ ‡>rÈüØ,Í32&ÆVJ+ÅÀ`‚±è/Ú¾ƒç+‰>ê0”½Ô•Z«¥ZÙT„>}Tf”k•ƒªÙ8ƒ±0:GGc—i{SÒr)ø…-Œ¯ÄPÌÔª5Ó¸Äd<Çf©V‹[Êãg„O]´8§Ì‡råÀKâàï˜Ñ¨qÁˆ5`.—9˜E˜Ì %x5ƒ˜+÷Á»Oœ`—>&ÐûÚn ßNîˆ kõؼèu‡ƒËVËÞ¶í“v§m}Ó–iHÓÀ"Y´åëðÏ\Û"•×Û‹o£  QÖÝA+Æ3lT#ÙZeøN©×(ènõ7‡”U³"Òjp é[ ›°æ77ýØÆÿÏ~ëüÿ Û”r"Ã»Ñ l‹Kk6\ò¬…*l†.~ÖÄýoFÅ¿CÿëÖ»[¼¤ð5Ç+W¶ýD6ŠÉÐ8²1(6ltj\S ‘{kÿšáÑ äâcÓóôrZc¿£BP/ÍDÄ_)?ËÏäªH3`¢Öb4¢T}vĈB¥ù²á"ˆ9Og¹…:ñÃdCÚFcØÓ—Ï:óæbãd/èWA!sHœaòòÀö^ü€ý! ©ï.†\,\Ì·3{Ô‡s!ƒ¼ºÇa0ÜÚ-äâxB1àœõ=¸{;—ê2¹ƒ‡L2^÷Û=+HˆƒV§ujµ¯zƒ)ƒh8C1©ç9M‹ó‰ŒZSÊCD„ÜËžõ1:׈ãcS™ÇÅò)È߯œëðzù€)‚iG± -kÊ:œÐÔñÀ€íÆV'…U^u»­ž5¶{ÃëN󴵌QÆ •'Zê¹ÉW%´úý«þ`Ø ÏÚñ­u¶”¡ÍÚ–côrP‘_#’ØÇcY¹p˜€ÝFm›ªÑ—û¢ú‹ÒáQQKæÆ²U²ŒË¦Kƾ6ü²Ùi_ô†­^«ßìÀ>ºÒw«ûN®,ëªk_šZx.”’Á&roÑs¢Û}*‚ÚIuÞêI¾æèPû;j³†ÈŠ e7bãÙpþ;‡Ÿzô   þÚž-Çát“ñ ݬN4 !X*:@å uuAÒÈ%ºì»ãdÙ«MÀAè[°g㉦،L•ñ†Sð“BÑ8±4”RÚ‡s‘‹ãÙoÃôè–—èÊz°´D¸¼_`jm÷sc\Yb\\â[y'|O!­µúßÚ‡†·š˜ «)à !ühèz^Æq2‹Åç^¾[S´>°¿×Bþ•¨Ò…-¥Va‰r>¾Ö¹•înVûüÛŽ¢»€ÏsœÏ o!ÞÂ{Àk]]ÿ‚ö'B[L„¶øÐîô¼è–ÑMsÞŠîNoºûn5Ý}¨ŸÇùñÛ~žçý0$ÞŸëâ– «øº ë ¬w»Æú´‡¥â–«øºë €w·ÊÚp‹‰à¦©²>j¦Þ|K‰ø¦©³žÀw§+­ýÀ·šˆï>TZ^ÎÉ}BtK[j«Òëj«~ûâò#þù jçѹOY?—¶”W¥×•WÛ1Þåêj_ð-&⛦ÂÚŽïn'轸”qš"k;Ä;^cí Ä•­Ÿ¦©µ~}V¸c—·T[åw?+ýM©º–¯ý=>•mŸ¯¯â½xùî¯â•Žõ—ÀåÅ ã ÐÌò'¾–ï7—kf,8€M¾Åiôh05Ó|- 1p‰˜#‡*wŸÒ™Ä TêYS,/xl(.TâŠmSq)Ÿ¬õ ®U*Y廨Vw\ŒÓã”…GÝÚØ‘Ö¥ý+BÌš¥òu°ëÆß‚•4#\sá 8·ò%gK½=^†()V«µÀ»Àþ¬„›%ß,¡ôf å5 U¯ÍÙØWÍ^ §ð”?Š)$$ú3•„D¦’èÏT6ý I'…?‹Oøóà0ŸBB’?ÓIHòg: IþL'!1>ϰýR–žŒÏR Éñ™FBr|¦‘Ÿi$$Äg)M|–ý)åÈoF€ …ÃfKü17 ¿‹ áÆõé ÄV¶ŠL(uÃq2ÝnFžìRH+$é¥0ç7øet»]#¥Èâ†È`Ó5ô¥ #?Ï·^ ¯ú測¾9.«iãrIYßr»˜±£K¤øÖ«úÍJý¤ÜåR„5‰‰ãu­ oÿuЂ΄aÑ©¾ÒÓ,¬”Š‹º˜]ê`WO"/o”Ñ;{Q»‹æñ4háý\u? š=ê÷ðXùòŒp[_,mÎUWÌBqc†¼¾..±// >±P„Àœ•»³’°ÒÔß~ ›7í3$¡‹ìXè. ¹Ãoeh|ù?r}¡ù ESpreadsheet-Read-0.93/files/perc.ods0000644000031300001440000003474313701334513016577 0ustar00merijnusersPK'bèP…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPK'bèPConfigurations2/images/Bitmaps/PK'bèPConfigurations2/accelerator/PK'bèPConfigurations2/toolpanel/PK'bèPConfigurations2/progressbar/PK'bèPConfigurations2/statusbar/PK'bèPConfigurations2/toolbar/PK'bèPConfigurations2/floater/PK'bèPConfigurations2/popupmenu/PK'bèPConfigurations2/menubar/PK'bèP manifest.rdfÍ“Ínƒ0„ï<…eÎØ@/r(ʹjŸÀ5†X/òšÞ¾Ž“VQ¤ªêŸÔã®F3ߎ´›íaÈ‹²¨ÁT4c)%ÊHhµé+:».¹¥Û:ÚØ¶+šñjƒ¥Ÿ*ºwn*9_–…-7 lϳ¢(xšóA‹ù„îÒo‰Z¯9’)V _€¡ž-•Éu–‰ ÚSŒw»]°‹¥s<Ãç8£†ú[»ï¨«hŠ'¨Ö’(ZñŠHZ@E #ªÙKw,qmµqÆŽRe­…ÊMQ…£ Â=v/¸üs©³h<c·ÚC•RG`ÓEë··qÛøˆvÑÿZèfçLtß'QÚO·ñš&Î1—Üp*|¦¥Ó4“ ¾¸˜dŒôß^‚O¢–ÌEVη[©õ3öÃÈãy“h@†qÇ{ŽkXÏ †óhH¢FN¤E¹Ê$h§8ã+ Oξ B÷®,dp5ã²Þ/n–7×Þ lYjõÌà0¼z¨¹Èü°ëçµU9ž¾ÊØ>+Ùçò†®øLÕÒØ‰¢6É@ˆ>7¼í’jÕ(õéᎹ®@û¬¹„¬E6:A÷eùÚnJ£AÚ§ëí´â$SU”TPúëùiºx¾÷‚×àã4н«57‡ÎÍ–Š|s(íêZ(jPú‰ö~ÚzÝÜ…jº¡2‡ìûJ)ÔaMEט5ô‹r®í™ùþFLµ*¿‚{C5ØáŽŸÝm|é?šþPKiƒöQ…PK'bèP styles.xmlí\moÛ8þ~¿ÂP±‹XE’å$¶7q°½½Þ-° Šm÷±`$Êæ-% 'ýõGRõ.Ëòû¢NÑDäp8ópøp(™º{xññèÒ‘à^³®Lm‡¸(XÞk~ù Oµ‡Å?îˆç!Î]âÄ> ˜±W £oDóˆ&uÄ4˜¡hFsæÌIƒ¬é¼Þf.»MÊ(²Ù½¶b,œÆz½¾ZÛW„./¢Ngð…™4 sYÑIb¦”›æµAaH(ˤ]G ‡1ÅRÌu ˆ¡0,2¬+KivV€²¾ÎHá¢Ñó²o[.ª;Ä9O•¸¬ûj²|ÈŠÍP}› Ùb[BˆÓìÄpv”³"z»+„+]­;»ZSÄ ÍÄ}È@ß¾„l±«Œ‚¿šbËšÍf†¬ÍD=Ò·“—ëiBî\§oɵ’–W};N§d)`l·ÀØn)ZÀSÿA”ÂÅÖAì?AÚ»oÀ@=¼þŽóvc5Qy$æ‘N—Š£<nÂ/‰6øBŠDÀ²Ù¼¤¡†F÷àÍ )Tœ¬ ,Ó2™ü’º.nŠE®Ú68/qŒôg×o²˜ p3 ’‚†RÀ¿ÅËà:|¼¨æ‚8‹/å]c§„è~¤£€Ï[Î ­‹û€­Z&ãÔøÈ+åϧ$õû†ˆ-ñ±CQØ› és¬˜ß8Z sˆZm”RXLmm‘­œ᫦¨»ÐÁÑâ.™ªx”\ ³îµ_(\!_2á׬Üènü;âSQÄè3¢5?‚D?Wä’BmTR-äõ% øØòõ Z£(*I„ˆ9|Ÿ7LL† ¦} ¶ØT¨ê0à5bÐßÅ‚/`E|ÐпªØµw£mÀÓò$sʬt¡bœæS™æÔ$É/º1Ö2ñP°¤ \é!ŸY2Ä“°¤ŠKs-$Ô]1ˆuÄ_]û~‰Xåë ¥¡-¡ã‘9Á2K^ YàpÂa”Û÷çg­ªBçs U43Yí·UV“êÊ*þùX×(V _ꢴ*‰ªêUU¿=ʱi}q—,^éV‰•GS«Ò+’å–¼‹–ˆEtÙQƒN¥ƒÃï¢ä¦7tfµöÆãùë!æQÅ{âìT°£»¶ÑÊ´^„Åâe³¼TWUcU+'¦”ï^}[ŸÌl,ž æ!%’ Fc¨5(xõŸ6ŽâuV»¤$åGUcÔFÙç¾Pheåo+ÊÏŽw‹}ªÙ¸(Ùü=÷ï~\²ŸïU€0Ä)8z)BŒ¡2…ÖÆò’²1áÙùÏ3ù§jÇ÷€TÁ´k@Ú Èq'¬ãó Hû ´w 8eö¢lò=ÊçB{“^éÖœ­Ž¯ó óyÒ¾ªØl4£ì‚×~‚¯(ÌÓ˜ˢɹm=̽Ñ:lЛm~ 51ÀÍ#Ô¢@81ÔàÛ½<ÈŒ©vL8ò[ì˜åv¬HL£Jó@P3N ÍÔÅNéðõÐ/Øœ¸ÙfÛ<°Í- "(áTN[pz!ãsD¿Ã“Ö9hÛ'£ÚÁ²÷An …äW38=’¢îü”[¾¢cý¼Ý{Þszp‘ÞØ•ôfk ¯w «S¦ÔÛ{{ä°ºÔ¬Y†Å.au³9¬ºÈÖCëâ[Àa¤*ç3¹÷¢7Ÿ¬c"wY”¹ªã££ªo’šmïg£TÀ';ƒÛœý(¢›!n†è¡ oVeõSµ´Ä sO…h¿›-öín¤ÕzgåïÃfCîaqXwb´½Áz™T7òèn¿·ò`‹kíLx{–Lx»?&¼ÝÞnd®ÅrzNÉÛEí/¦—’¼bc²ª'HÞŽ½NÔ6œ{ʧgÉ™ÓýqætOœ9Ý1{œ]DöxiO@9¬—ž=ž’kB~NÙãÙñÖéëì,©x¶?*ží‰Šg©¸õqؤð0òtϸÚÍË'4ŸP#ž‘@'ÏzXòŽà…=Ñk÷v|œÁh£kƒáIç¤ð02rŸŠÈCŽÞM;V'íX=™^Ô—â b½ZUÉó'Ïâ» ¶ªôu ›7Ð2¨3¢1…Üðµíɤï!»{ ƒ¿·˜[7ý×äÛðê›÷í§ò¢ú)J’³œ:ÀÒ€ã«I!épÓº'ÂÙæ\BzÆ#MÇaÚO ÔëÓ#‰üdÀ¨þ8ÛUZªNÉêe˜{<`3å'÷7B߸‚ñ$d…²dz„úEhÖ-WL@ŒÝ­ýú:6¿ªdÒEÉW½$1²ùžá6Øwkº…ïiùïÇÝÞOäýø€ÞáÖìÐF»îGÂà ÝÒ¨nÚá~?ç/‘ö®ž?›ö<ÇÉG,IÀ‰ç 댖IIÕ1^­ê„VB]q–Õ¼ºå3nŒÜÑ›©)~Ú9«0ˆ¶üÔÑ<à ~ „û»Ý¯‚>~!Æ©ÞÙÃÔ|åv$ç²蘘sn5`<ü¤0“‘Ó"²F®8õ bFZ$ÚŒ ág¾.ÇÑ¡fø¿ qéNÍ2ÇGÎñ>SÑ4onøôSñƌҎ#’_Pf³£ƒò=J=qœÆU÷€üÐ`h&Yå¬û¥„Ÿ²o¤m„Ä“Ÿ Ù.·þÅû°ÓlîVÇŽ!¸aHA )GŠ…m§G[ËV#…mØNcضÈoO ›Ý ›}lØ\ùÙ‚_¸^áÇûaq‹Jüý)¹WÓì™l1ÊÄGÙA|’õ#^1S¬ï0ò7XȪüÅ"gõCŽžUd-¡Îí%1+¹ú1ô-­A¨áN¢/"ÉÝ«{MÜÞGA¬64â%P|½Ô}⊛šTgOy¬®ø;¿]W*óøÆˆÿ*£¸±¶J#ñV¾"C–ºäz¼Ø,ÒD¸RšÜǺ×Ôk6Œv{RCŽn##aÝÀ²1Fmˆz í¸ßÐ^À¸÷üã«É,ßóÕ¸É+ñÌ+kš5jHDLñ£ )H ŸÃT ‘š›çCç ÖâÙîÏœŸtñr)Àä#‡´Eœi EùKÅk)@¬ãõÕ¤%k5ÉY³+óºq˜TMÑ i~:BŒÏ¶þ9€/ŒˆµÜü¡‹y‹r=âí‡Ñ(}a4"Oÿƒ/ø)ÑåÍèÜæüߊ«Ö:­ðA¤T¨e;-šºgCúžÀ²¸éâ—+ 5¯] Þ o;½„¶ÇÉhfI£ù•Ç‹ÿPK¥Ç£Ho 2YPK'bèP content.xmlí\]oÛ6}߯0+›×µGJ]éÓÖù*¶Ûíl{52 ÞÿÒt§ƒÊ;‘„ðcÞ‹0¼ ’€`Ñ=£Û«»Nö˜ßÞÞÖZ¹ÆB¦»r<0€rÜ è.§’™ñ`¾: AbÄ`Z¤ÈWûͱíëÁ:þyóú]´¡)†Jã,¢U/™ïçc£ê¹ $Í…Ô•7‰jç¼Üº‘( œ°*˜ÏæõìE,õгÎÍѨûdh_pʤ9¬öšÓf"ñvhã ¼lv7dÚÝø6û !¢{D˜Gõ`õ§ƒ‡kœ;©¶'Sm%âTî)Õxh.ãÛâgÙÇ~~ëžßC“ìG±èYBÜɱ¹ïÚÛ~ M\î¹a®ÈpÂ\‘[ðzø"Zçfï¬H×TÎ •çñðC¿E½Q‰{¦Ë¤.ı(2âj葺dº­ZfãôâÝÖ©¹YOv˜‡ñ©ü¹8t¹ä­åio 5E˜Þ›*W3œQN†UpRÕ-ߦw»~“O×ïzc½éهς7`´?Þ¼nªÍPvt…EE’åƒ ¡ón ÌT=c[Î<”ó×8.\M荒‹ª‚º!†3ŠqD¡WwÏÝv¨›'îÛ }1ýU2  BQ9¤Œ?TíÁéίlLK¨É;œ©#a~ƹP¿tü\ãtÒ müQB3ਃÚ2¥Z9Ó¬ë=`fk|Ú’ÒL Ó JÓôs¼ÇaXy¿6|nö oÁËv\hH¤Y„lœš ög k$æu²¥-@ <¼H³iÕ³ÙˆrرTjFÕ$«µ¤ø#ZS ,4©«ˆ¥û–³1ç7³ÛešZü 8§°-¾¶E8›ßø`“}ó&Ŷ Zš¨œÉ4n(K6PC®gfZNÃ-E"×,Å5ûjYÐá¨5>ŽºjLA@©D9N(r=Þ¯ïŒíÃ2þðŠc212§ß„©œã‡ZØœ¶à ‰RA (—H¯=x@û8J9¯,9–æšd?Jì¿ïÀáÃ"üðª`\ƒÔ˜ßßRc—<ép‘ªVM#˜êòJê”’í/fíñ†‘ÁZ­9Òp‚ÉDvhÓ`îØÌ‰aÎ’ )QHsl»Ç¼ H?äµ\?(n$Ž1WÔñGiÄÞl! (¨wnn¬ÇVâÜɨI&ùv]…$ô©„[W®e^¸;$ÂYbwá¡Á  Jm`²>"-PÌöíÞL:—ª~k¡¡|M'î(R[ÿ-”fñC¹/ê ƒÃ ŒbÓ\?{§u³Ùîf†šb™° q’0M“Ôl‚}ê€ fW‰À†´¥¸žô¢½¢¢Ðp  q[“iGz‹–lPyç9`DËÉP¡ícs·TFiûça®mU™–®6‡Ú`bîLÉMTZ-xU¸mY‰ªx H&;‚ÃÎ* M£Ý©¥õHg÷„ƒ°½ qºÛg:Ùk{OþÚÞ ëâQ·úôë3êVµ5Í3K³ÓŸóëëïEí{Qû^Ô¾µ/QÔ‚Þ«DiX ò°¿Šæpr%jC©¾{îÎæý£ànï(ª «#b„bŠf ¨y¿'3îÆ@BÄñšrÕñ1•4ðÑyØ6×ãc^[ÆI„%Q%+tæñÏÝKÝwŠw,-RDXS(,¦H…³0 çvjú‡T´?Ë`޵î´\65Kµ9…7îìpÑŸØç…ÆÈET¨F 4Æ<‡{"¡Ê”Q·™9h!(¯AG²Ú›^‰Ï¾«•® ¹ÒK \ƒ*Bc\€öX±hFùÍ<²~˜ŸÉÍüÜ´p»:’ÓÜ÷:ð ^ý>Sˬ XO[³QCP”êIðÐBC~gnî£âÝ>áGæÇÜ—Ž ËÝÂHÀ¼ãà=Zú|ˆ‹¯ qv.ÌS” :€+߀<ËÜYŽAåðeYŽB?€D›Å@Ú,Æ Íbøª,F¡À ¢Í|¸R T^"0†Ly¼ Ú,‡jÔ·'M8óÒ€Xã‰ð‚h³ªQcÐÆKF¡ ¢Mßmà@£Æ —ŒB/„D›ž*ÛÕ¨1Hú(À(¤ñBxA¤é©±]……4>õÒø ¼ ÒôTØ®>BŸê?i|^iz¯Ú€ß(ÄñQ€‘˜ã¦ñ‚¨3L¦ÀoêxèÀ8gb?ˆ³s_%#u†‰øC5‹:>gç¾L>FêôÕÛî„#I–— ŒÄ?Ñ Ï|¢|”ôªZáH²õtËO¸Â3Ÿ*%}†*W8’t=íò¯ðÌ'ËGIŸáê5š|= ýò°ð¼ÌÇI¡Á 6š„= ó±ð¼çÌÇI¡Á*6šŒ= ó²ð¼'ª¯D¡vtðk†ž‡×Ï–Ë›c<û¨ë/Ìë3ó5[ª¨&iþývã_¶¶þ ¼jtr^}uÿ×(wÿPKˆa|Ö[EPK'bèP settings.xmlíZmsÚ8þ~¿"ãï„—¼\ãIèÚÜq ƒIÚë7a/ ‰¬õH2†þú“lÈ$®Ý#Æâ®3÷)±-=»^=zvWæúý:d'+’"¿qÚ§-ç¸å‹çaz×xç¼ïþró9õÁ ÐCàª!A)=Džèé\º>ò9ÕbÁ]$’J—“¤«|#à»iîËÑnj,»³f”?Ý8K¥"·ÙL’ä49;E±h¶¯®®šéÓÝPD|h°3ÏÒÁVë¼™]?N¯öulû–©cÛÿ_„æÌéîâ°{ýîõö]²? ª 4±9ÙÞ6Æní²»¢úKð„¢¾-ôœ÷»Õ¹?_úo¿ç+º‚}Bø¢$<i³ó·fÍÚÁNÊå@Üzµ{‡z‹JaX#ðWÄpªQje´}$,Σ¦Ž¶[Uc@`¤õ‡è—Á½%&¿ šWí"®1TÜÜ×Á„` ku¯‹Š9Ãd âoÊlÍ “%Æ n¾ÌLeÓ²ï>N“KIöJ³ÈÁ2ç dlFDi±Ð¾h_ýÏçCùl Üêªéi,À”ø¶™¯ 0õ_Ö¿y þ'T¶ íìxƒÚG†¢.˳Nç¢b-üjY-e@¤ö<ù“@÷@VŒxK¥…ÆúPÞÇJ÷àmÂ2éA>½×b$eü@ÌZ?r£›¥t:`“ ¥ÇI4Å ‘ ò¤ªÃ@¬ß)ë´¬Y˜€Ôä*í+Ú_+ª]¾°¹8Þ‹g]QYê~MàÅÎW¥Nß[Sémt%"Óoå,ý¹ËœmO_<@‚ÚÿÐ&» bØô–Ó›á ´ø‡ƒµ®sh¤îtÍcAæRC=I ·of¤Ãp3÷œm$?´Q£Õ¬GICiCŠ­7µCùžVÈã˜û*&_=ê0”­²!ìtÝoEt†òÃöƒµ§Ék唡ÇtÇ–nÁßqÖ'܇ TÚx5¿û~Þ,ûeA÷oPKP®Ã6› PK'bèPl‹²WÁÁThumbnails/thumbnail.png‰PNG  IHDRÔÿ¾kßýPLTE:*!:::)1@<>A<@E>M^E5)C<9C@>XF9FDDGLTKRZTLGROR\SLZWYHUdW\gY_p^`^Yaj[dtbWMgZUq]Ip^Vg`Wab^m`Ulb[u`LqbUsdZui^xfVxf\~iT|k]ffhckwkr{vlexrlzvv\mambqƒdu‰fxŒiuƒlx„kz‹k}‘u|†m€”t€Œ{€…zƒ~ˆŽsƒ”t…™u‰{…’}Š—|ŠšzŒ¡}‘¥~“¨m]€n`ˆvf„}x’~l‘vŠ‚|•€m”‚r”ƒyš†t˜†{‰uœ‰{¡Œz¦’}¨“~ƒƒ‚‚†Œ‚‰Šƒ€‰†ŒŒŒƒ‹”„™ˆŽ“ˆ˜Š“œ‡‚”‹„’‰œŒ‚ž…œ‘‰‘‘‘’•›’™–”š››•’ž™–›š›‚’¤”©„™­‹–¡™¢›©ˆœ±“›£‘ªšž£˜ ¡¶— §” ¬˜ §›£ªŸ©¯–¨¹¤’¡”‹§˜‡¦˜Œ©•®š…¬›‰ —‘¢š‘¡œ™¬ž’°œ‡«£›¶¢Ž»¨–¨¨§£«´¡­¸ª­±§°­¥°µ¥²¼­²´©´¾¯¸´´«£±¬©°¯°¹³®±±±°¶½°¸µ´½¼»¶±¸·¸¾¹µ»º»˜­Âœ±Å¤¶Ç¨¼Ð³»Ã·¿È¹¾Ã¶À½­ÁÓºÃÈ´ÄÓ²ÆØµÊÚ¹ÆÓ»ÉÕ¼ÍܼÐߺÍà¾ÒâÁ®šÅ²žÇ¸§Ã»³Á½ºÊ¾±Ñ½©ÌÁ·Õ­×ȶàιâѽÈÇÆÄËÒÁÍØÈÍÓÅÒÝÌÒÕÊÓÛÍØÔÔÍÅÚÒÉ×××ÂÔãÁÖêÅØæÇÛêÊÖàÍÚåËÛéÉÞòÓÜåÍàíÔâìÛàåÛåìÛéòÝðúåØÈåÜÑáßÝéÞÒæáÜìâÕìäÛðãÎóéÚùðÞæçèäìòäñöãôûçøýêñöìôùìúýóìãôïè÷ñáöñêúóäùôìüøçüúêôõóñöúóúýùöñüúõþþþî”StIDATxÚíPSçšÇ»Ù¶Â „ÄÈÔ1TÜ^Hj¬í-p‘ªðF+þh»R×µNíô^£w˜Ž+ݶ6Pè¶»z·å‡ÓEÊ-³… ÂA,­Øka¸41))Y7! ©p8ÏìûžHNîþµçl}ß™è “¯çäý¾Ïû9Ï›àg8ðÿ‘÷3{© à­#4óÏGæÆß‚cÛ¸½ëðüÃG0¼Ý ç¸ÈàUù›éyéôæ­#À¼|àÔ—÷¥«pQHQCò'!þ5umqŠaÍÖô¼³cÔ‚JFöa„3NýzÌ—yß&SUl¤sdÊlÙG—Ö ì:€­é†µùY¹…­Ño­4Õj )ê‡ÎDPõLÜ»‹ÔîñèÙ±.Så 6×DÒT–.í?¾§@Gs‘†"Škt[†ZŸˆE¹êÿ^±±Ž‰4§é^p zûÝLd"鶬¸[w©FÇ͉5T ®„-5‘€Eµî‡®Óå Z6b6#QÕ ¸œŽ$#QêQ/Êÿ1zã—èÿ¨«óHB‚[@Qƒ) î0Tn,3'æV5dÌu7â;U¿ú«Üjy¾¼©­FîZ5™°uïÒ¯6V¨¯æVÃdnUIFnµé™†Œ6tµsY»û5|ŠúöãQNO¬æ¿æÄ¨?9â5°+RÀ¢Hhëöæe#m5Ðqe&ÓU M}äIH¸5«q39Š^¬†];„¼ý~–S:õÿHÔPyù´·´_ñ‹YÊËiæl0gû`êÐuoÂ//Ÿ€¦«Àœc†s[ÐËòÀYç¬ßHÔ‰_íékTªŒ%ʘÊù±eÛ_qåj¥½z­´ÿÙòLÇÑ™Hüö=nƒVÖ«•ý皢Uö°Ç3i=B‹Š×í ³Ý‰Vßø1z~L¦+ƒd¼`>¼áBê¶É™ˆ\w tkV4õc´úÖMM~-£8õžö «Ð¢>½bØ{ë®r ýÓ¢y!¦¼ý‘:l¾‘кvìÝO-_=éP#[¶¤ã(€j™7}'ÚÐ ‘¥-;s’iaEýÖeÎÊ­³?¡¯o{j^hüUÈ­‘;‹ ×tkæ4ûÌ-„_a6U©¬¦¢gq€þK*1¾›J2 )vYVç÷ +ªAnJ{ÐËïäI4tsèB·9D9 TõxÂ̇ŠÕL¶„†»šC•nªçÚ¥aÖ±˜‡jað£Ó |¥ˆOQŠ+G†ÙôÀéóþÆ\z¦J¯ Wú=tÌDFÐO˜ÛaªœµìOÏsùíå“ÌÇVèZTÜŽ˜ª’èø"“&Î8¿Ø—½"íקɺ×Èz7|’vùõ™É^¶GÖ“›"¯×§Êºpn±&¶’ ÏKl0j‡_ZÔ”ãlãQê[wüÌ×úT îCæ{àÙÓrî™ïmÈýRkbº™ïb”«¾5¬É¯c” G´/ÛÿL5kh®ò½»È/vüEÀo™ï>ïó±„Ì™È;™‰+_À•oìèOȼï Ê—‰œ8Û¾s¹Î-¬¨†LY,õ¤¾®5q~ÌPFƒÊºµBîÜTÚZ1m¾nUU_q‘ʺ›ïçTbv½9£äÀ 2ß ]»…5_F&‘¾>$³ÊÂçß5ƒ‰´›’FÓ-R T­G7m¾ÃIh=ånAQªlHf)l^µ´˘œb¾DÔ},Ê‹ìóT) ï¾çsXaìíó0ö» àÙë„öY¾Œjay›µìSïsùM¿wO½Ý7û÷*çc’À´R_Xü´¾p~¬sAd{Uv=ïJr[Ù½BA%è Tuñ( PŒò·¤d©…»Kª´7 -ÊÑ’q¶»ÊØ[ã~æÛþf®o÷)ùæ—fêîÍi¦Jà6¤[×bóÇæ»bc=£0è^r ~û ¤@¬›A•kó-©B‹wÌ©}æÊÒfÛ[(ÀžI·­XB³•¯&·ŽVé„ÿLÙÓÁPÝú¤¾Æœî3UCLÿÆÊëoª™m¾X”ºg‹QÕ· ÕÄúZs’¾¶1£d­™ï ]Y›/ÀÍ£àQ…;‡UJÿ%[s-XdZšŠ@¥,UïÕ휉\›V¢\çBéœÊû?bÖ?OÌ—ˆº¿EystµÌYt©}˜ùzî1ßi3Ð¥^½Í2_xãͼ|Œc¾{f¾Ó£5±½okzî@±ÍÆ‹N–ù^›f¾ÓcËávçcÇÔŸ³Ìwÿæ,}Qs”˜ïô8vUÀ|ñXåÂ[ÏÇ_Y=«òÅ#>BéDÖ¼çªG±ù‚˜¯oüà´/TÕ5Q’‰™o‡ù}¥vn¤!Iá«|ÇQå|GcèfÐE–ùúÆî/¨h?æëË¿+> ïÒ×ÀÝÔK³Ì }ß;kùÙ2à\}uIVC†™ï6ÇjÁÍ/jc£¬žØhW ñô„ET÷Ôú£s–» í¨E‘BSU8׫qMåaæ{vˆàö#>ED )ªåB@æ‹ÇÔÙo8æ{nrËeÎvL3ß–æKC“˜/Åše˜/ëFɲj–ù¾ŸiŸ3O€>Y^åc¾Qª Q1_r„!äßî@¿'Œ¨beÌ~¾ØßiCêó÷f ö‹¬ÓJkÃdÕ%á²jûC±YæÕZïsbõ=}s%¯‡A‰1ïZòzw€HCÑ̶ó›k¥é¼ö~ÑÜ~ž%üïÅ¢¤=;šŽøOé`WNøú|¹Ê7rbO{Áú4‘LéÊÞX³vms™Ÿù¶àUd_¿¼2¾÷rÒÉ ª|w_+‹ù>*‘¤óí`üDZTÕpBÊüÈIhYK•=äÁ^Kȃý™¤y—kˆùQD#µÌ÷˜/™Ûç{˜‹"a¾ì»Ë_È»­^þ̱¸ ˜Óç›.æ‹ÇÐy%oŒ:µ 6ø1_¶H<…§L_Ÿï›ù–ˆ†ù²—*Š?vyÜÆ}¾/ú›/Å1ßqóAŸï=Q ADeÁœ>ßy¢fú|\Ÿo–XÌ-ÌŽÖº¸Ï7Ó!²¦û|#ú=róMž$S:u?‹jú#úûw/é뽈ù¢Á1_6wóµÐ‚‹jˆ^VЪ)åÝK÷Äd?óŃc¾8÷¤F]Ù†û|ÅÁ|ãmø‘à-J ¯gvšŸÌ|ý/Ç|·¢\óUˆ„ù.³1È]:¿1óîÐBÛ30vÆù¢Áp…sYæû%(h–ù þÏc7¸3CE°ªhÏù™/î׿rUnt¥êñOãG™lB‹–‡õQUYX­™oíßJ•c¾v”ë…Û¼±Ò/ó%¢ˆ(¶K˜wñ~ÆöúõùN»2Ûç;UzlÒÇ|'EÂ|K4z´7¬6$ñeÆï”woÈ|³wÆüÀo ¿ÞšÌöù>%æoÃO%MÁe^Q¸ÕhnŸï\óeP®È˜ï²ì£V¥‹/?pÅ|f~?!9°ùâ\Õ(k¾‘,ó¼žÚXE­DŽdWUÎõù^òg¾1ÖÍ•\®¾ÖœQ²ëóóõ¨ÂmT¥^"MçÝxÁ}¾™¯E¦¡¹Ü!9ÛçË1ßb¾DÔ}-ÊÁ•¼ü| ÚÀ G Àr;­Ó¹˜ûþÐÁ2ß„Õ&¯@çßvÎMØòŸéðg¾†¨~.3_‡Tµ3ß4áE­ëÇ•ïà¿ðo;G€¹0ï›”ÛÎ 0£ÕÈà{JXŒ™o £0×þAÌwÙ­»XOmgd¾k<{1_î„+¼»«õm;³ÌWpQ¹u+ è¶sÄÄÉŠÀÌWî2áGôQÁÿ*éd™‡;^r÷_„å‘|ÝZLTƒäáÉ€ÌÌ’07Us-!õù˜ïa¾DÔ},ê"Ëg;ñA‘ó>CËœëãc¾g§™¯çã³…g¾ Þ6n\¨2¶*÷|Á—©OÔçËΜZi/šH”1•—”{®°}¾µwf¾*·´âçšT'¿ù6Ì|¹>_Ü#¼Y“æÚä;ÛY`óUЗ3ðÙÎ-L+‚˜ïڀ̗áú|ñ¹Ð8Ÿ­|…g¾j›©Û¯}å»¶AÞu’ܨϗ½ÒNlË뺩ÄwœŽh‘ôù¶„†»ÛÊRi/%•vóeš%ÊI¶Ï×oùcYè¦*1ómAùãrÒçKDQ?CQø|f–úmJÉ^Å—™ý÷lŸ¯Ý¿˜c¾%šX£!%{M[xN:>Ûù…ö)ì3qÈ|GÀž¤ò ÐçËU¾˜$âḜ”ÿ9£ÁÙÎøðHüØÝEàˆt1ßýSA˜o¬å[œ¸òóU÷£{*·†JlÓ¸x3¹>ß@­F1Ö­lŸok¥u×çûl—À'\Q2¥›*’‡õÇKäÝvnæú|=þÆQ¾³Ã­K%Ò¬±é³ ó%¢î[QS¾³™ñ¹Îü¤vìm~æ[;;_ÌWÿbL€I»ü€7ûaÞ̸C²Þ<æ+ÿŠëóË^"a¾>ó½15ÒÅ¿C«€KølçT>æ‹û|‡¾‰‚|q0ßH¸3ೃíвÌ™¯ÿ¶sL?f¾ì¹ÐÞ( óÅ̶­ S_`¶ñfú˜ï˜î` |Üç«@ùϳ 3ßâSD”¢,l.¦¶]]Àœ»øo*f¾A˜/æ½øÕ~®K`æ{\)ý`cTh¯9LVE…§^àËd™ï«™þg6¢BÑDgæú|k†¥ÛÊWk½™Â‰RR«€ýâ„xÛø¢¿ÚáRùæ]K~ù.½1½ôÖ †R>g5Uë„Üvޤí)ØXÛ2b‘ù6ø‡A*ß},ó=è™6_Üçk)- û­ ÌWílÜ7ŽKŠôÝšSÎaÞ%Å_c¾ëzílŸoK7‚†]× „c¾Í©ÍÔm–„9!’îfɃõ|™ùÚ%’ÜçëJÊpŸïãZ™Ò‰¨ûQÇ{›zXæËžïÌW{ð3ß&ã>ßväΖO&f¾ùY=Km¿ÅÌ÷¸&v _¦^„ùöpÌפ”W5‡çD Üç;c¾k0ó¡V1ß Ìw1{ÈÆ°Æ3éY$pŸïóUÂàkó]{ûmd¾þ51Þˆý‰5_{ü FXæ«¶6@×Ëj2êëíOØ£øwäΕÍWå<‰ÌŸ ÿg*É“€‡´ÏWŸõ‹Ï~y`Áš¢ã sëù35.¸ã™mEËç‹BÙ×N®øeщ'56àïcR‡EÐ?E|Šˆ@sÛ-ƒ;u›ðæsoæTyGÐ>_6ÿôgì¿!pŸ¯!Y^‡©¯¬»$:®h*/œ7sùó·eßÙÎj㛚ØJxóoAàïóUb4Š+ßÇl?E }ôiçü}¾û¹³c‘ùN}²„˜ùFÒ‰œùrÛÎü;´˜ùzËy˜/k¾Ü WK`JX滸ÏTˆÍ÷Dþ>ß {éÿ曨¯7gàGí~àÊ"UºÞ馤Qnü}¾Àðg#Ë|Ûj=Ëyú|P¾CîÄgDæKDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQDEDQÿÇ㚯æ×¦m¾IEND®B`‚PK'bèPMETA-INF/manifest.xml­“Mnà F÷9…Ŷ2¤í¦Bq²¨Ô¤ fpð€`ˆ’Û[q⪊KÙñ3¼ï1ˆÍîÔ»ê1Y {åkV¶^[ìö½ÿª?Øn»Úô ­DrTå¦ë´a9¢ô*Ù$Qõ$µÒ@íÛÜ’ü[/Ǥël&ðÎ.hçá4qc''ñµ¢R} ‚S€h‡-å¤7ƶ g„1i»ªnW0ÖA]Êãù&`²suPth˜¸ëukh«j:h˜ ÁÙvGÔ|ìŸ_§Aét &–¨|z4¶Ëq¤§7ñ BÊÈKx¶¼–…Ok6¾cŸ”ÍÌ8¿!ÛYRíÞ“HYÿ[z_ÿÿPK!µU0#õL Î_rels/.rels ¢Ê( Œ’ÏNÃ0 ÆïH¼CäûênH¡¥»LH»!TÀ$îµ£$@÷ö„‚JcÛÑöçÏ?[ÞîæiTb/Nú(A±3b{×jx­ŸV b"giÇŽaWÝÞl_x¤”›b×û¨²‹‹º”ü#b4O ñìr¥‘0QÊahÑ“¨eÜ”å=†¿P-<ÕÁj{ª>ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK![¸Éaxl/_rels/workbook.xml.rels ¢( ¼”ËjÃ0E÷…þƒ˜}-ÛIÓR"gS Ù¶é{ü ¶d4Ó‡ÿ¾ÂMå‚»1ÝfÝ{¸Œ´Ý}v­xGG5 ’(&·Ec*¯‡§›{ÄÚºµ H°Ë®¯¶ÏØjö—¨nz^Å‚š¹’ò;M‘íÑøIi]§Ù—®’½ÎºB™ÆñFºßiŠ}¡À틈ÃÐ{翵mY69>Úü­CÃ,ä‡uGªÙ‹jW!+-’ãdyb—aî–„¡Z;,^Øù¬i:kÏÁ¤K„&Ð:%“ÎÁ$ÿ “ÌÁl–„!Z¿ôaa¾ë9ûÛ%íÙ?%œÜÇRŽçlë%Â&L¡uZŽõO òìcȾÿÿPK!Y|{°xl/workbook.xmlŒRMoÂ0 ½OÚˆr-…„(h_h\¦œCãÒˆ4©’”¿Ÿ“ Öí´SbûùÙï%óå¹’äÆ ­2:Ä”€Ê5êѯÍêá‘ë˜âLj½€¥ËÅýÝ¼Õæ¸×úH@ÙŒ–ÎÕ³(²y ³]ƒÂJ¡MņæÙÚã¶p•Œ’8žDŠv 3ó]"‡W7(בÌáú¶µ¥‹y!$l;E„Õõ«pﳤD2ëÞ¸pÀ3:ÆP·ð+ašú¹ÒWÓxJ£ÅMä§! ÖH·AyWvô+'ÉÄ#½[­ýiò!9ï„âºõP´ör¦)%m¨ìw%–§Ã]îÄ¡t˜ŒG²Ü‰lØ3~VÔìÄ¡á$*h}ÑR7ÆâÃy¯×¨gH‰™ ¼˜5}ø*¼QÞÜЉØG?IqPÞü^CÒkýmXiåú»ŒzàqèQCÎdŽNû#,¤Ó$ ˆëg[|ÿÿPK!rKËŒ xl/worksheets/sheet4.xmlœ—[oœ:…ß+õ?X¼—‹™[FÃT Ó>Tªz}vÁ3XLÁÉ´çןm°ìˆQÒ—âÏËÛ‹ÙÙ½ýS•è‘¶ãuä®ï Zg(t´¤™”D†GÓ²Œœ$wºß½¨¼Iïª9½ÖúiøO-Êé‰<”â3¿¼§ì\p»ë¥TÈx 8üD“OÀAùÓ–‹®îÜuàß…€£Ÿ´)“Ë”=t‚W?¤¤¬D`T"»›år±Ú¼@%T*0jßÅ›e°\áçײP*0j•Ð]àåz¼@öëmQ©üƒ-+%£ ÜåÚ_RÉZ‰À¨DÂÕ³Ïã O»MBÙïZ~A|xž]CäklAY&‡.Ñóï€ßÉt?î×;ïâ–©¹{¹ú`ΕÁØ„bS!šP¢!(aTZ˜ÐAAr1BKJ5t7…V&tTPh>žÎs®A–o;ÀµœÀÚé^®¶-²¡XA†E6”hhj‘ dXdC©†¦ÙÐQA†EȰÈ‹Ö×ÉYi|ÃFŸF³û˜Ýk^‘Y(VPµÍB‰†àïÇ,tP†Ã,”*(¼UøQC3…>ÁnO|Âîø®ÉyéÄs¬jcf÷^CF,(VPÕÍ*%2r`)$?™³J©‚Â[…54S¸áìöÄ©Å5QrVúdäàÎòICF,(VPµ§³ DAØÈ4däÀ‚R…· ?jh¦pÃ'Øí‰OÓDÉyéÔ4Ø·œÒÐ46+(€ê®NÙP¢ <Í 44Í ¥ o~ÔÐLá†S°ÛM§ä¼tjšXN)H¶c£ kª›…áiìíš&Á†R…· ‡6´?Ýb¦ðÁ©¡§Úƒ¦€®[° zȯÅП"ñ·V¼æ1¯Uë.Û¿†œéGÒžYÝ¡’žàоì1Q;tœÃà Ø $Ð=ö—4åz >° úFi~¡â¡A ihû…ýÃsæ-ƒö»ïº#§á­h °Õ–å‘Ó~ÈYÐ œöŠˆ”ì\ÿ`¢P%ÊFïúÄþÿÿPK!Ä,ÂB#xl/worksheets/_rels/sheet4.xml.rels„ÁjÃ0Dï…üƒØ{$;‡PŠ%_J!×&ýE^Û¢öJh·%ùûèØ„BŽÃcÞ0]Yõ‹…c" ­n@!…4Dš,|>¶¯ X< ~I„®ÈлÍK÷‰‹—Zâ9fVÕBlaÉoÆp˜qõ¬SFªdLeõRc™LöáÛOhvM³7å¯ÜS å0´ N×\—Ÿ»Ó8Æ€ï)ü¬HòÏ„É%’`9¢H=ÈUíË„bAëGö˜wú ŒëÌÝswÿÿPK!;m2KÁB#xl/worksheets/_rels/sheet1.xml.rels„ÁŠÂ0E÷þCx{“Ö… CS7"¸UçbúÚÛ—÷ý{³eÀååpÏå6›û<©f‘,Ôº…äch°ð{Ú-¿A±8êÜ -æÙI‰y0Éù‹Ьªjmò_´/Nµï,ä}Wƒ:=RYþìŽ}¢H9ÈEíò€bAëwöžk}¦mÌËóö ÿÿPK!ìÅ ùWxl/worksheets/sheet2.xmlŒVMoÛ0 ½Øt_ü;Iƒ$E›¶Ø†}õ¬Úr,Ô–¥£îÑ÷€·G3(wÜ—ÂÞ‰;˃g ×Þ¢îý¨ ½ºº·.h>SŠNÏãE%C׸G¹{â:¾k—5o7v>h’©­„œc·é­n&ݰ°³âÔ~4Eú-M Ó׈ ÆF¡¤qc‰˜×F²Tk%»ŽÍ¿aþ•µ!5©xq¬Ö ÷aT¢äI˜vYÂpæÐÓÀ ¥ÌÛpº½k$¬ù(LÙ©àˆÄ[ÓÿK°ú ÿÿPK!ÌÌøä‹Zxl/worksheets/sheet3.xml¤•Qo›0Çß'í;X~_€¤mJTMÒh{˜TMÛúì‚«`3ì$í·ß»ÄxŠV)}h þÝÿîïsÎÉÝkÛ í%<ÅÑ,Ĉò\ŒW)þõs÷å#©/H#8Mñ•ø.ûü)9ŠþEÖ”* \¦¸Vª[ÌkÚ9å°Rо% ^û*]OI1µM0Û %Œc£°ê?¢!Ê’åt+ò}K¹2"=mˆ‚úeÍ:‰³¤`°¦ ¡ž–)¾V×8È’!óoFÒyFÚȳ/zá[‘â$mh®%ÝЦI1¨ ùgÐ4‚Á¨˜%§çwõÝ`ý±G-ɾQ?Äñ+eU­`Ÿç³åPR.Àá?j™ÞŒZòšbHtd…ªá›p¶ŒÂx8Ê÷R‰öÉ.hG‰ÊØE²¤G B²#º-Ñ "uÎy8‹B÷£8VÎs}K¡÷ò-“à 3Ùµµ–Nñ­‹ÄSdc‘¹£…Sfk™…ËDSæÁ0ñË\L^GÃëÃ:L]¹™æc¦aSÖ–í÷Æ7n‘IÁ¾qË,™È7n˜xœ1x‰qÆáW>šò[µ¶Lì0¾qƒÄ0=ÎÊl-㜌[fRÎãЫKŒOZ½ðZ­µÿsÆ-:ïØ2`êÄø­6̇Î8œ¼KëðÇ“Š¯<ã–q+ö[m¨ûdÊ?ã–ã·Œ{ª"¿Õf¨šÉÖÕp)–Ã@-WfT#õÖÁ­ÄÅFp{‹é¹Ø‘Š~'}ŸD -¡£°7ã×¼(Ñ ƒòY(«Ãc ÷…Î.…Pï/ iÖv׈4¬âOLÕ6‹¾6ô<oÅì/ÿÿPK!%ª‹Ô‹xl/worksheets/sheet1.xmlŒ×[›FÀñ÷JýhÞ»˜{Ö2Žb0—‡JUÓ¤ÏÄÛ(˜¡0»ÛôÓ÷ ‡àéú´öøçü½¾Ìîýß÷Æz•ýP«6ÎÓFX²=©sÝ^cñéì—wÂtÕž«Fµ2ßä Þïþi÷¦ú¯ÃMJmÁ„vˆÅMënkÛÃé&ïÕð¤:ÙÂ#Õß+ wû«=t½¬Îã“îín6¡}¯êVà„mÿf¨Ë¥>ÉT^î²Õ8¤—M¥áü‡[Ý b¿;×𘹠«——X|p¶å³°÷»ñÈŸkù6Û–¹/J}5”çXl` y2#­ þ¼ÊD6M,²Zü5΄›0О'ÒÛß§gã¥ÿÖ[gy©^ý»z+d}½ièì>Eã„q@Zéj¿ëÕ› 8FW™ ÎöNåd?À*<Í\Üë>ÚÙ¯p¼ÓôØÁ<#ÏDl–"AáÀK9q–$EâF„¸KrDâ…„xK’!ñ¡Ó| Ir$OH°$’Ð#$\’Iäòn&6¤œ{YéiVÇÖóy²f‡IÀûáG$™È”O‘¸´<;ЉGË3’!ñiyFr$-ÏH$¤å)‘D´üƒ,²YÉjVcSæfìÿì€Â×ïG$™†ÐòlJ:Zž‘#–g$CâÓòŒäHZž‘IHË3R"‰hùYd²’լƦÌÍØ{ó€Â¡åI¸´<#étZž‘ãDhyF2$>-ÏHŽ$ å)„´<#%ø ]ë²È d%«YL™³²Ï³ ‡–g$AâÒòŒ¤HÒP8´<# —–g$EâÑòŒ‘ø´<#’€–g$GÒòŒH"Zž؇ŒYhùÁ¬¸©À=AwƒM—®O°‰¸¨VãöÄÒß:؉µ*Qí´s3›‘®ºÊ_«þZ·ƒÕÈ tߘM†Õã–ïhÕ?{¿(­Õ}¼yƒ=™„=Ææ ðE)ýýÎ4ó£Ô/ÕUì?ÖÿÀáT_ÃîkÜtÅ¢S½î«Zá¶õ9}yvÌ áàlœhUM}mÿ¬õm:E³Ï2;¨y¹ÿÿÿPK!È;Á;‚Bxl/sharedStrings.xmll”ÏnÛ0 Æïö‚î­“ȺÂqÑfØvÈ.kûŠÍØl%Ò“¨eyû) z‘tÔïûøG4åö៳ê/ø€Lk½¼^hÔó€4®õëË÷«;­‚Œe‚µ>BÐÝçOm¢R,…µžDæû¦ ý΄kž’²g£›0{0C˜ÄÙæf±X5Î iÕs$IuW_´Š„"l.äö«îÚ€]+‡¡m¤k›Óñ‚F@9ÜÙ9;L(<‚µ|È­ÇIª‰ÏJ-»‰ÂyšÑ›cÎ,ì%g‡Á­ùS¹UxÎÑŽEØåô-Á}Q~ÖæÖG¦Õ+aZP¿žó -ˆ€W?X&ìk¢?IËõôR¨±ÇÁ¨ SàòÚÛ‹úl(|”ÏìØk€blÙÈÉ©êR¤¼E*æ¾R3#“_ÞÕ¹?–[Érÿ^ò)}êr]·&½ _îáϳ»¦œ#6iyóÙôl£+ÞÃ%QÝ«¾åƒª÷ù›jy«*z“þÝÿÿPK!ñ¬aXÞ©L xl/styles.xmlÄœÙnÛF†ï ôè…a›Ú,'$75à @R°ô€A‰#‰-•¤ )—}ž>UŸ¤g†ZŽ.cþ¦€À¡$Î7‡óŸŸä gØ»]øžñ"¢Ø ƒ¾Ù¼j˜†F¡ã“¾ùíñþòiĉ8¶¢o.ElÞ~ü¡'KOFmeûeIH³eüúX3¹ŽmÜ…Az¢2çÁâu3íÃ;¤VÔ;}–XW^J£<š¦NE(­rYšz•`éiæjkVXBK³<š¦fE(ÍrYšš•`éi&“ züR]ª”–vEDMýÊàt4,äiêX’§§å\Û…%´4Ì£iêW„ÒÑ.—¥©[ –žfëk\×$ñ¶×ðã¶ËÛYK© ¦H9}²0šÒäc^§JóŽ,G÷~•.û¤W s óe8¯”&ƒSVu÷Óݵëy›N?u Óo½™-{úÙXm?.gÔåhB iÉ’…{O"{Ùl]—/@·Ç®#£˜Üë´÷¿¦  ·lhÙ5©®l-5©{õ:jRÝÞ:*jª¾U-5©.r5¥ç:jJ»Ó:5)’‡aäÐâzø®IJ¿ô<1NÈ#‘;™Êÿ“pF‡a’„>m8®= Û£Mk]bµAØ‘ð¼9ÎøÇx‡½³A8±”}i9B(7é¼°ÚLyéÉ純ͱ×7´>ØXŒ75d•nf†µ)mس™·¼§ã 2yNÉbµ€¬6%‡f7½þ1ÊAUKޝ¢XrÅ’ƒ³(K{JžöûmO5äËÕÖ*WW™[Lf™ &³<“YVƒÉ,ÇÁd–ñ`2Ë0™¹LfÞ 4y£€UÁ`2ó˜Ì¼&3o€ÉÌ`2ó˜Ì¼&3o˜0o°*xL¦æ\_ƒÁd½™y3ó˜Ì¼&3o€ÉÌÔä0o°*xLfÞ“I¨µ7Àd½™y3ó˜Ì¼&3oPÃÀ¼QÀªà 0™yLfÞ“™7Àd­]&3o€ÉÌ`2ó…óF«‚7Àdæ 0™yLfÞ“™7Àd­]&3o€ÉÌT ̬ Þ“™7Àdæ 0™yLfÞ“™7Àd­]&3o¼z£€UÁ`2ó˜Ì¼&3o€ÉÌ`2ó˜Ì¼&3oÐfÎuã£çN_¤Ñ={ýј†‘û’]Na—$ÕSûÅ8û1¶Ê…$¢š+UO\k¨“$îH¶,=Û­¡¾-åò•“E°’ö¤1¤J×¶ÙO’ßÊÇì OÄ¡ü' ã j‹b›ÎãÄ/O|8M‡ipš8òà4aÈ{äšó@UÉÎõ_‹ö#¨Í‚ü‚¸DYýéŽM=2sj ɪË3E‰æqalBJþÍ_‰ÉSMš\€;LÖe©ë¥T‡±ŽIuë‹T‡±îGuëqT‡!Тp`yÖB: …tÍ&Ò4çÒ-¤ZH´h#ÐF: t@é€6Òm¤ÚH´‘h#ÐF:€¦íãNA¤:Htè ÐA: ƒt@é€ÒʹE]„UG¢ÜMÐïs(¢{õ¢˜cÓÓ›])%ž*³ O•™‚¦ªJ4TõÓàÐ7IyúCGªr mv¥·ñTir4U^ t™_£0£$}Y-˜šm>^8úK¾ßG½çÅ‚<\)U›1uGÈ—W!†œrÆ5J\Ы•N—Ò”zˆµ7¸¤Ö¶Ñj6¶dngÁÜfé›!¦÷ÍõF/;rÌíðÎpîz‰lV³m×ËÖYlWà){H¯ÿ’kó6Qû8blϽäqócßÜnŽ;÷é ³Úë«û& Ñ7·ÛŸåBÁ¦ZDomß16øÿÿPK!iÀRŠVxl/theme/theme1.xmlìYMoE¾#ñF{oc'vGuªØ±[HÓF±[Ôãx=Þfvg53NêjHHˆ‚¸ q J­Ä¥üš@©wfv×;ñ˜&%õ!ñÎ>ï÷Ǽ3¾zíAÂÐ’ò´Ô/×DÒiµƒ;Ãþ¥I…Ó1f<%í`FdpmëÝw®âM“„  Oå&n±RÙæÊŠ aËË<#)¼›p‘`"Z | |¶²Z«­¯$˜¦JqloO&4$—4KlÌ{ $¤Jê…‰fMrŠ]œ*Î…ë"g²Ë:¬€ 1?’*@ K/ÚAÍ|‚•­«+x3'bj m…®o>9]N0>\52E4*…ÖûÖ•’¿0µˆëõzÝ^½äg8 ÁT«K•g£¿Qï<+ ûu‘w·Ö¬5\|…ÿڂέN§ÓlåºX¦d¿6ðµõÆöªƒ7 ‹o.àínwÝÁů/àûWZë o@1£éáZ´ßϹ— g7¼ð €oÔrøÙP¦—1á©Zšl ¾ÏEɰ¢)R³ŒLpyÜÅÉHP¬%àM‚+oìR(–´0$CA3ÕÞÏ0ÔĜ߫çß¾zþ½zþää᳓‡?œþÌ—UüÏß}ôÓŸúPBs^|þä—gO^|ññ¯ß<öÀ·UáCš‰n‘ctÀ°Í8ÆÕœŒÄù(†1¦Ž·‡uOÅðÖ 3®C\çÝÐ=|ÀëÓûŽ®ƒXLõHÞ¸Ç9ëpáuÀ®–UñðpšF~ábZÅ`|ä“ÝÅ©ÚÞ4ƒ¾Y$¥ãûnL5÷tU‘”(¤ßñCB<ÖÝ£Ôñë —|¢Ð=Š:˜z]2¤#'‘æD7hq™ùl†P;¾Ù»‹:œù¬Þ!G. 3òCÂ7^ÇS…Ë!NXÕá7±Š}Jf"¬âzRA¤#Â8ꉔ>šÛì­}CÃò†}Í)=ôñ¼‰9¯"wøa7ÆIæÃhW±ïÉCHQŒö¹òÁ÷¸[!úâ€Ó¥á¾K‰î×7‚;4rTš'ˆ~3:–Щþ›ÐôÏš1£Ðm¼mÆí`¶&_IÜ8Õ‚—áþ…wOÓ}¹¾¸ñ¼í»oûnðŸï»Ëjù¬ÝvÞ`¡÷êáÁÆfLN–OÉÊØ@͹)Í ,a·÷aQš3")MY _óîîà" \}@U<ˆqCv=ÐL"™³Ž$ʸ„ÓYöòÖxÔ•=6õ©Á6‰ÕÛå5½\J6fωÌ´´¦œUØÚ•œ)˜ý&ÂêZ©3K«ÕL¯s¤•&CMƒÅÒ›0† ^ÀËëpJ×¢áp‚k¿Û¸‹‰ÂE†HÆxLòi»cT7A*rÅÜ@îxb¤Oz¯ñZEZK³ý ÒΤª¸ÆqEôþJ”Š žGIî©rdiµ8YŠŽÛA«¹Ú Pˆ³v0s-|M2ˆºÔ“f\…ÊÞ·8EZ¦“ œ-fSåóh¶ ÃÜ"¨Ã]…õû‚ÁŽˆLHµƒel%˜Wy °TK²ú¯6Á­e€Íô7Ðbm’áÓü膖L&$TÕ`WV´ïìcÞJùT1ˆÇÇhĦâCøuª‚=c*ázÂtý—iÚÛæ•Ûœó¢«^aœ]Ç,‹qÞnu‰•lᦎKÌSE=°Í«»1îü¦˜’¿ Sªiü?3Eï'p_°6Öá2W`¤ëµp¡b](‹iØ09˜-².dá5$\)›ÿ‚éÿ¶æ,SÖpìS4B‚Â~¤bAÈ>´%“}¯aVÏ÷.Ë’åŒLFUÔ•™U{DŽê¸®÷öÅꦛämÀàNçŸûœWÐ(ÒCNµÞœâm–ž^S4ï ž|l1ƒ<·›¦ð©¢gWµô†¼Ø{Owýù˜Õ(ª„U¶‚V^öo¨Â9·ZÛ±,^mÊA-†År ÊàÖé?°ÿQ2bÒXo¨C~½Á¯ š¤ dõ%;x Ý íâ'»hã¬YY׿£“vçßïRî)gkÍÎïs:»Î\qN-^¤³s;¾¶kK] ‘=]¢°4)N2&0懭êoO|t½wüS¦¤I&øaI`=¦ ø­DCºõÿÿPK!ˆ\ÓÒ 'xl/printerSettings/printerSettings1.binª`He(bÈg¨` 0²0±Þa8ÂüŸ‘“a· G ÅÏÁÄÈÀ$™€u^§w÷Å åm–1¹ŽÉ¬ 6›32{oמͷÆúBu\þ/‘Îc²ˆ'´ ×,@)O€¼ó}þòoÿÿPK!èýò^¨qdocProps/app.xml ¢( œ“ÍnÛ0„ïúïÃ( ƒbà(1rh#þ陡V6Š$ȵ`÷éKIP,µ>U§Ý™Åà—dçZ' ø ¬ÉÉ}š‘Œ´¥2‡œì¶«»ï$ (L)´5“ òÀ¿~akoxT’aBNŽˆnAiG¨EH£m¢SY_ Œ­?P[UJ“•§ ÒY–}£pF0%”wî3ô‰‹ÿ7´´²å ûíÅE`ΖÎi%Æ¿ä?•ô6Ø “ç³ÍèØd‘nòä^xÆè¸e)41˜WB`ô*°í¡­…ò³ H´> êw<¶IÞE€''ðJŒXíXßtµv=ÿþã]‹ £q »r<;®ÕœÏ»XLÛ€$SÄ­B áµZ 7ˆçc⎡çíq «íɇ1à'êªÛøMk©ÕÁ´»¿é®¬ÁIä„þ/ÞÂÖN˜ _¿½»·eò˜îSF•ýPæ#ìÜÖ> „a]S‘mŽÂC7<øW½ÄMy݆GaP3ÿíåÚ÷/ˆßÏÒ,~Ý4F¯o…ÿÿÿPK-!sA³Žœ[Content_Types].xmlPK-!µU0#õL •_rels/.relsPK-![¸Éaxl/_rels/workbook.xml.relsPK-!Y|{°Ûxl/workbook.xmlPK-!rKËŒ ƒ xl/worksheets/sheet4.xmlPK-!Ä,ÂB#„xl/worksheets/_rels/sheet4.xml.relsPK-!;m2KÁB#‡xl/worksheets/_rels/sheet1.xml.relsPK-!ìÅ ùW‰xl/worksheets/sheet2.xmlPK-!ÌÌøä‹Z¸xl/worksheets/sheet3.xmlPK-!%ª‹Ô‹yxl/worksheets/sheet1.xmlPK-!È;Á;‚Bµxl/sharedStrings.xmlPK-!ñ¬aXÞ©L ixl/styles.xmlPK-!iÀRŠVr#xl/theme/theme1.xmlPK-!ˆ\ÓÒ '-*xl/printerSettings/printerSettings1.binPK-!ˆ\ÓÒ 'ÿ*xl/printerSettings/printerSettings2.binPK-!$Óë¢JYÑ+docProps/core.xmlPK-!èýò^¨qR.docProps/app.xmlPKž01Spreadsheet-Read-0.93/files/empty.csv0000644000031300001440000000000010701240352016757 0ustar00merijnusersSpreadsheet-Read-0.93/files/test.sc0000644000031300001440000000771010332420104016424 0ustar00merijnusers# This model file is a sample of a SquirrelCalc Spreadsheet. # # (c) 1986 Minihouse Research dimension 28 {of 28 rows} 10 {of 10 columns} global frame 2 global display 2 global format [F2L] width c1 16 width c2 2 width c3 9 width c4 4 width c5 23 width c6 2 text na "N/A" r0c0 = "sample1.sc" lock r0c0 lock r0c1 lock r0c2 r0c3 = "Maximum Loan Amount Table" lock r0c3 lock r0c4 lock r0c5 r0c6 = date(today) lock r0c6 lock r0c7 r1c0 = [G2*] "-" lock r1c0 r1c1 = [G2*] "-" lock r1c1 r1c2 = [G2*] "-" lock r1c2 r1c3 = [G2*] "-" lock r1c3 r1c4 = [G2*] "-" lock r1c4 r1c5 = [G2*] "-" lock r1c5 r1c6 = [G2*] "-" lock r1c6 r1c7 = [G2*] "-" lock r1c7 r2c0 = " Assumptions" lock r2c0 lock r2c1 lock r2c2 lock r2c3 lock r2c4 r2c5 = " Results" lock r2c5 lock r2c6 lock r2c7 r3c0 = [G2*] "-" lock r3c0 r3c1 = [G2*] "-" lock r3c1 r3c2 = [G2*] "-" lock r3c2 r3c3 = [G2*] "-" lock r3c3 r3c4 = [G2*] "-" lock r3c4 r3c5 = [G2*] "-" lock r3c5 r3c6 = [G2*] "-" lock r3c6 r3c7 = [G2*] "-" lock r3c7 r4c0 = "Monthly Income" lock r4c0 lock r4c1 r4c2 = ":" lock r4c2 r4c3 = [$2L] 3500 lock r4c4 r4c5 = "Maximum Loan Amount" lock r4c5 r4c6 = ":" lock r4c6 r4c7 = r25c1 lock r4c7 lock r5c0 lock r5c1 lock r5c2 lock r5c3 lock r5c4 lock r5c5 lock r5c6 lock r5c7 r6c0 = "% of Income towards Repay" lock r6c0 lock r6c1 r6c2 = ":" lock r6c2 r6c3 = [%1L] 0.3 lock r6c4 r6c5 = "Affordable House" lock r6c5 r6c6 = ":" lock r6c6 r6c7 = r4c7+r15c3 lock r6c7 lock r7c0 lock r7c1 lock r7c2 lock r7c3 lock r7c4 lock r7c5 lock r7c6 lock r7c7 r8c0 = "Percentage of Loan Payment" lock r8c0 lock r8c1 lock r8c2 lock r8c3 lock r8c4 r8c5 = "Required Down Payment" lock r8c5 r8c6 = ":" lock r8c6 r8c7 = r6c7*r17c3 lock r8c7 r9c0 = "towards Tax, Ins, Assmnts" lock r9c0 lock r9c1 r9c2 = ":" lock r9c2 r9c3 = [%1L] 0.35 lock r9c4 lock r9c5 lock r9c6 lock r9c7 lock r10c0 lock r10c1 lock r10c2 lock r10c3 lock r10c4 r10c5 = "Maximum Monthly Paymnt" lock r10c5 r10c6 = ":" lock r10c6 r10c7 = r4c3*r6c3 lock r10c7 r11c0 = "Term of the Loan in Years" lock r11c0 lock r11c1 r11c2 = ":" lock r11c2 r11c3 = [I2L] 29 lock r11c4 lock r11c5 lock r11c6 lock r11c7 lock r12c0 lock r12c1 lock r12c2 lock r12c3 lock r12c4 r12c5 = "Max. Loan Paymnt/Month" lock r12c5 r12c6 = ":" lock r12c6 r12c7 = r10c7/(1+r9c3) lock r12c7 r13c0 = "Interest of the Loan" lock r13c0 lock r13c1 r13c2 = ":" lock r13c2 r13c3 = [%2L] 0.1475 lock r13c4 lock r13c5 lock r13c6 lock r13c7 lock r14c0 lock r14c1 lock r14c2 lock r14c3 lock r14c4 lock r14c5 lock r14c6 lock r14c7 r15c0 = "Available for Down Payment" lock r15c0 lock r15c1 r15c2 = ":" lock r15c2 r15c3 = [$2L] 25000 lock r15c4 lock r15c5 lock r15c6 lock r15c7 lock r16c0 lock r16c1 lock r16c2 lock r16c3 lock r16c4 lock r16c5 lock r16c6 lock r16c7 r17c0 = "Required down Payment" lock r17c0 lock r17c1 r17c2 = ":" lock r17c2 r17c3 = [%1L] 0.1 lock r17c4 r17c5 = "Adapted from: \"VisiCalc Home and" lock r17c5 lock r17c6 lock r17c7 lock r18c0 lock r18c1 lock r18c2 lock r18c3 lock r18c4 r18c5 = " Office Companion\"" lock r18c5 lock r18c6 lock r18c7 r19c0 = "Payments per Year" lock r19c0 lock r19c1 r19c2 = ":" lock r19c2 r19c3 = [I2L] 12 lock r19c4 r19c5 = date(31320,"Date created: %d-%h-%Y") lock r19c5 lock r19c6 lock r19c7 lock r20c0 lock r20c1 lock r20c2 lock r20c3 lock r20c4 lock r20c5 lock r20c6 lock r20c7 r21c0 = " Workspace" lock r21c0 lock r21c1 lock r21c2 lock r21c3 lock r21c4 lock r21c5 lock r21c6 lock r21c7 r22c0 = "Calc 1:" lock r22c0 r22c1 = r4c3*r6c3/(1+r9c3)*r19c3 lock r22c1 lock r22c2 lock r22c3 lock r22c4 lock r22c5 lock r22c6 lock r22c7 r23c0 = "Calc 2:" lock r23c0 r23c1 = 1/(r13c3/r19c3+1)^(r11c3*r19c3) lock r23c1 lock r23c2 lock r23c3 lock r23c4 lock r23c5 lock r23c6 lock r23c7 r24c0 = "Calc 3:" lock r24c0 r24c1 = 1-r23c1 lock r24c1 lock r24c2 lock r24c3 lock r24c4 lock r24c5 lock r24c6 lock r24c7 r25c0 = "Calc 4:" lock r25c0 r25c1 = r22c1/r13c3*r24c1 lock r25c1 lock r25c2 lock r25c3 lock r25c4 lock r25c5 lock r25c6 lock r25c7 r26c0 = "" r26c1 = " " r27c0 = " " r27c1 = "" goto r0c0 model on Spreadsheet-Read-0.93/files/test.xlsx0000644000031300001440000002421011130422501017007 0ustar00merijnusersPK!‘·„øÚ[Content_Types].xml ¢Ö( ¬TËNÃ0¼#ñ‘¯(qÛB¨iŽP‰òÆÞ4VÛòº¯¿g“ PHU¥—DQ´3³³³;Ê"ÚGmMÊÆÉˆE`¤UÚ¬Sö±z‰X„A% k eG@6ŸÝÞLWGQµÁ”å!¸GÎQæP L¬C2ëKèÓ¯¹r#ÖÀ'£Ñ=—Ö0!›MßH€× ¢¥ðáU”ÄÄÍsœ‹žšÂŠ;e¹BKH9ßõ‡5¶Y¦%(+·%q%5Ø]…Âÿ%Äp,S¡ó æ¡,’´e^@&¶Eˆžä@cº‡/kíÛÌ„*ëö1×{ú½ë÷doýæÓÚ͵]©ÜIJ¡M«»+4½¥·9Íz°¨,W bGàƒ†“g]ÜÀª÷zŒÈë×d°†ßÑ8á÷yСcø6œÑÑ‘ÒÝÀý£ú…{º+= (mY-+^»Á÷ŒÏ˜ ê=xRyõ3ð»OÇ)óÒz¸ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK!J©¦aúGxl/_rels/workbook.xml.rels ¢( ¼’ÍjÄ0 „ï…¾ƒÑ½q’þPÊ:{)…½¶Û0±‡Mlc©?yûš”î6°¤—У$4ó1Ìfû9ôâ#uÞ)(²ºÚ›Îµ ^÷OW÷ ˆµ3º÷ŒH°­./6ÏØkNOd»@"©8R`™Ãƒ”T[4e> K—ÆÇAsc+ƒ®ºEYæùŒ¿5 šiŠQwæÄ~ Éùomß4]¾~Ðñ ɉ “ Ž-²‚iü^Yyž¡\“áÃÇYD>qW$§K¹Sü3Ìb2·kÂÕÍ ÇT>:¥3[/%s³* }êú±+4Í?örVÿê ÿÿPK!5$ô4H,xl/workbook.xmlŒQMO1½›øšÞe—ÅE$ì’5r1$"œk;Ë6tÛ¦-.ü{§%(Ü<ͼ™yo¾fóC§È78/®èpSš!õ¶¢Ÿ«×» %>0-˜2*zOçõíͬ7n÷eÌŽ €ömC°Ó,ó¼…Žù± 1Ó×±€Ðm3o0á[€Ð©¬ÈóqÖ1©éIaêþ£ašFrx6|ß'Šß·ÒzZÏ©`}Úˆ0kßY‡s%Šùð"dQÑ{„¦‡«€ÛÛ§½T1[æcšÕ¿K.‚¸íZBïÿâ’ÃFjazdMðzÇ3zDЧÌFŠÐâqÇ£Qy޽ܶƒùd”ÇVÙ…|º¶I–è´ÀG¼ÛŸígDßM%:n!†Q᪸т$Ò§¸à©k"a+Î_:M/ʇ¢LçG×?ÿÿPK!ãý¯P®× xl/styles.xml¬SMkã0½ú„î­â@K·X.{ ,´PH {D²#Ї‘Æ!î¯ïÈvâº{Ù½ØoFš73oFåËÑYvÐ1™à%/îœi¿ ÊøFòÍê„àØàµä½Nü¥º½)öV¯÷Z## Ÿ$ß#¶ÏB¤Ý^;H÷¡ÕžNê ™±©TÊAΊåbñ(Ï«²ۅΣäËÉQ•é“ÀR] .ªÒƒÓ£ý3°ÙUƒ3¶Ëì™iäû‡ð%±öº,rTe ˆ:úl›¾%uã×¼Åã°B󋬾ÿÿPK!¼« 1Ö¸#xl/worksheets/_rels/sheet2.xml.rels¬Ëj1 E÷…þƒÑ>ÖL¡”x² …lCúÂÖ<èøå¦ÉßסÐv ÐMw’.::h»»øY9˃V7 8Øè¦0x=½¬ž@I¡àhŽ \Y`×=>lê"îk&ø“·ºÖ7'\ü»ûÿÿPK!°—j%Ðæ²àm•П›Ë“9%Ú°¶`B¶ÐgÐô"ýø!ÞIõ kC¡Õ ­é"ÏÓy ÓÙA‹H)Uà þU•§;¬pEðBß?÷Æ[Ú3Dê_8dYò2™ohMO¢@0ƒþuÍ;MÓ¸àˆÙ†ˆ‚2¡Ë ZO©—ÆNù‡ý&¶‘{),p]$Ô·©Þ_¹—®‘E (ÙV˜•w¼05-˜Ì1Ñ=x+wWÀ«Ú NØ«g̰4VrG°ÛGÛ1;» :Cß¹ .1Še¶Ç4bïÝä/àê Áõ8@åÍð-ͯ=hž•ÎPfKœÙCÊÙqÊzŸb'7V›¾¥¶Äèêü˜jeK^©ÍŽS²} ª9‡øvG„ó!»·Ò¿Ê~ð ¨ V „&¹Ü¶è"Ä9Ñþ¼da„ !ù«øj¡´mqð u¬‚oLU¼ÕD@‰”þd6Ÿ.FîêOÛ˜‘Ý;U÷ÒÙ¼Ö¸L€'f1™Ÿ£ÇŸ¯Oð…”Rš÷alÃ:ÿfÛ‘’›ÜX¼¤â¸\n§ÚIe㆒ã¿%"ëxB§>¦âÕax>Š qoìÒé&xÕÞqS¿ É.XË¢¸röÓO¬é¾¬Ü'ÝàâjòväV6¬ý| ÕV0E„îk{‡bËÓëüÏ 6NÙ#{aˆ½±ñ4P±ü9Sl‡—!Q/ª®‹ÀáúKÿÿÿPK!òŽöëŽD xl/theme/theme1.xmlìYOoÛ6¿Øw toc'vuŠØ±›-MÄn‡i‰–ØP¢FÒI|Úã€úa—»í0l+лtŸ&[‡­úöHJ²ËkÒf¶%‡¢~||~|¤®ß8Ž:$BRž´½úÕš‡Hâó€&aÛ»;ì_YóT8 0ã i{S"½ï¾s¯«ˆÄÁøD®ã¶)•®/-Iº±¼ÊS’À»11Vð(Â¥@à#³¥åZmu)Æ4ñP‚c{g<¦>¹¢Ebo#Þc !QRwøL ´h’ØÁ‰â\ppP×9•]&Ð!fmühHŽ•‡– ^´½šùó–6®/áõlS Æ–ÆõÍ_6.,"JëýFëÚV!ߘšÇõz½n¯^È3ìû°T;—²ÌF­ÞÉe–@¶9/»[kÖ.¾$enέN§Óles±B È6søµÚjcsÙÁÅ7çðÎf·»êà ÈâWçðýk­Õ†‹7 ˆÑä`­ÚïgÒ È˜³íJøÀ×j|†‚h(ÂK«óD- ¶?à¢dXÑ©iJÆØ‡8îâx$(Öð:Á¥7¶Ë—s]Z’¾ ©j{ï§rb&ïÕóï^=Š^=ròðÙÉÃO=:yøƒ•å ÜÆIXøò›Oÿøê#ôûÓ¯_>þ¼/Ëø_¾ÿøçŸ>«B Ífôâ‹'¿>{òâËO~ûöq|SàQ>¤1‘è69Bû<†µø3'#q¾ÃSgŽ@v…螊àí)fU¸qwO{ToN8sDb¢h…æ(v€»œ³•ØÑºJN’°Z¹˜”qûVéîâÄqmo’oæA騾gš{ X‡$! éwü€ŠÕݧԱë.õ—|¬Ð}Š:˜VšdHGN ÍmÓü2­Z3¸Ú±Íî=Ôá¬jÕ[äÐEBB`V1ù!aŽoâ‰Âq•È!ŽYÙà·°Šª&9˜ ¿ŒëIž ã¨)«ÆÜ°Þ’Ów0V¥ÛwÙ4v‘Bу*™·0çeä?èF8N«°šDeì{òB£=®ªà»ÜÍý ~ÀÉBwߣÄq÷ë‰à. )ÍD¿™íK`j‡cšü3 llcà’ŒÛÞ&lMU)±}Š‚áþ…Ä»…'ÉXŸßx.y÷’w½ÿ<ï.Êå³²íŒ`{uñ` cS&Ç‹«ä1el ¦ŒÜ’¦P–°[}èÔÍ‘Ǧ4‚fÆî.ØŒA‚«¨ŠN¡È®{ZH(3Ñ¡D)—pº3Ý•²5 ueφM}j°„ ±Úåí^ÑÝùá cöœÐAsE+ZÀY•­\˄²ßDY]OêÌÚêfj†ëmÅ’Á‰óKƒÎšP† (^ÀÊ«pJתáp‚ ´Ý휻Åxá"]$#ÌGzÝó>ª'å±bî v*|¤Oz¯±ZI[K‹} mgqRY]cºÜ{oã¥<‚g^Ò‰{*YRNN– £¶×j.7=äã´íá\ Í8¯K]ùaÂõ¯ì}‹“¤E8YÇÙd6Y>óf+_˜›u¸«°vŸ[°£"RmaY æU,Ñšìü—›`Ö‹Z€ô7˜ÅÊÃ?6 °£ëZ2_•]êѶ³•ò‰"bGhÄ&bƒûu¨Âz*ázÂ0‚~€Ë4mmóÊ%ç,éÊWXgû1K#œÑ­NÑ<“-Üäq1óTš¬­rîfqç_ŠIù ZJ9ŒÿgKÑû ܬÚ>\æ Œt¾¶=.TÄ…Òˆú}•ƒÙ2!ZàB^CPÁ•²ù/È¡þosÎÊ0i Ç>µOC$(ìG*„ì-™è{°z¶wY‘,d"ª4]™ÚiÈ!aCÍ«zo÷P¡nØ$£ƒ;îs–A£P9å|s8¤’,+¸&'ï ®|l2ƒ>—‡MA“Û¿˜bÅ®jÇ›áùÞ{šõgeV#Ï PVÚ ZYÚ¿áιÕZÆš[ñr3Ÿxq~ÅÐYD)Üú ýû>#&Œõ†:äûÀ­¾6ha6ÕWlá4AÚÎN¶ÓúY‹²¦ÍJ'mοÉß…ÞSÆÖ3;‹¿Ïiì¢8sÕ9¹x‘ÆÎ,ìØÚö-45xötŠB×8?Éǘ[åoO|ô½wüf¿FÉžL¤{Žà¸Iä&:ŽÇ"ÖoùxŒŽ ÅM3‚ƒ=ìX!:ëP$@o^TçCü‰T7 7Ãñ!°Š‰Ý0È[8Ê[þq’7E‡6áL¿zÆËx]ÃjË*\v*ïÚÎG/övåbY‡‰Ã"ËGÄ%^|’Æ&ÁA/ Ì%jÛKàó¤§)<&ì,vÝ2H…); lc Ê¢ê°q$ÁÉÚ#LÁÝð¹TÝŸ1ã Ïg4ŰÏA­üá ˜{/i}my >Ÿ*ó ’7Fyc’ÂÖm˜(íÒ–j¹Ú,ÈXrmox8¹Œ6tÆhË‚ r`žî€³†ƒöÀìú‘¢ÜøÿÿPK!¢Iïžkixl/worksheets/sheet1.xml””Ms›0†ïéÐèÐScÀvüU “Øõ¤‡f2‰ÛœeX@¨´¶Ûþú."ÆxšÌ´>Øxíû®VZ«Ÿ¥b{0Vê*âÁÀç ªD§²Ê#þm³¾˜qfQT©Pº‚ˆÿ˯â÷ïƒ6϶@F •xX/<Ï&”Ât ‘L›R ý5¹gk"uI¥ò†¾?ñJ!+Þ*,Ì¿hè,“ ¬t²+¡ÂVÄ€HõÛBÖ–Ça*‰5b²ˆ_‹Õ˜{q蜿K8ØÞ3C±} BJ à¬ÙØVëçfá ù¤hÝ‚FQ$(÷°¥HxL½ùÑz8¯sˆÃÓóÑmíZqoX ™Ø)\jõ$S,È5L>š^ò#|Ї[yD‡ÇúWE}`Ô/*×Ö¢é~°SI¼¦(¥5ØÇ~èí©˜ä…ÝôYpÎV}6ì˜G^áðUCŠv†£.ÑsÓg㎉Ž^¥h'zÙ%:ÑeŸMÎ٪Ϧ;3lÎíï¶Q´3œu‰í.úl~Ζ}œúÝ:¶× =´ZäðU˜\V–)ÈÈÌLgÓñ¼÷¡q3í±¿ÊP×odm5¢.߀ÍÐÕ˜f“ ÷ñgŸ/è€2­ñmL7¯©üpW³LâFo&½,´‘4‡nü"^kƒFHälga-Å{J¼Û•ÛF®WAËkZ¯VµŒøÈ'zù Lzòkë]»²˜P2¯ž$/½kGR§é­ÛUüA”õ§¥ûæ}ËîàÀt)ªï”0ÜÑ`è~®Cï”Òcëó?:Ͷ˜»wb/ ¡×/œÆ®{IÆÿÿPK!ã)?޾ xl/drawings/vmlDrawing1.vmlìV[kÛ0~ì?ï¡/Nc;uÛ¨v ëèSéÆVØÃE±”X¬clÅuúëwd9·²Kaäek ±|ÎwîçCIÚBüêš6©·¬4­³\¬2« †™dPЦPÞÛ7=~‡„ÙLf‚ºÇÖ¦}h3¡¼ ÆI€Ö9+…b+XÒPÑšÔ\šNmõ’¬ÜÓÎ K½Èv.†{>&Iã\šU)ˆä©wßø¹7Qy$¨x-ŸÚ‡§Aàw¿A%F¶L‹”Ìä©WøÊé+‡UîÑŠ>9Œd*XòR×f¥Ðk!¨\fS±ŽÈ¼b\ mºRa‘zÆÌ@k‘›gêUxZ׳SÀ¦šÝJê(8{ľÛ+Ï%qTB-MÙ´µ4âÂU°j.õ@‰™¡áèä8ŠKsÑ ”4v’GÉMNÇcTæBÎsCãøØBŸRsÑÒ°óÖÈZN¥’fEsɹÐGd&•Ê@A•zRÏà=Ëó –š“oçÁw[3¶I˜8VÌ–6}´–84~nÛÚ6{Èá‘€îºØG›* …þ§u¶¬μïåfϺ­A‹íŒ .ÝZ»L„$\6¤o£U ˜’sMmÓŽ&ɵ.6t×.i镲3þ€»I>NpžwÝdoÁôûBôWï«4ù•PªvEYñ¥Îr¨\$òIû$ðÉ™OF>9Å—”’á> o [>¹fªVÝ¿»RZú©’Ú¸l¶˜]áx‰Ó¸Æ!lQÉ.äFj±é$kˆ~‡MÛB6’5ä3R ëU ©‰­§K ?ß_ËP,ŽZ×GÂÈp°‹7Ã,*u‰KèD†½ÖÜt¯â€”&ç8')ŽÍÈ®åQB¯7Eñ®ƒóª‰Iºû j"°þkØ[#¶Z-Öèßô’c&§LªMÖʤÚÎwêLN™T»yë˜IÉ}^úwÐécö ÿÿPK!å€ä „xl/comments1.xml´‘ÏJ1Æï…}‡»í.ˆÈ&Å EAŃ>@ØíògÉÄÒúô¦Ín‚॒™o&_~IšõÁ¶Ç@Ú;ÁWË’3t­ï´Û þù±½¹ãŒ¢r2Þ¡àG$¾–Å¢i½µè"±dàHð!Æñ€Ú­¢¥Ñ¥JïƒU1¥a4T ˆÑ¨Êò¬ÒŽËF}ÅÁšùôºi ‹rRu:òES¼$,`/ø¦â,÷?w‚—É2â!5…4ÞÓDßl¯Lº_É!I[ïb‚Væ¤õÊjsÌbuà¼1Ê7‘­Hnœ ÃÄò›£¾.GU,Î<—õŸ\W檋ÅDVÿM4¿Yþ¿9#ùÿÿPK!…QA2docProps/core.xml ¢( |’ÑNì †ïOâ;4Ü·÷ìFÉ.&j̹p“S£ña\Ñ–@ë¾½Sº­»Æ˜pÁÌü|Ìü°<ûhêì|0­]V”$«ZmìfEn««ü„d!J«eÝZX‘-r&Žþ,•ãªõpã[>’làÊ­ÈsŒŽSÔ342¨°X|j}##†~CT¯rô¸,´(µŒ’öÀÜMD²Cj5!Ý›¯@+ 54`c ¬`ôKÁ7áÇ©²§lLÜ:œi×î>[«¡8©?‚™„]×Ý,µý3z¿¾þŸFÍí½R@ÄR+M¬A,é×wáíñTÒS€åAÆÖ‹Å¼y±Ù¹GÛÓé±Ô›þ Û®õ: à B‚† ¼qŸrÀ$P]Ë×ø¶OôùVd ñ-ÙßááÝôBüMŠ)ìk½üÆA ¶(YžVU–¼\ð{˜˜£HÆ‚ÎÐJ>?Vîf—Õèæ<ÇÅŽ+ÆÆÙ òFUro€Ín”߉§©ÃyÅæœrVîGÀàåáwŸÿÿPK!½cõê„"docProps/app.xml ¢( œ’AkÜ0…ï…þ£{VÞ%”²È !!äPèÂ:éyb×"²$¤‰Éö×wl7»ÞöP¨N3oO#©›÷Þ¦lƒ¯ÄzUŠ}Œõ‡J<ÕW_E‘ ¼÷]rïQw³"ab¸4LØï{:Œïó»ýMÞS'öãûÐY‘ø>qïéš„åS÷‡©ï3¬üJœ¼àdzćO'ä5>œ¦=zÖy†#g‰Ÿö"g }8MË õðñ9…>üÆœ²R_­Ä?ñâ5ðÃïýe’¬ïƒívûa;ü@£ÅÀšÍfƒìîÎaw—n½‰‚,•çH@R°x`}°eÚI¨iÚC—ÂÍê™Dà¢q絿,ÀŒxYÔ»t"07²ÄÇÕ;ôàÕ;ôŸ]9ɲ¦N¦ƒGv3ûñøeÏ…hÅJÓ•ùkp6óÔ‡ÏSJw®¦ä 4s×6ÍÑ ÿ|z{6ù6ò$wÏ&wÀÝ•8]UKg X ƒ¼¤4Ý?-ˆ¸æ{ßÞ%޽ZÓÿxüòä.ÉÊÙ'ö/'6ü0Nœ0-™"¤ÅÑOeÐÌ <ì.ÌYð4æŽK ¸AüécNþÝå^þ9­Ä‡þçÈw‚~q¼L°òƒ·òúàüÃ_Hª¢÷gš,}·ÂÈo5ÿp”*¿Ôï™MS ’Èg•¹¢‰Bv”Ú´ìÞ_Ï‚ï“á¡o\ßsz?Ò0¦©G?J††žUŽU[kçâ­Ç û½o¡ÏzjÒ{|ªÍßiB@Aåöä„qiýR¦áÆ×·5)CÀ“}rx­&Yû‰Ë"üÜ%Þ%7ð“8‰ˆ³êýDþ# i­£u€Ë­©§Ÿƒg'|ë}~üZÅÞ‚S»4î`/#ëŒa³üUÀÝl ±w·YŽÀÌ—ç¬R!LmÃ¥§oO?hyœ ˱A]·X\w6 eÃ)ß52;»þ2ûy” —Z;°ÂñlÌÎF‡ÁföË'/ëˆJ¢Ä'qoNïŸY«ûn<6v`SèÒb‘|ë{éÈÎü0™Yw~Ö ü9çœÝ–sÖ‡ád8åsnØ^ÉM­©Åçܨ½’›ã1Ÿsãöœ»997i±äF3›Ï¹»Kn:ãlÓÄt8ãsnÖ–s6+9›‹sQ]ŽèöÄ3våЭüVzqIüÅ2I‹ÆšÌ† ý¼Ë›˜tø+'0O¢ áq¼&@7rܾ›YŸ;AÌåyMônäùд§­yMdoèxºÛq¼&ê7sÜMZrÉâAörÔóãuà¼Î¦ÓÙ–.Œt2õÐ"#yæñ»ºqýþ™Fl)Ãíê– tûsà/ÂT»“áyuÓx*Ô ó:˜ Ùø¥÷µû'‰zÅ'6·ÈšvIÌ:¸~yg准&dÁ,zþ‚MÁÙÀ!ƒ®@ÛYg9rY¥ÅPá†e!úQÜO×0>ýfçUöq÷éÔ@QM|Œ]Ÿ=í³y—q»‡wÉ뚆éªQyÛ¾XªõÞÞ™{oç‘ã&> Ϲb¹Âþ$‘“Ð:W=Röû$Å%oÓ*¨¬}óÀÙ,Q±nv`pÿì™ñ©›×’`§&®(-ãìCÑ"ÿDæÎ&8)Öñ8öhôÐÿõ|n²¥­,!Ý$’r4rx+½n$ˈnËñ¡²:>šêK¡ +»ûÿfW-s\+-° d—óRY:^ºÖph9»± =e>a—æ¶EÏXÚ;ð)E7œØwÂ҇ÛYÑw+ÎížIYOW¢òZkw¿á4 |b@ê44¢˜æTE¢Ôé=ˆD1Íù\å½¥N{CìzÒš(ï(u:(*Qt×óþ‰R§I#v=š(*¥n}‘(®«»ž÷O”ºµ4¢LÍô?M”÷N”ºu3N¢ì:]UsÜï Ví¡gœ+>Z¦D'ƒ0-©Ð,$IQ ˴ʤËôHQ,Ó•,C3Eõ˜ZßR‚eHJ¨8–éS–!ɨ¢zLÍ2%X†¤ÁŠb™–å”`’€+†eZÓS„eHê/Ë y‚ÇÉö•ǽ“€Á£õTh vûÒ1Ë´¨§ËÚ—Ž¹X¦E=%XÖ¾tÌÕcjQO –µ/s²L÷˜ °¬}阫ÇÔ,S‚eíKÇ\,Ó¢ž,k_:æ`™õaYûÒq1qäqR†òX: kq'—ò{Ýp¤¾œÍ ž]×CaÖ…è1´.åWôX?UôN1|&rÍ#¿W^Mˆ›w°ëÈÓ(L˜}†mø|©¤Wù>g]ä&pŒ¥ïy$ÄÊ…H¥6¿·ÞÖKƒF>3â$> —ô¾ëýãq˜ø‹Ðˆé&rÆ‹lØØëm½«±ˆ¬‰sÙb¸Æ¸œµAשõ´’ôó®µø+¿ìND;[´pÆ éÀÊüåÔ›cÊÄKVÚß„s?9.–™*ŸKèzß(Y: æÓò¤á¬œhá‡F@æÌœéïjuù‰.Œõ˜okgÁW©"…ÑNWꊵ½€H«W‘Räuõ:÷_ße…:›„®˜%÷rîsýÐ'ʧu‚jZ¤ØÍšÅãVëX¤×Í:††ç6«Ù2EÊaݬç†QÛe9#‘к¹Ÿ±›uÍ·[¨e‘ÓénÖr“ÈÝBE‹×'ºVÑ C7 =¡-^ÌéZEsÇmÑU|»J×{­â&A[t-ß®ôu¦–3ÕöF+ùFË|—bØ-×ôÍ)$–ù.e°[®ãÛTH”°“M?ùÕMLŒ­ztkd;OŠ}@y%<ˆ¸ ¨÷-ô]V½Ç'½¨¥í@–…$³Ý‰~ð“8‰ˆ³êýDNïÉ ãÞ# ©&SkdBÒñn€LOßž~Ò’@!$‘ð(ôeãú^‡¾¾­IÚÝ›¦RTB’!o‹Jš?­ñIݼþdãk)Ìy¦'Š7Õ¶1Y“!pqI.½ÎÈž“u>H:ì Ðç¦fc]£’È{4ºyX×ȃ¤ßynhÖ5©£MËž{uŒ9¶:‚4|Öå'Nà»72_/©eÍÕóõz„kæë¶:ês£¹—&‰ÔÑŸ¯ši2aIºÁoVaÅã.Ý=îå-%ÿš„ª&4@´é’²=kŠlоC68œ dSF\ƒã²ÁÉÙàÝÄ`¸Y=“¨Hù÷uï¡o§cÜfôè¶4b 'þ1{½"àì¿ü:ýR Ö\ib¹ïןÒòqP|`œ˜hf4"ºÍEDHˆnõ™ÝB7º]²1ºÕ7–ŽnÑÍi'¦p3ÓBJx9o|F-rpb‰5µ+Ú^Ed ,2ˆh=•Pf‹X³ö°ÒÍma¥íÚÂJ%´¶°Æãö°&£ö°î†"±$Ç”·¼²EÃ"š ‹UXh°h…„6„Å+$´,b!¡a1 m‹ZHhw°¸ÕMr4EJþ±[e0….0¹pÀ†°À…‹[8`#XØÂâØ´pÀî`1«)˜ä  ‘ fÕQ²ÐlXÌBB‚Úµ°Ð`a m ‹[HhXàBB»ƒE®Æh’£ ,T6QÁ*à ,xaÁÙ°è…7„…/,¸,~aÁa Á°à&°†w‹aÍá$‡XÐlª‚W†X$Ä´aÑ r‹h˜#XTÄÃ"&äÝP!aò它”z`‘µá*YeäávHr G¬C’A8B’ÂéŽ@‡¤ŠpÄ9$i„#Ì!!rD¹wªÈ@š­žŸèZ˜ ]jÀBW0ÀFÐ… °1,”á€M K–`wÐK °)tÁ²­]*‡WŽÌíçü9ݾšToç´¯ÛÎi‹ÜÎY_éN†f¸×4-ÊÃ;}ËŽÆûúÏ>â`.¬ûAÇžAǤÇÇm‹WbîÞpOþªôiS±Öö>ظÀƒáè¸À7cáã; l\àÑt|ܶx%½á{ ƒ¯Ë(&­Ø ±|3• p`¯$xê[x«„ãoÛÇkoå×_}±Ey1ÿê‹ò“GÝMº ”… ûýéÿPKà·Ý"æ®PK—pä4 styles.xmlí][sã¶~ï¯àp§™Ý™R¼H¶.±äÙ¤ÝöaÉÄ»}ÍÀ$DaB´¬>ö÷ôWõ—/â]DÙ´ÝÍL6€s¾óáà€‘›Û'ßS!‰–ª92T6vPà.Õïß¾h3õvõ§¼^#.lÇ> ¨Ñ#…5¢ER¹Tc,0ˆP´€£µ8„AÖhQ”^ˆ¡’Ñ™ls!\lMá•mÌeKmÁƒüÈB¸ØÚ!`+Û˜Ë2L‹Í×X¶ñSäik¬ÙØE-ž<ü±T7”† ]ßn·£íx„‰«›óù\µ¹Âv.ÆÄRŽ­CòÁ"Ý™z&ëC dõã²E•‚Ø€D@Aͫѣ+͈G·{ˆ47„pÙ½cGÞ½c§ØÖtÓâ“™~Ç*Å¿î¾î¹@|Ù±¸l *› PÚÌDºØcœ«Ê$T¨kÆDOž ÒÛNñ-A’‚¸Ý)nÏÎÇ~hLÎÔ™„9MU% !¥°µÊbÔ³ø´6Ôh{Ñê&áV^¬$Ï£¥ú™ à© £P&à#o—•ëÝ¿BÊ,UþŽéÙ üBýX’JŠT¥Ô-—Ö\@‚V>v dÆ&¼OÓR~úÖ9ø^¬¿Ñc9@ùö`ûè%±ÞFÎ1[½Ö5@´EQ$Õ¿ò=@l„ÊÝ}«}UA ¥Hq»A”õ~ã¢ì%Ôø¶ a6³%4Ù‹Ë{½("j³ºFOÐ9¤æOˆF”@à+ÿ„$ÿ¸UѶÒ¸ªégï;åóÝ·&ö¦œÊeÔI{Œxl­“s`Äìk®Tyò{uO³HàãlN•aês¨tÿýþo´,‹õ¥˜Þ¶,¦åI&ŸàÀ5ˆ½4¿ÏzNµù¯fCÏS3ñ}‘¶ºŠØ® ëÊF>`4ZªÖ¦ànê­XlpjŠ(ø¶Â]¡ÂšÀsøz;a^’k¼ð@àÆÀe06ŽJ˜AßïÕjkåO ¨ÎT!“õ“‰8€Y]ÚeSÕ¾kž£zð©iæå}ç2M½—+¹oœ¶ºI²ï4 /y2Áçž,•„”ôÉG† ]ÖÎA. “,·5ô™÷aÇ„°=ã®i(Ó¸þÕÈìxÄËÑù†‹’ª ìüìeÚì°E=“Íœ÷ËWuõßÿ'W­ÒIÞ9§ËJÉÅÄc³õuÂvã’պǡØ/ ³ p•‘‘Lmcºà®‡ÙÆêÃzm°?|¬·Šaq,­2tÂ|‚¢b+ð¼~üôƒK\æÄaè¥hk%böUû,2éaj }Ä'gô^uèιÜiî Ìº'¦eN Ñì}1bvR¨!ÏìLòÌ/Lž~bqoä™ʬ‹0b~#Lã]1Â4ž?œ —<ÂùçÇ”$ÏXˆ˜­æÐm­rä [-9[µ£àS®y@9EŒéô€ŸåæG÷ô0“é!Ñ•w¸+S®«3–{¦0c÷ˆJùÕ’¯o#ydöJÎÙa¥ŠgØ+9o¹½}Í]ks×êoîZ=Í]묹;¾äZ;°,m|ɵö2ùضʮµý¨ZŽÛSH2$Œû ãžBÂø¬0¹ôr>°°0¹ôr>°Ð09j9=áa2Èð0é/`Jùí[ÆÈ˜Ï&É}z»V©:/¡)Åa£še•ôš»{Ù’óò«q!¯{ÀÄáÏÛøY¯K5šNfÍËj¤md¶vPÌ 0Œ?¿šð;üÈÛsÐbäà˜õ=7‡ôÖÄ-­ðA”w‘§si!ï©kY¤]=ßK`YÝð„z¦GáÕííí^-LKŠ*PsÔ² ŠØ–}WKýhòÑ妤{†®Ìl¼BYM…¬«æ*è5!ûä B°V Øl äò\žës$ÖÊÇDŽ"êE’çO5J#•Ša+£óCF­›K¶eÍ…4ñæc©Z†q­SÍ`qÍ˜êÆ„ß^{jÁWQ2…™öæõ˜,&W¹ÒMì)ë÷b”Rô¢ xÛµšÏ‹‚IÙ‹PÛqÏŸ¿Zÿþ3˼b’ß®—ö¯U%+bM|WøzÜcÝ %tQ¨¾ˆ,ïRe©& &o¨ÏüE ¿GûV5Áw ×,nê>D«‚ÐÛ™~zsV¢7ÿOVÿPKƒˆñD „aPK—pä4r7-(77meta.xml OpenOffice.org/2.0$Linux OpenOffice.org_project/680$Build-8825pc092006-07-04T10:45:04H.Merijn Brand2006-07-04T16:04:452006-07-04T16:01:26en-US2PT3M19SPK—pä4Thumbnails/thumbnail.pngí—‡3Ü÷C âQ#ê"¢÷,у艶X5DoÁj=z «D‰½—h«,Q6J°zßÅêÝ*o~3ï?ñμwæÞ3sçÌ9ß™;÷œó‰ÑÓQ'{ÌøøÞ½{d¯T þÙè;ŸøÑ¿“Kqïkµ†Šâø®…³ÍôW¹ †v“WJÄlú”ý¡_IÐ3/¡Š³]F"öѱáüB<¯¥uô£ÒëóüÛÑÚRÂLf€áŽæã8Aîï3§jˆ B»aeÇÑG¦“|"bOÑ‹j zq_Y.QSrMY{-Y—›£-%û7s)ŹFQúLaH#·n®ËÂi´‰•©WQmXô»ÖÓ³ÂÉÔ×'É7ÓµjÓX÷\þñ¼Ç„¹¥eb*õHWÌn‘÷ãÉîyûnì#üé½ÊbT׸:n¢D×öoÙÛ‹Íl÷j»AjWW‹Î²@Ø&ÉEÁሀSçjÂU¢IÆ­a~–*¨‡ªH˜ºÏ›­gzd÷U„ƒÓŽ[3ç^¸1Œe[¶N"N¶$¹t´¶º¤ ]æ whÏö‰²²oH6Vz°8\ïj_Üá^Û~Ae%ùP¦0ÆÏg¥8ÓñDõ¨Ü²=kIN”/ÛËÆØˆ”öf”फ़™y a<3iQ1ÁÛ·/}%E^\,\íe¨NoZÙØ<ïg¿ODžßÖŽaçåø’ƒ›ÜúÎvçj\ç$!Õ eU±ù‘ãîüMÓÁ¦Þ+ÔR·zÌÔ`Ev6Ü¿ ƒ óÅn…#G¡æÞÚ¾Ð_iÑÕ<ÉúgÕ¤s‘í¾-~ˆ‚M¯ w\(íêæ‚bô Õ¬'¾kÏ´x—”e‹;“³€><—(Nê£iºCn¥ý î/áYæ–RSƒ±”ÕŽ)‹u¤úfeêJ!&”TiêÞ (Ÿf~þü­ªŠ¢Ém1çÞ9RçPRI "Ž’ïÊ/Éh~ƽO—øí›-üJ;¦$B«œÐ|®òî{$“K}u /o–‰ô“‡¨+÷£’'Épx¼a‰ŽõÞ|K™mvwWÕÈ(C&W.ÐwRÒ~ݤ†Ðl©°Ù%­5=ôŠmŠ’ðnô—w÷þ£Ã8ìàúoUH1##ñƒr=»óóóµh…ëoW6h`ìE®ÓËsE“[äŸ`ºg‘ÿ.+æÅZF|¶¯Z6k{%bdNEãÃè õTv÷ýöÓçhòµs…×C; ‘°4ØA8ë›óλ›W ‚`Ÿ‰Aéãlb³Wž]+\Ȯ̀Štl%¸BZ4òœº{µýƒ’ãyN^r²•gÜBîYÿ‚‚”'G|,ë¡ßü¼6™?ù_{‰|ínèš„§ðAïpyrÚùW‡ü^@¿•kÌÄ1GãÐëÏ"»õùÓj Ö¦¶æ¯ó w@Ø-‰·½5 ’£ÿ†LØØÕÿ¹Ê@~Å~zÙÒÂÀðûsÃ/x5¦¡ ÉLŠ•ü„ŠãÿMÂCŸ—ÙXï"?Qÿ­XàyžÁöƒxÿ,ŠÞY¦}ž!¾¦_´?Výßý~˜£‘ª]¼Š‹ 4CÅË3:BÌë•Àɤ§ ÄfâoÃŽ`ͦ:/_ö”Í? VFÃ`4 w÷ô_APÆ ’’LbÒG×~“÷͉¶>Fš<é.ý&U¢ýB‹ô;m«¦Jˆ!¥Ï W5>Ú‘°wk$ª€­-1éY¹i+·ö8Ë eœmˆÈ8‚²¾xû¦åu»»Áo¬=Ö¾‰ÞU¼ßÉ˦¼îŸhñ~>ûxû>¼Ö Tu[ß«CxeŽöœèOÀ /¹ó­Üvœ»efsë ¢¼··Ùá¾¨È ’ž¤çñ<Ùâ?X*ýWœ½õúŸY)ÂŽr,ñó˜'ZwJ¨|ùŒ ó÷C1¯£–¥uÚF Fʪ“ßÙ[ÿa$@)¬Ž`©ˆgk°®+çF샓úx_*ݳwø=P’p’îóP˜Sƒ^sXóÝwý犆#åÙÌhØœ”_p¨3ó V _Dm:ŽgÈ&ízâ†h1¥Ðì•AC -r™çž\Ì¿ŒX‘–øRF[õÎÞ±íá“‹•¶Š:Áw¹÷á:C£Ø¼œ\„âhKºH hvtˆïÜå*ÿZm ”gµh¢±{;i„<_Þ|̽eIå{ f™ûÕ øEwcÊãÍâ›bˆ‚·žxg,ÝP»i QOHQ;…I¼üËÅ£©ëöŽâÀ¤¬+ü§ðÜ& &È•zêb‚ÜDŒ ħF,J€´¤ÞÿÚ®@C$¥;úŸ$±#ø0JRºýGà.ýÂh@æh¸­Ôw.vžã¹ÚÒ¡dzúO:XÛæ$Û:,âñÕÐö+¥ü ï!H·N÷º%ÁÞÌææÿˆ[~µÞ®ËžË/¯JÐmJ²$fbRÖJ}ÂÍîvK²UÕ£kjÖ‹ürm+êe¬ùXèã!›†§þ¼*®ôƒÿÑwãù`‚Ý`í°BÏ}[P6Ÿ]‚XÊ{€¨‰Y¤m¾UŽ6WNf¸R/'Á&×Ë-G . Ý€nƒIëV³7šŠtÕ›ÄwŸ×œºœpH–­Ôõ® ÿÉ;‡•<+IØC¹šRuàS—7®ýå7]ô¬¾OçY*Ý[nYd¹c“EÀ(–ç©´ÏH€ä(y\êZë–IËûÙ’Ë,;J+±úîÝOã´µ˜ÛfâïÅ[üUe=n-›ÂdKuHƒÌ©/Ó[¸ýØÈvýµUÓâ“%9 M>Å (S%zÚñv¤È¥ë8ØÓY|P{B`¡MÚÔ©"¢m+ŠH«A•ÃÙäf/P'"(çé²>ƒ¾àÂȂçsR¨÷ï×/¾Zà:]q–³æ?zkPgKÙõZ‰yGHÕꆿˆ½IŽ’’Kƒµ“²Ê´À0z/Ý=%~±&¦ wRd,Mú·ôIð—âñz‚‡³×ÜíU†L^9–0ìÚÖ¹*¯ÈìàïÁXv~î=Çèè0`ÙÄh´ÇXðúh~V3ÑÏÝêîoÍ×ûlPæçÚ»J ï7Õõˆ»Õé"C«³V“ñ1ÚÖ9ú1õí¢ÿÁ-™p…¢K‘ŠG;+A`rñ–ÝÅëT“Ûç7„’@6¸¿5YDþ†LÙ…Î2ìêj¦Z1N Hù†Ýk >¾Î^úõªMñAx°Óç4ÏQ7g¼pÌ¿´ß‚L%ÅŽ~nðÀÙŸ‘5 Ü‘—‰ŒQ…¿ý¥í4 3kx×[}ˆ«#ñßo§ôòZæ' Ù›VúYDÜêŸØ-$mSï"’´lí¶ŽÞ³º“ÓjÛcaÒÆ,ÕÚ¬!Äef2‡úc1‹_0å4´„Mnîí¯qNµBG®áÁ8“á÷ Ç\Žmb€«3J·³ù^ð[÷o¸¼¡I‰øU†> ï%½æ÷ÌeT‰­w”“—é×Èßš-%}aI›‹Oq/Lì±,«¾is`\§ØìÏ¢›=ûH}1˜s=¾ —œp,ø_h‘«Ÿ_ÏGÁÒKkpè=¯áÉmýDkÕ|kõïÇ{üŸ«~´ïSbHbš½ emÀ6~ýp®Âü.d&…K‹CŠÚËŽª{ ¯w…D"k¬ŸdJÆäáwùeô 8š±l1iߺý®Cèaeõ}±æ~£B̈E›þÕNÈ¿ëùË×£òÈyÞN²ç'^‚ÊŶ}ø}ð ;òj[U)¬âZtðþYš î»;qîʪ´Z9¸lß÷°¬*yð™ÃÕ”À­F*`¦ï­û»Âó°§ÉIf~Sœ 0•Ý(äÞ§¬·ì±X\ ûÂù$yµz× ÌÄŠÆy·™ìWPYîÒÒèNàcIÙ]šL–üÍô™írç„ÓÖ`—ä¸íà_¶õ^½S–•Ãw^So•Q¶¶—œï¯ÁOÏÑ×cΟû›¾8+Œ “ê¾­êé.û†WU)ë&°*vdá®;í»ò©?ÓLX:óX‹…«ï@"s¦õiAZѽû-#ÄûXÎ,{=Ÿ‹¹fñê,¥*N A·øx³VkÄÓùfQÚ骒1ŠR%CCI·%–Çw¢÷+œò€‘›ÈF/ò ¢Ù3üzéÕÞÊZ é˜úJ‹—Þ¸%Fõ€Û£ó¨oëp J1F/Òò˜=&·¥µè-e/‡Ÿþíqð£©L¥Ô³Ð´ù‚6´Aƒ³|HR­ Bž”ëqVåÈ’Eª8ƒNDTšÏ.á¤ä¦ÛŠnsSOæO¯Òw´W˜,|ÅéÅÃgM,0œw'}t´u¤t4XhÒˆ£Ô›Uµ7¾­ÿÝW‰@¤}xf™t‹¥^ 28ŸCi®ö¬Ÿ ‹V3_ P© ë|ݪ¢GÏdÃôü+RŽ'ÈyïðèHá+6Üû²Ã0H×G \¦Š Ÿ¿KÇ;•ˆÞiQÇšÓ¥>Q’8v)©#ÛpQ·>&{Sw‚eΨ?±Ï _êìšv}Í¢jY_68n5*Ül19èi»M™ŸœqÙ¬õ7žN‹ÿû ØÍûëH³^*W3)j¹<9p éªá1 _ÿ%OXëÏó/R'Ññ$†_wp3¢‡×ÜÀ …jn§9¹Æë{7WxýŸz ÖÏaaòTvPÿ*~R àÖ‡ )–On»úc¯ïVuATº’ÛE´Ž¥N]›0Ú1ð‹@ rOJØÕDdú##÷|O0!¨Î|f{÷ïÎ<y¯×Zijýª)EŠÜº¾ðvbkٲ÷*Oéí¿î¡Ë~“Ð]eË öôM9hÓF4­ÂK¦¨O€Ìñ%y\•HZaþõo’UòÏükìV¼äú=i²[Ú‚ q˜ãßÅ1~îl`¡µº@iÇJOuX‚Â¤ŽŸ ø?Stèjr¬øïGç’Á]± Ä(, ´ZÌÛ™‹Úà§Ò¾:ÃTqÄZAxY|ȲoÞnDäùšßÁ“…Ô”oW³¶Á‡êè€W‹YKz( ¬ý>sã¤_]=,’†?roÒÉܦôÆ»-;ÓÑTw2»’¼âžæ½K=Ùð[‚’Y™ÄÜõ«s¢Žœ²°Xh „çÃ0â½Å>yì>x2'£N0¤ð訓ÅÑÇt—’bóøÄõ£—ah…Émué“» n| ï5_=„½´f•8Î %[žðAþÉ`@ek ÔݲUÿ±§¾% ¹6VJ¹¾>ïštÿÌ…©ÆÕ¹Üc6 ‚º–™O}ÏW;$U°mT°™îÀèšlãdúÐCSC&Ìf‚ ÂH{!­GqÙΘ‚Å2ã <«”'S+¦1[ª]Sã•!":,Mºß\¦æ®x „“D/c« vɇluìúu}ylâV:š^FÖ–˜˜4Öþ‹²2¤.CÔ·çL*ÁÓ‡ÏâˆKfËÔ¨˜g(L­Ñƒ©I²uß#1,‰_À[Cº~ØO€»ÔùC3·^dl_IÀ6rog„Cú›ôâWºwDá 2û×f.Å%ˆö"æÑœ·±*Ò0ŠÝì'¶‰Ò;ª&Գɮ}CÅ®;%Ýýœó‡G˜ªØ‚ '.f=Ð-ÁÁ—Õ†z½¢DFÆÖUg¥µrAg`hžð¸Â²Bî»?Ý”8îý{ s$8úÞÈ8 …I„íŠK¢7â˜1ÃuJòW×óy·¦Æµ÷´+x¾¡cpè;ç¿§»ážH1+´Í,óL°cøŠ;Σ jn·“¯¿—Ÿ®>Ø ˜bˆ«Ó¾™ |ˆiÏKÁ$¼ –RÁu£š\¹e™{Jˆ®(9†ÌC|·‹yæèø¶ÖeY.spü,uiöàäÑx9/oÃCÖ“-»ö±S™§=ÊŒ¼Jz[÷2ÜpéW¡W:ܲ7ðµ^ciôÙ¿ ÑÐFøó|îð9ƒ¼ÇÿòèøÊÀq>´ÒÒíþÇAtE>e¿´ÞÍ3U^uSL´ìd„+¹X¦ÕZ"‡þ‘wœÎW“pú\\÷ç§÷¼1ŒoëÈÖq¦–{ý¾NRœ‘–“øï›€xÅDc‰Ë€Éd©=ðÏKÛIúR:PV’ØÎÙvðÖ¢ì® ¥üÄq¾z ŸqûƤCóöOÀÙ(0кbì”AÊØi-­\qÍ(çôi¬_o s¸©Ø­ö-JÔ³Ûu|¯Íç‚©Ä(1§úgðÓ¹âc@åÒ°R.c¹!€t)òŸš½UtË×Ͼƒœ'¶cFÒð.žá§4k•™ÉÊó”œx`±ÎÍ2ü|`€íxF,CÅù©œÕÃrê¶^#¿ØÖí4Ac_™½éö0ù±¨cEÌkòˆ¨Jãʬº¬\ÀHÙ•Ô¼ûzYZ"|".|O´»ÿðÁ޹5HKñ0ª’î„c©…õ‘P.û‡u†urTÊ•ÝРNR˜í!}op´÷G$g#ËË…ÓÁ½5k—GCUsg@M»1Ǹ‘q²´ÖUVúÃwËiu})¨ÌoV¾î}Èt¢€I™¥TBÞ§ô\!Ë%ö‹µ¬¾3³`G®ÆŽ’x{ ¤„I2Ñúc”ì×ÿÂÕÆ†\6ô^¬eÂ{eOvhF«Ù$[w‰¹ç9¯.䣔GðÐŒÀ™Œj“ <"f²ÁWò_‘^Ê~zwWqÚ¤r>óô˜’’ÕΠe|­þQ׃Ú}üÿû-hD0IcÀÂäϤ´þ0áYäŒ9EXxbKÏ â3°¥ê;–ï‚GA…7~ÌU¯ñ¯Ú¥8CAIl(AßF¨c)sÅüT§·³dû,ÿ‰/:_ÛôÄwÐShãâ¿$ˆë”rÚ/cÆŽh—Ñq§/xaÝ…NJ¹™VŒDÐE’íd¡NQջΟ™â[ÈŒ ª&u†,FŸü÷äîêY²— I°¥wŒ\Òœ Öz„ŸCWt${òd„ ÿ9»ÁÇøN}¬c¹Oß{àÕ7v}Äjéµ ,ý’ʇëݰR—W&ßóºOvÆãϳzÁ=ÕI$˜ÇEJ‡b­wNôKÝ—lÌ2ˆÄ4Ä«O„gÙBïú,IU qÖPùÙ€ Òù¬Fü¾ôÙ’ö,Š™ [ß:[’<ƒTT}²Õ凎üOéð·Uþ'0³û´×/‹Žæ®˜T;~  ¿ :¾?ä%/-Û—ÿi÷6$ýÆ–÷FìzCB`ž%ò°bM¬_C6àâ®hl ;%Áí|¥D3ÈË&C™f÷Püú#/–ȰHgÓ´3aÕóÄ~þ )³òg„Ç%Îý(Ih‚ú¡ör7p:<•ôVÓkÑ{äò5qDLÿ‰2àýžWÕ¦´8°«&h·œã_±dÍ,×å,°Ö_Mö¼»Ú½‡wgÜuû¿h*«Ú.Ì=€¯Ž¨zh5æR“ûÎø’Ew˜ºôò!«f¤ ¾¨=`Go•S¥¿ÃÖY5黡öćÇerIAùÌ.7ÌNÙowèÆèˆmÖ¢Û¨Vc5«e-ZƒÆÝáœin3Ø 9§ˆŠÌu›ë™ÊH±ݾ¿,\•zfw®óUÍuÆ £f.ŠÙ;¤ò/”-*TŽ¥°)ß§³ÿ;*oÁV³†~|+øì"Mò¡ÿkPOÔa€0€› ‹ò‰vÑÍm²“ø%¯U-AÏ–ÔËÜ–†øÐÜÏ鵎,8³ÆãÅ$f9ÈÒ¼ ¬ˆ/n’U“xZaâù÷ºn£þ’¼ÊX<ÍÈ‘‰°êÜËÿÈæ+ÕJib€P u³g‚¼ÚηÐD:à ü}gÖ³«½ÛÀ_[S‹m¿»SÛžet9­–*éP)­íjþä¿À$òPïiŸÕ¬û³Í2_TðûLªö>Z¹dA[w_]´54<]ëO0DWY6l¤L‹;Œª¶Ÿ78O¯¯ìŠVý™ÆlHÈ1窱íl¿åðû°¢é+ià¾Ô?kfΤÀ’ÆÈ´ïêHéej§X™ÃéH´Å”hl½<-ð^@[À`š˜µÑ{'%w1V¿PfP•¶µ55%g!~®Iý[£ï£þ¤Î¨þ~ Ñ9NeîÆ%æ¨ÞJïêí]0yÏ Žà«µÁhØ.®óÙÈr¡LÄ{s×ùâ òÄ5 £QãͶªGá¬rÝð«´mÆp{ m0à&LéÇ+Þ¤óšð,i4¸¯'éⶺ3½7ó3 iB/ºi2 Tj üs9ÓT3Òí0! HóK&ªärçeâ£_9¥µÞ“rÍÜ.+'î¥@€†”Y°l/$$xCƒ.72·§:¤+¹‘qIµw±3°R\ç1®óõ¤#Ë`v9Ö¨ –J Ûf8}ÎÉùPBBb`xøMá§&,ëò°Û Èô©]PÜ%,8ØéAå J+2sq*ª0M²gqH`ú;ù\)™4äy¬³@í ÁÊ1x”îœ/áæˆlx‡|;qND¹VüÏTFâ`“çÕÉý\”üQøïiÊ\q11 f±7‡Sï}Š‹­DÔ°¡«¶ÆV‘…ª½pÊU„Ö~ºÁ$ÅYIFCxU(ᚓǨ Š£ûëw„)jqàmLm°dôˆ3G~~™¦v°«QáØîä›×ò~£çÊäY¦ëeÅÄJßSÐÎñƙțß>”c`˜ÖÛ0ç—ò/õ¢54”õÜ›·Ë̈þëœKú¸~¡X+³¬ýµø¬âB[$ƒW·—?,¹”ƒf\7ä3¦QëÑÜ}Š ã,«zblÉ‘,™eÌ!›- ;Ð5PšÛw% ûEJ'rºÚ÷é~Ö2ŽTUÀ+:“µ0ùÓ!¡Pmüô0Ù9çW,ç¿o~ÝÓgÈœJÅÖVV&b€!úßÔ ”û7F)‘ u¼Y¢ÍŽ4êñDt¹ ”{Ùç#ÉŸV Ü}™dý‡Ç b3VX‡I$þÍ@J'ÑbwgÅ£¦Ùv¾ÖpÖ±&ìÚš§ôÞt‚é¯ï"©¢C¹ãÿ¬{­—IØÉïëÒ{Òû#>õt=Q<ÊY9ˆøÿ.ÿº\³~ƒ%o°)Ëîý[ª:*•JVaÿPK+Ž\ådéPK—pä4 settings.xmlíZ[SâJ~?¿ÂÊë)åîJÙ ¬ÞVÂEåm’´dt2“š™ð×¥\ áTíÙðd._wfº¿îéäøûÌ#{Sà3z¢•ŠÚP›9˜NN´áàlÿHûÞøç˜=<`ê³¨Ü ¥"öÔt*êq÷‰pZgH`Q§ÈQ—vù@—ÓêoG×Ââ–ÁôéDs¥ôë…B†aå€ñI¡¤ëzaÑ»j3ú€'›ŠŠG¿Å{Mˆ•Y+‹ÕB|­í½(ùniËuXÞ~ãøE@ü³%xÑÚì½4GªhJd}Š!|]5mÕ¼÷sFX`‹€Á ˜¯-;åÜW˜J­Q<.|ùð%<ÈÝ ßbGº« KµoµòÖðÀw¥ê•£š¾)ü¾‡ü}L˜“áêMZÌQæÅç›( a×Ih)$W 5¢ÎÒ—4@zZß)ú~ŠAð„F² ¶.¿aKåw«Ö»šn/ß#ßgˆÜa?3*éûË+æ@r\Æ·0ràÛ»BOh¿\ ,ô­þ;À7l‰§°@7¬Yž”°Ô7câZšëXeKÜl |‰ÚdR2ï À+?§³uÒb„)ΆAj9ƒä ’3ÈßÅ gÊB3âÜ?rþÈùãoãŽ0ŸÂ¾L •œ@rÉ ä¿#uÝ‹Òɦ¿(ª¬©Ú¼VO¶ö ›3B,Ä×Vʾ¦¤1cÞ@ádêÕè‘ ‰3h1­  D…°OÑS‚÷]FšÐÓ ‡¨›À·#€¨Öx@D@z1càl¡¿X'@ò` ük&wÝæ8Y¢Ì9Bª<MXäE¥òa¥\®¥ÌÜßíëV¥ƒ„R=ð¨É øn„ô]©Èfè]ñ3SèÏ=‹чdLÈDHŸ"ÀL$$$7: ÏŠ»â¥ð¿3 &µßëóÃò·” ”„_™$n ß,O±È8½ý¾Zù´¦Ã3,úsj»œQü )ˆ(eBðòÔgõróçzqCÀQ´Á_yÀ—ÇÿYܸÄôiè;HÂú3UÚa’ò”‡¤?#$ýN’HÖBĈ¢ŠìáoÔIUÝǵºXsˆ©¨3Û \9o¬XHÀaµ‰)âs­a† —Øž^5þ€O¯4ê Ÿýêøî| Ÿ½5Œ+ã±_ GMÃpûêï©£¾úžŽÍöYñ¾oÌZ´9G·µâø®«C{4·*“ «rîUÛýé[åª>lës§sÞÅ}YÑíèùfpza—¯]«=Ô¯FØòJ®í9¾å™.¢£g§]"íéW­0¼üaˆ+ôʳ©í™Äî˜ìfÐ-*ÙÏV{T߆úÛ~Ç#ãA1l‘fÏ<½žZÔ$pjºNûô"¥9û>™ðH¢ì͹å"Žles-æùDä÷™W7ºâ85Fô& ¶ Њ’b&Å4…QüFÙOÚ"Lì"„ÄIÈgÞ<ÿ3–ÙBˆAˆJ§":8gV QÈR*†Så;Œ’yŠ{X›Ü>¼ÆWX÷‚cãPK "y.œ")PK—pä4META-INF/manifest.xml­“±nÂ0†wžÂõ»íTY¤•*µ…! Ýø,%g+>#xû¤,m³í_ßç;éÆÓ]Û°-tÁ:Ìùƒ¸ç °tÆbóuñ’=ñéd4¾›/gÅçjÁZ¶‚@ª/Øjýüö:c<“ré—UeK®«¥œsöÞç[ÊÅg¼¿† Oðkfú†Ó1ç±Cåt°A¡n!(*•K.ãÊØ’ú™W‡6&#vW¶,»ýE`¬Îhï!çÚûÆ–šÒä8ºÄ¥Bß6a@ü ©bÓd^Ó&ç’Ë9CD‘úÑŠÒaeëØoÛf—‘ðø[9ÁŽd²Ý†'?z>†äÚ7Ƕ@úÐÛ°bÛ/Ô¶ ’úRx¬‡†;X J{íX^íÔäPKà&ËÊ.ëPK—pä4…l9Š..mimetypePK—pä4TConfigurations2/PK—pä4à·Ý"æ® ‚content.xmlPK—pä4ƒˆñD „a Ýstyles.xmlPK—pä4r7-(77)meta.xmlPK—pä4+Ž\ådé†"Thumbnails/thumbnail.pngPK—pä4 "y.œ") 0Asettings.xmlPK—pä4à&ËÊ.ëFMETA-INF/manifest.xmlPKÞwGSpreadsheet-Read-0.93/files/test_t.txt0000644000031300001440000000005011275744454017177 0ustar00merijnusersA1 B1 D1 A2 B2 A3 'C3' D3 A4 B4 C4 Spreadsheet-Read-0.93/files/test_m.csv0000644000031300001440000000005010614362642017133 0ustar00merijnusersA1;B1;;D1 A2;B2;; A3;;"C3";D3 A4;B4;C4; Spreadsheet-Read-0.93/files/test.ods0000644000031300001440000001562510327656236016635 0ustar00merijnusersPKyTZ3…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKyTZ3Configurations2/PKyTZ3 Pictures/PKyTZ3 content.xmlÕZÝoÛ6ß_!xÀÞhYvÒÆ^ì¢öÒ{+hвˆJ¤@R±½¿~GR’i[rå$õº"Hâ»ß}ðîxw zûf“gÁ#•Š >DÃÑ  œˆ˜ñÕ|ðåóèfðfñË­HFè,¤Ì)׈®ágÒ\Íw>(%Ÿ ¬˜šqœS5Ód& Êk©™žY[Ž¢ô6ë-nÁ¾´¦ÝWØ`÷dñ²¿e ö¥c‰×}… ‚ê‹'¢¯ðFe(õ¼Àšx±Éÿ6¤Z³0\¯×Ãõd(ä*Œ¦Óih¹Ã¤Á¥Ì,*&!ͨ1¦Âh…56§÷õÏ`}—x™/©ì¬ñQVÕãªwE<®:BCR,{׆ï§w÷Oï$öes¬ÓŽœÜ„÷À´ßîïvµ ó¾¶ v/TD²¢÷1Ú—B4®wA­»ãÑè*tŸ=ôú$|-™¦Òƒ““p‚3ÒD\ämA\ÑGS¦Má›@¨qèØ XŪÿ¾¿{ )Íñ̾FŒ+¹‰LÕÒöúè¢nš.à*l 4O”`BQLI¦·®ørà>›$Îï˜VZRœQ‰ƒÌU4 äk|βí|ð.„ú½ìƒÀ³Q0M 8±d¦£ ÂÓÜ•„ÅX®»{Ì'›øÈòe©¬¿Á]÷ñö`Ï?Øgœ “ó#k ãɪ[ñ̤9´¢œJ7J­™z¹˜?9äOr+캗â¯AVOsCì÷½C5Æ*¿í”†y•9Ô’>úÔŒª ³%„þZRè Ð˜®5Vð5‹M/‡¯^ç¹õßs§Û7Ùå›ëÇ€â{åX†˜R¶J¡µ_ ¯'`û´¿¥¢Hšå8C¾°–%íï¶Æín×Äf5•¨À+ŠœÄšà2ÓgòÎ㧘©"ÃÛÊŸJ›°¡\Ä )“H/û»º’G®®$.RF_ªÏ¾7fƒSÈop hàfAx+!^)űú:}¥G˜¦ L޹æ’Yxœ)Z–ep!DÆbbŠPò×þ‘‘Mic³p#- ˜UžkâRhmÆâ!=£‰>¦J—ò¨qS¥8¶›Å1å{D×MQ6ÇøšµõYCq ލ‚ßàÎ2I‰¶óÎVaï´}:ÊZ%¶™jòÖPŽï…Ùᑱ¨ l^\ð¦œ`Ù¥ÈÞC—pÚ ÍTï®AZívD©Î&³ËÚÒ©å*EÕÆ÷Åv·Ö^ ù²LÅþf4*´¥e˜¯Jpl>0‰%×âóåÁª-¹ÓÙzSçÙ÷À2JSi}Ýó±V·®šÄ~´$]ÐÌ£ñR”ª;]È&TÌ[FþfÂRÃ\pªäVñ©yþQ«Pµ±vQÛqý³za8°¾›WFF7kõ¼µúÞpÛ¼oezþ{ü®t@l¦h^¤ØÝ‘I3F¯:Òm‘RŽuSûG÷;ì×c)âín .¤i°)¥zqë&‚ý^MwQ ªÁÑÜ¡½±äÈ…d\×^y[5lû}íJàí£šËë˜E KL[ñª\›óynUËB‹'v稜¶ïÜ ª †…€ÁCãªFÄn6€€Öïk©‡æU˜C-&Í*qàèkž8+án @Â& ]΀Í_:ŠÅÛè6¬~…_Uªªß†7ÃéÔ¼– ­~|¿N^×4ØÊ®£aôªþ ›ýèèuU¨jó&C ¶…_‰.nc2#°Xi!Þ¿» ½Ï†CI/Æ£Ñ5‚¯hüy4šÙ/ ´Ì*EýqpºÅG¡iàO⣀]¤ŽÚo,¼ÿ8wÃoãq£ójˆG*iŒ¾ÓÍ~ž{‰*Ž®‡£éÿ¼Œ½…ëGaÛ®Çó&ð³+ÿòµ1…–7îY ö?®I¯|‡çizf³lmD—¾û‹ZØö~÷^øõ§Ãÿ°øPKRºØå5_ PKyTZ3 styles.xmlÝYÝnÛ6¾ßS*P´ÀdIÎÒ&n¬`Å0ì"-Šþì¶ %J&J‘IÙI/÷<{ª=ÉI‰–,ÉÑÒn+šItø~ççȹº¾-©·ÃBÎÖ~¼ˆ|³”g„kÿÃû_ƒ ÿ:ùáŠç9Iñ*ãi]b¦©î(–(3¹²‹k¿lÅ‘$rÅP‰åJ¥+^aÖ*­ºè•qe%ÆØ\uîj+|«æ*klOmæ{6à®v&Ð~®²Æ§]õœÏU¾•4Èyò²BŠEqK û´ö·JU«0Üï÷‹ýÙ‚‹"Œ///C³êN®ª5¨, 1ÅÚ™ ãE¶Ø+47>í†ÄêrƒÅljBƒ¬Ê]1»"vÅ5é‰ÙµaÀýôžeóÓ{–uuK¤¶9¹_Á¢ùñêæP ¢œëKc{T¥‚T³·iÑ]}ι U+ØjÂ]FÑO¡}î ÷'á{Axzž"š:Æy9FàâÞé2õ½æ é][I{Gåî§¥8ÈpJerekˉ=û¬9Zû/‰’J`Tz¿c¼wˆÉØ÷ ¢Z|IèÝÚŒ*._Œ€í‚ïu|TD¥ûD_~x:‚›:%’`kÄooñÁ.^“rSK¯w3½½ìË7ömy‰F¼¹…›IÄ&ÍêfX(X¹'òëqþ`ÊV8u¹íÝmøÎQM›ŽÞZn‚4/H1¥~ ?ˆ‚JÀyŠÀКJI‰`‚S¹ö—’*$P!PµjEpΫ #R!¦‰8*˃®nÚC5³»Q®s¾¢ˆ5*` 3#HyÍ”€-}xçàÎDlä˜XkªE1Îp»ÖX[:X×­‰âÛ±Ãìl;̘õþ¢NðHæ’+Ût›ÞÛKgÃ’¾#{ ¯y* S¸½Œp` ÆÑˆMg#­…€QñnÌU=µûØq ­YÏYJÔØ1pWn8m£9äŽQ¿ºü½¾ñ“¿þøÓ…vdÄ×E“xfÇw?¬ÚÓ¼´«…àueÆd³­]}fææOÕ»)_Êažz”ç|i_ß+‡]_Á‘kKO‰*w@XF”™vˆÖøÉÓÇ…z±v…‡ªŠ6l½Â<‘+«9ÌÐ/ö°ùÓ7d8­üËÓºž»%ÝËUÐ÷{¢8ÌUÓ¼C…(I[{\³ x À-FrJ² ÈždzpEµâˆ¦Só·ïbØcRla…Ê:÷Ô=ÌZr–b§O¬~‘¤ûT^~ÃH¿è~ÄœhŒ†BHLÁÉk¡[\Nn[ãWi2á˜0 /GTâ{Z'P~0ºöSP„™{²eº*!Ÿu{}V)ªr¾,™ £ñƒ(mÓ1kÖ §öìS%•\!- àþÓ›ºŒ†¡ë7q¸DÄ'¸¾ÌßÖùÏBðý"—ÑGØ€Yƒ™î´»àã5côŽàýK½9ò"oyg‘•Ëcƒ,ˆµl»Œ>w'³vkõiƒF’ýѬңxçµê‘\•±?‚’¤_ŀРä¨Q¨Í¡Fô>M½'Ë9‡r:* }“o›¢x¾8aD3b$ X¡8yÔ ‹>’n¸RúEo¹8·c^8PÉ$ ¤ÃûÑ„ƒ ÜŸ¸å÷“8½°á"ÓôD‹‹‹²ôLgñEæË*”Ù£E|Ñ*¡ô“nü,k›É£4Òߎ›ÆŠjd°Ïo¾ˆ¾M¶î/èpòŽjJ$ y˜ÑŒP[:5EuÏÀðj³Ñ'WæCÛªù-·[pr}}} IuÄÁQÚu]#17ü íZjœ÷7z+̓ŽÚŽIÜúëÈ!´¦zœŸ !Ðx³oqÅÅIb—bÛñ£ÐSÇó¹öžXœ"Šv!öù逇ž§žÈŸ#ï0ÍáÉÁÆE Ìð-ŠÎ¡ßËg~Gáò™þàð¼‰B“½6`ˆ>^®ÎÎWç‘ z¬zúñýo%å…] y‘K./»@+û—J/?ëáø…’¿PK#¬}LäUPKyTZ30W+  meta.xml OpenOffice.org/2.0$Linux OpenOffice.org_project/680m3$Build-8968H.Merijn Brand2005-05-12T13:31:18H.Merijn Brand2005-05-12T13:36:16en-US4PT4M58SPKyTZ3Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Òå@¼€ƒ Hš1}–e`` õtq ©˜óöÖÁ¬C"¹~þß¶U¡EåîUó‚âsËîö>îýè[Pm7?¾ÿøãçç?4}±õÙïÿ/·._{ëõ¶øŠÿIjqG²{¿ÿÒÖÛàù{ï>Ÿ7å·õ÷|º|úÿïÞjkÑÊzÓéö[ÃÕ¾í^[|ÿõ=ÅW«öæMî6|]=o—o\íý{ƒm^šèÊ/ßå‹¿¨mõÿòYÓÔ—?Û-Ó¶sδ¹ÅÒ~—?=1Ì(Úkm¤Û®;{Zx¤áRùùºþ{{/Ú÷ùè•Y¿W¿Ö«Ýv&ýoe´^ôÞã+¿N÷=½zÍûS ¾JùœN<-—ã;A8ü˪Òp ßӓ7/ÿeýAïóÑ̨y6\¾ò¼}¯Žï;YùkºÄåíÇvÿ±x_v~ÚiÃ~ æGmÒjy3vŒ2ˆeÜO^l”Éx‡!01xºú¹¬sJhPK‹g3ºxŽPKyTZ3 settings.xmlíZÛrâ8}߯ üº•`L&S S† —\Á˜Kx“mk%—$càëGÆ0•xp†€ÙÚÙ‚—`]ÎiK­ÓÝ"×_ç>.Ì ãˆ’¥t®*Hê"2¹QúVãìJùZýëš¾¾"V\ê„>$âŒC!ä^Ó ¯$Ý7JÈH…Žx…òŠp*4€d3­òvteE–´Ì1"ÓÅ"¨‹QGåsÊ&Å’®ëÅUïf¨CÉ+šìJ•Œ~KE)ýIOHŒY‘iªzQLž•ÂÚÈwKSÝ¬Ãæõ«×k‚äÏÐצ°nŽM»Q$ee†`ôsÕ”móÞÏ Žl EeÓ)ìDD(Uõºø+ȧ€à«8ò¹ÂÛ­«eí`ôDo«å¥+õrWø3gˆ¸pÝ4Œ¶ïÑjŽô.¶ØÅ`µÝ”•\0éJ5î,}ÊÒ4e§ä‚üÎÐ÷SzP>º…ž¡ØÁ ë!ã”u(GB‚QŽÎòù%GäehI‰¸`$© Ó›àQv€›C&s,ô”õ›Ê󘾵ÿø†#Ð ®ÐM@&˳§ lìÍYº6°f–°ˆ›¯„oPkTêxKãÇŠ–)#±~”þëR> ÈI@Nòï HV÷*wÙuãWYMFÚ”èÎÁÃac°Ì4UûgÏ•Sê['×#ƒÓ¨ëŒzOg¡‚_î ÞóhÔd¶>í0W?)|›R Qª¯s¸?Í2º²Ÿg€ÿDű › ¥ëƒcÔ:Å”¥ 1OPI»,kÚ—«¤öõ«Ò\šúĤQ WßG!Y鈚# ·ùs(0"°·ðmŠy¦ãA.$=‹š€ ˜ÞèŒÆóå,û^-X­)Iu¶Z¿~¼ÏO¤\¶à–eir¯¤œgsöÙé"[ÊÅg¼{<¯™q(‡§kʃwªÑhP9]*ÊU½Š&58Rõêc2bgpi,$Qè÷ 0:¡} )×mkM®)– ·®G/qi!°õ  Ü?CÊ`mÒjÚ¤\ry—''bŒÈWš*øãg¿ÛìR‚Ï·š÷CW&§ào¥ìHÆÙû©1 <†ä"í-ààØHÿÚË6¡þqÚX”ÔE몡áà DqÿOÕŽåÕ†N~PKƒÐƒ¸99PKyTZ3…l9Š..mimetypePKyTZ3TConfigurations2/PKyTZ3 ‚Pictures/PKyTZ3RºØå5_ ©content.xmlPKyTZ3#¬}LäU styles.xmlPKyTZ30W+  3 meta.xmlPKyTZ3‹g3ºxŽeThumbnails/thumbnail.pngPKyTZ3ˆ Ï­‘Ê #settings.xmlPKyTZ3ƒÐƒ¸99îMETA-INF/manifest.xmlPK jSpreadsheet-Read-0.93/files/gnumeric.xml0000644000031300001440000014214214362015733017467 0ustar00merijnusers WorkbookView::show_horizontal_scrollbar TRUE WorkbookView::show_vertical_scrollbar TRUE WorkbookView::show_notebook_tabs TRUE WorkbookView::do_auto_completion TRUE WorkbookView::is_protected FALSE 2022-12-31T04:57:17Z 2009-04-22T19:24:48Z 2022-09-01T22:03:41Z 3 2009-04-24T04:26:35Z -535 Sheet1 Sheet2 Sheet3 Sheet1 255 53 1 Excel_BuiltIn_Print_Area na() A1 Excel_BuiltIn_Sheet_Title "Sheet1" A1 Print_Area #REF! A1 Sheet_Title "Sheet1" A1 d_then_r portrait na_letter Bank Statement Number Date Description of Transaction Payment Code Fee Deposit Balance Reconciled ** 2022 ** Balance forward 0 0 44816 initial deposit 1 5000 =H7+G9-F9-D9 =I7+E9*(G9-F9-D9) 44816 consulting 1 271.60000000000002 =H9+G10-F10-D10 =I9+E10*(G10-F10-D10) 44823 check printing charge 36 1 Sep =K12-K13-H11 44826 consulting 1 439.60000000000002 bal 5235.6000000000004 44826 another charge 1 6.1200000000000001 outst =D4 44826 ATM 100 1 44838 consulting 1 942.89999999999998 44838 ATM 100 1 44843 ATM 100 1 501 44844 Credit Card One 1238 1 44848 ATM 100 1 Oct 502 44854 Plumbing 925 1 bal 4986.2200000000003 44860 ATM 100 1 outst 503 44862 Utility 152 1 504 44862 Credit Card Two 10 1 44869 consulting 1 117.59999999999999 44869 ATM 100 1 44875 ATM 100 1 505 44877 National Grid (final) 17.600000000000001 506 44877 Credit Card One 1385 1 44882 consulting 1 264.60000000000002 44882 monthly maintenance fee 1 14.949999999999999 Nov 507 44892 Comcast (final) 0.12 bal 2581.4699999999998 508 44892 utility 149 outst =D27 44895 ATM (no receipt) 100 44907 ATM 100 509 44911 Credit Card Two 10 510 44911 Credit Card One 1655 44912 monthly maintenance fee 14.949999999999999 44914 ATM 100 44921 consulting 390.60000000000002 44921 ATM 100 44896 44896 Sheet2 255 0 1 Excel_BuiltIn_Print_Area na() A1 Excel_BuiltIn_Sheet_Title "Sheet2" A1 Print_Area #REF! A1 Sheet_Title "Sheet2" A1 d_then_r portrait na_letter Sheet3 255 0 1 Excel_BuiltIn_Print_Area na() A1 Excel_BuiltIn_Sheet_Title "Sheet3" A1 Print_Area #REF! A1 Sheet_Title "Sheet3" A1 d_then_r portrait na_letter Spreadsheet-Read-0.93/files/Active2.xls0000644000031300001440000005600013111550441017145 0ustar00merijnusersÐÏࡱá>þÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿ þÿÿÿ)þÿÿÿ !"#$%&'(*,+þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀFWorkbook ÿÿÿÿ4_VBA_PROJECT_CUR"ÿÿÿÿ þÿÿÿVBAÿÿÿÿþÿÿÿ ©ÍÁá°Áâ\pH.Merijn Brand B°aÀ=Óº ThisWorkbookœ¯¼=hÍP<-8X@"·Ú1&Ü: DejaVu Sans1&Ü: DejaVu Sans1&Ü: DejaVu Sans1&Ü: DejaVu Sans1&Ü: DejaVu Sans1h8¼:Cambria1&,8¼: DejaVu Sans1&8¼: DejaVu Sans1&Ü8¼: DejaVu Sans1&Ü: DejaVu Sans1&Ü: DejaVu Sans1&Ü<: DejaVu Sans1&Ü>: DejaVu Sans1&Ü?¼: DejaVu Sans1&Ü4¼: DejaVu Sans1&Ü4: DejaVu Sans1&Ü ¼: DejaVu Sans1&Ü : DejaVu Sans1&Ü: DejaVu Sans1&ܼ: DejaVu Sans1&Ü : DejaVu Sans"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)àõÿ À àõÿ À àõÿ À àõÿ À àõÿ À àõÿ À àõÿ À àõÿ À àõÿ À àõÿ À àõÿ À àõÿ À àõÿ À àõÿ À àõÿ À à À àõÿ ´Ÿ àõÿ ´­ àõÿ ´ª àõÿ ´® àõÿ ´› àõÿ ´¯ àõÿ ´¬ àõÿ ´ àõÿ ´‹ àõÿ ´® àõÿ ´¬ àõÿ ´³ àõÿ ´ž àõÿ ´ àõÿ ´‹ àõÿ ´¤ àõÿ ´± àõÿ ´´ àõÿ ´¾ àõÿ ´Š àõÿ ´¹ àõÿ ´¤ àõÿ ´± àõÿ ´µ àõÿ ”— — – àõÿ ”ff¿¿· àõÿ Ô`À à õÿ ´ª à õÿ ”— — ¯ à+õÿ øÀ à)õÿ øÀ àõÿ ÔPÀ àõÿ ÔP À à õÿ Ô À à õÿ ôÀ à õÿ ´« àõÿ œ  š à õÿ ´­ à õÿ øÀ àõÿ ôÀ àõÿ Ôa>À àõÿ ”¿¿– à,õÿ øÀ à*õÿ øÀ àõÿ ôÀ àõÿ ôÀ ||>‰q—}(} 00\);_(*}(} 00\);_(*}(} 00\);_(*}(} 00\);_(*}(} 00\);_(*}(} 00\);_(*}(} 00\);_(*}(} 00\);_(*}(} 00\);_(*}(}  00\);_(*}(}  00\);_(*}(}  00\);_(*}(}  00\);_(*}(}  00\);_(*}(} 00\);_(*}(} 00\);_(*}(}- 00\);_(*}(}. 00\);_(*}(}: 00\);_(*}(}; 00\);_(*}(}6 00\);_(*}-}7 00\);_(*}<}/ 00\);_(*_)?_);_(}<}0 00\);_(*ÿ?_)?_);_(}<}1 00\);_(*23_)?_);_(}(}2 00\);_(*}<}+ aÿ00\);_(*ÆïÎÿ_)?_);_(}<}5 œÿ00\);_(*ÿÇÎÿ_)?_);_(}<}3 œeÿ00\);_(*ÿëœÿ_)?_);_(}Œ}, ??vÿ00\);_(*ÿÌ™ÿ_)?_);_(ÿ ÿ ÿ ÿ}Œ}9 ???ÿ00\);_(*òòòÿ_)?_);_(???ÿ ???ÿ ???ÿ ???ÿ}Œ}( ú}ÿ00\);_(*òòòÿ_)?_);_(ÿ ÿ ÿ ÿ}<}* ú}ÿ00\);_(*ÿ€ÿ_)?_);_(}Œ}) 00\);_(*¥¥¥ÿ_)?_);_(???ÿ ???ÿ ???ÿ ???ÿ}(}= ÿÿ00\);_(*}Œ}4 00\);_(*ÿÿÌÿ_)?_);_(²²²ÿ ²²²ÿ ²²²ÿ ²²²ÿ}(}< ÿ00\);_(*}P}8 00\);_(*_)?_);_( }<}" 00\);_(*_)?_);_(}<} 00\);_(*ef_)?_);_(}<} 00\);_(*ÌL_)?_);_(}<} 00\);_(*23_)?_);_(}<}# 00\);_(*_)?_);_(}<} 00\);_(*ef_)?_);_(}<} 00\);_(*ÌL_)?_);_(}<} 00\);_(*23_)?_);_(}<}$ 00\);_(*_)?_);_(}<} 00\);_(*ef_)?_);_(}<} 00\);_(*ÌL_)?_);_(}<} 00\);_(*23_)?_);_(}<}% 00\);_(*_)?_);_(}<} 00\);_(*ef_)?_);_(}<} 00\);_(*ÌL_)?_);_(}<} 00\);_(*23_)?_);_(}<}& 00\);_(*_)?_);_(}<} 00\);_(*ef_)?_);_(}<} 00\);_(*ÌL_)?_);_(}<}  00\);_(*23_)?_);_(}<}' 00\);_(* _)?_);_(}<} 00\);_(*ef _)?_);_(}<} 00\);_(*ÌL _)?_);_(}<}! 00\);_(*23 _)?_);_(“ 20% - Accent1’H’ÿ 20% - Accent1 efÛåñÿ ÿ“ 20% - Accent2’H’"ÿ 20% - Accent2 efòÝÜÿ ÿ“ 20% - Accent3’H’&ÿ 20% - Accent3 efêñÝÿ ÿ“ 20% - Accent4’H’*ÿ 20% - Accent4 efåàìÿ ÿ“ 20% - Accent5’H’.ÿ 20% - Accent5 efÛîóÿ ÿ“ 20% - Accent6’H’2ÿ 20% - Accent6  efýéÙÿ ÿ“ 40% - Accent1’H’ÿ 40% - Accent1 ÌL¸Ìäÿ ÿ“ 40% - Accent2’H’#ÿ 40% - Accent2 ÌL湸ÿ ÿ“ 40% - Accent3’H’'ÿ 40% - Accent3 ÌL×ä¼ÿ ÿ“ 40% - Accent4’H’+ÿ 40% - Accent4 ÌLÌÀÚÿ ÿ“ 40% - Accent5’H’/ÿ 40% - Accent5 ÌL¶Ýèÿ ÿ“ 40% - Accent6’H’3ÿ 40% - Accent6  ÌLüÕ´ÿ ÿ“ 60% - Accent1’H’ ÿ 60% - Accent1 23•³×ÿ ÿÿÿÿ“ 60% - Accent2’H’$ÿ 60% - Accent2 23Ù—•ÿ ÿÿÿÿ“ 60% - Accent3’H’(ÿ 60% - Accent3 23ÂÖšÿ ÿÿÿÿ“ 60% - Accent4’H’,ÿ 60% - Accent4 23²¡Çÿ ÿÿÿÿ“ 60% - Accent5’H’0ÿ 60% - Accent5 23“ÍÝÿ ÿÿÿÿ“! 60% - Accent6’H’4ÿ 60% - Accent6  23úÀÿ ÿÿÿÿ“ "Accent1’<’ÿAccent1 O½ÿ ÿÿÿÿ“ #Accent2’<’!ÿAccent2 ÀPMÿ ÿÿÿÿ“ $Accent3’<’%ÿAccent3 ›»Yÿ ÿÿÿÿ“ %Accent4’<’)ÿAccent4 €d¢ÿ ÿÿÿÿ“ &Accent5’<’-ÿAccent5 K¬Æÿ ÿÿÿÿ“ 'Accent6’<’1ÿAccent6  ÷–Fÿ ÿÿÿÿ“( Berekening’z’ÿ Berekening ÿòòòÿ ÿú}ÿÿÿÿÿÿÿ ÿÿ“) Controlecel’|’ÿ Controlecel ÿ¥¥¥ÿ ÿÿÿÿÿ???ÿÿ???ÿÿ???ÿ ÿ???ÿ“*Gekoppelde cel’L’ÿGekoppelde cel ÿú}ÿÿÿ€ÿ“ +Goed’6’ÿGoed ÿÆïÎÿ ÿaÿ“ ,Invoer’r’ÿInvoer ÿÿÌ™ÿ ÿ??vÿÿÿÿÿÿÿ ÿÿ“-€ÿ’ ’ÿKomma“.€ÿ’(’ÿ Komma [0]“ /Kop 1’:’ÿKop 1 I}ÿO½ÿ“ 0Kop 2’:’ÿKop 2 I}ÿÿ?¨ÀÞÿ“ 1Kop 3’:’ÿKop 3 I}ÿ23•³×ÿ“ 2Kop 4’,’ÿKop 4 I}ÿ“ 3Neutraal’>’ÿNeutraal ÿÿëœÿ ÿœeÿ“ 4Notitie’h’ ÿNotitie ÿÿÿÌÿÿ²²²ÿÿ²²²ÿÿ²²²ÿ ÿ²²²ÿ“ 5Ongeldig’>’ÿOngeldig ÿÿÇÎÿ ÿœÿ“6€ÿ’$’ÿProcent“€ÿ’4’ÿ Standaard ÿ“ 7Titel’1’ÿTitel I}ÿ%“ 8Totaal’J’ÿTotaal ÿO½ÿO½ÿ“ 9Uitvoer’t’ÿUitvoer ÿòòòÿ ÿ???ÿÿ???ÿÿ???ÿÿ???ÿ ÿ???ÿ“:€ÿ’"’ÿValuta“;€ÿ’*’ÿ Valuta [0]“<Verklarende tekst’D’5ÿVerklarende tekst ÿÿ“=Waarschuwingstekst’F’ ÿWaarschuwingstekst ÿÿÿŽXŽTableStyleMedium9PivotStyleLight16`… y-Blad1… ›/Blad2… ½1Blad3šš££ŒÁÁgæüD A1B2C3D4D1C2B3A4A3B4C1D2ÿ–, ¾,4ccgg––Bå››ŒŒ——Ęé7åɹÔqÈë÷1™ ©ÍÁ .//  dü©ñÒMbP?_*+‚€%;Áƒ„&ffffffæ?'ffffffæ?(è?)è?¡";Ęé7333333Ó?333333Ó?1œ&œ<3U;;;;ý ý ý ý × ˆ<>¶@‹‹ggÿÿÿÿD ©ÍÁ ±0Q1  dü©ñÒMbP?_*+‚€%;Áƒ„&ffffffæ?'ffffffæ?(è?)è?¡";ÿ333333Ó?333333Ó?œ&œ<3U;;;;ý ý ý ý × ˆ<>¶@‹‹ggÿÿÿÿD ©ÍÁ Ó2«3  dü©ñÒMbP?_*+‚€%;Áƒ„&ffffffæ?'ffffffæ?(è?)è?¡";ÿ333333Ó?333333Ó?œ&œ<3U;;;;ý ý  ý ý  ý ý ý  ý × À<>¶@‹‹ggÿÿÿÿD Module1ÿÿÿÿThisWorkbookÿÿÿÿÿÿÿÿ Ù_VBA_PROJECTÿÿÿÿÿÿÿÿÿÿÿÿh dirÿÿÿÿÿÿÿÿÿÿÿÿC  þÿÿÿþÿÿÿ !"#$%&'()*+,-./0123456789:;<=>?@ABþÿÿÿDEFGHIJKþÿÿÿMþÿÿÿOPQRSþÿÿÿUVWþÿÿÿYZ[\þÿÿÿ^þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð|Ô°ÿÿÿÿƒ×Ú¾ÿÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxÿÿMEÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(<ÿÿ<ÿÿ< ÿÿ<ÿÿÿÿÿÿÿÿÿÿ@ÿÿÿÿƒÿÿÿÿÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%ÿÿÿÿ@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtGÀRßþÊÿÿÿÿÿÿÿÿxÿÿÿÿ"°Attribute VB_Name = "Module1" ðÄÔÿÿÿÿËÚãZÿÿ#ˆ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxÿÿMEÿÿÿÿÿÿÿÿÿÿßÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(SLÿÿÿÿSÿÿÿÿS”ÿÿÿÿ<ÿÿÿÿÿÿN0{00020819-0000-0000-C000-000000000046}ÿÿÿÿ8€þÿÿÿÿÿÿÿ(ÿÿÿÿÿÿÿÿÿÿ%ÿÿÿÿHÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßþÊÿÿÿÿÿÿÿÿxÿÿÿÿ°°Attribute VB_Name = "ThisWorkbook" ŒBasŒ0{00020P819-0C$0046} |GlobalÐSpac’False dCreatablPredeclaId±Tru BExposeTemplateDeriv’BustomizD2Ìa…ÿ  äú*\G{000204EF-0000-0000-C000-000000000046}#4.0#9#C:\PROG~FBU\COMM~CP1\MICR~NEI\VBA\VBA6\VBE6.DLL#Visual Basic For Applications*\G{00020813-0000-0000-C000-000000000046}#1.6#0#C:\Program Files\Microsoft Office\Office12\EXCEL.EXE#Microsoft Excel 12.0 Object Library¼*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\windows\system32\stdole2.tlb#OLE Automation(*\G{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}#2.4#0#C:\Program Files\Common Files\Microsoft Shared\OFFICE12\MSO.DLL#Microsoft Office 12.0 Object Library ÿÿÿÿÿÿÿÿtGÀRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚModule10652c047ccÿÿModule1ÿÿ¾ÝÿÿThisWorkbook015af84d84ÿÿ!ThisWorkbookÿÿãZ %ÿÿÿÿÿÿ@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUCbD39*Bo˜·UÁ*ÿÿÿÿÿÿÿÿ`X˜uñ_¨>J Ž%÷$>§ÿÿÿÿÿÿÿÿ€ÿh&Excel€+VBA÷âWin16Á~Win32Mac³²VBA6­#Project1 stdole“` VBAProject¾¿OfficeuModule1b €ÿ_EvaluateÙ „ÿÿÿPasteValueÖ€ÿRangeÚ  €ÿSelectionZ®€ÿCopyÆ¿ ThisWorkbook|ãWorkbookkÿÿTÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$²€0* pH‚dä VBAProjeˆct4@j = r tGÀR” J< r€stdole>stdo€le h%^*\G{00€020430-C 0046}#2.0#0#C:\windows\syst em32\e2.tlb#OLE Automation`ƒEOffDic„EOf€iÔc‚Ež€”€E2DF8D04C-5BFA-10€1B-BDE5€EÔAA€C4€2ˆE€˜gram Files\CommonMicrosoft Shared\OFFICE12\MSO.0DLL#‡ƒM 1€q ObÁ Li`braryK‚Ô‚Ú€ Modul`e1G­dDu¯1 2E€ HB1µÂp݃B,B¨¾!B+BÂqThisWork€bookG@‚T@sisW€  rkbÀoÀÎ 2Ú Ï$%bÍ$ãZ"B#Ã$ÂModule1Module1ThisWorkbookThisWorkbookID="{58B0B1F8-B010-4070-8AC2-6A72FF08AF79}" Module=Module1 Document=ThisWorkbook/&H00000000 Name="VBAProject" HelpContextID=PROJECTwm ÿÿÿÿÿÿÿÿLAPROJECTÿÿÿÿÿÿÿÿÿÿÿÿNYSummaryInformation(ÿÿÿÿ ÿÿÿÿTàDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿX"0" VersionCompatible32="393222000" CMG="E6E435E9CD192F1D2F1D2F1D2F1D" DPB="44469747ABA4ACA4ACA4" GC="A2A0712DCE2ECE2E31" [Host Extender Info] &H00000001={3832D640-CF90-11CF-8E43-00A0C911005A};VBE;&H00000000 þÿà…ŸòùOh«‘+'³Ù0°@H`x œ¨äH.Merijn BrandH.Merijn BrandMicrosoft Excel@'ŸÎ@€ÔÉ3TÕÒþÿÕÍÕœ.“—+,ù®0Ø PXd lt|„ Œ ²ä Blad1Blad2Blad3  Werkbladenþÿ ÿÿÿÿ ÀF%Microsoft Office Excel 2003-werkbladBiff8Excel.Sheet.8ô9²qCompObjÿÿÿÿÿÿÿÿÿÿÿÿ]qSpreadsheet-Read-0.93/files/test.txt0000644000031300001440000000010211275744145016647 0ustar00merijnusersA1,B1,,D1 A2,B2,, A3,,C3,D3 A4,B4,C4, ,,,,,,,,,,,,,,,,,,LASTFIELD Spreadsheet-Read-0.93/files/perc.xlsx0000644000031300001440000001710611130422501016767 0ustar00merijnusersPK!Ì~æ¡Nß[Content_Types].xml ¢Û( ¬“ËNÃ0E÷Hüƒå-ŠÝ²@5í‚Ǻ(`ìIcÕ/yÜÒþ=“„"JEU6±"kî9s=™m½cÈhc¨ùXŒ8ƒ £±aYó×ÅSuËŒr1@Íw€|6½¼˜,v QuÀ𷥤;)Q·àŠ˜ ÐM³W…~óR&¥Wj òz4º‘:†¡T¥ÓàÓÉ 5­6W¹<+O>rëd!5¾cAzœÝ…wÍUJÎjU¨s¹ æ‡k›Æj0Q¯=y‰^ìªS‘¿bÙ9À³­0eP[€âD÷ÎШµ+ìqKèž6Ú'LA•ýøØÚ„G޳;Îä=æÕ[Œ«ÿ¦ÒÑ^Ù°ïûPh{óJÚõÙ @‡Ü€©IB.¾˜ò¦v³÷kDÙç§ð{4¾ôÿÄ@Ç §CØg¥«>0¹ìßñôÿÿPK!µU0#õL Î_rels/.rels ¢Ê( Œ’ÏNÃ0 ÆïH¼CäûênH¡¥»LH»!TÀ$îµ£$@÷ö„‚JcÛÑöçÏ?[ÞîæiTb/Nú(A±3b{×jx­ŸV b"giÇŽaWÝÞl_x¤”›b×û¨²‹‹º”ü#b4O ñìr¥‘0QÊahÑ“¨eÜ”å=†¿P-<ÕÁj{ª>ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK!‡Úpà-xl/_rels/workbook.xml.rels ¢( ¬‘ËjÃ0E÷…þƒ˜}=v ¥”ÈÙ”B¶Åý!Ä–„f’Ö_á‚Ý@H6Ù®Ýs$mw?ã N¹÷NC‘å ÈY_÷®ÕðU}<½‚b1®6ƒw¤a"†]ùø°ý¤ÁH:Ä]X¥Ç:‘ð†È¶£Ñpæ¹4i|¤[ ÆLK¸ÉóŒÿ; <ëTûZCÜ×Ï ª)$òínß4½¥wo#9¹€@–iHP•‰-‰†¿œ%GÀËøÍ=ñ’ž…Vúq^‹kÅ=¾} A”tŠÐöð§à;·î¤º³|N³ê*òÝ ïTÜ¢¼‘ýbSÆÒä`ÅNB~ œöÒÛ#åZ{QÁõ©µ—"¶%eÅc~­½‚<´ù§XÉ~ñ'ñŸ‰IòÖŠ‹/5˜»A˜û…ÄÄo°>Œ¯j®j”3„4Èf÷l–&Æ‹VßÿÿPK!< „ª; xl/styles.xml¤TM‹Û0½ú„ ÇFv–nw‹íe[0Ú²ö*[²#Ї‘ä÷×w${m'e›B/ÉŒ4ó<ïÍŒ²‡“’èÈ­Fç8Ý$q]&t›ãŸûòýFÎSͨ4šçxà?oßdÎ’ïœ{Úåøà}÷‰W¸¢nc:®á¦1VQ®m‰ë,§Ì…$%É6In‰¢Bã"Ó½*•w¨6½öPÇ|„Æ›¯ ?Þ`4Â}1 jI6I’¼Ã¤ÈÈ”_dÑ Ì À„ƒ"s¿Ð‘JÀHB¸¦Šþ£TF„1î¢ïþMbiPr&º ÂA‘uÔ{nu šìýÐK ºƸ+Ñ­¥Cºý°J ñƒEVË Ïk‰Ç£"“¼ñ ‹í!ü{ÓÁoe¼7 &hk4•`’—ŒÉpEVs)waž›;°:5«ÖÁTö¡‹Á"“9âàŸ%Ý/Ié«IˆvJУø‹÷9ò^üG)Z­ø:áÉÏkW Y³9®è…±:«ôŸè¡Ss•çëâLÙ ÄŠpÚ|VÉ´#פ¾@ûÑ«ŠÛ2njX¾?¾õVí>kö, «•c´…ñòªÒ ˆÃy™±‹o µì%¤Xå\t a§eÞâ­§B…ÙþÖ"½+µ¼zÅoÿÿPK!iÀRŠVxl/theme/theme1.xmlìYMoE¾#ñF{oc'vGuªØ±[HÓF±[Ôãx=Þfvg53NêjHHˆ‚¸ q J­Ä¥üš@©wfv×;ñ˜&%õ!ñÎ>ï÷Ǽ3¾zíAÂÐ’ò´Ô/×DÒiµƒ;Ãþ¥I…Ó1f<%í`FdpmëÝw®âM“„  Oå&n±RÙæÊŠ aËË<#)¼›p‘`"Z | |¶²Z«­¯$˜¦JqloO&4$—4KlÌ{ $¤Jê…‰fMrŠ]œ*Î…ë"g²Ë:¬€ 1?’*@ K/ÚAÍ|‚•­«+x3'bj m…®o>9]N0>\52E4*…ÖûÖ•’¿0µˆëõzÝ^½äg8 ÁT«K•g£¿Qï<+ ûu‘w·Ö¬5\|…ÿڂέN§ÓlåºX¦d¿6ðµõÆöªƒ7 ‹o.àínwÝÁů/àûWZë o@1£éáZ´ßϹ— g7¼ð €oÔrøÙP¦—1á©Zšl ¾ÏEɰ¢)R³ŒLpyÜÅÉHP¬%àM‚+oìR(–´0$CA3ÕÞÏ0ÔĜ߫çß¾zþ½zþää᳓‡?œþÌ—UüÏß}ôÓŸúPBs^|þä—gO^|ññ¯ß<öÀ·UáCš‰n‘ctÀ°Í8ÆÕœŒÄù(†1¦Ž·‡uOÅðÖ 3®C\çÝÐ=|ÀëÓûŽ®ƒXLõHÞ¸Ç9ëpáuÀ®–UñðpšF~ábZÅ`|ä“ÝÅ©ÚÞ4ƒ¾Y$¥ãûnL5÷tU‘”(¤ßñCB<ÖÝ£Ôñë —|¢Ð=Š:˜z]2¤#'‘æD7hq™ùl†P;¾Ù»‹:œù¬Þ!G. 3òCÂ7^ÇS…Ë!NXÕá7±Š}Jf"¬âzRA¤#Â8ꉔ>šÛì­}CÃò†}Í)=ôñ¼‰9¯"wøa7ÆIæÃhW±ïÉCHQŒö¹òÁ÷¸[!úâ€Ó¥á¾K‰î×7‚;4rTš'ˆ~3:–Щþ›ÐôÏš1£Ðm¼mÆí`¶&_IÜ8Õ‚—áþ…wOÓ}¹¾¸ñ¼í»oûnðŸï»Ëjù¬ÝvÞ`¡÷êáÁÆfLN–OÉÊØ@͹)Í ,a·÷aQš3")MY _óîîà" \}@U<ˆqCv=ÐL"™³Ž$ʸ„ÓYöòÖxÔ•=6õ©Á6‰ÕÛå5½\J6fωÌ´´¦œUØÚ•œ)˜ý&ÂêZ©3K«ÕL¯s¤•&CMƒÅÒ›0† ^ÀËëpJ×¢áp‚k¿Û¸‹‰ÂE†HÆxLòi»cT7A*rÅÜ@îxb¤Oz¯ñZEZK³ý ÒΤª¸ÆqEôþJ”Š žGIî©rdiµ8YŠŽÛA«¹Ú Pˆ³v0s-|M2ˆºÔ“f\…ÊÞ·8EZ¦“ œ-fSåóh¶ ÃÜ"¨Ã]…õû‚ÁŽˆLHµƒel%˜Wy °TK²ú¯6Á­e€Íô7Ðbm’áÓü膖L&$TÕ`WV´ïìcÞJùT1ˆÇÇhĦâCøuª‚=c*ázÂtý—iÚÛæ•Ûœó¢«^aœ]Ç,‹qÞnu‰•lᦎKÌSE=°Í«»1îü¦˜’¿ Sªiü?3Eï'p_°6Öá2W`¤ëµp¡b](‹iØ09˜-².dá5$\)›ÿ‚éÿ¶æ,SÖpìS4B‚Â~¤bAÈ>´%“}¯aVÏ÷.Ë’åŒLFUÔ•™U{DŽê¸®÷öÅꦛämÀàNçŸûœWÐ(ÒCNµÞœâm–ž^S4ï ž|l1ƒ<·›¦ð©¢gWµô†¼Ø{Owýù˜Õ(ª„U¶‚V^öo¨Â9·ZÛ±,^mÊA-†År ÊàÖé?°ÿQ2bÒXo¨C~½Á¯ š¤ dõ%;x Ý íâ'»hã¬YY׿£“vçßïRî)gkÍÎïs:»Î\qN-^¤³s;¾¶kK] ‘=]¢°4)N2&0懭êoO|t½wüS¦¤I&øaI`=¦ ø­DCºõÿÿPK!a~’†š xl/worksheets/sheet1.xmlŒ–Ûnœ0†ï+õ,ßgÁ$ä¤Ý²¤Q{Q©ê)×ë]PSpvÓ·ïØÃÁgÕ½H€Æßx ¿fy÷Vä š6—ÕŠ²EH‰¨R¹Í«ýŠþúùxvMI«xµå…¬ÄŠþ-½[ü°<Êæ¥Í„PV¨ÚÍ”ªoƒ M3Qòv!kQ²“MÉÜ6û ­Á·&©,‚( /ƒ’çÅn›ÿYCîvy*dúZŠJá"(¸‚úÛ,¯[º^nsÐô†H#v+zÏnvCƒõÒ çâØZ×Dñ碩[è%zgÏR¾èÀ/ð(„%[ —ä©Ê"E±¢ D· $ Á@Y/Çëžøhúñ­![±ã¯…ú.ŸE¾Ï £ÅU¬ËLeáð—”9Ê9%%3ÿùVe.¢ë˜Å—QLɳhÕc®ó)I_[%˧.J¯àb¦¦®øzÙÈ#VëÒk®ŽÝžÃSýðžÁÕaÍÂ0\Ý ®“PvEÓ†¦b¨yy˜Ïp:ºÇÅj]æ 90h™gsz›‡5¼wC’ÙôFG÷°ÈÕÔ6jì »è;é.¸ÑÑ=Œ¹Z‚Z×ÇAs`pàžÅO7¦ƒ{V¸˜öU¤ÙªÃ»ôò.»N5b#uðÈÛeÔÕž7ªïÊË»êš9áéà‘7í&ª=oTž¶·ùgpýœàtìˆ §ýD¹çY²¼ño°¡ Žµ€c˰¡(ÀQv€ ,ݳExl¾å ÒD[̱mÈìô:ê.ô{A±ß6|s˜í/ñüÇþ±OgçnI—€uœNp óûë746±+Ìv¢ÈS‡íFŽîbýŽÄÐ’ÂÅØÆk{’oû¶/9º‹õ{Cs ÖKÚqm{òµõbz¶gNp+óC'ƒÊfa›YäyCf•Ùþv:Á­Ìoy =*›•m{p³Blãst—ë·>†Þçkí䛨@èè³x9§ŽÕ%¼ó9 n©~×dh›ÎWнV¶uÎΙ„–Ò[ÁÊN'¸•ùíÆ?cv³ïwÊØ3ݜ֬g¶ëžNÀÊpÄÙ«Î`ˆVy óßNVJO—àêo “u%Yu“¸žÜj¾_y³Ï«–b^¨çCÒà´ˆ7JÖڬɳT0ø™Ë fl³˜,ŠTý ¬‰Ú£yHx‘ï«§\eEOºzb&ûõ?ÿÿPK!Û2'ÉCXdocProps/core.xml ¢( Œ’AKÃ0Çï‚ß¡äÞ¦Y©ÌÐv ²“ÁŠâ-$o[´ICíöíMÛY;ôà1ïýóËï=R¬ª‰>Á:Ùê‘$EhÞ ©w%zª×ñEÎ3-XÓj(ÑZU—7”·lkÀz . $í(7%Ú{o(ÆŽïA1—„„ÍmkóáhwØ0þÎv€iz…x&˜g¸Æf"¢Rð i>l3ÇЀí& Á?YV¹?/ YRI4a¦“îœ-øØœÒ'§`×uI— ÁŸà—Íýã0j,u¿+¨*§Üó­­Xù¦ <+õëk˜ó›°é­qs¬¢ÿ.Ì`=²@DÁƒŽÖßçìö®^£*¨\Ç)‰Ó¬&% šg¯ý›g÷{¯± N/ÿ‡˜×$§dIs2#~ªÁûü/T_ÿÿPK!H뤖docProps/app.xml ¢( œ’MoÛ0 †ïö Ýk9Á0 ¬¢M7ô°¡Aóѳ*Ó‰PY$ÖHöëGÛpã´=M'ò%ñêEq}llÖBLÆ»’Íò‚eà´¯ŒÛ—l»ùuõƒe •«”õJv‚Ä®å×/b}€ˆRF.•쀜'}€F¥œÊŽ*µBJãžûº6î¼~mÀ!ŸÅwGWAuÞ Ùà¸hñM+¯;¾´ÛœKq‚5Z!½Rþ1:úäkÌ~5XÁ§EAtkЯÑàI‚OS±ÖÊÂ’Œe­lÁÏ‚¸Õ m¥LLR´¸hA£Y2ils–=«NÉZrHX]Ûô± £|‚øòlUNpjÄ>œöNcóMÎú .;ƒ„ —ˆƒÒC½R?!žM‰{†wÀ¹%¾áÊ)^ÿbºèõÒ7A¹“\=>,·7Ùm¾ËUñÛ¸—´ §ÆÉ^Šb}P*úŒ±~Ä= 5ÚÎdyPnÕØó±ÐíÁnXv9›çþûGMðóZËÿÿPK-!Ì~æ¡N[Content_Types].xmlPK-!µU0#õL ^_rels/.relsPK-!‡Úpà-Jxl/_rels/workbook.xml.relsPK-!¨R'ÜFjxl/workbook.xmlPK-!< „ª; Ý xl/styles.xmlPK-!iÀRŠV! xl/theme/theme1.xmlPK-!a~’†š Üxl/worksheets/sheet1.xmlPK-!Û2'ÉCX¬docProps/core.xmlPK-!H뤖&docProps/app.xmlPK >òSpreadsheet-Read-0.93/files/blank.ods0000644000031300001440000002006013701052226016716 0ustar00merijnusersPKéVçP…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKéVçPConfigurations2/images/Bitmaps/PKéVçPConfigurations2/accelerator/PKéVçPConfigurations2/toolpanel/PKéVçPConfigurations2/progressbar/PKéVçPConfigurations2/statusbar/PKéVçPConfigurations2/toolbar/PKéVçPConfigurations2/floater/PKéVçPConfigurations2/popupmenu/PKéVçPConfigurations2/menubar/PKéVçP manifest.rdfÍ“Ínƒ0„ï<…eÎØ@/r(ʹjŸÀ5†X/òšÞ¾Ž“VQ¤ªêŸÔã®F3ߎ´›íaÈ‹²¨ÁT4c)%ÊHhµé+:».¹¥Û:ÚØ¶+šñjƒ¥Ÿ*ºwn*9_–…-7 lϳ¢(xšóñèžGm«©Xé¤ÔÛøÅû3øiš¤ÉëJœ’áKî9zSÐÜÅCG×¼kg˜å•ª˜á'¨˜ÌžÁŒìeÁVK1Ik§ƒ4tM¦ Å#{ÑÊü¹åŒn6ª#j­ÀÎE?ï8Æ÷ñD‡èGv†Þg ÏâbÜn7k‘‡‰…î[µÛƒ"%4E$Et±'+F—Œ¬s|ƒë{•Q^qBͺb__úº’KÁ47eÍK(ŒFßw9ž§ºúÈ~M¾S¯&zrÜÈÀÍ}> ²D4ÛÓ”‘–­83²µ`J$þ UAgW鬬]²øI>_ñS©ï(Á€ žvêèàGØ+^%$<ÇIïwÊÔ—Ãïõò°\D3ìpvö„Ç„Ü?ÕJKD±÷S{•éT¾¯¼QÈ{~Ô€„­o¿lÜ'h}³ÇNhÌ’9þðà[÷­øPKþÞ‡¶¾­PKéVçP styles.xmlí\ëoã6ÿ~…¡Å»@e=œÄ&îÚÛ»Ý`Ñlq´DɼR¢@Ñq²ý‘”D½eùm› šŠ3Îüf8êÁûÇ×^  4khj:ÄE¡ÿ ýñå£>Ñç»'ž‡8s‰³ `Èô˜½axç0žEƼ0)cEÃ1Šg!`aeØ žA7 õˆHüS…/iì1|‘#BÌá®~É)³AµÂ ¤Þbƒ}4ø–$ ã+¾£ma‘¶'õU¦¥ =°ÂiÕ•INU’YHw ÆZÆ | ¢¥ñù)C¼TKHœ›K!‘P¬6–=¼ ‚Q Ô;JE[BÇ#3 B|N…¡lpxZb”ë÷dzV¡óÂ*š™ˆŒúm™QRYá秺D±übøZ%Uq,QU®"ýú$}Óúü>YâÒ•®ä‰•'S«0 Ò«…2ú¼Ÿ‹|Äbº¨A¦’á¬(啸[ÓP–m}63+^æÎ‹7£+¨5x -Úñ¸CÀz„yr͸܂ÞÝÔºUÕ§dÉ=„T*\D×| L——êªls_(´²ð÷á—Ç‡ŠÆ‰ˆTœ†.J6W/¯àû?øì§ Šp Ž^ŠcOhíïQ¦ ÐÚò£Lv˜ðê÷ç™ü§ªÇ÷€TÁ´o@ŽŽv'¬öåäè¨iïp%ÊFˆ²›ïQ¦ ¸”´wµyÓ+ ù6{à6º€—»ËŠÎF3Ê.xëÇøÂ<½‘‡IèUÎuë¡îÖ¡ƒÞ¬ƒ´kP ¬nöP‹aÄ® ®ðNjL´SÂÁPТÇ4×cIV4®Œ8k…+Æ“Bs ue§ôztÎܬóÈ<²Î-b(¹Œ¶Ž`ôNŠØ—ˆ~‡%­sp4:[ªí,wrCZHþ4ƒÓ£(ê^ÁϹå+ÖÏÚƒ×=ççåͨRÞl ôí¾auÎ’z{kOV×Z5˰Ø'¬î6‡UW²õƺxªi«B¸œÉ}°½ûl¹ëJ™{ jŸU}«˜ ©Y÷~:J|²3² ÁÙ/Etgˆ»$Cô…7‹²ú‰Ú´„“‹µ§B´ßÍ–Ñx¿¤Õzg寓Ív¹‡ÅaÝ+£ ÖëLu;B¾Wº;,ä­y°Å´öL8¾ÈL8>\&(Ž7f®ÅrrIÅÛUí/&×R¼cc²ªg(ÞN½NÔ6œª'™3'‡Ë™“åÌÉžÕãô*ªÇk{Êa½öêñœ¹vGÈ/©z¼ØD¼uù:½ÈT<=\*ž(O7¦âÖÇa7…‡‘ç{ÆÕ®^>¡ù„ ñ ˆ„:yÔÃâCà^Ù½vkíÓ8£- Xï(:o #cñ©ˆ<äèÝiÇêL;VÏL/¨ð5"¡øÐ¯NV$ù}Ç‹x7a¤ˆ¡tóî1òÃú›å21¼Â/É ØêeïöÞó¦ú‹ë”$êK]B®˜Z]§Ã!Ji Âéx¾ðÆ”?µÑ _hpæ?ÝP]côM¼ oE¬ÔK4g/Ã׈å×á;íÓ*–óÖ?îÊ(ºT'‡~ƒ‡ÿøÐ´ÃÃ)%T}uª—£c _•aµorª-™Î!¡|ÊäÍkˆü%‘Ý­íúj›_Uñ袘OÄ7½Ä1°v²=Ãmgۭɶ§í»Xow[oŸÉzûˆÖáÚìÐF»ì'ÂàN²¥RÝْ۽Ο¢Ì]=íyŽ“{ø$äùruF˹TÑ'+šJ¨+¾ 5‡c>ã1Áȼ›˜â_¯T;’?5'šGtâGBXx°ÛíJ!ècbñ-„bJsÓ6us̵¹iò×4S-ãüÇA¦0·Â4gòW)ÝFeýÎ[âF±ƒ<2k>;$mg‰Eaϳ¸þzë}}áÒ²{ÎË\á;ª„õF/¦í‘2šó¤Ñ|tïüÿPK-öøW úWPKéVçP content.xml­XKoã6¾÷W*ÐM?4Q“ì¡Åž²@Ѥ@o šÙÄR¢@R–óï;%™r$Ghz‘#Îë›™C*_N¹ZÁX©‹Çd½\% (¸²Ø?&¿~%wÉ—§Ÿt–I©Ð¼Ê¡p„ëÂáï­ ›–,¾1×8©L‘jf¥M –ƒMOu Eg›¾·I›¸a[»uÉÁ¹2¥´®ëe½]j³§¯Q/#NŽvÚ{#„ÓÞ¬V[º§‚9FŽêŸ;‹ÓÁå£ëûû{ÚH;ÕL›üÔæƒ ´5IÁ©#}>L¥Z£Ñ"#Ëbt™žŬœÀº¦ÿ|{~áÈú°Ž:+SžëqÆÑYÞR¥6®Ó¼W.+£5Á)(ð`-]/×}õø7·arœ=îçÚ¢*R&/±Û;±aX=׋×E^Ææž sͽnl«µæW {C9S¼OÖ½)˜®W¾U_ U‰ÄéÔspln,¯;à˜’Åi~{é™ßsƒœ¬"™žh!&w5·ðÞk7os·{n@˜­˜O˜­°…íæ7±QŽ­‹*ß™'Ï{dóG»M¿Q‘‰g¦›}?ˆ3]"ÌБ¹äÍÒ‡wÕ¸Þ¼{Ú(Å›õªÁzE½N§¯ôݶ<ò0h¿Î'G¨ÂpôS®g¸%æMpMr{9¾½õp~‹çw¿‰™;LìÃ;ú …ÍãÛs|ÚÌeÇåÁb¹‘åìA´‰y‡v"· âdÑÖ/º.l“§în¼ZÚ/dxG ã@peŸÂvè—áÝ#}L~gJîŒLxTt*¹To±$6÷2²‡[ˆCÜÖÒÚ„^ñ,qû6´[¼°ÂŽ„ú…•Úþv¡g„5Jé8vÿÈŒl6Ðо€ L‘è €7ë ÿ ‚WvО»ïâ÷‚ÏF§S´h×Yå0“œ4~z¾4ÏV®×}°e3¦ð|RU^$e¼HJÜ×`œ»Ètº3À~ ±Ñ¡ÝylÕk)üöݬ–Û›¸úq\5$(¥‡È3=K×G¾ zB,¸‹DRér‚t•ïb|?Í}9ÚMew6Œò§g¥Tä6›I’œ'ÝsËfûêꪙ>ÝEÄç;ó,ÜiµÞ5³ëçÑéUUÇvo™:¶ûÿEhºNo‡ýë÷®wï’ýiP¡‰ÍÙî¶1vãh—Ý5…ä9jNѼ×s©¤s}d†‘³¨¶‘~H¹rz­ëæ· oÃBÙAþƒjUÝiu»G£.W…ž_t®ª¢7B5(`AÞ$ÅŸ(£é"¶Uü…d䜔Jèïïô ÚoòÔ€æüœrôõo Úè7ˆ…D1AI•fÿŸ5²ä5ò_EÈ•#óyˆ‚~E®ó"FÕï@>ü+Gð„¢¾-ôœ÷ûÕ¹>_úo¿ï+º†}Jø²$<ÃÀ÷þÖ¬Y{Øi™¢‰[¯vïQoQ) kþ‚Î4J­Œ6 „ÅyÔl·Y‚ÑÖï¢_î­0ùEмlÏîô”ˆáÀÅÁ}Lf°Q÷º¨X0Lư$þ¶ÌÖ‚0Yb¬àæËÔTö8Í!U×qš]JÒW–FŽÖ9_ cs"J«…öE»r>ÿŸÐe„6nuÙô4` WÅ̘ú/ë_=ÿ3*[Ðv–¼A CQH—Îe·Ó¹¸¬á³ZÊHíyò)&C n‚¬I…D+ô‘¼•nÁÛ†sdÒƒ|~¯ÅHÊø¡®˜© ´:~âF8KétÄ"I“h†S"äIU‡ X¿SÖjY³0©ÉUÚX´;ïT»<|qwq$¼Ïº¦²ÔýšÀëlF2ƒïo¨ô¶ºÈé×r–þØuή«/ AUßµÉnÄ‚6½eûæS8-þaÄ`£ë©;]óX¹ÔP_RÂí›ë0œÀÌ=gÛ ÁwmÔ(B5«ÄIUµ°X¸œ¤°°X-Ú­Y&º½2ŸTœß6˜ —ïn)'bë4ÿõL«“ˆ"/í§°(n³ÞÿWËÛíJ?ŠR ‰"'XüuÖ!§+ÆH‚©ÖÔzoá#÷c…Âü˜UJ¢#S•­å‘5ÌVq8焲©çÝ)Øg}Q¼wTAºv¸Êa A¬ˆ ¾¶dê4Ò¬¤Ú÷ŒÆ”?=D¦`ù‰Á'b¶7 ³ãÏ{>`(mH±õ¦v$ÁÓ ys_Å¤àØ£CÙW6„®û­ˆÎH~ÜX{š¼VvúLwléüçÂ}8@€J¯æ7èͲŸôþPKž‡í¥8œ PKéVçP©É»ÔššThumbnails/thumbnail.png‰PNG  IHDRÕÿQ©cá PLTEÿÿÿÿÿÿ~ïOLIDATxÚíÁ1 õOm  €¿Õ*õ{•pIEND®B`‚PKéVçPMETA-INF/manifest.xml­“Mnà F÷9…Ŷ2¤í¦Bq²¨Ô¤ fpð€`ˆ’Û[q⪊KÙñ3¼ï1ˆÍîÔ»ê1Y {åkV¶^[ìö½ÿª?Øn»Úô ­DrTå¦ë´a9¢ô*Ù$Qõ$µÒ@íÛÜ’ü[/Ǥël&ðÎ.hçá4qc''ñµ¢R} ‚S€h‡-å¤7ƶ g„1i»ªnW0ÖA]Êãù&`²suPth˜¸ëukh«j:h˜ ÁÙvGÔ|ìŸ_§Aét &–¨|z4¶Ëq¤§7ñ BÊÈKx¶¼–…OkÉbY{,x«ÄëÝDþ”ŠúHˆ"…ºÈ弌Üp™…ì,ˆ¨¯ŸFäé¸{*ÒqS0$»¨Hð ?À¦~<Œóò ¿–<dù9‚…õ‘ˆªßñˆ”}[†‚W.(Í· ŸR¦hc³÷¹Ôñä §k¯Xæ= >Èk9Ì%’Ò¶fÜ€fÄgÞ¦¸·Å2å@­–D0-@\ïá‘ùÓHZ ±Æ­÷^¾Ëï”Y:™Óc}4šÓ€ æ@7VLî-.i@²D"ÅAgÌAš"ëŒ~Âwx+󓄬?v˜W^ävj Ð’PŒÊ8Å)ˆå M)H8bo)‰1C+æÆ*o·_¿ù¾Žv+‚êpDU8‚¯Êb1 °‰”Í üËF³료$EÌ*PHæ‹‘ÈSe™hË®Ëdè‘MU$¸²¿ÉÆ”»›AÏpégÂkÜOâÏb6kÚå©ì’þ—@µbV=¨D‚†”( £ð"E¸&aäPÏCÛ,i%pÑ+4£Äe¬Šè€Và놃­NþìáT•Ýíav¸†jTO…wrÌn_§ÛZ¤gH¯s²Þ £Ê{Zowޤ/Žìé‘vÃÃìJ;½½R3y(Ü]kbîgŸ?—:Ö'“êG1N»¥1¤§Tp§¬üÜZp¸²ÿ|¸Í/ "n‚«:8ê%‚ŸVÛÎRyäŠZÛóõýéêW.,‚/3튨ÔÖnË>(‡Ã›ºhÏöÁòÒ%¡H¢ì¤÷<{ª=ÉŽ¤þZ²¼eÝÖ- ’èøãÝñwÇ»“ç µ¶Xd„³…í<ÛÂ,à!añ¾¿ûàœÛËoæß^^¿»ûùæ½Å£ˆxò O0“N&Ÿ(ά›û·«ßY¶ãº×)f×5â"vÝË»KË<_›,0ãºï¯lË6êF¡ íåü€nðe3³¸°7R¦3×å`…×VÆžç¹æÙ.6è݃x(á?ÊA´T`´>¢[#Jx(Ðn­Àx‰x…Þív£ÝD#ýétêþt»r?p‘ Ê—GJØÃA¼^-¡,OÖX {‚$jñ’mã>å†Àmår°Ab˜?¨™„G™„%»9pÀs÷#,ê_W5}"T®ÕùAÒaÏ Ä.s¿u[ª¬8dlˆš-çšÀZb™g†È™Ueˆe¶qŠPBèS{­¡#%2¶HUî°…+’¬ó̺5ÖÊïZyRž½i¡Œè‹}®Mƒvb̰ ÁÂÎv$;J…Û€Bd Héxˆ#”Ó¢¬”J ÿôuuL©]ÂS¹ $ TîH‚¨“Ràla[ž¢"ç(†5Ì´ à9“lÞßv8(#ˆuCh`¥ªÅ8ÃåZ¡µo©Öð$¥ø±/Ñ*ݦO{ï"pœòÔ I&SEÚ÷’DǦ‡ùåÜ”¡¢µÂQèÙ{áQUÉí½íVñ”æ&q C òµ =Ö*A.´»§>'|ïìfÈ‘beË)’Du)ò†{µê§dÍiégŒÚ¥°J‰«•½üí—_+§÷”TÊU/ZZL?öóÒ“´ƒŒ•«±àyª‡}¬‘mÎþ(•ƒí\8}M(‡VuEP‚=åÀÿ•ئ-gÏ´a&AiuYH¤î>[DsüòÕ‹X¾YTyŠÒ”!pZy<@³³¶Ksk÷#×(•îáÍŸp6¼·XI‘¨F=§m·?/t5+f;"%AU‡€1'g!0óÀj,×÷´½ê饵éÿëžµÃ$ÞÀDy6ŠØ¶ÌÇÏ:q›¬új4B8Äõ…zzüâdkÒ€ãò-€­X´èÔ+NÆs¡Š~Dk3òYõ357ˆÚ_ã»8´ÿ¬S—ŒõŸ:$æ’QYXp‰”ÐA*­öÔë:«æx¸­âê„þߘû^¾Û€ÍÌRþnãÙ–àÝ[Ô³ OpenOffice.org 1.1.3 (Linux)H.Merijn Brand2005-05-12T13:31:18H.Merijn Brand2005-05-12T13:36:16en-US4PT4M58SPKˆ\¬2 settings.xmlí™mw¢8Çßï§py»ÇâC§3ô´ÎA´jѶ¾ JÚp’ ê§ß Ú2âXÅ=;{ô•!7¿{ÉÃ?7áâûÔÇ… dQr©”OJJ‡ºˆŒ/•uUü¦|¯ýqñgãÁ°ž»Í}yAÚG6†:ƒÀ¢²ª³@V""”ZéBýò)ð-|‡!?"WxëÐZ©ZÙ›Þ†hì­\ŽöÙ¶ø¢‚"".œB7í FëÇhÑFÎW6Û&`uÜT”\09”Z\YþT¤14§d‡ü*ÐMúPÝB߃Pl1 qʺ”#!ÀSŽ“å#ù9Gr›24§DÜ0wÔ…éAð(ÛcšC&s(z*úUå¹LŒÿ|ÝhtqF÷쨫xs–®ÖÌ–=¹ùJøŠZ§BPÿà57+Z¦ŒÄúQþ¯ Hõ( G9 È¿' YÕ‹ÜeÛ_d5iS¢;{/ ‡QŒmÀ2ÓÔÊ×{vD©oIN®K:†ÓÔeF½ãcg¡ág;Âûbu™­¿uŒO?)¾M)†€(µ€9ÜÝÍ2ºˆŸg9,܃OÅ¡Ð-†ÒçƒÈ1Õ ˜²Óx•+gÕJåËÖ§¤ ãz€^i.C}bÒ¨ +Þq²Ð)4 wøC(0"°?ómŠy¦÷ƒ\œô ,j.`z óXY ¸Ã—§îƒy0!—ã™–wâ4~m‚¸/¾Ú.š ž~NðõÁï:u¼>E¼?#ŽÇ(As¸ƒí˜ ,¯\Öp(¶»OK !ñà~æbí¸güÏöŒ[DÞ Ì>Kíz¶@ggÿÿÿÿ þÿÿÿþÿÿÿþÿÿÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ ÿÿÿÿÀFMicrosoft Excel 97-TabelleBiff8þÿà…ŸòùOh«‘+'³Ù0 px„œ¨´À Ø ä ð ü éýTuxH.Merijn Brand3@eÍ@@l€…èêÌ@-û˜E½¥ÐþÿÕÍÕœ.“—+,ù®DÕÍÕœ.“—+,ù®\éýéýRoot EntryÿÿÿÿÿÿÿÿÀFÀWorkbookÿÿÿÿ/&CompObjÿÿÿÿÿÿÿÿIOle ÿÿÿÿÿÿÿÿÿÿÿÿSummaryInformation(ÿÿÿÿÿÿÿÿDDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿ tÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿSpreadsheet-Read-0.93/files/merged.xls0000644000031300001440000003400012474071332017117 0ustar00merijnusersÐÏࡱá;þÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿ þÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿ » Ìá°Áâ\pCalc B°aÀ=œ¯¼=@ 8X@"·Ú1&Ü DejaVu Sans1ÈÿArial1ÈÿArial1ÈÿArial ¤GENERALà¤õÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ ठÀ à+õÿ ðÀ à)õÿ ðÀ à,õÿ ðÀ à*õÿ ðÀ à õÿ ðÀ à¤À à¤8À “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ`… ¼$Blad1ŒÁÁTëZðRð3 ð¿ À@@ñ  ÷ü& notes monextintÿ { wL0°ÞΰÞÎ&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?VV:?V&HîX{!ü?V:?V&HîX{!ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?VV:?V&HîX{!ü?V:?V&HîX{!ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?VV:?V&HîX{!ü?V:?V&HîX{!ü?~‰•)Ï&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&úaU$ü?&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝããÝÝÝã&HîX{!ü?ÞãÝÝÝã&HîX{!ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝããÝÝÝã&HîX{!ü?ÞãÝÝÝã&HîX{!ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝããÝÝÝã&HîX{!ü?ÞãÝÝÝã&HîX{!ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?øÿøøøÿ&úaU$ü?øÿøøøÿ{ wL0°ÞΰÞÎ&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?VV:?V&HîX{!ü?V:?V&HîX{!ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?VV:?V&HîX{!ü?V:?V&HîX{!ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?V&úaU$ü?V:?VV:?V&HîX{!ü?V:?V&HîX{!ü?~‰•)Ï&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿ&úaU$ü?5ÿ«¹5ÿÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿ¹5ÿ«¹5ÿð?5ÿ«¹5ÿÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&HîX{!ü?5ÿ«¹5ÿ&úaU$ü?&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝããÝÝÝã&HîX{!ü?ÞãÝÝÝã&HîX{!ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝããÝÝÝã&HîX{!ü?ÞãÝÝÝã&HîX{!ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝããÝÝÝã&HîX{!ü?ÞãÝÝÝã&HîX{!ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?ÞãÝÝÝã&úaU$ü?øÿøøøÿ&úaU$ü?øÿøøøÿcc » Ì d-Cëâ6?_€%;Á*+‚ƒ„&ffffffæ?'ffffffæ?(è?)è?¡" d,, ¶` ¶`à? ¶` ¶`à?U} ”;;;;ý ý ý ¾ ý ý ý ý ý ý ý ý åìPðHðð0ð( ð ð>¶@ggÿÿÿÿ þÿÿÿþÿÿÿþÿÿÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ ÿÿÿÿÀFMicrosoft Excel 97-TabelleBiff8þÿà…ŸòùOh«‘+'³Ù0  px„¨´ÀÌ ä ð ü  éýH.Merijn BrandH.Merijn Brand0@@@µb.—Î@…l‰VRÐþÿÕÍÕœ.“—+,ù®DÕÍÕœ.“—+,ù®\éýHÈÐàèðø AppVersion DocSecurityHyperlinksChangedLinksUpToDate ScaleCrop ShareDocéý12.0000 Root EntryÿÿÿÿÿÿÿÿÀFÀWorkbookÿÿÿÿŽ'CompObjÿÿÿÿÿÿÿÿIOle ÿÿÿÿÿÿÿÿÿÿÿÿSummaryInformation(ÿÿÿÿÿÿÿÿPDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿ dÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿSpreadsheet-Read-0.93/files/merged.ods0000644000031300001440000003532312474071347017115 0ustar00merijnusersPK“l[F…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPK“l[F¼uèYÆÆThumbnails/thumbnail.png‰PNG  IHDRÞÿõÿsIDATxœí]k¨UÕ_×®Z¦¥FiIZT•ˆXd†=À{H“^’if¦–&¤ •™}É‚©/A„ìE=è‹f%J/%‘Dñ™Ïû_Ýõ¿ë¿îš™ßZ{Ÿ³Ï_ùp\wÎìY¿™5gfÖÚûÛ;::Ž?Þ«W/Ó“}µï:ù^èÇ,ß3½ªhÉDJ©#Š#ô3¶µµ9?ˆàEö² bä¬!¬3#Ì‘“CTÔv€º‹Å|ŽŠd’³´»…1„Sz¥2SRÈrè@º _Â"´Ÿ=÷J5{¦œrÊ)nòýؽzmìŒØr`{ƒL¼v,SK&Hc 9-žÓnNtò‰Ð‡×±cÇl Z¦[þÑ£GíŸ[·n=ï¼óìŸö]Ç·w•Ú(.•*¥vçqúF˜-è+•‰˜’B–CÒUø aX¦m ¶··Û?]Àíß¿ÿôÓO·Κ5ëµ×^>|xŸ>},ïÞ½ pJöìÙÓ¯_?{• ͰžJžÉGlo‰×ŽeJcÉi 4'£ÅsÚÙTïTº©ÌÌ/’|²Ç°´{÷î3f 2ä—_~™3gέ·Þºyóæùóç:thäÈ‘“'Oþá‡fuÒ5×\³hÑ¢ƒ6láÂ…¯¼òÊüa3èsÏ=wá…º\+y Ššîy@É®®¦c[Jt€Žsâtû)tÝ÷† lœmÛ¶méÒ¥·Ýv›}½á†¦NjÃÑÆåÍ7ßüôÓO_rÉ%Ó§Oïß¿ÿ¤I“^k×>üðÃcÇŽµ U z+éßÐd=î7ôÕtÅuÈ/ôc–ï™áÞ"D2‘’pêH€âñ›GmÓž-Ígžy¦åìÚµë°c…ß|óMß¾}‡j«ö–-[ÆŒóÙgŸ]{íµ&L°»zõjÇO>ùäõ×_ïPÖTŒœ5„u¦÷LÄô—S‡³+È PÌäóXd…‡½rÚñV²-š)ކD¤é¾ºØà;`ñ¸±ÛÍìØ±ÃæÎìܹÓòG5{öìûî»oÙ²e/¼ðÂ[o½µfÍ[èoºé&[ý§L™òÓO?qÆëÖ­»å–[¾ÿþ{›Ym– bä¬!¬3ÁZšî€W ˜ÙÏ@2‰Ðds™ä¥ÓN9šéÄÈš®FÛuiÒr/^¼bÅŠ÷ßîܹ6æN=õÔ·ß~{Ĉ–ÿꫯ._¾Ü÷o¼ñðáÃv9tèЖ-[f̘ñÅ_lÚ´iÚ´ivÃû×_­^½ºÿþÓ§O·ã 6lݺÕî§NJÞÍ1˜.ŒБ9”c`ÜGš©—¥ÀegÉAÎB¡Ò•£°M÷PfãR ˜ÙÏ@2‰GE2ÉYÒÛ Ó¹E°›Vy=ö˜ÎñãÇÛ±¿ ,_¾|òäÉ·ß~ûúõëçÎ{çwÚx]²dɪU«ìå>ø Û‘† Íšt"ÎI”5 ÷ÑôL¯÷È‘#cÆŒY´h‘ µ¯¿þzöìÙû÷ïôÑG¿üòË‘#GΟ?ߊÙ@üñÇíëÌ™3Ï>ûlûV[g3à·Æìì€Êä\b–8¬@æX?˜%GX…rLŠ…$y#Ç3ÒhÆ^ 9é^³#8±q¹cÇŽØÁÎ;í[¶ ÿúë¯öÝíÛ·ïÛ·Ï–u;¶)ÖŽÝSd~2Íšš5‹eM|†PG×>ß«ëÛ·¯Û õîÝÛl7i‹ûUW]e³æ]wÝecÑ&Q©7n´i²O'…®¤³xP™œKèDìÔT s ¬Ì’£ ¬B9&ÅÆB’¼‘ãi 4c/…œôóšŽ ´råJ˱Áç¶d¿ùæ›ö­eË–ýöÛo§vÚ!C8`ƒÕ2ï¸ãމ'Z1ÊE+³ò%jzQ$™U¾ŠšŽ1³hYðÕÕtlKr-$UésͶ®Ã#”¦sKä65žuÖY÷ý.¸àÓy'º_¿~¦óÔ Ø‰•”r(k‡6t~wÎ1Ûº¾¥à8ÚkäÚkн¦›Ï½‘:v“ù”I^º#2TB¨¼6ßK…ßU #Àe(WÍa¶¦š³c 9³š›žøä‘´Ÿh ¾Krªè(¼ëݲ¨ª¸wý]miÊQÏ MÓ Gõ•ÂÝ»7]Ï 3ù§Í¹i™»víš3gλï¾kº—ø‘°†·u=_×»wïPÏ3Ï<óÈ#\~ùåá÷ß%%Ò¼QÉW® kÃPq„HÓUímÁw´CªçËxÎwß}·råÊ#GŽÌž={ݺuW\qÅĉçÎ{ñÅüñÇwß}÷‚ ®¼òÊcÇŽ…\R$mæËX¿>|xïÞ½v`cÑβqãF Æ"ùàƒÖ¯_?yòä™3gº¯½îWYô‡eð,=ì‡e\®úûï¿çÍ›7kÖ¬>}úØ×—_~yÅŠ«V­²±xÏ=÷ØÈxñÅÏ=÷\ï—¦oƒœ£wìØ±víZkÖ¬y饗&L˜°hÑ¢O?ýôꫯ¾÷Þ{Çß<–¥Û Vmb$[´qGÒÑIx!;qxÊr¢--•‰”Øhûý÷ß·oßþÕW_:thøðá×]wÝG}ôú믿÷Þ{¶ <ØæNÓõ€)«ÄÏBц' ^†µ×ÖñAƒÙÁ¨Q£&Mšd´±h\vÙeçœsŽÿfp¤–Õ&­]¹ˆ¡M® +@½ Žu"±Xd…Çb`géa½¦³mذaçŸþ”)Slj´©Ë¦ÉÍ›7ÛìµdÉ’gŸ}vÛ¶m?ÿüóˆ#úöí‹Û¸Ò½fG'Ùbm ºìÞ½{ß¾}6(÷ìÙcßý矾ýöÛ!C†¸/¼ýÚkU=ï‡e,î¡C‡.]ºô7Þ°ãqãÆmÚ´iÙ²e]tÑ´iÓlÖ|衇æÏŸ¿xñâ1cƸ^³q$¬á6GŽ=ÚlwÏŒ;Ö¦ê'žxâùçŸß¿¿m6<I‰4¯D¸ç%»ºšŽmÎĪzdA·¯×vRøwÞ±‘1£“3üiBI#ýÒK/]¸p¡ØÖÖ½köÕFê‡~ètú¸Ô‚É$géaÛ o›;×l ŽÚº~Ð2†> ¡òöz×»§QýÏvt=@HýS.e6ÂlMÊdÇ@sfÊ4=®×ô¿óõQhº‚&ä`„¥{M#¤(sHjµ×̱¨‡kÒ£5Zƒ(§¢sÍhF\ªô\Ó=×ìqY³èç²Ò¬iÿB®Y“UÕ#ï¡+ t²üRœ„„¢šÅäÆ3³ KÈYCXg²˜C$Ôáì ²3Å#ù<eHkŽg9)~_SBȆ¬|Ôû¬—(TŒœ5„u&‹ÙtJ:c!u‹ø<É$gѬ©Y³ÆY“ugÒW:`/ÇjéŸ!_ ž¤9HÀ¤¬ !g畈Ê$}•D˜éy 5é(ŒrzÞÝ Íš'KÖtÿP§x&}¥ör¬–þò¥1À áI˜ƒLÊú§rv^‰¨LÒWI„™žÇP“ŽÂ(ç¤ø/­ÂB¨°þ*ªy#ÌÖTsv 4gVs£Y3‰fMÉIU²¦QRª%é= If•¯¢¦cÌ,Z|u5ÛR¢t=׌цš½Ld/ë *FÎÂ:“Å"¡gW ˜)Éç!0à¨H&9‹t¥š’îÐ  Âú«¨æ0[SÍÙ1МYÍMO|Ê\Ra!TXÛóF˜­Ùž³c 9s{n´ +Õ–züSîôÁlÌ1MzÊz?¿­O¹›¢O¹-èÙ¨´ c±æt=< 'ÕÃ#?ðy 8*’I΢GîYH2·íUlÒ1f- ¾ºM:¶%¹’*½‡ž…$³ÊWQÓ1f- ¾ºšŽmI®…¤J ºôtjm¨…µ-š)ކD¤áBA28BÅX<!²RðQï³^¢P1rÖÖ™,fÓ=(éŒI„Ô],~àópT$“œEï¡kÖ¬kÖ4JJµ$ M¥š’nƒ´ ×¸ Sx¦ôJe"¦¤åÐt¾¤ÂB¨°~쇤6° å˜xí€9XaÎ%@s2ZrWRª!i¯©½¦öšJJEèß•ÇïÕ«Wô†c²¯ö]'òà ý˜å{¦W "™HI8u$@ñ`„጑Q¼È^ÖTŒœ5„u&‹9DBή +@1S<’ÏC`ÀQ‘Lr–öð*¤6áP“=¦Jže†üèð2ç´,BÅX<!{ÞÙ&œ\†ÚXHP1rÖÖ™,æ u8»‚¬ÅLñH>GE2ÉY4kjÖ¬qÖ4ð<‚=}ÇTfæIHò%Ί"ÉWÖýÔV¡¯0+̹hNF‹çè—}µ×¬k¯É~žÂYÙø|P ˜™ÿY”äK$΢H2Si‰cfѲà«KœØ–äZHª´×Tª)é¹f’Ìm{›tŒ™EË‚¯n“ŽmI®…¤J³¦RMIwèPaýU4š0[Óh²c 9³Ñ4ZÐ3‘hA—LT5¡ kÖÌG¥Y‹iÖÔ¬)rN¨¬i:㔾ݡGîªÈ^ÖTŒœ5„u&‹9DBή +@1S<’ÏC`ÀQ‘Lr=rÏB’Y嫨é3‹–_]MǶ$×BR¥= ‰tÉIU ºfÍ$š5%$UMÈš†«÷žÉ¾í5µ×lA¯©=‰tÉIUs z¡j^"?K|œüYNSªyÑš%Õ_#{&9®æ0[SÍÙ1МYÍfÍL$š5%$Uš55k& éÁYÓ()Õ’44•jJÚkf!Ñ^S2AR¥½¦öš C´×TRj2ih*Õ”44•jJú 1ÚP³—‰ìe= AÅÈYCXg²˜C$Ôáì ²3Å#ù<É$gÑ'²dîªØ aÌ,Z|u;!lKr-$UZЕjJšJ5%ý}ͨ°þ*ÎÛa¶æ¼Í™çíF·Aº ªï68EC3Çãš!°&‡&õˆgJ¯T&bJ YHWáKJ ,„ ëÇ~Hj«Pމטƒæ\4'£ÅsôzTX?öCRX…rL¼vÀ¬0ç 9-ž£YS³f]³f›þ÷©ÝÑêŸÊâ>5ó¿O5JJµ$½Q™…$³­¢ÝĘY´,øêÚMlK‰Í‰ãh¯©½¦öšÚkj¯Y¤×ü'š(˜8}|IEND®B`‚PK“l[F settings.xmlí™ÝoÚ0Àß÷W ¼Óíº5*L”­k·n«í>ÞLr€UÇÙ)ýëç$¤¢i²¦WÓ4^€ØþÝq>߇9~w°Ö„¤ÈûVw¯cµ€{èS>ï[W“Óö[ëÝàÕ1ÎfÔÇG/ €«¶¥ôÙÒ˹t²á¾ î ‘T:œ å9Ï—9›³TXöä–Q~Ó·J…ŽmÇq¼ïÛÝ££#;ͧzÈgt^WT6{S"Þ JdʤÂzÎ}·Zk%7LÓ³¹òŸ?8^ ÈÞÚTAئµ~œ¨Ö·´HgI!¾·šU¶îášk*é”ÁP™`håƒjêAÊ•5èÛ!Ï_ÀL™!§¾Z”¡ß¼Ùß™~t¾(Õ¼§_uñ퀄mÊ}¸¿( âò=J×hï«: C|î´”Jh°‰;tŸ¥i-è9!Ú O)úpÉ #~·†û"!Q\¢¤J{ÿ½ä!ùgù`;ò z‡\憌ª/èCÑú ;ø7E=Sô‚ö¹š<Ÿ›úà=E—ÒÇ„Ï+ÌSû|>„çú6³rì¸*¢ìÈm6vçÔT ƒÁ¿ƒ‰¦4êÑ ôš°¨HMív¶µ™CZÿH?Üî.0þ(h1jOn ”ˆ œ\òp3YT §Q½îÑJã}EBIûΑÇÈØ”ˆêü]?¿þ÷°*Kœè:ææR@RTyÛŒ0YánuÄü©þòùî\‡ÿ•)ôvgð)rB!CQ@3LNP·w¸ßë½>l`_ XåŒH­zð1Æg@|Ý–â.”4èçò[¤t+î*˜"“.3n#B\NÂ Ž‰TPÜè&NV>—ë~Ę„1H½ß•Õ·Žn[F "¾´ßïFSŸ.©¬T¿!x¹òÛºN†ÞR鮸·Èé¼\1°nFË'HPõo²‘ É?çÚá‰?Öá9[™HKd ×ÙÊ7>b(MœŸsù~} ä.ˆ¨Þ¿D|Á‡’~qOE¤¤—jBÐ0 ÙêJ‚xOi>ZŽ´ˆ§}~„A(@&Óx•v©+ÔäÔ‚ŠŠÍДH8<8¡œˆ•e×F}Õ_ÊëàŒ«Ð' N…®G!™þܼ]‡‘Âa^dÿ!˜‚ªKöÊ,ýW'¸ÊцrЋ”1CÆt=™xû'œŽ÷€5/Äp¡a¶š¼ ü&;ÊÕWq[^57W<™ÿ…®Át[e¦4ZJ®± wß»\T–®ö£¿Îìª?¿PKñCgÁ–PK“l[F content.xmlíYßoÛ6~ß_axÀÞhYN²&^’bÃЧÖnØ[A‹”Ì–"’²ÿ~GR¢)ErÕÄÛ‚¡/NL~w÷ñ~ñ˜Ü¾>”|¶£J3)îæéb9ŸQ‘IÂDq7ÿãÃt=}ÿÝ­Ìs–Ñ5‘Y]RaP&…Ÿ3zíwïæµk‰5ÓkKª×&[ËŠŠVj£×Ζ_ÑæOwàXÚЃ™*l±Y¼™nÙci¢ð~ª°Å‚Scñ\N>hŽr ^/+lXÅ3ñùn¾5¦Z'É~¿_ì/RIzss“¸Ý@8 ¸ªVÜ¡H–PN­1¤‹4i±%5x*?‹)‰ºÜP5Ù5ØàGQ­ÕãÚÄœ¦(–éä×®˜œ]»bÄÍÙ«ÉyæÀÝT¹ ÓSå‚IJ%6Û‘ø^'ï`Ó}¼{{Ì+UNµe±WeŠU“éѱ¼”2Pµ¾ØÝÕry™øïz¾WÌPÁ³“ð ó,x\–CN\šÑMùPDÖzD`•øíÖdTõ_ï޾϶´ÄG0û21¡ GÏ(„Ñ“^%ŠVR™à˜|zó…h­·­)ùxë°»-´P„ BÎEmŠíÝßé­§óá&q ¸ŸžH—‰Å„’„p›¿*Âý”ËZß¼3è¡¢ŠÙ-ÌØº£!Î`.Ÿ ²¹Ó" FÏ(o«?iP”¨Ô ô²ZGÒÝ{C•‡iêl¢K’÷5öŠ>Óú ÅöÃï‰ÝCöÚ„‹¡± «ù};ø^ “°ÃŒ€rœQDhÆõý­ïñayæ¿[Þwó_é'üg={T4áV2þp7ÿWRÿaüÂ|ÖQi±¨ mBï™Öóä´Ù· î)ÕÓ¦{¸ÉæcDÅL}|‡sIÿj?Œj×O˜~І–ϱy:=W8žOJIFœ¹ÙÌùgŸÇ¹=Æžc2–ßÍ:®„+›eÈé ‰ï>;'ÊdŒ5ô]?„ „×¥˜·’ñ"ª Ž©2ŒêY.×Eñg´¡PҠКn56ð=#vzX-Òô:+ÿˆÎ875ÆMÉ}¬Ä¬ü–]ÜRVl¡±,WW?‚ñÓ„kM‘¬ +1G±t޹¦_C|uFâ—ׯþ-â{¼],aH¦ U¸ ÈKü¿¾·{¯ò¿pLÒÞ£ÃùÇ aºâØjVuPl‡,xš RPÊ2›é¬3:–Ô‡6Uae_î j[LŽknú9BCb¯„9+Ò²Vö©™³C«F!ŠÃ“´u» Ù^áÊEÆ^VB"û½•"LÑÌïp£‚.é_‹Â> —7, «Mÿé­‚72åìhßïíìA`ÊhåŒ~@[ŸjmXþÐ$Uè‚à4\ãm¯äÞ°Þn>v7¸ßéj³%VˆÓܦtVÇÝæÕׄ}¤Ê^lØm KEì³4Þ·<˜”ÉèåÖll$y8΂ðÇDo)5÷·¾óØI»æÞwšk°mJ† w 4v48Îo æLÄñ†rÝÃØ¬hê‚XQmçÓ€j)ا¤Ÿáü÷XY—ˆ°<§©6Á–‹%<ÌÜùÇy· Ýg£Ì§·oÂÍRœ÷¶¹G“1<&gn Ž ¥±Ý¬*OÕ¶|tÂ1h&ƒ«nÀhø¹?É4P|õPx•¤ËÕe "¾:}=•mÏ0ÜvVíèÐ#ú†èÑôÑQÆ«ãóóš"óPÁº6Prä}óŽÚ<¿®°öø«ŽÔÙzVqu/¤¡²ÂkÓãÈ:$º„‚¦íäéSO¨ûŸÚ%õ—è?"s*q–Q¡„Œ8sŠüSïWÆhàK)žöQÿ­†úÄ·Ä8&Æ ¬$ø|Š«ÎMƒ‰Aãe§Ït‹—c•øtÐê r3Â3B2Ðicå—×W¯–ÿ­sZŒWZ½Ö‰'Òè¯G9é ÑÉÈ[ïÿPK0ègàÌ®PK“l[Fmeta.xmlµTÍoÛ ¿ï¯°X¯6Øùh‚Wk«©‡L=4v‹¼$t,Œ“ô¿ÆvæJ™¶Uªo¼÷ûâžÝœö*:€-¥Ñs”&E ¹Roçèyù5ž ›üÓÌl6’†W{Ð.Þƒc‘§ê’6­9ª¬¦†•²¤ší¡¤ŽSS€î(´¦Á¨©œ”Ô?çhç\A1>Éq»Åét:Å¡ÛA?ãŠÊª€ƒ‚Ú¡Äi’â['ü×P5¶És6ªáMè`—2ÄͺCo­êÒý†©þßcQË?KsïOúôŸ8SpgMñÚ;fÁÿ}ÒøÍ3Å—~‰ù/PK2ô \PPK“l[F styles.xmlí\ïŽÛ6ÿ~Oa(¸¢N–d¯w×»+Š+AÚ»¯W¢e¶”(PÔz7ïyúT÷$7¤$Zÿ-ÛÚÜ6 ’ˆg~óãpè5u÷ö) “GÌcÂÂ{Ã™ÚÆ‡.óHèßÿþé{óÖx»þËÛlˆ‹Ws“‡ÂŒÅ3Åñ‡ñ*í¼7®ŠI¼ Q€ã•pW,Âa>hU”^©©Ò¥¬ïp%\-ð“è;XÊ–Æ¢‡þ3+áâh£]ßÁR0-ß°¾ƒŸbjn˜é² B‚T¬x¢$üõÞØ ­,k·ÛMwó)ã¾å,—KKõjƒ]-%œ*)ϵ0År²Ør¦Ž•ËX ¾öIÙ¢Ia<`Þ$P-ªÇ1ˆ€»’—ýÇ”øõè÷fף߳»E¼7Ï”p™*s¯?Uæ^ql€Ä¶%¾·Ö{èT½·çúÎ%eKP¹œD½ÝL¥‹ãcÚT9 ]ìÊÜ™m_YésAz×)¾ãD`^w;Å]D]8 š@9Ç ?JÊçÒ\:ݪyaq1.´!›þÉЙ饺m_ª²7õ¹ç5Š‚9s –-,ó‘àÝ›R.ëÆi)¡bþêàØ–”ÑKàÝ'[îëí`Ã’ÐK—] ~Š0'² Q5lUÒPd e'¨Ìö‚†ÒRã¹hÂî§O–ì3å6‰.ÓRØýfÆ:ßê6 ¶¹ r±éa—Æë»4EéæIú,»7¾Ã¿ ÿ$“QŒ‚’‹„>ß_¡ˆÅßdÒcRR)eM‡à%°<Þ‘86¬îißH³ ¤î©+r½§/JDD¸†'ŠCLû;ˆÑƒòöŽ©Ÿcƒsæ. í ŽóâŒxjºÉ÷ˆÒäþÚn[]v0­6~gíie—ûâá JhVïåš3[U.1]L©‘‹Gˆ#Ÿ£hkF² ŠÄ´ ¤A ‹LÄ…²^„õ¶pƒ=prYÖ*C[ø¾a+ŠB?A>ô†T5¸9û>¼3ª*LHØ(¬1D åŠr™ÏÛ¼'Ó˜wüóC]¯¬(~ªð[«ÔÝ[RUª»~ø ÂÓ€ûú.-¨²ºªŒ˜¶QšdO M ìÃ8øDÄ€»š¨A§Öá&œÃ1à¹i*DZ?Ú¹ŒB™ËDà%ÒkÆ“ó˜vó'ÓÚ9㫉€õB¤¼9›”·c!å0µÕ€¤¼½L^ˆi·g3mù'ÓÚqú5)—=HéɳB3ðŽ}õ<ô|À¹/Šm?ÑgŒtZÎ{7zy漸g“BO‚h¿¸ü=Ý·Ù—óíD‹ç'Xü ·@çê“_äÔÝ’µP`FÁ©çkÇYŒÅ½“>Txy|N9û †Ï‰6uŠ]L;œîJ-§T©¯¼…õ`ëàÔiÈv5˜3duÚ]QíôíU~¾¢‹/S4:}ŠÆNÀfí?'ÃqevTÅ|üQåri5³Ï¦•ój´Û xvÊqå5\|!®8gseöÇåÊQÇ¿¡SШi5;›Vó¡?£«Æ=ýÂÚ†PjÊ/Š"W`.…Û/tœtþ  Vy}ˆ³‚˜zyWTîisr(gŠsAò8øÝ/åÊ8ó4ãôPFû(sú);˜%yŠGj‚žä»< 6|ü>ÚU<`*¼<^¦Ã«ÁÓáP@œOùÜyT)ñjÈ”x5XJ¼:3%..°2ÝÑeq•áËœxÎq¼•áð_0ªý °L{ÊÀF•iCfÚÅ`™vqf¦ü ©¯T3.Û^_hñ9ºŒ{=òâó’²îÉ_ªKÖ½2ë^–u¯Û³n:®ïÒ‹fúF[ûݾ}SýŽgé­{QâƒÁ! ±^-RÒÖe}LÖqë¯ð¹´­~ÕnÛUîÛ€®ÛjU1ù ³8N$j“ë+„÷9k3dÒ§ßëÌ5´ÝîÌûõÏ¢„ô#höF_?,_a®Y£åŽGw?¶~«X¨û•‰ûK¨û ÇÝÌÍz"Äõ+KÌ2ë;8˜š'{ï "€»n®O '¡‡9%!ÎebF‰×"²#ž|…Jk‘ȯ&Uÿßsq‡‰¿rÝPïXpf'¡SV½i œjœBö«Oý/Œäëc† LGÒQª¤bÆ,áòFñ†<åÊ9Ž0Ò»B~9N›ÝxS ß+½7\ˆyg¦*f‹k¹¾Z˜s^03D“ ÍÃq\}iþÒ®iU.Šg’Ü vͼ#·ÈÇ&EÏ,%ŸÞGc45\'<†f)’nlÀ’„‰Nvò=!à£0O~Š›âa¶-°/OJmÆ Â•˜ÊZh›ÅÉžÞÈ+êªqz(ÞÈör#Ϥ˭éN'•ä÷Ü­v‹2S^ßJÁ¢ËæXµ0õï¬_x/"v²çqO’o6½ZFà­Lø]£€@„¼ô½YöÔvnóQ°ÉËCJèåIþkËß‚Tç>®ñ¤æéø‰4R¼`õü«•c¾ÞôgÎÔ¶Ì9Õ‘ƒ=[No\]ÑAj3åÛ˜PÇÛl ‡2“q²–|GDÔw¦K{ÑL↮4®Îôææ¶1¶º§hˆ2?‹ª€eÚ?AÇpÀ`'(¶í¿v¥íâ„ G¾H+ždoO‹'ìáìBÃgÌ™©ŽEñø’Åï,Ñ[­;|Ö X«Ðû~Ö(5u8‹‹¨¡0HYßÉÒkeÿÆ[ŒSéõÛ·oï¬jcÖUÂP["——¸$ŽÀ†Z‘˜b£gÿ(}Éöd_;ù|…¶š ¹ªè&X5Aû){IY²³²yµì˲Ot$Ø“¯S9A-ФÏßÔ€(ÍTjR¬­Ì.¿ÂÞzÓJ“$UÛY˜öÌœÝkÛ6ÕÛά‚ë¿MrƒÁzÛ^©?Úè&ú”íûbœšXEAõ!Ùz¹, ¦m_„{ÒåóÏ‹ÍÏÿ ÈÓ{X¦Ý¬Ê•„É:¯õ²ÇÆ —Ðñ8YÍYÑj~…êúÿPKP£zÔ ‚UPK“l[F manifest.rdfÍ“Ínƒ0„ï<…eÎØ@/r(ʹjŸÀ5†X/òšÞ¾Ž“VQ¤ªêŸÔã®F3ߎ´›íaÈ‹²¨ÁT4c)%ÊHhµé+:».¹¥Û:ÚØ¶+šñjƒ¥Ÿ*ºwn*9_–…-7 lϳ¢(xšó‹ÐÆÞáØ‰í{û*6ëÅ*të³ÑÔ>¤‹Û‰’QGCŽ4š¤Ùê˜ûhKdý½^Ÿ˜.Þ€¥X/š+ßà<´µ?¯ÕCñ¾M†wP÷@®á½3-t¤ä5\ËÔ{y,ouJJLO;jŽ”í®„O4Γâ³)Žw¤¸`FPS~ sÝ É:Ï;È VSz°ÈÓù€ÍÃA‰?ƒsLæ~øÃ ªUO³9Þ"n,ùAKe¬ÕYÙ’óï;ø×_œ$È⤽E˜ÈWêÇW°þPKBÙdŽ EPK“l[F…l9Š..mimetypePK“l[F¼uèYÆÆTThumbnails/thumbnail.pngPK“l[FñCgÁ– Psettings.xmlPK“l[F0ègàÌ® Kcontent.xmlPK“l[F2ô \PP%meta.xmlPK“l[FP£zÔ ‚U ‡'styles.xmlPK“l[F´÷hÒƒ “1manifest.rdfPK“l[FÒ2Configurations2/images/Bitmaps/PK“l[F3Configurations2/toolpanel/PK“l[FG3Configurations2/progressbar/PK“l[F'3Configurations2/accelerator/current.xmlPK“l[FØ3Configurations2/floater/PK“l[F4Configurations2/statusbar/PK“l[FF4Configurations2/toolbar/PK“l[F|4Configurations2/popupmenu/PK“l[F´4Configurations2/menubar/PK“l[FBÙdŽ Eê4META-INF/manifest.xmlPKpM6Spreadsheet-Read-0.93/files/hidden.xlsx0000644000031300001440000002422714562637075017325 0ustar00merijnusersPK!‘·„øÚ[Content_Types].xml ¢Ö( ¬TËNÃ0¼#ñ‘¯(qÛB¨iŽP‰òÆÞ4VÛòº¯¿g“ PHU¥—DQ´3³³³;Ê"ÚGmMÊÆÉˆE`¤UÚ¬Sö±z‰X„A% k eG@6ŸÝÞLWGQµÁ”å!¸GÎQæP L¬C2ëKèÓ¯¹r#ÖÀ'£Ñ=—Ö0!›MßH€× ¢¥ðáU”ÄÄÍsœ‹žšÂŠ;e¹BKH9ßõ‡5¶Y¦%(+·%q%5Ø]…Âÿ%Äp,S¡ó æ¡,’´e^@&¶Eˆžä@cº‡/kíÛÌ„*ëö1×{ú½ë÷doýæÓÚ͵]©ÜIJ¡M«»+4½¥·9Íz°¨,W bGàƒ†“g]ÜÀª÷zŒÈë×d°†ßÑ8á÷yСcø6œÑÑ‘ÒÝÀý£ú…{º+= (mY-+^»Á÷ŒÏ˜ ê=xRyõ3ð»OÇ)óÒz¸ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK!J©¦aúGxl/_rels/workbook.xml.rels ¢( ¼’ÍjÄ0 „ï…¾ƒÑ½q’þPÊ:{)…½¶Û0±‡Mlc©?yûš”î6°¤—У$4ó1Ìfû9ôâ#uÞ)(²ºÚ›Îµ ^÷OW÷ ˆµ3º÷ŒH°­./6ÏØkNOd»@"©8R`™Ãƒ”T[4e> K—ÆÇAsc+ƒ®ºEYæùŒ¿5 šiŠQwæÄ~ Éùomß4]¾~Ðñ ɉ “ Ž-²‚iü^Yyž¡\“áÃÇYD>qW$§K¹Sü3Ìb2·kÂÕÍ ÇT>:¥3[/%s³* }êú±+4Í?örVÿê ÿÿPK!0{ÁR;xl/workbook.xmlŒQÁN1½›øMïÒeq »$F\ ‰ çºeºmÓþÞi 7OÓ7ÓyoæÍl¾ïùç¥Ñ%2J@×FH½)é×çëÝ„¸\ %=€§óêöfÖ·ý6fK@û’¶!Ø)c¾n¡ã~`,h¬4Æu< tæ­.| :Åò,³ŽKM S÷Ó4²†gSï:ÐáHâ@ñ€ãûVZO«Y#¬Žní;ïpî½¢Dq^„ JzÐôp•p;û´“*V‹¬ ¬:/¹tâ¶+ ½ÿËGHök©…é±k‚îNèAŸ*k)B‹æŽG£â”{¹i&³É(‹Rì‚>y„2)øˆ¾ ñ1.pF|»©Ä‡[ˆad¸ú µÑ‚¤¦‹ž<3 ­Ðû3Ež†H¨\sU/‰!iåÅCža§»W¿ÿÿPK!ãý¯P®× xl/styles.xml¬SMkã0½ú„î­â@K·X.{ ,´PH {D²#Ї‘Æ!î¯ïÈvâº{Ù½ØoFš73oFåËÑYvÐ1™à%/îœi¿ ÊøFòÍê„àØàµä½Nü¥º½)öV¯÷Z## Ÿ$ß#¶ÏB¤Ý^;H÷¡ÕžNê ™±©TÊAΊåbñ(Ï«²ۅΣäËÉQ•é“ÀR] .ªÒƒÓ£ý3°ÙUƒ3¶Ëì™iäû‡ð%±öº,rTe ˆ:úl›¾%uã×¼Åã°B󋬾ÿÿPK!¼« 1Ö¸#xl/worksheets/_rels/sheet2.xml.rels¬Ëj1 E÷…þƒÑ>ÖL¡”x² …lCúÂÖ<èøå¦ÉßסÐv ÐMw’.::h»»øY9˃V7 8Øè¦0x=½¬ž@I¡àhŽ \Y`×=>lê"îk&ø“·ºÖ7'\ü»ûÿÿPK!°—j%Ðæ²àm•П›Ë“9%Ú°¶`B¶ÐgÐô"ýø!ÞIõ kC¡Õ ­é"ÏÓy ÓÙA‹H)Uà þU•§;¬pEðBß?÷Æ[Ú3Dê_8dYò2™ohMO¢@0ƒþuÍ;MÓ¸àˆÙ†ˆ‚2¡Ë ZO©—ÆNù‡ý&¶‘{),p]$Ô·©Þ_¹—®‘E (ÙV˜•w¼05-˜Ì1Ñ=x+wWÀ«Ú NØ«g̰4VrG°ÛGÛ1;» :Cß¹ .1Še¶Ç4bïÝä/àê Áõ8@åÍð-ͯ=hž•ÎPfKœÙCÊÙqÊzŸb'7V›¾¥¶Äèêü˜jeK^©ÍŽS²} ª9‡øvG„ó!»·Ò¿Ê~ð ¨ V „&¹Ü¶è"Ä9Ñþ¼da„ !ù«øj¡´mqð u¬‚oLU¼ÕD@‰”þd6Ÿ.FîêOÛ˜‘Ý;U÷ÒÙ¼Ö¸L€'f1™Ÿ£ÇŸ¯Oð…”Rš÷alÃ:ÿfÛ‘’›ÜX¼¤â¸\n§ÚIe㆒ã¿%"ëxB§>¦âÕax>Š qoìÒé&xÕÞqS¿ É.XË¢¸röÓO¬é¾¬Ü'ÝàâjòväV6¬ý| ÕV0E„îk{‡bËÓëüÏ 6NÙ#{aˆ½±ñ4P±ü9Sl‡—!Q/ª®‹ÀáúKÿÿÿPK!òŽöëŽD xl/theme/theme1.xmlìYOoÛ6¿Øw toc'vuŠØ±›-MÄn‡i‰–ØP¢FÒI|Úã€úa—»í0l+лtŸ&[‡­úöHJ²ËkÒf¶%‡¢~||~|¤®ß8Ž:$BRž´½úÕš‡Hâó€&aÛ»;ì_YóT8 0ã i{S"½ï¾s¯«ˆÄÁøD®ã¶)•®/-Iº±¼ÊS’À»11Vð(Â¥@à#³¥åZmu)Æ4ñP‚c{g<¦>¹¢Ebo#Þc !QRwøL ´h’ØÁ‰â\ppP×9•]&Ð!fmühHŽ•‡– ^´½šùó–6®/áõlS Æ–ÆõÍ_6.,"JëýFëÚV!ߘšÇõz½n¯^È3ìû°T;—²ÌF­ÞÉe–@¶9/»[kÖ.¾$enέN§Óles±B È6søµÚjcsÙÁÅ7çðÎf·»êà ÈâWçðýk­Õ†‹7 ˆÑä`­ÚïgÒ È˜³íJøÀ×j|†‚h(ÂK«óD- ¶?à¢dXÑ©iJÆØ‡8îâx$(Öð:Á¥7¶Ë—s]Z’¾ ©j{ï§rb&ïÕóï^=Š^=ròðÙÉÃO=:yøƒ•å ÜÆIXøò›Oÿøê#ôûÓ¯_>þ¼/Ëø_¾ÿøçŸ>«B Ífôâ‹'¿>{òâËO~ûöq|SàQ>¤1‘è69Bû<†µø3'#q¾ÃSgŽ@v…螊àí)fU¸qwO{ToN8sDb¢h…æ(v€»œ³•ØÑºJN’°Z¹˜”qûVéîâÄqmo’oæA騾gš{ X‡$! éwü€ŠÕݧԱë.õ—|¬Ð}Š:˜VšdHGN ÍmÓü2­Z3¸Ú±Íî=Ôá¬jÕ[äÐEBB`V1ù!aŽoâ‰Âq•È!ŽYÙà·°Šª&9˜ ¿ŒëIž ã¨)«ÆÜ°Þ’Ów0V¥ÛwÙ4v‘Bу*™·0çeä?èF8N«°šDeì{òB£=®ªà»ÜÍý ~ÀÉBwߣÄq÷ë‰à. )ÍD¿™íK`j‡cšü3 llcà’ŒÛÞ&lMU)±}Š‚áþ…Ä»…'ÉXŸßx.y÷’w½ÿ<ï.Êå³²íŒ`{uñ` cS&Ç‹«ä1el ¦ŒÜ’¦P–°[}èÔÍ‘Ǧ4‚fÆî.ØŒA‚«¨ŠN¡È®{ZH(3Ñ¡D)—pº3Ý•²5 ueφM}j°„ ±Úåí^ÑÝùá cöœÐAsE+ZÀY•­\˄²ßDY]OêÌÚêfj†ëmÅ’Á‰óKƒÎšP† (^ÀÊ«pJתáp‚ ´Ý휻Åxá"]$#ÌGzÝó>ª'å±bî v*|¤Oz¯±ZI[K‹} mgqRY]cºÜ{oã¥<‚g^Ò‰{*YRNN– £¶×j.7=äã´íá\ Í8¯K]ùaÂõ¯ì}‹“¤E8YÇÙd6Y>óf+_˜›u¸«°vŸ[°£"RmaY æU,Ñšìü—›`Ö‹Z€ô7˜ÅÊÃ?6 °£ëZ2_•]êѶ³•ò‰"bGhÄ&bƒûu¨Âz*ázÂ0‚~€Ë4mmóÊ%ç,éÊWXgû1K#œÑ­NÑ<“-Üäq1óTš¬­rîfqç_ŠIù ZJ9ŒÿgKÑû ܬÚ>\æ Œt¾¶=.TÄ…Òˆú}•ƒÙ2!ZàB^CPÁ•²ù/È¡þosÎÊ0i Ç>µOC$(ìG*„ì-™è{°z¶wY‘,d"ª4]™ÚiÈ!aCÍ«zo÷P¡nØ$£ƒ;îs–A£P9å|s8¤’,+¸&'ï ®|l2ƒ>—‡MA“Û¿˜bÅ®jÇ›áùÞ{šõgeV#Ï PVÚ ZYÚ¿áιÕZÆš[ñr3Ÿxq~ÅÐYD)Üú ýû>#&Œõ†:äûÀ­¾6ha6ÕWlá4AÚÎN¶ÓúY‹²¦ÍJ'mοÉß…ÞSÆÖ3;‹¿Ïiì¢8sÕ9¹x‘ÆÎ,ìØÚö-45xötŠB×8?Éǘ[åoO|ô½wüf¿FÉžL¤{Žà¸Iä&:ŽÇ"ÖoùxŒŽ ÅM3‚ƒ=ìX!:ëP$@o^TçCü‰T7 7Ãñ!°Š‰Ý0È[8Ê[þq’7E‡6áL¿zÆËx]ÃjË*\v*ïÚÎG/övåbY‡‰Ã"ËGÄ%^|’Æ&ÁA/ Ì%jÛKàó¤§)<&ì,vÝ2H…); lc Ê¢ê°q$ÁÉÚ#LÁÝð¹TÝŸ1ã Ïg4ŰÏA­üá ˜{/i}my >Ÿ*ó ’7Fyc’ÂÖm˜(íÒ–j¹Ú,ÈXrmox8¹Œ6tÆhË‚ r`žî€³†ƒöÀìú‘¢ÜøÿÿPK!¢Iïžkixl/worksheets/sheet1.xml””Ms›0†ïéÐèÐScÀvüU “Øõ¤‡f2‰ÛœeX@¨´¶Ûþú."ÆxšÌ´>Øxíû®VZ«Ÿ¥b{0Vê*âÁÀç ªD§²Ê#þm³¾˜qfQT©Pº‚ˆÿ˯â÷ïƒ6϶@F •xX/<Ï&”Ât ‘L›R ý5¹gk"uI¥ò†¾?ñJ!+Þ*,Ì¿hè,“ ¬t²+¡ÂVÄ€HõÛBÖ–Ça*‰5b²ˆ_‹Õ˜{q蜿K8ØÞ3C±} BJ à¬ÙØVëçfá ù¤hÝ‚FQ$(÷°¥HxL½ùÑz8¯sˆÃÓóÑmíZqoX ™Ø)\jõ$S,È5L>š^ò#|Ї[yD‡ÇúWE}`Ô/*×Ö¢é~°SI¼¦(¥5ØÇ~èí©˜ä…ÝôYpÎV}6ì˜G^áðUCŠv†£.ÑsÓg㎉Ž^¥h'zÙ%:ÑeŸMÎ٪Ϧ;3lÎíï¶Q´3œu‰í.úl~Ζ}œúÝ:¶× =´ZäðU˜\V–)ÈÈÌLgÓñ¼÷¡q3í±¿ÊP×odm5¢.߀ÍÐÕ˜f“ ÷ñgŸ/è€2­ñmL7¯©üpW³LâFo&½,´‘4‡nü"^kƒFHälga-Å{J¼Û•ÛF®WAËkZ¯VµŒøÈ'zù Lzòkë]»²˜P2¯ž$/½kGR§é­ÛUüA”õ§¥ûæ}ËîàÀt)ªï”0ÜÑ`è~®Cï”Òcëó?:Ͷ˜»wb/ ¡×/œÆ®{IÆÿÿPK!ã)?޾ xl/drawings/vmlDrawing1.vmlìV[kÛ0~ì?ï¡/Nc;uÛ¨v ëèSéÆVØÃE±”X¬clÅuúëwd9·²Kaäek ±|ÎwîçCIÚBüêš6©·¬4­³\¬2« †™dPЦPÞÛ7=~‡„ÙLf‚ºÇÖ¦}h3¡¼ ÆI€Ö9+…b+XÒPÑšÔ\šNmõ’¬ÜÓÎ K½Èv.†{>&Iã\šU)ˆä©wßø¹7Qy$¨x-ŸÚ‡§Aàw¿A%F¶L‹”Ìä©WøÊé+‡UîÑŠ>9Œd*XòR×f¥Ðk!¨\fS±ŽÈ¼b\ mºRa‘zÆÌ@k‘›gêUxZ׳SÀ¦šÝJê(8{ľÛ+Ï%qTB-MÙ´µ4âÂU°j.õ@‰™¡áèä8ŠKsÑ ”4v’GÉMNÇcTæBÎsCãøØBŸRsÑÒ°óÖÈZN¥’fEsɹÐGd&•Ê@A•zRÏà=Ëó –š“oçÁw[3¶I˜8VÌ–6}´–84~nÛÚ6{Èá‘€îºØG›* …þ§u¶¬μïåfϺ­A‹íŒ .ÝZ»L„$\6¤o£U ˜’sMmÓŽ&ɵ.6t×.i镲3þ€»I>NpžwÝdoÁôûBôWï«4ù•PªvEYñ¥Îr¨\$òIû$ðÉ™OF>9Å—”’á> o [>¹fªVÝ¿»RZú©’Ú¸l¶˜]áx‰Ó¸Æ!lQÉ.äFj±é$kˆ~‡MÛB6’5ä3R ëU ©‰­§K ?ß_ËP,ŽZ×GÂÈp°‹7Ã,*u‰KèD†½ÖÜt¯â€”&ç8')ŽÍÈ®åQB¯7Eñ®ƒóª‰Iºû j"°þkØ[#¶Z-Öèßô’c&§LªMÖʤÚÎwêLN™T»yë˜IÉ}^úwÐécö ÿÿPK!å€ä „xl/comments1.xml´‘ÏJ1Æï…}‡»í.ˆÈ&Å EAŃ>@ØíògÉÄÒúô¦Ín‚॒™o&_~IšõÁ¶Ç@Ú;ÁWË’3t­ï´Û þù±½¹ãŒ¢r2Þ¡àG$¾–Å¢i½µè"±dàHð!Æñ€Ú­¢¥Ñ¥JïƒU1¥a4T ˆÑ¨Êò¬ÒŽËF}ÅÁšùôºi ‹rRu:òES¼$,`/ø¦â,÷?w‚—É2â!5…4ÞÓDßl¯Lº_É!I[ïb‚Væ¤õÊjsÌbuà¼1Ê7‘­Hnœ ÃÄò›£¾.GU,Î<—õŸ\W檋ÅDVÿM4¿Yþ¿9#ùÿÿPK!Sš "¢(docProps/core.xml ¢( |’ÁjÜ0†ï…¾ƒÑÝ–e§Û vHKè¡ :´ô¦J“[Ò$ξ}Çò®³KJAIóë›™´¾zí»ìB´ƒÛ0Q”,§cÝnÃîÚ›ü’e•3ªlØ"»j>~Xk/õà6 Zˆ‘\”ÚoØ¢—œGý½Š)ï‡Ð+¤cØq¯ô“Ú¯ÊrÅ{@e*>s¿Ùiô‚ôÏ¡K£9tЃÃÈE!ø›!ôñŸRäDÙ[Ü{êéPî)Ûè9¸¨_£]„ã8cÊ úÿµýþ#µš[7y¥5k£%Zì Yó·-íâóŸGÐ8_/ è ‡Ð|+¶ì£Ë®Ùž^C“éO°‡`"ÎND0u°i”3þì‚ÔŠ¸¥ÙÞ[0×ûw™Þ+¦„^ìô;š‹”q9N± x¬C0X•"O«-KY®d-~§§"²%MaîLF¾Êy ÇÈÏúË×ö†5dí§œ–¨Z!&Å%ñŽªd e]€ý¡¯ÿ«‹¼¬rQ·‚*¬dýù„xÌÆžÿíæ/ÿÿPK!½cõê„"docProps/app.xml ¢( œ’AkÜ0…ï…þ£{VÞ%”²È !!äPèÂ:éyb×"²$¤‰Éö×wl7»ÞöP¨N3oO#©›÷Þ¦lƒ¯ÄzUŠ}Œõ‡J<ÕW_E‘ ¼þÿ  þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿ þÿÿÿþÿÿÿ þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿÿÿÿÿÿÿÿ ÀF€+%T²kÅ ÀWorkbookÿÿÿÿÿÿÿÿ„SummaryInformation(ÿÿÿÿÌDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿ  K(Ìá°Áâ\p Abe Timmerman B°a=œ¯¼=ìÿìÿÌ=€480@"·Ú1ÈÿVerdana1Èÿ¼Verdana1ÈÿVerdana1Èÿ¼Verdana1ÈÿVerdana1È Verdana1È$Verdana"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)àõÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ à À à+õÿ øÀ à)õÿ øÀ à,õÿ øÀ à*õÿ øÀ àôÿôÀ àôÿôÀ à õÿ øÀ “€ÿ“ÿ“ÿ“ÿ“ ÿ“ÿ“ÿ“€ÿ`… Sheet1…ŠSheet2…‡Sheet3ŒÁÁaiüÿú£l#¿ÿ£ly+€x眿ÿŸ˜ )\m\m¿ÿžàz“`Up¿ÿ œ¿ÿžt0,„¿ÿž ”à Äè¿ÿŸ`C¼+)¬¿ÿž`t0+*˜R¿ÿž@J¸~)D¿ÿž`+/äÿÌ`` å`Chi¿ÿŸàgo])hñÈ~)D¿ÿž°D$"+0<¿ÿžÀ”à Äèþx2ð`¿ÿžàxèDy „uBH¿ÿŸ-¿ÿŸ \@yÄ¿ÿŸ0¿ÿŸP¿ÿŸ]‡è+&Ü¿ÿŸP#¿ÿ£l¿ÿ£lÏÓâ“¿ÿ£lz•Âÿÿÿÿy&8‘^\¿ÿŸ€#‘^¿ÿÄHü„6¿ÿ£l¿ÿ£n“Óâz•Âÿÿÿÿy&8‘^\¿ÿŸÀz•²y&8‘^\¿ÿŸÐ‘^p͘¿ÿ£l¿ÿ£s¿ÿ£qxèD¿ÿ£r¿ÿ£puBHîœü„y+€x眿ÿ¡Ø ¿ÿ  t0]&Ð$y€y+€$¿ÿ¡àÏàÎ`y&@¿ÿ p¿ÿ¡<¹¤¿ÿ£l¿ÿ¡ uBHC¼y+€¿ÿ pt0ê\,RCrc[Î`},;@$¿ÿ£luBH¿ÿ¢Ty+€¿ÿ¡àhÐPM¿ÿ À- ¿ÿ£l¿ÿ¡h0$$„¿ÿ pt0¿ÿ¡xèD]Zy „uBH'uBHz“`ü†¿ÿ¡P¿ÿ¢ÿÿÿ¿ÿ¡@y+€ ò(‡…““ÂKÁ•‡…““ÂKÁ•‡…““¿ÿ¡p‡…““ÂKÁ•͘ü„Á¿ÿ£l¿ÿ¡ t0 õ¨‡…““¿ÿ¡à‡…““ÂKÁ•͘¿ÿ¡àü„ K(Ì Ë #  dü©ñÒMbP?_*+‚€%Áƒ„¡"à?à?U HBCnÙ` ÐA †<ÆÿÿäÄ#‡Ð…C @–« C ð‰ š Šš0‡  D„C”›EИ<@ ¤Í , ~ ð?~ ð?~ @~ @~ @~ @~ @~ @~ @~ @~ @~ @~ @~ @~  @~  @~ "@~ "@~ $@~ $@~ &@~ &@~ (@~ (@~ *@~ *@~ ,@~ ,@~ .@~ .@~ 0@~ 0@~ 1@~ 1@~ 2@~ 3@~ 4@~ 5@~ 6@~ 7@~ 8@~ 9@×6@à>¶@ K(Ì B  dü©ñÒMbP?_*+‚€%Áƒ„¡"à?à?U >¶@ K(Ì ?  dü©ñÒMbP?_*+‚€%Áƒ„¡"à?à?U >¶@ þÿÿÿþÿÿÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ à…ŸòùOh«‘+'³Ù0œ8@Xp ˆ”'Abe TimmermanxAbe TimmermanxMicrosoft Excel@€îC¡kÅþÿ ÕÍÕœ.“—+,ù®0Ü PXh px€ˆ ¹'ztreethÖ Sheet1Sheet2Sheet3  Worksheetsþÿÿÿÿÿ ÀFMicrosoft Excel Worksheetþÿÿÿ8FIBExcel.Sheet.8CompObjÿÿÿÿÿÿÿÿÿÿÿÿ XÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSpreadsheet-Read-0.93/files/test_x.txt0000644000031300001440000000005011275744471017202 0ustar00merijnusersA1=B1==D1 A2=_B2_== A3==C3=D3 A4=B4=C4= Spreadsheet-Read-0.93/files/empty.sxc0000644000031300001440000000000010313232324016760 0ustar00merijnusersSpreadsheet-Read-0.93/files/empty.xlsx0000644000031300001440000000000011130415007017160 0ustar00merijnusersSpreadsheet-Read-0.93/files/values.xlsx0000644000031300001440000001655611130422501017345 0ustar00merijnusersPK!ëzÒ“bÜ[Content_Types].xml ¢Ø( ¬TËNÃ0¼#ñ‘¯(qË!Ô´G¨|€±7UǶ¼ÛÒþ=›„V€J¤ª½$Š¢™{2Û4.[CB|)ÆÅHdàu0Ö/Jñþö”ߊ Iy£\ðPŠ- ˜M//&oÛ˜ñ´ÇRÔDñNJÔ54 ‹ÁóŸ*¤F¦…ŒJ/Õäõht#uðžrj1ÄtòÂ’5ÍU¢gÕ0Ü8IŒýs\0žÈîûÁ–»*Fgµ"V.×ÞüaÍCUY &èUÃ\EvÕ¢È ‘¶ðd*Œ ”Á€Wô ;æ¨ÔÊQö¸azÓ8Œ]gÛé Èî>™~ÿÿPK!µU0#õL Î_rels/.rels ¢Ê( Œ’ÏNÃ0 ÆïH¼CäûênH¡¥»LH»!TÀ$îµ£$@÷ö„‚JcÛÑöçÏ?[ÞîæiTb/Nú(A±3b{×jx­ŸV b"giÇŽaWÝÞl_x¤”›b×û¨²‹‹º”ü#b4O ñìr¥‘0QÊahÑ“¨eÜ”å=†¿P-<ÕÁj{ª>ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK!>”—ôºxl/_rels/workbook.xml.rels ¢( ¬’ÏJÄ0Æï‚ïænÓ®""›îE„½j}€L›²m2㟾½¡¢Û…e½ôøfÈ÷ý2™íîkÄ&êƒWP%ô&ØÞw Þšç›ÄÚ[= &$ØÕ×WÛ4çKäúH"»xRà˜ã£”dŽšŠÑçNÒ¨9ËÔɨÍAw(7ey/ÓÒêO±· ÒÞÞ‚h¦˜“ÿ÷mÛ| æ}DÏg"$ñ4äˆF§YÁ.2#Èóñ›5ã9é³”óY]b¨Ödø é@‘%’sç"ÌÝš0ätBûÊ)¯Ûò[–åßÉÈ“«¿ÿÿPK!]ÎkHxl/workbook.xmlŒQÉNÃ0½#ñÖÜiÒÐtS“J zA =›xÒXõÙiÿžI¢°Ü8Íêç÷Þl¶­Ø':/­É`:‰¡)¬æ”ÁûÛÓݘܮ¬Á ®èa›ßÞlZëÎÖžŸAB½Ž"_T¨¹ŸØ MJë4TºSäk‡\ø 1h%q<4—„µû†-KYàƒ-& DßW²öoJ©ð0(b¼®_¸&ÞLq… (2˜Qi[üÓpM½k¤ê¦i<‡(ÿùê˜À’7*¼‘¼üJfIÒovV$¶þçQW²ËQaÛ îçdíu¬)°¶Ÿ¥!¥Ó%- ½g”§*d°ŠWqG#ú…ÞûG¿ô‘™^ÜNq1¥;uÖî‰>ån-)q{êwã«‚«‚Ät¡_LÒE’öã=ó/ÿÿPK!UUÇÐ_xl/sharedStrings.xmldÁJC1E÷‚ÿfoóêB´$)"øúñ½±/LÒ̤ؿ7-%.ï™{g†kö?)ªV™,l7(¤9/>?ÞžA±xZ|Ì„ÎȰw÷w†YTÏ[XEÊNkžWLž7¹ õÉw®ÉK—õ ¹Tô ¯ˆ’¢~œ¦'| Psn$^@5 džoÚΈ{Ý-Î苺’ËÑ?÷gúVÆzBpjpéÛˆ‹þ ãàp×#ÄTä”?¸Û’¹Æ®->«œÓ‹%΄ °çëƒÄ?gë¹g´É¬¿Ó²¶ùÿQÍ>ð Ômzþs·ÔßÌ„ŒbXšŠœoº•Añ±'¶k´AíÆ'ˆVµ“§Ýt¡ÜÑ@'·Ç‹ÈZ¥l nÇÍœOø”nìýxêM=v9ŸðKzúåm§júkŠoÿÿPK!iÀRŠVxl/theme/theme1.xmlìYMoE¾#ñF{oc'vGuªØ±[HÓF±[Ôãx=Þfvg53NêjHHˆ‚¸ q J­Ä¥üš@©wfv×;ñ˜&%õ!ñÎ>ï÷Ǽ3¾zíAÂÐ’ò´Ô/×DÒiµƒ;Ãþ¥I…Ó1f<%í`FdpmëÝw®âM“„  Oå&n±RÙæÊŠ aËË<#)¼›p‘`"Z | |¶²Z«­¯$˜¦JqloO&4$—4KlÌ{ $¤Jê…‰fMrŠ]œ*Î…ë"g²Ë:¬€ 1?’*@ K/ÚAÍ|‚•­«+x3'bj m…®o>9]N0>\52E4*…ÖûÖ•’¿0µˆëõzÝ^½äg8 ÁT«K•g£¿Qï<+ ûu‘w·Ö¬5\|…ÿڂέN§ÓlåºX¦d¿6ðµõÆöªƒ7 ‹o.àínwÝÁů/àûWZë o@1£éáZ´ßϹ— g7¼ð €oÔrøÙP¦—1á©Zšl ¾ÏEɰ¢)R³ŒLpyÜÅÉHP¬%àM‚+oìR(–´0$CA3ÕÞÏ0ÔĜ߫çß¾zþ½zþää᳓‡?œþÌ—UüÏß}ôÓŸúPBs^|þä—gO^|ññ¯ß<öÀ·UáCš‰n‘ctÀ°Í8ÆÕœŒÄù(†1¦Ž·‡uOÅðÖ 3®C\çÝÐ=|ÀëÓûŽ®ƒXLõHÞ¸Ç9ëpáuÀ®–UñðpšF~ábZÅ`|ä“ÝÅ©ÚÞ4ƒ¾Y$¥ãûnL5÷tU‘”(¤ßñCB<ÖÝ£Ôñë —|¢Ð=Š:˜z]2¤#'‘æD7hq™ùl†P;¾Ù»‹:œù¬Þ!G. 3òCÂ7^ÇS…Ë!NXÕá7±Š}Jf"¬âzRA¤#Â8ꉔ>šÛì­}CÃò†}Í)=ôñ¼‰9¯"wøa7ÆIæÃhW±ïÉCHQŒö¹òÁ÷¸[!úâ€Ó¥á¾K‰î×7‚;4rTš'ˆ~3:–Щþ›ÐôÏš1£Ðm¼mÆí`¶&_IÜ8Õ‚—áþ…wOÓ}¹¾¸ñ¼í»oûnðŸï»Ëjù¬ÝvÞ`¡÷êáÁÆfLN–OÉÊØ@͹)Í ,a·÷aQš3")MY _óîîà" \}@U<ˆqCv=ÐL"™³Ž$ʸ„ÓYöòÖxÔ•=6õ©Á6‰ÕÛå5½\J6fωÌ´´¦œUØÚ•œ)˜ý&ÂêZ©3K«ÕL¯s¤•&CMƒÅÒ›0† ^ÀËëpJ×¢áp‚k¿Û¸‹‰ÂE†HÆxLòi»cT7A*rÅÜ@îxb¤Oz¯ñZEZK³ý ÒΤª¸ÆqEôþJ”Š žGIî©rdiµ8YŠŽÛA«¹Ú Pˆ³v0s-|M2ˆºÔ“f\…ÊÞ·8EZ¦“ œ-fSåóh¶ ÃÜ"¨Ã]…õû‚ÁŽˆLHµƒel%˜Wy °TK²ú¯6Á­e€Íô7Ðbm’áÓü膖L&$TÕ`WV´ïìcÞJùT1ˆÇÇhĦâCøuª‚=c*ázÂtý—iÚÛæ•Ûœó¢«^aœ]Ç,‹qÞnu‰•lᦎKÌSE=°Í«»1îü¦˜’¿ Sªiü?3Eï'p_°6Öá2W`¤ëµp¡b](‹iØ09˜-².dá5$\)›ÿ‚éÿ¶æ,SÖpìS4B‚Â~¤bAÈ>´%“}¯aVÏ÷.Ë’åŒLFUÔ•™U{DŽê¸®÷öÅꦛämÀàNçŸûœWÐ(ÒCNµÞœâm–ž^S4ï ž|l1ƒ<·›¦ð©¢gWµô†¼Ø{Owýù˜Õ(ª„U¶‚V^öo¨Â9·ZÛ±,^mÊA-†År ÊàÖé?°ÿQ2bÒXo¨C~½Á¯ š¤ dõ%;x Ý íâ'»hã¬YY׿£“vçßïRî)gkÍÎïs:»Î\qN-^¤³s;¾¶kK] ‘=]¢°4)N2&0懭êoO|t½wüS¦¤I&øaI`=¦ ø­DCºõÿÿPK!Ú3ÙÔ¾xl/worksheets/sheet1.xmlŒSÁnÔ0½#ñ–ﬓ…n«U’ªÝm$T œ½É$±êØÁžîÒ¿goCB9p³çͼ÷fÆÎ®õšÁyeMÎÓU˜ÊÖÊ´9ÿþ­|wÅ™Gij©­œ?ƒç×ÅÛ7ÙɺGß #ãsÞ![!|ÕA/ýÊ`i¬ë%ÒÕµÂd=õZ¬“d#z© [÷?¶iT{[=õ`0’8ÐÉ¿ïÔày‘ÕŠ°ÐsÐäü&Ý–k.ŠlT~Ppò³3Cyø *„šÀYhì`ícHüD¡„ý˜e…ê;Ð:çÄÊüÏQ# ˆI¡Èþœ_ÔÊq_«¡‘Oïíé#¨¶C’]¯./&‹{‰²Èœ=1 9òƒ N·²R…à E©,4{,’LI¯:c·s,]bûô_w1úWn”GýIi=± r7Y cxm‘¢Sáû©p´;Ç>,±Ý»Xbû9¶Ybwsìr‰…EM^®&,6g>tôÈQU´¤ÆŒëgø<ÐË7vgÍù§„U ²…ÏÒµÊx¦¡!þ$,‘¹¸ÒxA;Œ#œöNcóMÎú .;ƒ„ —ˆƒÒC½R?!žM‰{†wÀ¹%¾áÊ)^ÿbºèõÒ7A¹“\=>,·7Ùm¾ËUñÛ¸—´ §ÆÉ^Šb}P*úŒ±~Ä= 5ÚÎdyPnÕØó±ÐíÁnXv9›çþûGMðóZËÿÿPK-!ëzÒ“b[Content_Types].xmlPK-!µU0#õL o_rels/.relsPK-!>”—ôº[xl/_rels/workbook.xml.relsPK-!]ÎkHxl/workbook.xmlPK-!UUÇÐ_ xl/sharedStrings.xmlPK-!¡ó¬˜{  xl/styles.xmlPK-!iÀRŠVÉ xl/theme/theme1.xmlPK-!Ú3ÙÔ¾„xl/worksheets/sheet1.xmlPK-!‘Ïà4GVŽdocProps/core.xmlPK-!H뤖 docProps/app.xmlPK €ØSpreadsheet-Read-0.93/files/misc.xls0000644000031300001440000003300010614376235016612 0ustar00merijnusersÐÏࡱá>þÿ þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 1ÍÉ@á°Áâ\ppc09 B°aÀ=œ¯¼=x‡Ì$”8X@"·Ú1ÈÿArial1ÈÿArial1ÈÿArial1ÈÿArial7"¬ "\ #,##0_-;"¬ "\ #,##0\-A"¬ "\ #,##0_-;[Red]"¬ "\ #,##0\-C"¬ "\ #,##0.00_-;"¬ "\ #,##0.00\-M$"¬ "\ #,##0.00_-;[Red]"¬ "\ #,##0.00\-q*6_-"¬ "\ * #,##0_-;_-"¬ "\ * #,##0\-;_-"¬ "\ * "-"_-;_-@_-,)'_-* #,##0_-;_-* #,##0\-;_-* "-"_-;_-@_-,>_-"¬ "\ * #,##0.00_-;_-"¬ "\ * #,##0.00\-;_-"¬ "\ * "-"??_-;_-@_-4+/_-* #,##0.00_-;_-* #,##0.00\-;_-* "-"??_-;_-@_-¤"$"#,##0_);\("$"#,##0\)!¥"$"#,##0_);[Red]\("$"#,##0\)"¦"$"#,##0.00_);\("$"#,##0.00\)'§""$"#,##0.00_);[Red]\("$"#,##0.00\)7¨2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).©)_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?ª:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6«1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)¬"F"\ #,##0_-;"F"\ #,##0\-#­"F"\ #,##0_-;[Red]"F"\ #,##0\-$®"F"\ #,##0.00_-;"F"\ #,##0.00\-)¯$"F"\ #,##0.00_-;[Red]"F"\ #,##0.00\-;°6_-"F"\ * #,##0_-;_-"F"\ * #,##0\-;_-"F"\ * "-"_-;_-@_-C±>_-"F"\ * #,##0.00_-;_-"F"\ * #,##0.00\-;_-"F"\ * "-"??_-;_-@_-àõÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ à À à+õÿ øÀ à)õÿ øÀ à õÿ øÀ à±õÿ øÀ à°õÿ øÀ “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ`… * misc… a  … h fooŒÁÁ€8üÿ 1ÍÉ@ æ  dü©ñÒMbP?_*+‚€%ÿÁƒ„¡"ÿà?à?Uÿ~ ð?×">¶@ï7 1ÍÉ@   dü©ñÒMbP?_*+‚€%ÿÁƒ„¡"ÿà?à?U>¶@ï7 1ÍÉ@ $ ^  dü©ñÒMbP?_*+‚€%ÿÁƒ„¡"ÿà?à?Uÿ~ @×">¶@ï7 þÿà…ŸòùOh«‘+'³Ù0°@Hhx œ¨äMicrosoft Corporationpc09Microsoft Excel@€&\¤iÜ»@ÔÎшÇþÿÕÍÕœ.“—+,ù®0Ð PXd lt|„ Œ «äð" misc foo  Werkbladenþÿÿÿ þÿÿÿþÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀFþÿÿÿWorkbookÿÿÿÿÿÿÿÿÿÿÿÿSummaryInformation(ÿÿÿÿDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿSpreadsheet-Read-0.93/files/misc.ods0000644000031300001440000002023213701055232016563 0ustar00merijnusersPKZçP…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKZçPConfigurations2/images/Bitmaps/PKZçPConfigurations2/accelerator/PKZçPConfigurations2/toolpanel/PKZçPConfigurations2/progressbar/PKZçPConfigurations2/statusbar/PKZçPConfigurations2/toolbar/PKZçPConfigurations2/floater/PKZçPConfigurations2/popupmenu/PKZçPConfigurations2/menubar/PKZçP manifest.rdfÍ“Ínƒ0„ï<…eÎØ@/r(ʹjŸÀ5†X/òšÞ¾Ž“VQ¤ªêŸÔã®F3ߎ´›íaÈ‹²¨ÁT4c)%ÊHhµé+:».¹¥Û:ÚØ¶+šñjƒ¥Ÿ*ºwn*9_–…-7 lϳ¢(xšó8~D£#g¨5ŠjÖˆ†*¶‡†ZNu j,A_°ÔÛêゟKÕ­‘¾PÁ HèH ‰Ã˜ŒØ“ê÷5gñb± ~w„j­ÏÀÎEßïØÆ”ôñí£ma˜obX_ |‚òqº]¯yê;JXÁ$æ˜Õ&ÿ&¸Ñ.m°Ô¦Ö†YGOÉUlZp:®ƒ”\D½¶»“ÜÍâÇ1NfëxB§sÏÝ׸NÕ/Ü<8Šqt»Žoi<§ÉÌéQžYã+®ÄÖÀwß™…‘·’ܬ„jO›Ÿó»ÍÝ4¸€mj£·$Šn>·B8ü¼¨öUΗ±±Îgc|Þ²­Ìu«l†&¨OrrÌ%CNo»Bc6Bdn0¸€R((zdw¼úT×?úƒCyœ„‘{k—Œ¿ˆ6L¶€ísívK©™Eùt¿:¾é®t³Ü1UAqE}«µæÜ—L6ðÿ5VüS½Öî¬ßAÿ‘3 K£ë÷ÐÞ1nøo“&¯>Qríw˜ÿPK·Ú–ß LPKZçP styles.xmlí\YÛ8~ß_a(ØA¬Z’Õ‡íév0{dwI#˜d°[¢dîH¢@Òíîüú-R÷iù¶³qqÄ*«¾*‹ºîß¿„Áè3Nhô YW¦6‘C]ùÚï_>èíýüO÷Ôóˆƒg.u–!Ž„ÎÅk€ù:G|3Ì¡ %cÉ¢EœðY„BÌg™ÑGY×Y³ÏL ›´;œÛâA[Ï cµZ]­ì+Ê|ãËo†¤é¿#ãfqÁ+IÔTücÓ¼1Ž)·ëäÌñ’ŠÍu `©7¬++—ì,CQÌe+ø³?´/°ê c@â)Àe!.C«¡R$/¸¬Ü]5´»ä-÷¥”:=À^ œÜX ƒÍ•̵¡V½C­˜eì!hèX’·<ÔK@¢?ÚbËšN§†¢f¬:È tv¸Œëµ-9ιÕÑÐÓ)Y Û0¶[‰ô4܉йÜ;Z†O˜  ÔŒo¸áÐoœOTˆÄ"Ò™Ÿç(.#7É/‰4ücF$ ªÛ¬"¡F¿ó¦†b*OÖÞ–iHžŒßg®´Å"ˆ¶ ÈK€‘þLðêMÖ# [˜™IIB%`hØ¡‚e‡ŽŸe^ÌçÁA_¹u­ƒRª‡\'Ì[ÏJ½Ëƒ‡H,:&ãÄøDõÏÇ_‹)É¡!"y+ùØa$œ îJæXˆ°Õ[IæTm”RZLmmž­œ…UÓCÖ]ì|~ŸL€¼y”Kµ´_A –†Œ!$ÁkÖnôwþ•ÀTT1úŒ"Þ"æ'Sþs/iÔFÑ’_÷q¾…õ€¯çŽ˜œøŒ@19Ö¨öaÜ¡S‰Ô£À+8ÜEƒ/hACÔ2~NØut£Ëái{R9eZºØCË ­§2É©J*¿è-cC>CñBafa&a ¸A u—p"¹ŽXã«›0, ‘«|³£R´#t<: Pä/‘T©Ž` ßºæŠêhf"2ê·EFIee„¿=6%Ê…5À/ÍÉ¥æ R—›“þý¨|Óúü>Y¼Ò5¬â‰•GS«1Ò£D*ËùÐÏ%>@WµÈÌe8KÆ Æ~mÊ[ŸÌÌŠg€3ä²,Øk-^Ã'ÚAÜ‘z@‚f ·¤w?µiUFõ]Æjw ”*—Ñ5妫Ãü¨jóP(´ªð·5áçÇ»šÆ‰!Šó8\’l›žQ°Äoßý䋟ò@q¤àè•1v„vü#Êr(´®ü¨’]@¡®}ãy&|êzüÈ<˜v Hû`9î…u|~i4펃D™½‡(»þe9ç’ö.6 ¯$ìÍq»nŠ  ¡Ü]Ôt6ÚQvÑë0ÆWŒrÌÓStü²Ê…nÔ½ÕztÐÛuPvJ”% Ú=Ô!@±­Âw{Wx+5&Ú1á$ìÐcZè± KÆk#Î:!ÑR@Rh¤¾ì” PÃ’Î…‚ëu¶ÍëÜ!€c™Ne´u£·Rd|Žè÷XÒ9mûd©v@°ìÝÉ-i!ùig@QÔ¿‚ŸrËW6l˜µ{¯{NÎ!Ê»VÞl ôÍ®auÊ’zskV—Z5«°Ø%¬nׇU_²õHèòz=rf%®á|&÷ÞBôö“uLä.+eî€êøè¨êÅ„JHíºÓQ €É.p$Öç°ÑŸ!n“ 1@T°^”5LÔš¤%\®=sD‡l±ïvKZgV¾Ÿl¶Í9,€u§Œ¶7X/3Õm ùNén¿wæÁÓº3áÝYf»ýe»=e»µ™°o±œœSñvQû‹É¥o§Ø˜ì€ê Š·c¯ 瞪ÇÉYæÌÉþrædO9s²cõ8½ˆêñÒ®€¬—^=ž2×n ù9Ug›ˆ7._§g™Š§ûKÅÓ=¥âéÚTÜy9ìºt1òt׸ºÕ+&4L¨È‘×€h¤Óg̼@>b㡀㠻¢×míø8ÎèJÖÅ{ŠÎëÒÅHÄ#ŽÞŸv¬Þ´c Ìô’Š_bÉGøšäœ¤žÜx–÷&Ø9Ñ£ÌÁnÑ?jÞQ-!Û ü=¹;¿Ù»û†÷¢©yã:£Éãƒ: ”.(–¯.’ÓˆRÚ‚nr+|ú†GÛžÀè¾I½IOŸ"¨q7£¯ê_Ég1{ J)1bùƒ™zæW¦Lõ)ìåä_Ç¢Ô–Ì‹ˆ²° Í !$Ä»±]_Çæ×¼ s ‡ˆ~Õ+#k+Û3ܶ¶Ýšl`{Ú¾õã~ëÇ'²~|@ë¿€6;´Ñ-û‘ ¼•l¥TÚ»Ÿó‡¬—#W/.êzžã^D> ñ<º`Õ¤”Ósš”J™+Ÿ4¯î`Æ8 ˆ;z31å_wÎ*9ÑVŸ†Í:ñ¥"ÚØÝv¥ ±‹HõΦæ+è‘< |@ÃäœÃx#‡•dBø)qÆ£"¦ƒeE\ù %Z ÚÁÑ¥Ô¶~†uyÉ5ÃÿI©»•ìT­mæ¸ã¨9>d*šæímK>=äT|ÄKÁJeÇ‘@IßP¦Ó£ƒòWtô(‘p ÄqZWÝCòÄ¢m+É:(geØ?£ìø!»•k-$žúìÉfµõ/Ž–žfËpp³zv Ö†´mb!EâH±°éô(`ëØj¤°m·Óض êÛ“Âf÷Âf6W}š†µ ¤‡²î ‘ Žž2¥|¬ƒ5t)*vŒCKkaj9[B‡fÉ’œöyÐä¹e-óM|w¬9zH]yFéâ©ð÷6©õsEi›› ø©b!Ï^-RoÞ©7¨VÄ| ؃f³ÚÈæZkr.èAËߎ`të“*rt› V•1.àÚñ0×^€ßÊûæñÕõ´Ø7—¦¹É›ÌÌ+k’ujYÌMù—CSâ !ÀÔ‘†™çCç ÖâÙÏŸtùN $Ôùî´#•)#Å»ëäÛâ"¢ ãÍÕuG46(‰‹¬é•yÓꦜRVC©ŸzHÀlžc¹ƒ`íT®‡æŸû2oy@#_ZÇGé›ãøˆ>ý;Ðð 3ª««iüÜæüw•«Î:%„ˆç"òe;m”’ú.©”gC˺žÀ2¿—%×,Nùã„{þþýû{£Þ˜¶Ä5'Ô –ÀUë¥ìÒ£QuT>ú'iKzPúÜÊÆ+µ5TÈDU@ïUÁhà¸ÚßÒ—Hö ;n ›1ìË TR¡MÁNŒùÛ䂈 Ìš¿kR±Ò¤‚·¦…|R0CJ¾p®\¢>† gJ„¹96uó¾ÚÜ4 õ5ÍT É8ÿË(S¬0Í™úæJ·…QU¿ÓÅV†¸Qî Þ$5ŸNË’¶“Ä¢´ç³<þzã} wÚ÷&[™§5tíZè®ÁwSO b:(Jr ·¥Ñÿ7D0Ä:„J,ßFFûRk´¿îxþ?PK€•01 .YPKZçP content.xmlíXKoã6¾÷W*ÐM?’m¢&^(ö”Š&z hqdK‰IYö¿ïP/SŽä¨u‹-Ú^‹óÍÌ7œá •‡‡T{ÐF¨ì1\ÌæaY¬¸È¶á¯/ŸÈ]øqý̓JCÄU\¤Y«Ìâßµ3å ¾1[)t)f„‰2–‚‰l©²V7z«U~ëõؘ•} wÖæ¥eYÎÊÕLé-}ù…:±p°´Eo5çr½œÏWtK9³Œì”ß¶‡M5÷÷÷´’¶ÐDéôÐă4{P‡´pñ0)… Dñ„Ü­òèdÀí`Ä×ýíóÓs¼ƒ”¡ cYC«¥óÓ~œx´š·TC®´mÑ<îÀy¡eã1 ެ¡‹Ù¢Û½xÇ´š° ìGcöÛ©ºÅ’IsÌöF‚o„kVNµâ°X—¾º+†©êëë*¥â {Cc&ã.X{”09\>sU^tUj…ÓÂS°lª/‡íÕ˜Ù—ñúvÒS}Our0’$j$…ÜÅØê÷]½MuÜœ¹^Á¬øô‚Yñ^µ°Íô$V`_;+Ò èɾ±ó¼­ƒdz਷ì*Vâ©Òõ¶kĉ*2^÷оäÔ¢ž…7»q9y÷´ù‡õ¢ÂbN¦ÅKõ'H7)÷,ôÒ¯ÒÑêš0ì]—ë*\€äÓ:¸"©9oßN»ß¿ùûý»;ÄÌîFÎáýŒÂêñùÉŸ6S«ã|°˜X‹|r#¬Ñ½ÀœA3Û’Öâ0höÏ».¬Âu{7¨­Ú-$xG ‹pˆ¥Y?ÔÇ¡[êwÇô1üQ †ƒE H…<¶ëô²ò“ÀƒYTðÌ23`æ;–+óî^ ƒži‡'[Ȱ6p:˜RÓCäÂÆ˜×=Cbîh¼Cí“áä‰.8 é5 ^ØN¹ª|ã¿\ëŽ%¼Yg…EGVĤ²ÓUBõìqÕ¢sÖ°¬NY¤YØjú‹$Ç Ú 0A¢¢ö…lK :×­Å^ îæâÃìþ6M+þqnzŒ›Vå1\ñYÕ"·¸±Ýá9½™9×—éˆÊ­H™$¾®ÕLgmÙ0ëv1Å!šäl ¤Öø>;Ùëmòš ŸçVH.L.Ù±aÖØu¼«‘Tq´)5±›?Bzy é×åüõk^]C:QêïãLGOb#Ø(~.úå¨è'ÔÁí¿¾Üx¬„Õ9•Zú®èY«I=kõÏúšµêüpÿâà}‘ôn2´wס#ÿÒ^ÿPKÄÊÐÖPKZçP settings.xmlíZßsâ6~ï_ÁøHB “pC¸K¡¥“´½7a/ ‰¬õH2†ûë+ÛI|vê€Eï¦~ÛÒ·ëÕêÛòõ‡Çjk’"¿±šgçV ¸ƒ.åËëavWÿÅúÐûé ê@×E'ð€«º¥ôYÓÓ¹ì:ÈTOï"‘Tv9ñ@v•ÓEø~Z÷åèn,,¹³a”?ÝX+¥ün£†áYxq†bÙhv:Füt?ŸF؉fñàÖùùe#¹~_Ul÷–±b»ÿ/LsaõövØ¿~ïz÷.ÉO*ð"ÛÔv·#a7–V¹»¦>[ÍÊš÷zÎ#•tΠ/€ÌзöÕÖ×)WVïüºñ-È»€Ç°Pfÿ¤®ZeA7Û«£Ñ‡@—«LÍ//;EÑëñë”»°7- Âì%ŠçhwÛ"úB8rSJJ%ôú[½ÈšïÒ4Mé9#Úÿ¦èë)µž7„D1AI•vü¿Jt×È—ˆ£êt!mùŠ#\„¢Ž)ô”ö{•¹5_êo¿ï(º†}Jø2Ç<­ÃÀ÷ú–LW{Øi™‰[.mïQoQ)ôJþ‚èÍ4J©>¤Q“p~¨ È"Z}½} ¸½ÂðWAÓŒ=Gd@¸ÕS"€7w´1ÁÁFÝë|bÁ0Ã’8ÛHpß”Q" •Ì' ë‹ì¶QêÚaLˆâN —I‡%y°"‚8ZR”§ ÑN*½g4¦üéÁwµ æ\|ŸM€È “ï!ïù€¡4AÅÆ‹Ú‘ü3äIÀŒ2%«9ì tÞo„tFòãîV[;¯‘.CŸéŠ-Þ‚¿á|@¸PnáÕøæ‹ÚF޷ƽPK ׫éZ­,PKZçPL¿¾¼˜˜Thumbnails/thumbnail.png‰PNG  IHDRÎÿŽçþ PLTEÿÿÿÿÿÿ~ïOJIDATxÚíÁ1 õOm  N Î1¶•zIEND®B`‚PKZçPMETA-INF/manifest.xml­“Mnà F÷9…Ŷ2¤í¦Bq²¨Ô¤ fpð€`ˆ’Û[q⪊KÙñ3¼ï1ˆÍîÔ»ê1Y {åkV¶^[ìö½ÿª?Øn»Úô ­DrTå¦ë´a9¢ô*Ù$Qõ$µÒ@íÛÜ’ü[/Ǥël&ðÎ.hçá4qc''ñµ¢R} ‚S€h‡-å¤7ƶ g„1i»ªnW0ÖA]Êãù&`²suPth˜¸ëukh«j:h˜ ÁÙvGÔ|ìŸ_§Aét &–¨|z4¶Ëq¤§7ñ BÊÈKx¶¼–…OklÆDŒÆ·¦ÜX i»±ý÷¶áÔÅ·Þ}¿÷é]¯ñl_•Þ´‘µJ ò@‰:—ªHÐK¶ð§È3–«œ—µ‚À Yz‹†‰ZÓ®ÐV‚ñH&šm¬mÆFl â&påÄu­+n]¨ ÜpñÉ À!!c\å9·w@¿ˆè„ÌÅ€l¶ºì¹ÀPBÊLŠ¿½te®ôÊ…³’öÐÀUëYÜ{#cÛ¶AõV×?Åo«ås?ª/U÷TPŸaB·{ÀŽ×•×èî>[ 4$4ôIèÓÛŒL32}ñ¯úx<×:ͶûÎ0ÄVrUlÝ“¦ªô—½<¤ºe•ÜØ•[ëZB>?¤Á ´üPÞ\»ÝÆø¯c˜ :åþa䓱O£Œ†ŒŒX4¹á èûа“Ý_KiéöÑÏ•~PK4<É^PK²PÍFxl/_rels/workbook.xml.rels­‘MkÃ0 †ïýF÷ÅIcŒ8½ŒA¯ýøÆQâÐÄ6’Öµÿ~.[ eìГÐ×ó¾Hõê4êˆÄC ª¢…ÁÅv½ýîíáVÍ¢Þàh%°«¼Ø€I/Z³ó8Y.bÂ;]¤ÉJN©×ɺƒíQ/ËòIÓœÍS­[´n+P»sÂÿ°c× _£{Ÿ0È Ír‘3ÑRbà+/2ômùå=å?"Ø#ʯƒŸR6w Õ_fïz o Û­P~ìü$óò·™E­¯ÞÝ|PKOðùzÒ%PK²PÍFxl/sharedStrings.xml5ÍA Â0…á½§³·S]ˆH’.O íØšI›™ŠÞÞ¸pùñxü¶{§Ù¼¨HÌìàд`ˆûm~½áÌya¤Ðh`Í_Àñå/Å í³k<£Æ­yã}÷>Ë\Õ@+Üv`ÈS£m…§«=d®³ d|Ôêl™çWY+”á)Â{ûb`]« î±ê[0>± …'ø®Qãe3@ thGû‘JYsÈֻⴎų*|ûÅ¿zÇÙ+b»«„&êy>»‰ÏßZÉâûÈ×à Ú#>Sˆ›‡ÖÅ*éjPp&Èz„Ír~OO™û'µiyîb¾¿* ªÜÅ¿-:X˜o””pnx+¾‡ê–+:ª0Oax^M¡`%}³æ7×ËÛÕíâæòêúòÝÕmœrÄÄ÷‹²°xb6¨zç±MpÎyØ·ùÓ·c5ƒ“ à:ù© ª.$ mvñ z&éXæEv ðè—Ü$ˆUÆo»8z¬!ÙÒÎ8Ëüp–ø[ à(º­zEã…¾£y;£––’WÕÏŽ,MñgaŠë8ùÅõ0Ù”OÄÑ=‘2Þš8_á¶Z,nòÕôÃY4ÁÿéʦÍÑw$ÍìN½RWo‰°ÙÔÊ:Äþ¥o÷1O[æ[jýb¸Nrã,„ÝÚˆˆvˆyjÀl©rêšUT¸Hû¤Cë­P4½ƒÇÀ;Øû¤Þ3¿{-ªçF~k”Ÿv“VÌ6EEs‡mXž. »róø(³©=÷ZóËP䨗³¥ÂN…>Ç™øÝD*™TuM½3>&8cÍ[);žõ[(eZ€$µÙ™Ž)b2Oçy2ºNÿ”ÊPK+ܺÿ?ØPK²PÍF xl/styles.xmlí˜ÑNÛ0†ï÷–ïG’R Li02Mš‚"Mšvá&NbáØ‘íBËÓs§i„6º‹©Ü8þsüßǶêž-KŽ©ÒLŠ)|Œ¨HdÊD>Å÷³øó FÚ‘.âÕø,új³âô® Ô =Å…1ÕÏÓIAK¢dE¼É¤*‰®Ê=])JRm•ÜùþÄ+ 8 Å¢ŒK£Q"€VB®ùž‚8cäp—2+ß®®¯nÏ`/ ½…™Î;! õ3z$ O$— ©|>Åqì×V¤¤.ì’p6WÌŠ)_9yT.ˆÒ0mÇ«³»ƒLä¹b„þÎ ¯[?Æy[¿vBVĪD Ô<ÏV,‚€]á0uÜ¢sEVÁè¨3 n ï\ªvaw8 ¥ŒäR~_MqF¸¦¸•¾Ê'±£ÓÌX±¼°­‘•g!ÆÈÖcljGn }B9¿³[úg¶™½Ðeöz Šº'Åzo©éªâ«XZˆQ ÚuHO:ç,%Þ(ihbêYËQHÖ¨Š=Ú.`NU°®ö–XÉÍ#C—æVâ(àéI‘jb[D&Ò:1¼Ó…bâa&cÖ¾†2U­ Äeò@ӵɂ¥0´é-³A¥üM‚mëÔøª+w+µÞÇÌhoæ 3[Ÿ­½™½™½™½™½™mÌŒwé—rì”›ñN¹í’›ÓÿlÆë^ßÝe¾s¶½Æ/³×λ~þÑú¸Ó{M);HmY'¸£"û©9Å×öóœw*7_0n˜hzÉBÃD.œÖÉ5Ä\ʲ$kJpÔþƒ~ù¿[Ô¤‡š¼µPŠŠdÕ’Ž{¤ñûI=_'=ÚñßÓn¨J`Å[Ðitô6hsd`q½Ís¢PKƒöT|µPK²PÍFxl/workbook.xmlRMoÛ0 ½ïWº/¶³"Hƒ(ÅТhûÀúu¦%:Ö"K†ÄÄí~ýh%î: ‡ž$òQï‘Z_µ¶Or³n¬ÃÇ£!}ÿ:–} NËbó*ûg5èݾ¿æj%p Ùh†õoÔÄŽÀ9) VçåÙTòE ®ä6œ‡ôÃÌx¢ý<»Ó18§$Åý© %«ßCîÆAÝC¦äó“õ& JòŠ^Þ܇|}²†Z^àâËòlÊݠݶ¤ä²:ŸKAPÿ¥ä¢äg‰r“Ììä€ÜoŒØPñÆQÞÙt Ÿš_V£T>o wÎÿ„:ØdkÇŠãÊ2oÍ<3N4lWóü-aäú˰÷,¡5El¾Ã_™í„¿.ç_¡#`‘³²,«Ì; |óPK±WÕÿšÍPK²PÍF[Content_Types].xml½”ÁKÃ0Æïû+J®Ò¦ó "ív<êÀy–˜¼­¡mÞ‹³ûï}©› ÛØðÒPò¾ï÷Þ—j>ô]¶$ë]-¦E)2pÚëÖµxY>ä·b>›TËmʸÖQ-šÔ¤è>€ã•Ç^Eþŵ J·j òº,o¤ö.‚‹yLbV=1­l¡0>ªj!_:’EúŠìþK˜µP!tV«ÈýÉ3¿hùŽ””c 56Ðù7Éx½@H²q‘êNÂùÕÊj`÷ž% ¬4`òÀ–€ÑÂqlíN‡ïgMê#‰C·‹öÃcûæ}›¨ÿ3ƒ©Qæ9"ß%:;j ÊPy‚ÞúH£:’ã2½p/ßþ‡òˆÛ.ÄhzDûÿè!ðZôʺRÉñ¡˜}PKbÃ4WPK²PÍFfª‚·à; _rels/.relsPK²PÍFÐA»qãhdocProps/app.xmlPK²PÍF4<É^:docProps/core.xmlPK²PÍFOðùzÒ%×xl/_rels/workbook.xml.relsPK²PÍF}®‘°ñxl/sharedStrings.xmlPK²PÍF+ܺÿ?ØÄxl/worksheets/sheet1.xmlPK²PÍFƒöT|µ I xl/styles.xmlPK²PÍF±WÕÿšÍ9 xl/workbook.xmlPK²PÍFbÃ4W[Content_Types].xmlPK ?…Spreadsheet-Read-0.93/files/gnumeric.gnumeric0000644000031300001440000001141014362015733020471 0ustar00merijnusers‹í]{s£8¶ÿ>ë½5ÕÛ³vŒ¶ñL²å$NâÚÄIÙîž;½³å" ØÜ`äœÇ~ú+ Œ1 ZŠ{2íGoíÃÑùÿò—™«:z~~®M¼Å ùŽUÃþäèI­×ìЮÄs_gmî3d³@½®ýïÍõК¢™Yu¼ 4= ªÀilð[fÈdãÞʨ½våäEab~Ž£tçØš’%U”óÿ°OŽ9tq²8ñªõj¹Ä`L‘.$±>ãº]£ 6Ô¿dø$s×8-äWmôàxÈVØ…ñ¸2 °‹Ú$¼ ¹9!@°K̬«áëœLxp±VNª:Ôã¥Y-m?R2°fæ‰C?3]ká2)I(ð¦;@Ä›$†ÓõÌ{õBäÇa†Å‹—d #u2/‘ø4Jò‰_$P™¦í¼W@|zîLœÐê0Y†S„Â>QDϳÑKÊk$&/v %Ðv:ÀÏä´¡ë°Q9a3Õh«'Toç¾'XÀ)3”¬šñ¿D˜ ä¿*¿:vHã4D—WÈ™LC¢7­‘U\N9w‚¹k¾^`Fð žW޾ ''—¾c''dWÈ´‘ŸŒ•¤FbŽ·‹¸/0kˆO†¯³{¢„Säâç‚ñA$7ÿìνã:áëqå²3^u»£ñçÞ°wÚ»î~‹¯»…ŠF$¢ I½MþWYsÿL‹i¼ûÙA씟]&Äç™)d…':LfÐÓôŒ/ÏNâ;°ã¬ ‰“HË• ¥#\÷ÅBîøtá¸aÏßQç6î•o™ç™þ– q©Ys8ÌÉtbA“•h9IŠË4=9¡‹¾*ïÿYàðç›èøý¥—Pï_Ý‹¿¼¿„ß™FW#Áš3Eö¼âEÌ hËøR˜ädñ\¹Ã„”z @|Ç>yq³Yä»Öæßã0Ä3)=„ A|u¾O} Á”y>ŠLrV1Š¥Çɨ/òß$þ"% ùsä[$f³|`u…Ý£ ݽJîÏÌ‚zìì„é×&LˆÏå_EOÈ;c칯ã |%)ò {¤ÂôIãϱ}“`ȽÒÍQr R¬ŠiÌòDþ,vyL’’I" G×NoG£Û›Šò«oÎGè%d÷NÉBGøÂ‰Î8Œ3ov‘ ;¢É¢͸ÆÖ#²™„$c#Ãl”d}h™7)§¦EJÑ ò¯ü‡x&“bê­¥X”Ž(ȉ<’Ç»kKM ì¶È¥„7v£²š®U Ÿˆt>Íþ"©IÉýˆFÄ,&ÓhÄò9“þ¤ã;¦AHù®iö(QmÖm¦°“GU]¡ÚZ¡ªPÝjTÁ Õú Up@õÛ¡JCÉû‚ A…P— ªÚƨžáÉP|¥žß\­\ýîVûáF!ªª»°e›+p®¯àmàMà­oaœm»âC Ý‰]«kœmKŸPâíÖm]•S÷ÀCÝS„*ØBTaaçi/üñ+ù÷{u6û½jÛ»å”UNõö,OÞ„[…ïGRµ»Îpx@ðÇ€û.Áp‚/س໓ÅälÙÖaË€»-]GÈÙ²pϲ©ßÿ‡þ¡åïØV!¶û‘Gí"¸§}¡Úˆ;~—Jãxcý@íØŽÕ wì^„ÚÝ·Uî~ÄÚDWçÛµç@‡p»uO tŽKní™KÞÅYçxäÖ¾yä]·ÁI”›{–(ï"¶-¶­=Ãv·§}l^øc¶ìŸ+,„u/2¨]†µU«q€u»aU9^øð¯Xu›€U‹=8âmß±¼7Ôë[÷÷ÇëÈÇX2|Àu»}±Q,8Ù-÷Å@å=8ìÙíöÅ€³eÏ–ûbX\ðÀCßiË}1ä=’Ý<»å‹©œÅªïY«ø½î¼ÏŽ]Çãº-Š]ƵÅÙ¯`·X•ƒì~T²»ŒlºÞI#»yñŽ!«ò^¬\kï°;–ó>l°þ)’°Û l‹·cÈn9²*ÚýH vÚtµí~dP[mêÂúWúÉúå=˜ 7:ÿEwôóó¬¥ßìXN¤_ÉVú8^]!lÕ´Vî«Üé©êrªkMb'W¦oÓûÐ+et`Iô&F˜.éš-q"-YOƒ Y6U_NÕ5 ±žÆ’®U—¢k¾Q­ä~†ÔýŒDÍZ–C›˜AÖ$n¡&6¡µj´}†t·MÏ~œZçš¹ÒÈÉ™«ªÕzÖ^É̼½ªF ê«æÄL%¨æ-"=3o–­t§6)>¥sÕâ;¨rù›ë·HVÝÌj™*uMËCä"‹ýJ“r¶ðì/?iE ‘ÕxBÅû< H}â5õ}ÐÈ ´ºÿº¯B®›ý?S–•ß’ógúc #ö+ âDOMY3d¿/[¡ã²1«zŽU1»_þœ 5ÇâœÈ!Á ¿œs°A5”‘Ob„i­~qOˆ-̱½3_%Õ£åxœa[fmzŽÁ’¡oè†ýdf¹¸ôwÈ$x´r<Èžå¸Ë!,e£q¡þøQ¡¿R§|ü(À¦Q²ØŠ”ì?'-Ák];áU— n½‰ºU¸u(µ¦µÔ†‡¼&âÓUla;i;•F• nä¨õz]FÍÊÉñUó§K£zaTÏ Ê¡ì5ê?,©ÿ&@nlŒ‚ÁEì€pÇ›H°yÐTkzê`GöE÷eî÷ÎYgñøÊøéR­W/ÈÿÏUXÕYò'ã§®Z'@­˜‰`¥ÖËÀP†EZSd=*ìÇbŠ55ý‰ˆwLXœTPÄ~ú·!Ÿ¯a•KLóó×0˜oä46Ds)Ôê«;BbÿTAõŸ*¬^©BëTKÁÒ´úm¶jÂ爩ÜͪAC~³&üD-@•´•k÷Ë‚ÐÕóñ@}mÉšÃâ´SÊø‰§éápŠ| Pœ) ÛCqžGÉ5¤Í¡.ÅOÔ€¤=®=àEˆd+S>A#>á\~¸9ü gt#à ïõU¡Œ'aðF£’ CIµ2Öˆˆü„_ÎÝj›iJãn/Cµ–‘ú'µ,QÍk’š×7×¼¾©uë›Z·¾fº¤ŽuI7Êt¬ e’ü:TPÇMuÜØLÇ I7$uÜ,l/EE¡€ÍR„"E“ Ò™Oƒ^93}[¹õ„Â|“Û—ÍÍkJ"Ö”D¬´%¡ ­ß“Ü­MwÅf µ%©ãÖuœOžn-¡Ô)i­œ*¹£Q²…ê‹Ò‰.´ùM’;w1»L ®m@—aðFÛ(l‹h^Ô6 ®mZFÊ6²P­F ¤ª ‘ J;. ‘ýø1øý16k°É l°~ƒE´œE-­ìžj‰O2ŒÒnLCÄ­~7æSè¸Nø*äÀ8t))Þh’½ Ù{ÅÏè" DûCDÓU.}ÇV><8äXäÙ(év4ןy5€d÷Hv/@Y÷B¤Ã J»b0|Ëî(é^À–amÖ½’Ý Ù½¥Ý‹–P¦Ãï^È…ÞÍz yÁÓü†&ÿ€Hö4€dO”6Ä4Ïo̰NÝWef:^ˆ¼è/|Äþ~j³r?!×óäZÍФ3 Éöl~û Ÿdm-Áz‰“ñp°´¿`ˆXä÷ÎðÌ2ƒP"JA~¯¡^S¥ÄJv ¿[ Ö#‚é^AÖ»è-µ¦5䞇Á²^‚ƒ Œ€ßKX÷`I/AÙàP²%›Éü·wŠVº®Ó§í@h“–¶ ‘Ôò[$ëW>xXñ‘…œy(´KËz"%”ì@É.,ëbžqÓ?P€›þ”,Ø¡dÁµ¿!´ÝÊ*~CèÊ ¿â—omÁ²ê_†^Tá’Õ;Ôù °¬üT8¿ü—/i`I+ ¡ ù%ÉbJó°¬7Ä ~-þöÌ8aúR[(YCÉj–Ó†*Ò‡übZС–ÐbU²†’0,+€ ´=¿Q ù,4êò,”¬`¡d Ë*XAÕñ+XAûâ?Ý´/ÉúJÖ—Zy±&ÒÓ$«#M²:ÒÊK !%“x­<‰_Ý1óîá¡ðÚ|%‰»2ÂókôW:kï²iØ}B¾rƒmäFk!¹óñ½‹fÉùù2rf‘±Ñ“^ˆ|šá×Éi{}4a 9wËgEˆ‡–é&ì&¾9D/e#/pB牔Ll 'Z:HÎ)ß¹k¾Ò—Æ®06W޾ ''´]œœ}]!ÓF~2BT™‰9Þ.BúúxÀ¤O†¯³{ì§È¥ÊÏœÉ4Œàwçž•~Ñûöënw4þÜöN{×½ÑoÑáu·Â:Ùgé÷ß×è›3tÂ;*6žA4NÈIñgñyf Yáòµ°ø,=á Æ³eSŠgEȾš–"ôè`÷ÅBîøtá¸aÏßÑ÷YÆ™s¯ˆî‰n•ÏüW_Ñyv{•Œ¾l߉MV¢å4$).Sôxä„.úª¼?þgß#h¢ã÷—^B½t/þòþ~g]¬ûC¦HúR7ýòDþc7¦?q¼ 'CˆçÊ&¤ÔIæÌÐCô:øl–öÚñü{†x&Eâל4ÁWçûÔÉL™ã“¡xÀ8¤XzœŒú"÷MC€²02G¾…¼Ðœ Š²:fQ$üžèUrf© ±ZÑ×&LèÃCîUô„¼±ó0Æžû:ØÇ<ø“I„­©gˆ?ÇöM‚!÷rH7GÉ-l<öp8f¯òg±Ëcßô&‰$4îÜ zýQ}†ÝëîÙ¨wÛÏcŸ˜À‰=§déñ‹÷ÑXvžC‘a;dŽýÐ7—o÷¦¯¬ÓDU‰R ’ 8¶M#?ýæÊßhBb¶möúælþó¿FÓW”8’æ$½ˆlO€Û1 %by×¹ì–ðœ›ÄäHü»ˆ~&ö&lp}¢…gôåý@!éÅ>sVòÙíÍM·?Ž;£q·ž·+ßÇ~ 0WÓeÇ Mß n„z8>ï ï®;¿uϳ‰ÏMEûií»3éÁÜg†ê"ókè:ÔßÚŸï e>£ç¾r&ñ¡˜L!Qø­Z^­¾uRùÔ Ïrë+»­gÅ–|è$#faY¤ª¢ï¶*‚‡ªè{­Šà¡*úÆUÑ¥ÑCUt¨ŠUÑ¡*ZWÝ¡*:TE‡ªèPmwU”:e e²~ꛡ©D*@öȼD³Åþã=Æ'?ü?–¨{|bÄSpreadsheet-Read-0.93/files/empty.ods0000644000031300001440000000000013677406611016772 0ustar00merijnusersSpreadsheet-Read-0.93/files/empty.xls0000644000031300001440000000000010313232324016771 0ustar00merijnusersSpreadsheet-Read-0.93/files/test_t.csv0000644000031300001440000000005010614363313017136 0ustar00merijnusersA1 B1 D1 A2 B2 A3 'C3' D3 A4 B4 C4 Spreadsheet-Read-0.93/files/test.gnumeric0000644000031300001440000000355613223172672017654 0ustar00merijnusers‹íZÿOë6ÿýýY&í7Ú&myA§)T*µ·½iŠÜÄ´Iœ9_Þ_¿³¤IÚ>è6émZ@BñùÎþø|wþœÄÉO/a =a–êF«£k8ò¨O¢å©~猎ôŸN–Qh}¢ìqAé£&QbèT_q[íöóósk¥!fÄkQ¶l?–Ï}=Ó}IHE÷¹+µÌNÇhÿ|=™{+¢%E«„X‰N¨‡¸Ä¶s«ãÖKâ냚&aÞ«ÃhvL½I×®Ñï”Á— Ÿ$ŸÝº6Jƒ@œØ0[0löCÎY¤'BT*Y&Pˆ¹[î ~¶¬dEŸÝeä 8 ÜÄc4ˆ´ ‹òO(HñÀ™ÝÙJAÕÆí-;ÿ4p»œxÿ,åXˆ\ŽÉ7áS¥œº ã‹Ðú&0HâÆ œáqìÀh8™¿ AM$£÷„><á=Șˆ„˜£,'ÕÔ©ž²È¢(!‰DXܳhŒ£ÜÄ*k[²@d9èq[VÇÇÇm9›«ú^¡§,Z¾×Æ;$mHÂv®+¾”Ð-C¢” u:/5½¶ëZv˜RÙ3õ̯ٔX¹¸ ß³|N6;ÆÑAÇ8èt£o™=«g~>iç³¹¶å1,ËÖÁ6CÃ2ŽÁp‹bv·5… rEÁ:G—r(uQŠ‚†tŸƒcì-<æ˜eeTÖ×B€¤z…À¡|E"2:-¨ÏP(Šø ùäåT7³áY¶ýn©rÎWó)Ü×8òñK)+Š Mâ¥XšýC]gô†‡ý~÷PHMC…raõ×W2ÿ±•º[Vª‰ŠSËõ/1…[b¯Ú'âsñõzàæ+L–+.–>ª;.©ƒÓ.HèuDY÷›Èû¼">þŒ-—ŒøÅŽq…‘Y!“”$ÙŠ7)‡ôĉŒ†l0 à„3Ðç-ò™Â ò{’ =Õ/§×îüʶ÷~<Ÿ'cçõ9±uM@DâÁíXð«WÊ›ôbù¾§õq æãHÍgÚpÐ+Ĩ¬ð™Òp­/¿ë’\RFUˆÊõû–‘ˆ»CÈ×Íz]«ÙßÏìÑw5»¤Ó„ˆd 3l…`fÃ'o"”ÎtÂü&ÄþH)ÿQ¹_}ÿãx×’¤âvéÈqôajk¨[dK`‚8µ[ ¦"lMæ[†î"Q†*™*ú Ê9 ÷2 ð/ >šoê3‘û¬d*îcñ@$¼Ï"O‚šûTAkü5†²cæÁ#‚–ð®¿Õ;ЮÙ=‰YØ_†…(!u…Õ[ K(»gñŽ\òàÒ(xuþàd·rH# ô êênŸ!¸ÃÓ\$ÇW¶v¨¸{·–œvá•\HD%¼§Ž;*KdÖSGgx)èô§ŒÃ#$S9˜‰×R6;”›ý¾H¹ }}#§åŠÚÕ0 ËHÁ¿NÆ—S÷ÒžÚ³áÞØÒܽš;»qœ›k]ûÄPìà.w¯à85žQžÑ<9 ñ ¿3‰”ôÓØ—9ÐK)P œ?ÒÚò€×àÇ*þ@ÕAB$ª¼çÂÜ8q¤1¨µ-È$U® ±8 ]CwLG½xLp ˜Gì@ž§Ë•’xŒÄþ`Ž¢¬mëV<Û.\[/‰¥¬Cõ¾Or"¨]à”|N¾à[Qu{Gz-(@M‘6¥êXê€ýÖ ×NSám³{bíÊf‚fnlf˜­ý’© ­’'éºvž²„2kbc5”ÑÖ«ƒ,¬JqkT··\£³ŽÛ^ùzÿª³pÔÓEÈ´<+òT¹EÒ‘¯Ï!ÜbÎ"„î›æÆ†ùÙ>æÝ ó‹÷˜»Á›{˜oÿss÷îÝ=ÌÍ óó}Ì·¸î=æÝÝà{{˜oqÝ>æ[Îþó^¾ûцýd8wFc{r±¹ÌZRMɯ'蕦\sh¬ÞסQÏn<Áë{M}¨í$U¥Ð¸‡Åš‡„ JÞÁKÎÃ)¦x)]ž§z½aÊ©¤}ùrK†Â™*¨8ôý z¸Y‰ß”úÙÿm/j~½=0ÞêEKM3º3j6ÍhÓŒ6ÍhÓŒ6ÍhÓŒ6Íèöf´JÿfYm";ïi"wÅ[©…ììÓBÖ`6¤ù?Fš» iþ¦¤¹Ûæ†47¤¹!Í inHsCšÒü#Í¥¡ú·E1¼_ Ž4åì;h‘- ´ó§|øò¬ÉëÄ,Spreadsheet-Read-0.93/files/test_m.txt0000644000031300001440000000005011275744475017173 0ustar00merijnusersA1;B1;;D1 A2;B2;; A3;;"C3";D3 A4;B4;C4; Spreadsheet-Read-0.93/files/attr.gnumeric0000644000031300001440000001344414374657065017660 0ustar00merijnusers‹íÝrÛ8–Çïû)8Jí\dÚ¶H‘”¬N”ql9Ö®¿JRÒ›ÔT©h –8¡ I%ñ\îóìSí“,RI2A[_ÒÝiþñ;Žè݇_SGù<߆îûŠz\­(À‘íŽßW>÷/•­ßÞÝióOè}€ð»‚Џ~%½¯L‚`Ö<9ùùóçñØOg¡7>ù¡VGÁ¨åýåÛ©¼?k$—V­ª'ÿ}sÝNÀÔ:²]?°Ü!@¥|»é“Äk8´R7î¥Nù£Jë7E!ÕüތҞÁáÝRE¹±þ =ôICm4Ðm^Îß±ª£Ã“¸üYxöÃ<>NÊ&†iQªkMAkÑ,_lð³Ùô'ðç`=ûßÐ ,gà=è8–÷î$.‘”øa9sÐêw?·Ã áqxáÆ• ÔÑ ìánÔÅ…ÀIƒÀzð·RXó†p:s6­­TÃö35Æ0£•¸<»îåªA&‰Xï;øøhºé!ê1np4õÉðÔûÊÜs›ÐòmŸÔÀoÃ&œwQ¤™ÌÝ$DÔ§ÛýÎêÕêééé 9»È:ÆùfsÏ!¹FÃà|ÿu“E^\ü•Ây“U‚ÆÂÙÃJ/†ý$<®(ÑÍ$†=­µkt +Ç0FÃæÐV½ÖÙ#d¶‰„Dž‘…@hUÕ8ª6Ž4µ¯Ö›ÕFS­~#ÈÙEnRñ¹¼£x´]0RH ¾×÷”y6pl¼Jx‚? žfè´»ãJë¾{wþ¹{¦|<þrüî„RÌw­±ÿØÄ¤ü£‘íOŒË!“u€åVZ–ãƒ]ÈGƒXó%ÀpîÙÌyt TZÕgõ ZdGЪyT­Uõ>¢©ͪþ-’HgLiخؖs´0“Ù°z•ÊžÊuo¿ÿWó ݇GhO,w FëkKr½ÞÄòÀè‹_çÝI¦CÅ ©!)~øž[ÎpîVEmwn9]€¬¨“·]ëÁx‘K@ží¿â¥TQ¾8¡êèa?F¾zèc#èZ#û×ûŠ^Øc;@eZ èMnQ[tÜø•áã ©/tðUÍZC¯„.üIª¡7ŒºYi¡ópîEOº¸ha¹KèM­àµÔÎ¥"¯W=4š3Ä2Iq“’K|™€÷¤üiì°i Äð ØãI€=5#KÅÏÖO¹°ý™c=áÖAÆãc¹²Gàð`|ðɳGñº“+`€§ [I¤DŠwóõ7àS‹zOÓÔ2Ò»a½QúÛ·lFï+Ÿno½«v»?øÒéu>v®;ý¯áÇëvEÁUÖ‚¯ÝDÿTR~iÅ”!Ýf]Ô P†V#<e2 LdÀGÉ ß œ¶Ôð4ùœ­¿HIÖ*NJ::÷èù ÎÐðF;6çæM·}ùʹId›A߯=¹uÕ-NXÖ†j’gkH¬fз<[Å¿þkƒ?¢æ^½ÂË?Õî¤%;î#éõi£7Fs&ªœ)÷Ev[G£Ü½?£§ÎûÊtv¦Töp*RÂAœßПÍïá>!R`Bzb\¢f>[â"g:_‰EÈ4^8ž`E qèa;Dƒ£5F>ËòsøŒ9É”ûÏ¢ë£À#H6Ãä¹ c4ðÏ‚ÀØè:O?xr€ÏÏ<….šúzhXåçybÈ=ྱâh…¦rh ƒš›Ÿ‹œxØWYdÂá}·sÛ†Ã^ûº}ÞïÜÝR…¡‡L 5tëÑ”5LËæ³1Ò?fÐ <˹—gÒe‘^¹Fvü¾‚££‘ð§hô¦*sšWþ3 ™LËöÑlS’’Î…&¡d¤ ‡ÍL†’-t~wsÓ¾í÷ÛÁýõÙy›6 σž¯q¢M>ŸùI…v·{×í Îzƒ‹NI|m_,5ÂjñƘ°;KËöœØcì£ùåhp$MrÐÅOEE-ÒÑÇ(•ê¶DK¹"žHXñ«³ëΧÛÁ§öm»{vž¢‰s_Âsïúý»›Šò§gÍúàW@.Ò› ùÞ‡—vxÜ…Aä%’“ˆ7ù„}7Ìq ‡ßÁˆ<ª‘€’I*r"Àâ1¬|´†hŠ{‰þ4ã¿ÐÀbÈÜÔ[ ]3TOà"ŸÓIÝjlD¨³„#’ŠÅ¡:$ÀrìÐÅýŒª‡]ü°²=4Õûú¨+ÏÇ“0eèÙ3RýÖ™‡f!C,œjÚ“¸m³Ã^ž8V•‰Uݬ¢$K“Õ˜dµý![m6ª I–&[c’­íÙjÄP’M‘Õ™dõý!›%)ù¦øL¾Æ>ò•Ãr®É„kîܪ$Ë&[g’­ïÙsôGŽÉ,¸ &ÜÆþÀ%^rü—ä›á{ºä‹¿æ¨%f¹äKŽ=zúÊFXåD¦ÔŠL©/ÀJŽ¨Êºõ˜T~ Ì˜Ôa3Õ˜L·餌hÔa3­1™n=%6ðR>ña3Õ™L·{Ù¨Ã&k0ÉnÝû-BVĄ̂“ºCQ'‘AX2Í0­3™n=Þ$”o:l¬ &Ö­Gšòc]i:8²'¡íb9Õ9X *è‡ $ÓdB+EB2M† ´R„ $ÓdB+QB’M† ´²„ $ÖdB+EB2M† ´²„ $ÖdB+Qâ0ÉÖ8!ˆZBÕ|­¥Æ AÔJ‚8x¦“é^‡ žiÉt¯CÏTg2-AâàÉL²û‚8x¬&ë^‡ žiÉtßCµÁÄZ‚Ä!’Õ9!}ÿC‡¼¾Fç"ôR"$Y:¡—"!ÉÒA ½A I–Mè% MH¾t€B/K€BÂ¥Ãz)Â’,¬Ðˬpé…^¢Å!ó58 £L‹ê3U™LKµ8d¬k)B‡ŒµÆÄZŠxÅ!cÕ™XK¬8d¸nY"‡LÖd’-E˜â±Ö™XË£8d² &Ù( ®É‰N˜û¨J *è‡&$Ód\Â,E\B2M%ÌR%$ÓdDÂ,QDB’M†#̲„#$Öd,Â,E,B2M"̲"$ÖdÂ,Qâ0ÉÖ9!ˆzB‰Þ{°LU&Ó½ŽBH¬©@D½$‰5‹¨—$!±¦ÂõR…#$ÜTD¢^žˆ„$› JÔK”XSq‰zyâ’l*4Q/Uhâ@á68щÆþG'²¤«ÊĺÇ I–ŽQ4J£dé0E£a I–ŽT4J©|é`E£,Á —ŽW4J¯déE£,! —ŽZ4Jµ8d¾§œÀ…jÖ»´jUnšÉ@›8áÇi8 Ý ¯\€Gkî=ûßà>ð‘sܨœ¤r!´t.U;®™Œ=à€!Fâ+çsχÞbiWxD¹ÞéB¢«±O2·_<}‹ÀqüÌ%qš²0e"ŒþÿÅræ ÿ4C`LÔøÖ<€¡0Îý¬€J x`$P^£Ê=\…¥ð€ŽtJàçÄD Já å?$LJ “@´1êlÁi0 XO9T®Yå³ õ…V¥r­J¬…×¢rމ5®A Ðö$(PøAWãZ“ mL‚´- Ц$(@[RNkHy½kI¢ ´)‰*ж$ªPÜkÒ¹Ö$ª@›“¨mO¢ ´AåU0¸•Û{4¸&%,AÛ”°mT´U K¼À7¸v%,A–°mY¹%L®i Í*L®y’¡M¬ mf…dhS+$C›[!™ÎÿL®Ù’¡MOH¦¾Úür>që«­OP…c|‚*ÛTᘞ  ÇòU8†'¨ò²¸C}µÙåTi¬˜<æŠ^4¸'(Àš: °fŽB¬‰£kÞ($Àš6 °fBy£XË”tµ7 ¸¶žà8`ßX¿úö4¬>èÀáò*:¼…î-«»°ý¡G œÍØZN,‡ª>í†ràúv`ÿ°ƒ'’U' ã:G ñ1Ö9ÖäÏË'2Wö|Œ>yö(>@ x¬ðâÔ´‰”Hñnà¾Ojôž¦Ðñ?'Š¥Ó»¸G‡}ÌöíÛA÷~Ò»j·ûƒ/^çcçºÓÿ~¼nW\µÔw)·Ö´Â/)ÂF ɨÅQñ–žŽŽ2ÐýµÔZœ&s|ƒpÚRÃÓäs¶ÙX{²q¢‹ï=Û g°B9—•ó¶ÜÖ›nûò/a®0!›m±-@·uÕ-NÈ|;’®Î35$V3èÛž­â_ÿ5‡Áaó‡Ÿ_½¾Ë”t% Ùqɵéoôn,ol»>U‡Î”{ˆŠ"³­k¸wÇð»«étÙ¹ãì0àT¤„ƒFŠ8¿¡?›ßÃ]B¤À„tĸDÍ|¶Ä#„A΋.i¼p8ÁC’am¼!pk *Êò3ÕRrÄðYt}b‰AkyGÏe£!€üîÀ~@×yøäû>~æ)tápâÁ)àçybÈ=à®±â#8pa0˜aåç"§žåŽãšàqð¾Û¹íG£a¯}Ý>ïwîn©ÂÐC&Ð ‚ ºu/„¦eóÙ˜ é3èže‹ÜË3é2á@¯„O<ôÀ²G#ü$ª(ÑàMUæ24¯üf2™–k €¿qŽÆ’˜Î8„Ó)ª¥¯ ÇÍLÉ7ÜËF:¿»¹ißö{ƒÎíàþúì¼M[†çAÏWÈPÑ&ŸÏü¤B»Û½ëög½ÁE§‡$¾¶/²_°ò†™°G¤¾\N&RïTó½K°õ…ò]á×Dªœ…ÕZ± ¬Õãjµ”L5&Ó­/ØÓЩû¿ÿùßðÃ?”7¿¿yƒAŽJ‰ºÆD½õ5›@=8¢`¿Màþcåùp·Ÿ¢3>™¿—Ôvt¦íl}ÕÅ&lgt2-%Rƒ‰të -6tÒœ–“©Édºõõ›òÐþ£”PëL¨[_Z± ¨o”'J µÁ„z¯ÛãžÚþ[IçS§L®§‡Àõ索VÙQƒˆfUq_ ÿ-gwU91­ƒj½}Æ<ÐÕêïU‚ù÷·oË ZãÆ¥ÕªÞ0ê1ñ)YtZåD§³€%ÚýF›ì»;¹¬.±ªë*¬úŠ!y7ÙÊ.›{4N ÇZAÇê¼}Ûow%×-sÕxCqºÏîèp,Ñ®@[ãuÙìx,]¨„›8‘oˆŒU løýåF·€oð´†7‚P®,o„‹âVξ|”,W[”Cò Ï'ó®®Pª†+ö È\ åŒ/†§q-¬%ï‚X?ýBs/ 5µ—EÊÎÓ¥ÄtëÛÎBG6¤j5ÝÈñÒ8{ç‚" ôê)ðÆ/Xþ.R þò÷¹ëÑ ‡{Í´H5ø‹¦'ÄÖW¯{}¥ˆ{]zEÈ:ó©«\^N%R þ"(ÛWr#a/°©ÇéË{Ù+tõWèëüÎŽÎ+jMiW•¿íE8n+^®UŸ*ã ñºÐ+ˆ®rkð7]¸¶ü ïÝð÷=ûŽˆ}7¤&8gþA7d]‹ì³ˆœk}Tµæ¹ªE¯Ð“$f6”‹•)‘”½Lø”•+’ögEñêñ ë/\”´Ì ×$ ­IŠÈeI¤„\–$—%ÉeIrYRÎeIU¹$iiG;ÖÊu½K’úw÷’iÉ–$-¾T’Xåò#‰u×Wýçç^¿sùUrÝæò ù¾\I«¼…úÅ<âëöe_2Ý%¦*“©ˆ;Ìe*}áÝyóQÄæ•Žð–˜Ö^ü6«xw©Îd*âs™JxƒP5އ¤ó䬻G•ó¾ÖëP•^Ò–_JÖŠyI+J?iKTkLª"~’~wªÎ¤*â)­ *}¥ b­q|¥‚[>v;Ÿ®ä¬f§ ªL¨"®ªô”¶ATcñ”øD¥£´%¨5&TGI޽;UgBñ“øP¥›´Aª:ÇMÒ‹¹I—kùEêN1U™LE¼$.Sé$m¨Æ*â$qJiKLkL¦">’xw©Îd*â"q™JiƒP|¿r»ïÚĉ×ÛƒÂ05=½…rç¸é5m-_[««9/s“ =µÉ„ž­k‰\Ýúv˜À ‰­ys,E®rWŒãuyôþ)Y×$ A¯¨&kýèõÔ6k)5%À^{8(_¸Õ—7£úâfT_ÚŒürß«œ-©½¼%ùämIþv9[’¿WA¸ÂV@¢pKÖ^Þ’üÍò¶$«„œ-ÉÞ± üsîöcžßnÕ_Ú”úË›RqSê‚M¹L‘û=,ön¿ìúŒ]pB´»ƒ¹XÄÎÛëa™Aîõ øû³¨ñå>¤„ÜçAîó ÷yȱσíÃm¯#7y{—îdÜ(?ÖþÒÍbÅrCäm+7=¹7@Ù_“”O0˜ØÃ2í ñ.ðz®ª)û[Û+ ÁWîðª|çC{d)çÐõábö(V´t|{–ë/Û…\ç~ñ*7üØW7:džrvÄÀªîÖ—o!±îÜìè•7Œ„wkvôÊ{GH¼;6;R9³#UÎŽÖÄw³³#•3;Råìh­|7:;ʱŒtžWωÔtž_yç‰uçœçWÞEDÞ-çù•·‘xwÌyÖ8γ&ç5ñݬó¬qœgM:Ïkå»Qç9Çæ@Òy^=CÚEçù•7“‘XwÎy~åe$áÝrž_y‰wÇœçÇy®IçyM|7ë<×8ÎsM:Ïkå»Qç9Ç–QÒyyGÝ çù•7’XsaݤóüÊ[IÂÏÞ¬óüÊ»I¼yðnÐyÖ9γ.ç5ñݬó¬sœg]:Ïkå»Qç™·›˜!gdsOÞd78¾³!}çõQݤëlp\gCºÎk¼YÏÙàxΆôœ×FwƒŽ³Áqœ é8¯ïfýfƒã7Òo^'ÞºÍ&Çm6¥ÛÌ`¬6öÄo69~³)ýæ5bݤãlrgS:Îë!¼YÏÙäxΦôœ×‡wƒ®³ÉqMé:¯‰ïf}g“ã;›Òw^+ß:Ïõ|¿`!Aïä*‰¯÷ jµvlP;g&³ªqVÞÃ4™Q[jšÏhÖ–šµ•õüõ4YÍ*þ UYÍXõT=ÖÖþCµc͈œC£j–,·¡V_™/n@Mc4K2gÜ‚š¾2Ÿ‘RdÔ6lœœ?%RKý”ÈižŸI½2xÊ|eðt×Jä ô&ù6b$èMòqaz«üùbˆP1(S™áM§4LJCmäáÿ¼Ib.ø'¢ 4]Q®¨UTF*ª@Í«Àÿ•vø¢àï­¼@ŒÃ¸˜w11ùbb#(&Ʊ11þÏÆ0â=¦¨mE•h‹(ªD›CQ%ÚŠ*ц ªÄÿÉVx¤à/ß–bÛA!)¶!’b[B!)¶)’bÛ‚”Á7F,%—ÊJ1Œ¡¨ÃŠJ1Œ¡¨ÃŠJ1ŒATÊ|ÎèÀK.=®EÔãšEA=®mÔãHA=®•ÔãšÊj½eJ‰~ñ+qHîŠÔõsç Ps™2õ­|Y$æþzß üÞúíÿzíIÑ ¥Spreadsheet-Read-0.93/files/misc.xlsx0000644000031300001440000001755511130422501017001 0ustar00merijnusersPK!XVÆ`Ú[Content_Types].xml ¢Ö( Ì”MNÃ0…÷HÜ!ò%n‹„JÚ?Kè¢Àؓƪc[·´·g’ÐJ ©„›D‘5ï½ùfœ|±¯M²ƒ€ÚÙ‚M³ KÀJ§´]ìuõ”Þ²£°Jg¡`@¶˜_^䫃L¨ÚbÁªýç(+¨f΃¥“Ò…ZDú kî…܈5ðÙdrÃ¥³lLc£Áæù ZA²!>‹š|øÞðHjÐ=§é±ä¾+l¼ &¼7ZŠHÉùΪo®©+K-A9¹­É+kÅ®þ£!ƃm…>€PXÄÚdèÑùJ±51yÜzƒçµö 3£Ê¶}¬´Ç‡avÃLÞ]ؼ9·ùk* ¬Ús÷-MoœGN³ä TêIBÔpbÖçM ØôÞŽyûšÎðu5NúC zr\ÿ“ãoå/xœvBºçƒ8Þ¦ºgxû_›ÿÿPK!µU0#õL Î_rels/.rels ¢Ê( Œ’ÏNÃ0 ÆïH¼CäûênH¡¥»LH»!TÀ$îµ£$@÷ö„‚JcÛÑöçÏ?[ÞîæiTb/Nú(A±3b{×jx­ŸV b"giÇŽaWÝÞl_x¤”›b×û¨²‹‹º”ü#b4O ñìr¥‘0QÊahÑ“¨eÜ”å=†¿P-<ÕÁj{ª>ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK!»DÚðGxl/_rels/workbook.xml.rels ¢( ¼’ÍjÃ0„ï…¼ƒØ{¼¶Ó–"çR ¹–ô„½þ!¶$´Û¿}… nÁ½„\£E3«Ùí¿†^}PàÎY Y’‚"[ºª³†·ãËú ‹±•é% #1ì‹ÕÝî•z#ñ·g],khEü‘Ë–Éódã¤va0ehЛòd™BÝgI‰dοqáçtŠ¥éàOöÍK+d˜ÎÒ9MŠ›É/K8T¬•~ƒö®ì˜W6Ͳˆ Qltî÷Q(Éy'47]€b´—[5™QÒÅÑNp_çôy}ëÄ¡öQöXéÅ 6l$AT2ØÓÄñ$:ZU•øÑBÎkô2¦Ä.^ìšÇ÷C,³0 ‹†Àʘt2€N¢¦ˆE!%“%¦ޏ<›=f³ˆ¸þ0ÅÿÿPK!iÀRŠVxl/theme/theme1.xmlìYMoE¾#ñF{oc'vGuªØ±[HÓF±[Ôãx=Þfvg53NêjHHˆ‚¸ q J­Ä¥üš@©wfv×;ñ˜&%õ!ñÎ>ï÷Ǽ3¾zíAÂÐ’ò´Ô/×DÒiµƒ;Ãþ¥I…Ó1f<%í`FdpmëÝw®âM“„  Oå&n±RÙæÊŠ aËË<#)¼›p‘`"Z | |¶²Z«­¯$˜¦JqloO&4$—4KlÌ{ $¤Jê…‰fMrŠ]œ*Î…ë"g²Ë:¬€ 1?’*@ K/ÚAÍ|‚•­«+x3'bj m…®o>9]N0>\52E4*…ÖûÖ•’¿0µˆëõzÝ^½äg8 ÁT«K•g£¿Qï<+ ûu‘w·Ö¬5\|…ÿڂέN§ÓlåºX¦d¿6ðµõÆöªƒ7 ‹o.àínwÝÁů/àûWZë o@1£éáZ´ßϹ— g7¼ð €oÔrøÙP¦—1á©Zšl ¾ÏEɰ¢)R³ŒLpyÜÅÉHP¬%àM‚+oìR(–´0$CA3ÕÞÏ0ÔĜ߫çß¾zþ½zþää᳓‡?œþÌ—UüÏß}ôÓŸúPBs^|þä—gO^|ññ¯ß<öÀ·UáCš‰n‘ctÀ°Í8ÆÕœŒÄù(†1¦Ž·‡uOÅðÖ 3®C\çÝÐ=|ÀëÓûŽ®ƒXLõHÞ¸Ç9ëpáuÀ®–UñðpšF~ábZÅ`|ä“ÝÅ©ÚÞ4ƒ¾Y$¥ãûnL5÷tU‘”(¤ßñCB<ÖÝ£Ôñë —|¢Ð=Š:˜z]2¤#'‘æD7hq™ùl†P;¾Ù»‹:œù¬Þ!G. 3òCÂ7^ÇS…Ë!NXÕá7±Š}Jf"¬âzRA¤#Â8ꉔ>šÛì­}CÃò†}Í)=ôñ¼‰9¯"wøa7ÆIæÃhW±ïÉCHQŒö¹òÁ÷¸[!úâ€Ó¥á¾K‰î×7‚;4rTš'ˆ~3:–Щþ›ÐôÏš1£Ðm¼mÆí`¶&_IÜ8Õ‚—áþ…wOÓ}¹¾¸ñ¼í»oûnðŸï»Ëjù¬ÝvÞ`¡÷êáÁÆfLN–OÉÊØ@͹)Í ,a·÷aQš3")MY _óîîà" \}@U<ˆqCv=ÐL"™³Ž$ʸ„ÓYöòÖxÔ•=6õ©Á6‰ÕÛå5½\J6fωÌ´´¦œUØÚ•œ)˜ý&ÂêZ©3K«ÕL¯s¤•&CMƒÅÒ›0† ^ÀËëpJ×¢áp‚k¿Û¸‹‰ÂE†HÆxLòi»cT7A*rÅÜ@îxb¤Oz¯ñZEZK³ý ÒΤª¸ÆqEôþJ”Š žGIî©rdiµ8YŠŽÛA«¹Ú Pˆ³v0s-|M2ˆºÔ“f\…ÊÞ·8EZ¦“ œ-fSåóh¶ ÃÜ"¨Ã]…õû‚ÁŽˆLHµƒel%˜Wy °TK²ú¯6Á­e€Íô7Ðbm’áÓü膖L&$TÕ`WV´ïìcÞJùT1ˆÇÇhĦâCøuª‚=c*ázÂtý—iÚÛæ•Ûœó¢«^aœ]Ç,‹qÞnu‰•lᦎKÌSE=°Í«»1îü¦˜’¿ Sªiü?3Eï'p_°6Öá2W`¤ëµp¡b](‹iØ09˜-².dá5$\)›ÿ‚éÿ¶æ,SÖpìS4B‚Â~¤bAÈ>´%“}¯aVÏ÷.Ë’åŒLFUÔ•™U{DŽê¸®÷öÅꦛämÀàNçŸûœWÐ(ÒCNµÞœâm–ž^S4ï ž|l1ƒ<·›¦ð©¢gWµô†¼Ø{Owýù˜Õ(ª„U¶‚V^öo¨Â9·ZÛ±,^mÊA-†År ÊàÖé?°ÿQ2bÒXo¨C~½Á¯ š¤ dõ%;x Ý íâ'»hã¬YY׿£“vçßïRî)gkÍÎïs:»Î\qN-^¤³s;¾¶kK] ‘=]¢°4)N2&0懭êoO|t½wüS¦¤I&øaI`=¦ ø­DCºõÿÿPK!L£É‘„- xl/styles.xml¤’=kÃ0†÷BÿƒÐÞ( 4´Åvè(´PH ]åH¶ú0Ò9Øýõ=ÙŽcOºXïuî+Ù·F“‹ôA9›ÒÍjM‰´g'”-Súu:<Æ> v[Û˜ƒ7‘RœXlÂUb!£xƒùsÚÀþ7–´Å’ÄYÚ‹¤§çIœcJýVq/èD!y£4(»dö@¬ho]è÷xŽ+û3=„Ͳà†Óô3¥7ý!…jÌótëS]ôˆ”Þô{Öf×:L{žýÿÿPK!kÅ3q]Dxl/worksheets/sheet3.xmlŒQËjÃ0¼úB÷ZvJÛ¡4„öP(¥³b¯-[+¤MÒü}×v ½ô Ø—ffgóÅw߉„hÑ2KR)ÀUX[×òã}uu/E$íjÝ¡ƒB ÊEyy‘ï1l¢ Á.Òù¹R±2Ð똠ÇC¯‰ÓЪèèzüÔwj–¦·ª×ÖÉ aþƒMc+XbµíÁÑ ÓÄú£±>Ê2¯-÷†…D€¦™Te>Ò~ZØÇ_±¶X#n†Æs]ÈtUfWã¯AÔÐèmGo¸ÛbËfÉÝÍ™`©I—yÀ½àm2¶ÎëÁ›lž±®j(²š2ߕ׹Ú1SŧOœÓwoØj²ó5èhÒ%èàÙ‡èŽ÷X½náE‡Öº(:hXP:èaR7%„~T³F"ìÇÐð%€å¤ 7ˆtJsê­Æ¢ÐmÝ—%sd9yt¾ùÿÿPK!^é)2Cxl/worksheets/sheet2.xmlŒ‘MkÃ0 †ïƒýãû’´°F’2VÊvŒ}žÝDŽMËØêºþû)I[»ìfYzé•ÊÅwïÄÄdÑWr–R€o°µ¾«äûÛêâFŠDÊ·Ê¡‡Jî!ÉE}~Vî0n’ ÁŸ*iˆÂmž§Æ@¯R†(IÊh)Ûa0Æ>În¢$¦ŽåÙjºþûÉÉZzÜ!X²¬÷žž’/z#ðA£-d6K¥[a­m[È÷Í̓”­•A …Ò~j8„‹XÄ)¶ˆ»Xx® ™r{UÄŠV` £ÌÙˆï p“3âe|Bߌs¿zQC£ö†ÞððºíˆMžÏîoÏ’ÖŠT™{<ž?c§¢›Ù"c)U¼dýe>”Yž ÌTñǯOœS»ëx9¤+ækÐÒ4‰ £ãY\¡ýÛpduª…å[mƒ0а 4ê~R7%„nT³E"ìǰãÝËIgü¸A¤S˜Sm3^ etk¿4u,ÑÕè×ù)ÿÿPK!Ü×ô¦UgdocProps/core.xml ¢( |’ËNÃ0E÷HüCä}⸥/+I%Šº¢A v–=m#â‡lCÛ¿ÇIÚ ÄÒ3wÎÜ;r¶<Ê:úë*­rD’E ¸•Úåè¥\Çs9Ï”`µV£8´,no2n(מ¬6`}. $å(79Ú{o(ÆŽïA2—… Í­¶’ùð´;lÿ`;À£4b ž æn€±é‰èŒ¼GšO[·Á1Ô Ay‡IBðÖƒ•î϶3PÊÊŸLÈt¶;d Þ5{õÑU½ðp8$‡qk#ø'ømóøÜF+ÕÜŠ*2Á)·À¼¶Å¦âV;½õÑJ[£-óáØ(škÖÌùM8ü¶q*¢ ÿ.j¢Cƒˆ‚-Ú…¸t^Ç«‡r ²XLcBâѬ$cz7§döÞ켚olvyÞü1d]Ä)‰ÓII&”ÌéhH¼ŠÖ÷õ×(¾ÿÿPK!=ØàE=docProps/app.xml ¢( œ“AoÛ0 …ïú ݹé0 ¬bH;ô°a’vgV¦¡²$ˆ¬‘ì×O¶‘ÄézšOäãÃÃgšVwûÖ&²ÁWâfVн µõÛJú_ Í켉f}6ð.JÛéV^Ó±w,”°‚Ê V›ô>ú F¼¨`j¨âc|4挴ë`ŒÏ¢šÔGN6tG©ó5 ÝÓ-âéöHÔð¾ÇU¬mÁ(Œ“0î/’>I¤Ÿx‘å+3P`¼â\¬ +Xàó–®%„L—ʺɢ:É@Ê6×4I½®”ÚtŒpÃ\`B¡€×Èê`'è6ÏŸë#CiÒ‰bw5½Wüƒd¦w9UG”þz|˜-oƒiô}œæN³'`¥öظÙSYBh¹ÛÝHM-J?ÑÞ½«7Õ7Q̶TeÀ/°¯µ–@Ý6TðqyE¿Ìúν3_ÀÿĨ„™ÑùWpo©7üÏQãwß8¾ô?MÿPKçùéWPKìZçP styles.xmlí\koÛ8ý¾¿ÂP±ƒY;‰íI\ììLg˜Å4ƒýX0%s+‰EÇqý’”D½eúmêME^^Þ{xyHš"ïß¿†Áà’áèA³†¦6€‘ƒ]ùÚ_Oô‰ö~þ{ìyÈ3;ËFTOè:€É€Ž’YL`Â:–$ša d&3êÌp £¼è¬Yf&ªMÓ$ÑmAi<3ŒÕj5\†˜øÆÓŸÏÓ)|¥F.MâB–W’š)ämÓ¼1Œ1¡¹´ëHáxI!æ: 7,1¬¡%5; @¨ª3B¸ìEòâ«–e¢ºƒÃ˜!ñÀ²—€•ª.Ëš¬\œ¥ZœË–ËbŒ`džG:ËcAÙ].\«jÕ[ÕŠ I.B Tëâ²åª^}m‹-k:"7õ°j%¯I {¸£ ™s½¾¥ÏRZ<©VœuÉJÀŒ\õ€¹•hÏê(„Ë¥£eø ‰rÝ€‚fxꎳr¶ì¨,‹H'¾ä(/#7å—T|!A< ¢Ø¬¢¡FãM !T,Óà2¹¼O\7h‹E¦zd0^bé/®Þä%¼ƒ›Y”4T‡&X“Ðá çEÙ' òø’ÞµVб&:ŠX¿Åñ¬Tº\y袣3NŒ,Süóñ¢K’P5D¸l…‚be6L¥+̱ akk¥ÌÁsµAHi0ió|äô05=à@Ý…NÌïÓ “é37ëAûRJ~ÃtaÙƒŸŸ´#rÉëíã䧪Xš¦Û¨¶¶Ó=¨hæâº#Öðl°± I´±zÄxBDëà3ˆ’îê«r õ'+”$‰Q‡EØ HôÔ ¦} vØTÊê1`PîcÁXà´Ô/3ö­ÝèŠÆ,=ÖåVºÐË ›ìåš3“ùé ->ñBY·‡„"6CL³˜4Ó‚cÝE ä,{x†$| Ò,( íÏùKà³\‰‡±!%̾¿>ku:ëø ª£™«Ès¿-òœLWžñïǦF>êðµ!R«”X º^™õû£h›Ðç÷éÈš °•–HQy4µšÐ { Q$(Øgå\ä#š0ÐEE-:¥gI[¬Ûª²lë“™{ñ‚Ö|Î@Éj- Öá3ŒëXÜ¡z°(d–1½%»ûs›^å¹>ÁËX,]„QEå<ºæéºx”OUŸU¡ÐªÊßÖ”_>ïj§† –q¹(]Ó½€` ß¾ûÁ§?=Èqdàè•1ö„Öþe ­‹Ù˜MºßxžÉ>u;¾¤ ¦}rt´€´{aµ// GG¥½SÀq”( ÊÆß£LBq)´wµ9V HPØÞ7EÐ…lº»¨Ùl´£ì‚µšà‰yöýa€#¿lra›‚¹·Z z» ¯A)g ‚öêPÀØÕໃ¼“í”pPvØ1-ìXà%Ij5Î:AÑ’2Rh¤>vÊ@¨ÇaÉæÂÀÍ6Ì#ÛÜ¡ œÎå´u§w2ľDô{<é샣ÑÙ¨V!XÞÈ-´þiGaRÔ?‚ŸsÉWvLÍÛƒÏ{ÎÎ1¦7£Úôfk oö «sN©·÷öÄau­³fû„Õíæ°ê#[Î_&…¤$U˸œÎ}°½ýd¹ë¢Ì=PµOŽª¾ULBj·]ÍF¡€uv #º!8Õ(¢Ÿ!nS†PPlVe©©Ú@Z¼‘ËsO‰¨Ú—-£»ýH«ó›•¿›íòƒu/F;¬×Iu;B¾ÝòNìp­› ï.’ ïÇ„wb»LØ7XN.iòvUë‹ÉµLÞα0ÙÕ3LÞN=N4œš=N.’3'‡ãÌÉ8s²çìqz³ÇkÛe°^ûìñœ\»#ä—4{¼X"Þzú:½H*žŽŠ§¢âéF*îÜ—6#Ï·ÇÕm^Ñ¡Y‡Š¾„#¿@âüü‚^ÙŽ^··öi£‹¬ †÷L:Ç¥ÍÈÄA¬+"9z?íX½´c)2=Ï…¯1ŽøùÂf¶ÌÇJ^ø» #™éaâ@·(ž ?j¾Ñ:…ìÜ— (6ï¡VÞžhqÁú€¯¼Œëoè(„X÷Vòî…ü&ϸú&Ž=}áך-?vŒ!jžtV¦CÁ–P¤Ž7Aø%= OtŸ¸(’š''N×ê !b=CNo¸¤Ãúh–÷Œ)Å[ŨPò°ú¢\6Aßø1+.<Í“ó#í™òÜ„È.NNl€õ?ðSÍ=°f91 òˆ³^m…mTS|ênÚcî‰LKƒ#„e‘¼‚È_PÞ»µ__ló‹\2¸(aô»Ö+k'ßsÜvöÝšlá{–¾‹÷v¿÷ö™¼·èý³f¯€6ºu?b wÒ-Œê§(æ÷3p¾òÅ]äêÅžç8E+GŒ¤ž’*É<ʲe׊‰Ë"›Ã;Öã ;x31ùO7¿•q$>F4؈0¦ÑaÀîö+ƒ@Å/DÙ°à k®™é¡ú#:Æû„[5XI' ?a#ÌeDÄtˆ¬Ë,ƒ%Å]Fí ág6†/“cõðß0vwÒ™µKwÑÇUº¢iÞÞ¶ðé1»â#\RR„È©@ɈO”éôä ü N%E@§uÔ=& ÿ$Úu&Yå¢û•LNÏù{‡!ñÄg/H¶›[ÿËq˜§çY2Ý­žC*°ã‚!m—XÈ8Q,lÛ= Ø:–l»­4ö€m‹ùíYaõÂ6:5l®ø41j·ad|ÞŠ=ÏÈò¡Î¼ÁKZñûcZZ‹PË7+ˆ$,™‹¤ß=h|#EK¹(à·`±1Gç׬ª ÀƒyoV·`6í7sÕ£ƒN NÚ”8h5 æjc­òaùJ]œ†²Ð{ÙjýÏöèË~dƒÆ:"fûl„ÃÀƒy;fñ+øäЦÜÒþq„* òÁÕ°^€œ«‚9ì¦ Ø ˆí!o1¾ËOÝ¥¶A´ÈÕ*UޤÏYêù(ßóUa ÉM²'£m7,= ·ºZÿƒjÛNd¥¬0¬u±¶&|LÔîñ,¢)×Xv€êVyò(ôUÀ)ë–‰8.0T+õæµ53½G´vµU éºQYßla_ä„÷HØÊhn–ùg‰Ã”j>”$¦ ÅåaYÉ7¡ljNõLû©ç2ÎN¬&”ü0 bO ¶u4Rò:ásØï#ÉÈ=¾/U`[X´‹BÔ$‘m¹ÊÚßS!w“OTe‚û° ýªkôÙ]æšÝfªËæ^£º€ÄŠ¢ú)CÍJ.Î'çóI¿Q^¯¾ß ¿ékR½}kpƒõµ†~Aã\£Cc}žÙaFhK‹Ûžhqsó~´¸NäÃÕ%)„Äê{Š3pâîpâ2R…dÉÇ Ä—OJ\ììq>VL>YÑ+LJ} VL{ßN~w|w¼}'d[}¥­»kK[j+d÷vîüŽ[ä E{¡s²â´ãüË`Åed‹ŽwCç$ÅiG柤èså{N^ôtÊ:¶®keÑÛ)ëçÊâDVИœ‡½²^Ý Òñ²âlŒèíŒõêÑýäq6RôvÄzu¤è~¡y6RôÂúÆýO±’¬x}×n~Lý?“Ò7WxR½`!é뜺^w—§ÔÚÂAˆ›oÕç F6Û+# §˜ŸRùpŸ½U¬î)¥a& ˆU¼pì`¥±º-·$É*·Ý &(Ä Š=õ… §¨çˆ®ÕTu¥Nj„ÄÁœˆü딺¤—]ÑÈž#¼¢4B$p] éIek͵kš»T(ÔŸ¹²<§¯_ç¥Õ|§Þì®\¯á‘ (U;ÏœTTÒ—ªL’pƒ*õe1Z¾_‘_ ¨±ªï=äõKϹ¨@YÖ¤d>¸-$H–’³$\—«Û[½luúV³œ­jlª› {ð@_8õFwqª|ís>Poƒ—úÕp];Œ ×!ý’l~ï !˜VåÉÃý-õ€>ÙSÁ£-¢–oûĨ¤ÕŸÓaÚýúÒœ¨Kl]àìÕŸÖÄ´:C:­E*$¬1¼z0y]Ž4ÞŠçXÈš{Š /#8Õ#/”=ê&:ïú™E§=ê€K£>qNL{Ôé{u¨Õ%ÒÓ֭מumçίÔ9}Œ¾ô‰QIÛ£.¨tÓ'L |g3R¯þ 6w¯(8ÕX[ Ô¸›¹sÒ'È|îwÀ¥qŸ8aFwEú^ju‰´ƒ¹sü'ž;ëWc-º_^$8ŽøýÍ6­ÔÚ[ï=20BòlF…ø0~ùG g:lI9%è…NNN Z¸ÿnôî¯è×°ï›Ï¸œ„ §'´ŸÓcâtP,ö&òWø0žžžŒKA–ŸßÙ]ÃZ[ÿì4hïìw`Í[Vig™¬>þ—½NL¾{xûwlÇsÄ)t«MÑ[Õ¶u3¹½›4s²ÔÍ) º³W-)´*;¤zZ_ù•>;_…Ù ÅÓþ/¬|ø?PKïªÊÞæñRPKìZçP settings.xmlíZßs›8~¿¿"ûãIÓ†IÜqÜæì«¯ñ’ÞõM†µ­‰Ð2’0vÿú`2 …ÖÁÈw¹§¾]VŸ¾Ý¾z¿ ØÉ„¤È¯­îiÇ:î¡OùòÚºwo[ï¬÷ýß®p± Ø>zQ\µ$(¥‡È=KÛC¾ zB$¸DRis€´•gc<Ÿf?m§Æ²;FùãµµR*´Ûí8ŽOã³SËv÷òò²>͇"âÓÀ;ó,ÜëtÎÛÙõÓèôj_Çvo™:¶ûÿYhά~‡üõûW»wÉþ´¨‚ ‰ÍÉîvbìÚÒ.Ûk ñSÔ¬²y/ç.Hµ‡‘(¦(©Ò;à¯Ò嬷”/‘ÿ.C¾¨‡#|Yžš´ÉýmX·rØY•¨ˆÛ¬~ç¨7¨ E \Ò(£Ð¢"jêh·S7d ‰ºþý¢&¸³ÂøwA‹Â=Gd@¸ÕW"‚š›ƒ{:˜à»°Qwº°X0Œ'°$Þ¶ÊÖ‚0Ya¬äæóäTõ8Í"ûîã4¿T$°<‘¬tž@ÆæDTÖ Ý7ÝËÿ)}(¥7ºvzœ HŠ”ÛÇÌW˜ú/›ß? þgT¦ Ílúuˆ E)]zg½Þ›šÅ΋e5”‘Úó(à3ŒG@|Ý 1⬔Öècy)Ý>‚³ æÈ¤Š߈‘”ñ#]?°¤†Ðúø‘'ÒYI§6ÙX:œ„.ΈTP$U2`ýNY¿eÌ ¤&WekÑí½­©vEøÒþâPx'šûtMe¥û —;_—:ü`C¥³Õň@N¿U³ô×®tv}ù jÿ³›ìF$H¦×â| æ Å?ltCCu«k2—HJ¸y3†#˜¹ãl{/Áÿ¡E¨a•8Jâ1ª —£«E³5ËT7Xɲ‚ŠŠs"áâü†r"¶Vû_Ï´:‰(²qÒŽp‹F{Ì—!¦Û•A¦&t«Lްù›¬CŽW*Lø3­¨õÞÀ""…C¼ˆUI¢S•©å5¸«(˜sBÙ¯Ôóîì³¾(?=ÚCºvS‚¸”ÊaA®ˆ ž¶”Ôid²“?3šPþxúš‚Õß Îþ›‡ ² w|ÈPšbãMíX~ÁÓ yqOE¤äÃG†²UNë‚®ûˆÎX~Ø}·v4yœ2 ˜îØÒ-ø·„{PC€*¯öwŸÑÛU?0èÿPK&ˆ<Ø;¢ PKìZçPM‚xg))Thumbnails/thumbnail.png‰PNG  IHDR¨ÿRmÉýPLTE %6&;8;,8G7¿û<÷ò’Ç#d­½äwÀxîÚ„~º“(¨b•¯«<\b¿*‘•º%[^CÒª8l]-¹Yí/9ßæ¿8W,Ð|DÙ"ožÍúýñž—k6p~L8æÜ”"¥l‘½J“Wô÷—ESôï®Äl¶ní/?âü¸©¡ã °jý'³2×¥Ÿ]4õ˜X Õr–‡®{ýÏœŸ1ƒy¶ý$5Ìdµ‡e®¶µ[ÿØí/èl°Ñºï°1·mÍŽ"ÚgBÖﳚäfã¡(ç+(½äfW¨œe†ØÝ Â2¡ Ú m„ÜÑ=W>Ü<÷ˆh¶Ñ‡¦¥P  ´{ù*—0ѵRÜÐDëÉ aBë{7ÀðM¡y¹)¥ÂÄ‚“‡†ñ^êÆ 1Bµ«^ߣnà‚>ŒãBÊFÝ:›#F¨={.ÎPOF07Iö3‡ÄU¤mÌ6ã˜s+ò7»Ì³D E“Ex`1ÄŽ  »w[éCQvÇdÓ ÿ» ©°-€¥ è4 ƒ)ö€3‘PtÈ ˜M¢Fê%ã™­=8¹¨ë…ƒ±$!‹ôÒÖnŸTŪ4bš0Çé¬Òl?ñ€ºuÜÌžyˆ²ÿˆÝVr80;«D³j5$¸k¢ÐŸÙš¿òQèÿÉÃ<]—X Æ>À«MØÔ̽°ï0¤í±H´øÃ˜ÅCÉy±l£œŸÓƒ­e;޾›UµA›ËMuøy‚®Ï`÷eáäNh‹˜a±@·ÄÄ;ÝËSÁm‹wr["ŠQV‚ÓÑ©žOcbl§cb i=J¡ú0BÛ¥­¨ v3mâ…%7#Ýaô†H)Á­°˜[zEWô¿³ŒÔîBÉ!‡Bu;7í´#²ztEG¿ÃMѽoz.GŒPíÀc2Ùêb ÓH:‘UØNŠ.¸kœÀÎ ‰hZK¥H´'-œ4ؽ$ðÐCQ=™ë“Ê (£.¡>…R(…RèwÚMª}nÏ  ¨P;ÀøÄbp{IâÁL±„Ë5ž×æ*ÊjÖì˺8Ï€‚‰ƒ$QfËËùuéIMù±@{G¤.™«F³©™ ¸ôª;˜Ï¢—“9"oÖ&œÜÙ&(’ ùsOk?âüÜS$è  („Ìu)îãÉRÑŒ)ÙA$$G7ü–ä辂ÏQíN’x«n}”“ˆÊ=mjbµ¹IeÕd5®µø vNoà‡óv*J·æ6>?îÐŽè¥NþõJXL˨äƒúl°×ŸÊfq*­ú(Ðg;ù½~d¯Ú1îÐDÛ¡G±m{`aIƒ´E”õ¨.{‹Ð­tqdƒÓf²]~ªB1BU©É¹Ÿ*• uë!ëT9Ášò€ºÃî¿/ôv€;?ßÒ–€g߈úÆêE;…mtÒ (–Ƴ’e¢,úËßûþ }ä1=?ÈÞ|œ¥­' ¥P ¥P ¥P ¥P èÇÓm( öd©½+Î ‘³íA!.&4ÈÆ-X˜ mXtrÖ-;‚ö ?ë¸B=ÉÍÀŽãÂLJØG°  0™Iª$áéb›ñо¢‹q5ë9?&2§ož1îÂÈðûã<î‰ï =í/ÄõXPžÃ#”¢Kšù0‡³2¶n-­”®ùËO °©ÒBœÂp"ólë8C›ÎȆŽÐ #Ü-ß„H¡/´ËÏÙƒÞqOÕq•~—^¢YfÚxL€^OÙ5îÐs<sߟâLÓ¸f"›låûÅçÛ(û™]Ú£Wbß<9-á˜Ó€ª <Ôƒ‹¯Œ+´q‚Ü•'—ÝàyeP\HŽö¼º9𸠗ܬõ—ÜpK¥Íí’å+°5âç\ÒR‰­[:ÙV,-ÿê‰ùRÌi.Nü÷è!oqü¹eþ»ŽZÖ3,‚z”Ñ›DWÒ#…R(…R(…R(…~7¡å_L·7üë4ßJrrò±VYÁ¢¿Þ›‹Õü ]^‚S!i÷Í;J^:{‘¦a ñý™sI˶ãš÷ý~þZ5Ë tN7±×eÅN46½$æ^,w–bÈŸõvzûb;§—°ïgðƒsIPê±x/uË9_Æ{]÷ÝG åó¢Šéž4l#¡ìº•²fþí+3TÍHI•ÚMõl‡Ofú{2ÕÉkÞj¥Ðjg|ÓãðdªŸ7D™¨w½ÿèr ž÷¼åý&rHÚãî¯èùM´w¯¨âû‰U‹_"9ÊÂ'&pƒðÓwƒ{*fj! …É7àƒˆpOcþç„z¾zF½°’s`Š0Ì<€šµWW Š•}BZÏSÑG.®¹hRëå8þ´ÀåîBŽJŸßY@›€gø™`žÀ‡Aaüt$ÄnlÅP °×h áH¬ì Š^ª2zHöñAÔdoѓպÃÑ_Ð碘%Ò2N­a¤«¦±<ôìÌh¡è™ÙA¹È ‰°#*¨Ûƒw 9FL§c&ž¯–Øø¥8Ù\ I¿M :V“Õ³Ro‹öî{= Ūvª'îKûvoÐ7‰&ï’õþ?êÑve­ð)”B)”B)ôA@;M°ügvÔ}Í,ÂÝ}½–¡ÿíàgùš´NÒ¶uaäÚ¨e:ùãkšÐÔÄ÷¨Œ]fr¤›n ÂÑÝk %í6¡©ËÔC†L2¡[?'?@›%¬ÚBžýÎNO‹ÛyÏ•¦ WÖ[*XÆdñ®¦Íƒ•µûà¿Ç¸V(Ñ´™4 9ŸÊ€9%“f½3‰o™µÜvx?Åò•/û*ÒXÅL]‰Ò`¸¡ìC¹06LeIU™Ó<–cüb½<&÷ºe8ýâwë3¯dª¹Ô·ïÝRWávªÖ*{¯HÕŸŠäV’r)s3£ÔZ·TÞž)Š¿¢Iæ¡ÉáiªÈxåÜU|ö*÷~¶åƒR]ý[:SîW çŠTžLíeO6Y’ÃÐÔUriJ&³[]|°¸ààþÊÜ µ­æùaÆÇЍB¨Æˆ}RÑ“Yþ‡ÔK‡•L*:ùFVmQú@æ©fåå\oVéZ• ÓùLmR“gšI-4~_ù¶gÊù._ûW :õg†C¿ºØ]"ŒGÿP\gÖï7ëùoõËl*cø3ónR¢›áQ¹<Æ1.®ÒªôjÖpµ¾C¯A:Jq{”ìÁt[åÞnOpgª±GÅ—K1 T„àgŽ£Gƒ%å·ßëo«íx»ÅhüÆ·ø0«m_Îþ—YñUµj‹GÝBëQ ¥P ¥P ¥P ¥Ð}£ÆQBOÅó-ºBTÔƒKWòM\•«qY!˜Íûô4{•¶1£Òê¾ÓÐüâš°!½]1»½3]oÝý'œjµñ˜—7 ƒÿ¤± ŸÄ23›;Yƒî’Ó d%©œÄ)u)66wêrÎ%tqÝ1$ßòN¦|1È­ÑÇŽŠ¾9­ÂÌŽÉw_ÚÂsë®Ìk—sÒ¾ VÚ—hz%öÓpÞ&œŸÇHÞ!&”ÂÃøB‚3Y‰­WVÔ&|<Æ=GÏ2-ÖFÈa ŸÐüErÒàú|oGkO0K†tµO«wëÒ>™I×O±è|¤=É6&´G²,(?F ¤Ÿ%[X0Òf<‹ª_D]p‡·KŽq´:åsÜDÃ¬æ™Ø6*k’HÌ´wš“Œ¼NÃÈÊ…`±WnŒƒî0$Ÿ¼Š$ÛÑû˜ÐÇu· 9Š«óø  I$ê—°'s^·vÅ)¬Ý;h¾41þy5ܘ‰”QÑà¯.ðe\$|•I „®²c±°‘´Å’’Ëàüþ‹(‹Uš1¡åòÊI¬›DÅ\ÊKŽêLíè¬`¦äç³Û³gÛËãG÷­©˜qï>ŽÛÕþÙJöý>eØþ˜wéΩ¹ØV2K(Tm)f{¤é³Û–>!äè&M¾Åí§[ƒ@ƒ?ótIÔ‘±÷úF½F²eq%$ eAâW®²ØÄ¢ ¨$‘ueþ±Îìpp¦k€©Ó‰ž¸5˜Àè½$ä·°ý ú¸PáÝC¥ –|×ÉÇ_××Ãzttl}iç}Öƒ÷ªÌta…÷SáþOßnˆ"=„R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…R(…Rèƒü ¡˜ÌL?×*ÃIEND®B`‚PKìZçPMETA-INF/manifest.xml­“Mnà F÷9…Ŷ2¤í¦Bq²¨Ô¤ fpð€`ˆ’Û[q⪊KÙñ3¼ï1ˆÍîÔ»ê1Y {åkV¶^[ìö½ÿª?Øn»Úô ­DrTå¦ë´a9¢ô*Ù$Qõ$µÒ@íÛÜ’ü[/Ǥël&ðÎ.hçá4qc''ñµ¢R} ‚S€h‡-å¤7ƶ g„1i»ªnW0ÖA]Êãù&`²suPth˜¸ëukh«j:h˜ ÁÙvGÔ|ìŸ_§Aét &–¨|z4¶Ëq¤§7ñ BÊÈKx¶¼–…Okþÿ þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ^ÍÉ@á°Áâ\p H.M. Brand B°aÀ=œ¯¼=<¹F„!8X@"·Ú1,ÜÿLettrGoth12 BT1,ÜÿLettrGoth12 BT1,ÜÿLettrGoth12 BT1,ÜÿLettrGoth12 BT1,ܼLettrGoth12 BT1, ÿLettrGoth12 BT1,ÜÿLettrGoth12 BT3"¬ "\ #,##0;\-"¬ "\ #,##0="¬ "\ #,##0;[Red]\-"¬ "\ #,##0?"¬ "\ #,##0.00;\-"¬ "\ #,##0.00I""¬ "\ #,##0.00;[Red]\-"¬ "\ #,##0.00q*6_-"¬ "\ * #,##0_-;\-"¬ "\ * #,##0_-;_-"¬ "\ * "-"_-;_-@_-,)'_-* #,##0_-;\-* #,##0_-;_-* "-"_-;_-@_-,>_-"¬ "\ * #,##0.00_-;\-"¬ "\ * #,##0.00_-;_-"¬ "\ * "-"??_-;_-@_-4+/_-* #,##0.00_-;\-* #,##0.00_-;_-* "-"??_-;_-@_- ¤yyyymmdd¥ mm\/dd\/yyyy¦ddd\,\ dd\ mmm\ yyyy §m/d/yyàõÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ à À à+õÿ øÀ à)õÿ øÀ à,õÿ øÀ à*õÿ øÀ à õÿ øÀ à À à¤À à¤!À à"À à¥#À àÀ à¥À à¤À àÀ à¥À à¤1À à2À à¥3À à À à À àÀ à¦À à§À “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ`…Ô DateTestŒÁÁ`iü  08 Aug 2008 12 Aug 2008 08 Dec 2008 13 Aug 2008Locale settings on this PCShort: dd-MM-yyyyLong: ddd, dd MMM yyyyDefault format 0x0Eÿ * ^ÍÉ@ &ø  dü©ñÒMbP?_*+‚€%,Áƒ„M’ \\dc242\HoldÜ´ Sï€ ê odXXLetterPRIVâ0''''`4 €\KhC¹¬bPÿÿ`SMTJPDocuColor 242-252-260 PSResolution600dpiEFMMInUseFalseEFMMInsTypeNoneEFMMCoverPrintFrontEFMMTabShiftFalseEFColorModeEFColorModeDEFEFRGBOverrideEFRGBOverrideDEFEFRGBOtherWtPtEFRGBOtherWtPtDEFEFRGBOtherGammaEFRGBOtherGammaDEFEFRGBOtherPhosEFRGBOtherPhosDEFEFColorRendDictEFColorRendDictDEFEFRGBSepEFRGBSepDEFEFSimulationEFSimulationDEFEFSimSpeedEFSimSpeedDEFEFOutProfileEFOutProfileDEFEFSpotColorsEFSpotColorsDEFEFPureBlackEFPureBlackDEFEFBlkOvpCtrlEFBlkOvpCtrlDEFEFCompOverprintFalseEFKOnlyGrayCMYKEFKOnlyGrayCMYKDEFEFKOnlyGrayRGBEFKOnlyGrayRGBDEFEFSubstColorsFalseEFSeparationsFalseEFTrappingFalseEFSortCollateEFStaplerFalseEFOutputBinAutoSelectEFImageAlignFalseEFImageUnitInchesEFFoldFalseEFImageFlagFalseEFOffsetJobsEFOffsetJobsDEFEFPunchEdgeNoneEFPunchHoleTypeNoneEFFaceDownEFFaceDownDEFEFImageSmoothFalseEFBrightness00.00EFImageEnhanceEFImageEnhanceDEFEFCompressionNormalQualityEFCopierModeEFCopierModeDEFEFGlossAdjustFalseEFTextGfxQualNormalEFRasterFalseEFDuplexFalseEFUserRotate180FalseEFRIPBookletFalseEFBookCoverTrayEFBookCoverTrayDEFEFBookFrCoverNoneEFBookBkCoverNoneEFCopierBookletFalseEFCenteringMiddleEFBookletCreepFalseEFBookletReduceTrueEFManualDuplexFalseEFMediaTypeAnyInputSlotAutoSelectEFTrayAlignmentFalseEFSlipsheetFalseEFSlipsheetSizeLetterEFSlipsheetTrayTray5EFMediaInterlvFalseEFInterlvTrayTray5EFMedQualCoatd1EFMedQualCoatd1DEFEFMedQualCust1EFMediaQualityCustom1DEFEFMedQualCust2EFMedQualCust2DEFEFMedQualCust3EFMedQualCust3DEFEFMedQualCust4EFMedQualCust4DEFEFMedQualCust5EFMedQualCust5DEFEFMedQualHeavy1EFMedQualHeavy1DEFEFMedQualHeavy2EFMedQualHeavy2DEFEFMedQualPlainEFMedQualPlainDEFEFMedQualRcycldEFMedQualRcycldDEFEFPrintSizeEFPrintSizeDEFEFCreateMasterNoneEFUseMasterNoneEFPPTSlideFalseEFPrintMasterEFPrintMasterDEFPageSizeLetterPageRegionLeadingEdge€IIFE2IFE¡" dýÿXà?à?U}  X@X@X@X@X@X@X@½€^ã@€^ã@ €^ã@!€^ã@ý "½_ã@_ã@_ã@_ã@ý "½Àmã@Àmã@Àmã@Àmã@ý "½ _ã@ _ã@ _ã@ _ã@ý "ý ##ý $ý $ý $½ _ã@% _ã@& _ã@תx0000*>¶@å ï7 þÿà…ŸòùOh«‘+'³Ù0¬@H`t Œ ˜¤äH.Merijn Brand H.M. BrandaMicrosoft Excel@€S}½© É@€ávÁÙ ÉþÿÕÍÕœ.“—+,ù®0Ð PXp x€ˆ ˜ ­ä PROCURA B.V.eTe2  DateTest  Worksheets þÿÿÿþÿÿÿþÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀF ßéTï ÉþÿÿÿWorkbookÿÿÿÿÿÿÿÿÿÿÿÿSSummaryInformation(ÿÿÿÿ DocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿSpreadsheet-Read-0.93/files/merged.gnumeric0000644000031300001440000000365714374657065020156 0ustar00merijnusers‹í]sâ¶ö}…¯;sßø»Y7Ð!$ÌÉ€“m÷Å#lÚ‰Jrýõ=’lc 4°½mïC“™ŒttŽt¾?œ«ŸÖKê¼b! g-·V®ºf!›·Ü'ÿ¶téþÔþp5gKï /SÎ_ aÒPË](µò*•···òœÅK,HXæb^y­UË‘ŠÜw-Éî[Ã`Õ«ÕZåçá`.ð•“ ±•$ž4À‘2¼}êsy-#·ýÁq ›ÏV§·âáDr!úƬê°$L/› æmL©–¸V/ö’Ñw”d+,5¨´°ÊзSµ<üæyrÁß‚ä7΢ §tŠÄU%£È_ñŠhŒÛþø©gìÞ>\9ðòwpÖU$üÿà…q…5(Ph*ÿ6" Xñ äËÅÚµþ6ˆ V”*ý!·Áä$ ã½W|6#!¡Cˆ¦JK¬P“ö¨åÆ‚yI" ÒS¡ÇW˜¥$^Û3 "‰iJØË¡¨®}þü¹bNSÔ(ÌðV± + +˜bý‚¬@VR\Íá©Liܶ|ü™H2%"µåÞ†Áä¾×óƒçþ¤Ýôý_ìrÐsÍp¤{¶ª¿îN…4ZÌ©vT,¡à@ÝnØãdW@ñrz—GøÊù²\oÖÅ÷e Éó”ò À#dkt Ü÷ ~¡èÿ0îÝþg¯èçÐV\íÙíNÂ[Ør³§’w94>øDQü.‹ÿý5æêG£|»üŸ³»…È­=öÙ |î°Fs˜$öxP|å1èëw”[É´[L|9óoØ‹­au+˜3®m›g˜ø®7ê;ƒƒ6¾~ðý‡á¿fþûÌ|q$~ f>'†ÿ5ðßlàÜÁnC©‡7§‹g(¦jB~úKº¸ÌÕ‚t¢Ûê5ËŸšÄ ¦84s¨s ÉEš(ì.ÉE·K‰NÈ-Õ­Ã] Ööñ]1¥ÅJ¥aNêÐÖ›Áu#â›ï#˜@¯M”¯Ñß½¡±wƒsu-¡®îQ/Óϳ'Ñßëõ£ÒCäA_ߣ‡Þá úïã¾qTwçPïË~õ¾äçPŸ$÷²ëØC,æ8²^tpsÖîÔ½N:ßÀ!¤ëšwS?€”Ù~e  •ãó•í€;µbFàôúã!0µRVõƧ/³ý­}²´H?g™q ¶#ÎFxnÌÔ%2´_b:±âf"K¯› ´Û$Š™ž¯_‰ÚŒs£GîkSáã“Ì>$=õ»H!Çæùhš\`±Óÿb´?übòV;Spreadsheet-Read-0.93/files/Active2.xlsx0000644000031300001440000002053513111550441017341 0ustar00merijnusersPK!q9+p Û[Content_Types].xml ¢×( Ì”MNÃ0…÷HÜ!ò%n‹„jÚ?K¨Àؓƪc[·´·g’Ð PˆTÒ›DQ4ï½ùfìé|[™dµ³9g#–€•Ni»ÌÙëËCzÍŒÂ*aœ…œíÙ|v~6}ÙyÀ„ª-欌Ñßp޲„J`殸t6‚i¬5ØlúD‚V,Dˆ¢"¾5<’´ÏqFz,¹m kïœ ï–"Rr¾±ê‡kêŠBKPN®+òʱ‹Z…ÿjˆqg[¡ –±2Y+ºw¾ƒB¬MLî·D …Ààq­}Ą̂²iKí±Ç¡Ÿ]?“wVoέNM¥¦“UBÛ}î®% é-‚óÈiÖƒ@\J=IBˆ̺¼iëÞ›1"o^“Á¾¯ÆA¿AGŽË’cø©ü,EõÝR'?®_µûærØMé?ý®«;6’7÷ëìÿÿPK!µU0#õL Î_rels/.rels ¢Ê( Œ’ÏNÃ0 ÆïH¼CäûênH¡¥»LH»!TÀ$îµ£$@÷ö„‚JcÛÑöçÏ?[ÞîæiTb/Nú(A±3b{×jx­ŸV b"giÇŽaWÝÞl_x¤”›b×û¨²‹‹º”ü#b4O ñìr¥‘0QÊahÑ“¨eÜ”å=†¿P-<ÕÁj{ª>ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK!Þ ý(Ôxl/_rels/workbook.xml.rels ¢( ¼“ÏjÃ0 Æïƒ½ƒÑ}q’ne”:½ŒA¯[÷&QâÐÄ6–ö'o?“Cº@É.¡ƒ$ü}?Чýá§ïÄjU%)´¥«ZÛ(ø8½><ƒ Ö¶Ò³¨`@‚Cq·ÃNsüD¦õ$¢Š%†Ù襤Ò`¯)qmœÔ.ôšcéuyÖ Êr”xl/workbook.xmlŒRËnÂ0¼Wê?X¾—< E$H¨­Ê¥ê!…³‰7ı#Û!ð÷Ý$%¥U=y£ÙÙY/WçJ’+´Jh0ñ)•k.Ô!¡ÙËÜë˜âLj ½€¥«ôþnÙjsÜk}$H lBKçê…çÙ¼„ŠÙ‰®Aa§Ð¦bSsðlm€q[¸Jz¡ïÇ^Å„¢ÃÂü‡C…ÈáIçMÊ $$s(ß–¢¶4]BÂv؈°º~cê>KJ$³î™ <¡3Lu ? ¦©×]7ò#ê¥ã’'0Pe¥°»¯í)áP°Fº ×¾NEÃYÆCgÑV@k¿Éº”œwBqÝ&t£å—1äí;;Á]™ÐÐçѵö âP:¤¢9YîÄ 2¶ÇJ7Ë»ÖÛŒCû—¨Þƒµd<ÀsvØà–›…ÀÀl°Ž¿Áá ãþžÞ€1ÁÓ^ÚUOÎdÞ¹‰O/!œEÁc¸~¨ôÿÿPK!iÀRŠVxl/theme/theme1.xmlìYMoE¾#ñF{oc'vGuªØ±[HÓF±[Ôãx=Þfvg53NêjHHˆ‚¸ q J­Ä¥üš@©wfv×;ñ˜&%õ!ñÎ>ï÷Ǽ3¾zíAÂÐ’ò´Ô/×DÒiµƒ;Ãþ¥I…Ó1f<%í`FdpmëÝw®âM“„  Oå&n±RÙæÊŠ aËË<#)¼›p‘`"Z | |¶²Z«­¯$˜¦JqloO&4$—4KlÌ{ $¤Jê…‰fMrŠ]œ*Î…ë"g²Ë:¬€ 1?’*@ K/ÚAÍ|‚•­«+x3'bj m…®o>9]N0>\52E4*…ÖûÖ•’¿0µˆëõzÝ^½äg8 ÁT«K•g£¿Qï<+ ûu‘w·Ö¬5\|…ÿڂέN§ÓlåºX¦d¿6ðµõÆöªƒ7 ‹o.àínwÝÁů/àûWZë o@1£éáZ´ßϹ— g7¼ð €oÔrøÙP¦—1á©Zšl ¾ÏEɰ¢)R³ŒLpyÜÅÉHP¬%àM‚+oìR(–´0$CA3ÕÞÏ0ÔĜ߫çß¾zþ½zþää᳓‡?œþÌ—UüÏß}ôÓŸúPBs^|þä—gO^|ññ¯ß<öÀ·UáCš‰n‘ctÀ°Í8ÆÕœŒÄù(†1¦Ž·‡uOÅðÖ 3®C\çÝÐ=|ÀëÓûŽ®ƒXLõHÞ¸Ç9ëpáuÀ®–UñðpšF~ábZÅ`|ä“ÝÅ©ÚÞ4ƒ¾Y$¥ãûnL5÷tU‘”(¤ßñCB<ÖÝ£Ôñë —|¢Ð=Š:˜z]2¤#'‘æD7hq™ùl†P;¾Ù»‹:œù¬Þ!G. 3òCÂ7^ÇS…Ë!NXÕá7±Š}Jf"¬âzRA¤#Â8ꉔ>šÛì­}CÃò†}Í)=ôñ¼‰9¯"wøa7ÆIæÃhW±ïÉCHQŒö¹òÁ÷¸[!úâ€Ó¥á¾K‰î×7‚;4rTš'ˆ~3:–Щþ›ÐôÏš1£Ðm¼mÆí`¶&_IÜ8Õ‚—áþ…wOÓ}¹¾¸ñ¼í»oûnðŸï»Ëjù¬ÝvÞ`¡÷êáÁÆfLN–OÉÊØ@͹)Í ,a·÷aQš3")MY _óîîà" \}@U<ˆqCv=ÐL"™³Ž$ʸ„ÓYöòÖxÔ•=6õ©Á6‰ÕÛå5½\J6fωÌ´´¦œUØÚ•œ)˜ý&ÂêZ©3K«ÕL¯s¤•&CMƒÅÒ›0† ^ÀËëpJ×¢áp‚k¿Û¸‹‰ÂE†HÆxLòi»cT7A*rÅÜ@îxb¤Oz¯ñZEZK³ý ÒΤª¸ÆqEôþJ”Š žGIî©rdiµ8YŠŽÛA«¹Ú Pˆ³v0s-|M2ˆºÔ“f\…ÊÞ·8EZ¦“ œ-fSåóh¶ ÃÜ"¨Ã]…õû‚ÁŽˆLHµƒel%˜Wy °TK²ú¯6Á­e€Íô7Ðbm’áÓü膖L&$TÕ`WV´ïìcÞJùT1ˆÇÇhĦâCøuª‚=c*ázÂtý—iÚÛæ•Ûœó¢«^aœ]Ç,‹qÞnu‰•lᦎKÌSE=°Í«»1îü¦˜’¿ Sªiü?3Eï'p_°6Öá2W`¤ëµp¡b](‹iØ09˜-².dá5$\)›ÿ‚éÿ¶æ,SÖpìS4B‚Â~¤bAÈ>´%“}¯aVÏ÷.Ë’åŒLFUÔ•™U{DŽê¸®÷öÅꦛämÀàNçŸûœWÐ(ÒCNµÞœâm–ž^S4ï ž|l1ƒ<·›¦ð©¢gWµô†¼Ø{Owýù˜Õ(ª„U¶‚V^öo¨Â9·ZÛ±,^mÊA-†År ÊàÖé?°ÿQ2bÒXo¨C~½Á¯ š¤ dõ%;x Ý íâ'»hã¬YY׿£“vçßïRî)gkÍÎïs:»Î\qN-^¤³s;¾¶kK] ‘=]¢°4)N2&0懭êoO|t½wüS¦¤I&øaI`=¦ ø­DCºõÿÿPK![×3(†îxl/worksheets/sheet2.xmlŒ’ËNÃ0E÷Hüƒå=I -EU’ª¥B°@B¼ön2I,O°‡þžq¢Fº`iæÚg7N—Ÿ­;p^£Íä$J¤[`©mɗ盳+)<)[*ƒ2ù^.óÓ“tîÍ7$¸‚õ™lˆºEû¢Vù;°|R¡kqêêØwTÙC­‰Ï“ä2n•¶r¨°pÿ©U¥ Ø`ñÑ‚¥¡ˆ£ˆç÷î¼ÌÓRóYXH8¨2¹š,6SçißùUÃÞÿˆ©í(J6@аØñ-\¼c)ኾ¿*ª‚ô®Á˜L®ÏÙ›÷¾‡Ü ;üŒÝnz+œ(¡R†q ºnˆÛ΢ùlq£Hå©Ã½`Kx"ß©`ðd1åQŠ nXe,,»Ë§i¼ã~ÌŒ`îxÍêÎŽƒÇÀ5«#xyœW¬Žàü86ìÛ©î•«µõÂ@ÅLÍ¥pƒC}LØõêLŠ-a{È~WÀ¾$Y!Ò! ?e|©ù7ÿÿPK!™–#Pxl/worksheets/sheet3.xmlŒ“ÁNã0†ïH¼ƒå;qRÚª$Z¡ÝZír7É$±p#™§Í·Î-ñ69ª¢"qË1ëýÐq4äâ'Ìè÷waXo®.¨1`UBÔÜìëJ'SU8Ó'm{Ì+…Ž¿‡@< m¡ Ž¥z¿1 .§6Îíò@þ57ìs#°÷[O?t)y´¹ ï’ ™åÄ›6™M›ØŸÆŠssËgâUÚ7I/áEo)wãóƒ¨åB‡Þ:²xË;ÀX}¾ta•‡@pà·šû³âfhÓ@ïh¿–ò¢m{ÿmñúmOFD)/úgÖúqtZ~ˆê ÿÿPK!–2 Hb¬xl/worksheets/sheet1.xmlŒ’MO„0†ï&þ‡¦w)ì‡lV7=˜£Þ»0@³Ð!mwWÿ½SÈ¢QH:3}fæ}i²úhvcê”GAÈè ¥«”¿½n¯n9³NêB6¨!åŸ`ù*»¼HNhö¶pŒ:h›òÚ¹.Âæ5´ÒئJ‰¦•ŽBS ÛEµ˜…áµh¥Ò|è›ÿôÀ²T9l0?´ ÝÐÄ@#íokÕYž%…¢šÄ ”)_GñfÁE–ô“ßœì3óBvˆ{_x,Rú«âÏÝm/äÙ°JyhÜ ž@Uµ#×–ÁÍr°‘Nf‰Á#A¹×IoO/hµÜ'×”%̯zÌÂDi^N1#8›ï(;‚Ñ48Ÿï);‚³ip1’qßàü8˜4èídOÒTJ[Ö@IÃÂà†338ÔŸv}vÉÙÃöÕô*€| Z³DtçÀÿˆñe_ÿÿPK!a&8NmdocProps/core.xml ¢( |’QKÃ0…ßÿCÉ{›¤[UBÛÁ”áƒÁŠâ[Hî¶h›–$Úíß›¶[­L|Lι_ι$]ì«2øcU­3D#‚Т–Jo3ô\¬ÂXǵäe­!C°h‘_^¤¢a¢6ðhêŒS`OÒ–‰&C;熱;¨¸¼C{qS›Š;4[ÜpñÁ·€cB®pŽKî8î€a3Ñ)ňl>MÙ¤ÀPBÚYL#мLeÿ蕉³RîÐøNǸS¶ƒ8º÷Vƶm£vÖÇðù)~]?<õUC¥»] @y*¸«M~­Á¨w,_dŠ'R·Æ’[·öß(ËÙûÜáÙ}•ádž*'åev{W¬P: IRRЄÊ’ù[à×|v¸¨Ž1þ'^‡$ 㤠1›SF’ ñÈS|öAòoÿÿPK!9€Ð”DdocProps/app.xml ¢( œ“OoÛ0 Åïö Ý9é0 ¬bK7ô°a’vgV¦¡²$H¬‘ìÓ¶‘ÄÙŸË|¢ø~¢huwh]ÑaÊ6øJÌg¥(ЛP[¿«ÄãöËÍQd_ƒ +qÄ,îôÛ7jBÄDsÁ>WbO—Rf³ÇòŒeÏJR ÄÇ´“¡i¬Áû`^[ô$eù^âÐ×XßÄs —ýohLÏ—Ÿ¶ÇÈÀZ}ŒÑYÄ·Ô߬I!‡†ŠÏƒNÉ©¨˜nƒæ5Y:êRÉéQm 8\q°nÀeTòÒPýÐÖ`SÖª£e‡†B*²ýÉc[ˆâ2ö8•è YðÄX½m< µ‹™’þéåÙA^I6ŒÍ¡œz§µ}§oׯ>`aáqkÉaþÞ¬!Ñ_ˆo§ÄÃÈ;â|b¾ùï Ú+‹*#æôJÔî7œUh#ø# çê«õ/ù1nÃ=ž^ຩ6{HXó£ôKC=ðð“ëCV{ð;¬Ož?…~_žÆŸBϳ’¿aMN=%/ë¯ÿÿPK-!q9+p [Content_Types].xmlPK-!µU0#õL |_rels/.relsPK-!Þ ý(Ôhxl/_rels/workbook.xml.relsPK-!²Žt>r”ªxl/workbook.xmlPK-!iÀRŠVI xl/theme/theme1.xmlPK-![×3(†îxl/worksheets/sheet2.xmlPK-!™–#PÀxl/worksheets/sheet3.xmlPK-!ýúºÈÅz“xl/sharedStrings.xmlPK-!KáŸV Šxl/styles.xmlPK-!–2 Hb¬Txl/worksheets/sheet1.xmlPK-!a&8NmìdocProps/core.xmlPK-!9€Ð”DqdocProps/app.xmlPK ;Spreadsheet-Read-0.93/files/test.xls0000644000031300001440000002000010313232324016614 0ustar00merijnusersÐÏࡱá;þÿ  þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿþÿÿÿ þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿ  !"#$%&'()*+,-./0123456789:;<=>?þÿÿÿAþÿÿÿþÿÿÿDEFGHþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ » Ìá°Áâ\pH.Merijn Brand B°a=œ¯¼@=àZÏ?N*8X"·Ú1ÈÿArial1ÈÿArial1ÈÿArial1ÈÿArial1ÈÿArial#,##0\ "$";\-#,##0\ "$"!#,##0\ "$";[Red]\-#,##0\ "$""#,##0.00\ "$";\-#,##0.00\ "$"'"#,##0.00\ "$";[Red]\-#,##0.00\ "$";*6_-* #,##0\ "$"_-;\-* #,##0\ "$"_-;_-* "-"\ "$"_-;_-@_-8)3_-* #,##0\ _$_-;\-* #,##0\ _$_-;_-* "-"\ _$_-;_-@_-C,>_-* #,##0.00\ "$"_-;\-* #,##0.00\ "$"_-;_-* "-"??\ "$"_-;_-@_-@+;_-* #,##0.00\ _$_-;\-* #,##0.00\ _$_-;_-* "-"??\ _$_-;_-@_- ¤GENERALà¤õÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ ठÀ à+õÿ øÀ à)õÿ øÀ à,õÿ øÀ à*õÿ øÀ à õÿ øÀ ठÀ “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ’â8ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÀÀÀ€€€™™ÿ™3fÿÿÌÌÿÿffÿ€€fÌÌÌÿ€ÿÿÿÿÿÿ€€€€€ÿÌÿÌÿÿÌÿÌÿÿ™™Ìÿÿ™ÌÌ™ÿÿÌ™3fÿ3ÌÌ™ÌÿÌÿ™ÿfff™–––3f3™f333™3™3f33™333`…™Sheet1…G Second SheetŒ®ëbðZð 3 ð¿ À@@ñ  ÷ü_A1B1D1A2B2A3C3D3A4B4C4xxxxxxxxÿ 0 » Ì dü©ñÒMbP?*+_‚%ÿ€Á$!&C&"Times New Roman,Regular"&12&A)&&C&"Times New Roman,Regular"&12Page &Pƒ„&333333é?'333333é?(333333é?)333333é?¡"d‚,,é“>é“>¹?é“>é“>¹?U} ÿ¯ ý ý ý ý ý ý ý ý ý ý  ý  ìPðHðð0ð( ð ð>¶@ » Ì dü©ñÒMbP?*+_‚%ÿ€Á$!&C&"Times New Roman,Regular"&12&A)&&C&"Times New Roman,Regular"&12Page &Pƒ„&333333é?'333333é?(333333é?)333333é?¡"d,,é“>é“>¹?é“>é“>¹?U} ÿ¯ ý  ý  ý  ý ý ý ý ý åìÈðÈ ðð°ð( ð ððx¢ ð “ ð6€¿XPƒP¿?¿ ðÀi&Äð]ì ð¶<Note 1<ìxðx¢ ð “ ð6€¿XPƒP¿?¿ ðÀi&Äð]ì ð¶<Note 2 Note 2 Note 2<ìxðx¢ ð “ ð6€¿XPƒP¿?¿ ðÀi&Äð]ì ð¶<Note 3 Note 3<HMBHMBHMB>¶@ þÿ ÿÿÿÿÀFMicrosoft Excel 97-TabelleBiff8þÿà…ŸòùOh«‘+'³Ù0  p x „ œ ¨´Ìäðüéý4@1Ÿ±@0:é@x¯ÎæVÅ@GæVÅH.Merijn BrandH.Merijn BrandRoot EntryÿÿÿÿÿÿÿÿÀF0PdøêÅÅ@WorkbookÿÿÿÿÇCompObjÿÿÿÿÿÿÿÿ@IOle ÿÿÿÿÿÿÿÿÿÿÿÿB_SX_DB_CURÿÿÿÿÿÿÿÿþÿÿÿSummaryInformation(ÿÿÿÿÿÿÿÿÿÿÿÿCPÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿSpreadsheet-Read-0.93/files/content.xml0000644000031300001440000001063410313232324017315 0ustar00merijnusers A1B1D1A2B2A3C3D3A4B4C4xxxNote 1xxxNote 2Note 2Note 2Note 3Note 3xxSpreadsheet-Read-0.93/files/attr.xls0000644000031300001440000005700010452463445016637 0ustar00merijnusersÐÏࡱá>þÿ -þÿÿÿþÿÿÿ,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ú0ÍÉ@á°Áâ\ppc09 B°aÀ=œ¯¼=xKÌB}(8X@"·Ú1ÈÿArial1ÈÿArial1ÈÿArial1ÈÿArial1È Arial1ÈArial1È Arial1È Arial1È Arial1È Arial1È(Arial1ÈArial10ÈÿArial Unicode MS1*Èÿ Letter Gothic1,ÈÿLettrGoth12 BT1,ÈÿLucida Console16ÈÿLucida Sans Unicode1Èÿ¼Arial10Èÿ¼Arial Unicode MS1*Èÿ¼ Letter Gothic1,Èÿ¼LettrGoth12 BT1,Èÿ¼Lucida Console16Èÿ¼Lucida Sans Unicode1ÈÿArial10ÈÿArial Unicode MS1*Èÿ Letter Gothic1,ÈÿLettrGoth12 BT1,ÈÿLucida Console16ÈÿLucida Sans Unicode1Èÿ¼Arial10Èÿ¼Arial Unicode MS1*Èÿ¼ Letter Gothic1,Èÿ¼LettrGoth12 BT1,Èÿ¼Lucida Console16Èÿ¼Lucida Sans Unicode1ÈÿArial10ÈÿArial Unicode MS1*Èÿ Letter Gothic1,ÈÿLettrGoth12 BT1,ÈÿLucida Console16ÈÿLucida Sans Unicode1xÿArial10xÿArial Unicode MS1*xÿ Letter Gothic1,xÿLettrGoth12 BT1,xÿLucida Console16xÿLucida Sans Unicode1hÿArial10hÿArial Unicode MS1*hÿ Letter Gothic1,hÿLettrGoth12 BT1,hÿLucida Console16hÿLucida Sans Unicode7"¬ "\ #,##0_-;"¬ "\ #,##0\-A"¬ "\ #,##0_-;[Red]"¬ "\ #,##0\-C"¬ "\ #,##0.00_-;"¬ "\ #,##0.00\-M$"¬ "\ #,##0.00_-;[Red]"¬ "\ #,##0.00\-q*6_-"¬ "\ * #,##0_-;_-"¬ "\ * #,##0\-;_-"¬ "\ * "-"_-;_-@_-,)'_-* #,##0_-;_-* #,##0\-;_-* "-"_-;_-@_-,>_-"¬ "\ * #,##0.00_-;_-"¬ "\ * #,##0.00\-;_-"¬ "\ * "-"??_-;_-@_-4+/_-* #,##0.00_-;_-* #,##0.00\-;_-* "-"??_-;_-@_-#¤"¬ "\ #,##0.00_-¥d/m ¦h:mm§ 00.00.00.000¨**\ #,###,#00,000.00,**àõÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ à À à+õÿ øÀ à)õÿ øÀ à õÿ øÀ à,õÿ øÀ à*õÿ øÀ à À à À à À à À à  À à  À à  À à  À à @ à H à H à H à H à  H à  H à  H à  H à @ à H à H à H à H à  H à  H à  H à  H à @ à H à H à H à H à  H à  H à  H à  H à @ à H à H à H à H à  H à  H à  H à  H à @ à H à H à H à H à  H à  H à  H à  H à @ à H à H à H à H à  H à  H à  H à  H à @( à H( à H( à H( à H( à  H( à  H( à  H( à  H( à @ à H à H à H à H à  H à  H à  H à  H à!À à"À à#À àÀ àÀ àÀ àÀ àÀ àÀ àÀ àÀ à0À à1À à2À à3À à$À àÀ àÀ à4À à  À à À à À à À à À à À à À à À à À à À à À à À à À à À à À à À à À à À à À à  À à! À à" À à# À à$ À à% À à& À à' À à( À à) À à* À à+ À à, À à- À à. À à/ À à0 À à1 À à2 À à3 À à4 À à5 À à À ठÀ à, À ॠÀ ঠÀ à  À à  À à  À à1 À à§ À ਠÀ à €À à €À à À “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ`…xColours…e)Format…z, Alignment… i/FontsŒÁÁ`iüLžredgreenbluewhiteyellow lightgreen lightblueautograyleftmiddlerighttopbottomjustifyfillArialArial Unicode MS Letter GothicLettrGoth12 BTLucida ConsoleLucida Sans Unicodebolditalic bold italic underline6 point18 pointmergedunlockedhiddenÿ"  PR‘ ú0ÍÉ@  Ú#)  dü©ñÒMbP?_*+‚€%ÿÁƒ„M¢xeroxÜÄSÿ š 4dXXA4PRIVâ0''''ÄP4(ˆ/¾hž ÿ¡" dXXà?à?U  ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿý ý ý &ý /ý 8ý Aý Jý Sý \ý ý ý 'ý 0ý 9ý Bý Ký Tý ]ý ý ý (ý 1ý :ý Cý Lý Uý ^ý ý  ý )ý 2ý ;ý Dý Mý Vý _ý ý !ý *ý 3ý <ý Eý Ný Wý `ý ý "ý +ý 4ý =ý Fý Oý Xý aý ý #ý ,ý 5ý >ý Gý Pý Yý bý ý $ý -ý 6ý ?ý Hý Qý Zý cý ý %ý .ý 7ý @ý Iý Rý [ý d×" ~~~~~~~~>¶@ï7 ú0ÍÉ@  !*,  dü©ñÒMbP?_*+‚€%ÿÁƒ„¡"ÿà?à?U} Û ÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ~ €È@~ ¡€È@ý ®®~ ¢€È@ý ¬~ £€È@ý ­~ ¤€È@~ ¥€È@~ ¦€È@~ §€È@~ ¨€È@~ ©€È@~ ª€È@~ «€È@×ÌÜ&>¶@å ï7 ú0ÍÉ@ 6- /  dü©ñÒMbP?_*+‚€%ÿÁƒ„¡"ÿà?à?U} ¶ ’@’@’@’@’@ý ý e ý f ý g ý tý h ý i ý j ý k ý uý l ý m ý n ý o ý vý  ý e ý f ý g ý tý pý q ý r ý s ý w×ÂPFFFF>¶@ï7 ú0ÍÉ@ Ë37  dü©ñÒMbP?_*+‚€%ÿÁƒ„M¢xeroxÜÄSÿ š 4dXXA4PRIVâ0''''ÄP4(ˆ/¾hž ÿ¡" dXXà?à?U} ¶} Û} I} m} ¶} ’ } m$ÑÑÑàÂÂý ý }ý ƒý ‰ý ý •ý ›ý ý }ý ƒý ‰ý ý •ý ›ý xý ~ý „ý Šý ý –ý œý yý ý …ý ‹ý ‘ý —ý ý zý €ý †ý Œý ’ý ˜ý žý {ý ý ‡ý ý “ý ™ý Ÿý |ý ‚ý ˆý Žý ”ý šý  ×:xbbbbbb>¶@  ï7 þÿà…ŸòùOh«‘+'³Ù0 @HXh € Œ˜äpc09fpc09fMicrosoft Excel@(Ä$FŸÆ@*A@jŸÆþÿÕÍÕœ.“—+,ù®0ô PXp x€ˆ ˜ Ïä PROCURA B.V.lig ColoursFormat AlignmentFonts  Werkbladen þÿÿÿ !"#þÿÿÿ%&'()*+þÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀFþÿÿÿWorkbookÿÿÿÿÿÿÿÿÿÿÿÿÚ7SummaryInformation(ÿÿÿÿDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿ$Spreadsheet-Read-0.93/files/test.csv0000644000031300001440000000010210701240203016576 0ustar00merijnusersA1,B1,,D1 A2,B2,, A3,,C3,D3 A4,B4,C4, ,,,,,,,,,,,,,,,,,,LASTFIELD Spreadsheet-Read-0.93/files/merged.xlsx0000644000031300001440000002017012474016202017305 0ustar00merijnusersPK!È£Í4vÝ[Content_Types].xml ¢Ù( ¬TÉnÂ0½Wê?D¾VÄÐCUU]Ž-ôLßT bˆ 4–TÙ4DÃŒqDl …œŒ?Øt4’™Šô®*f;+‰@{¥ì¡—ˆì®FùŸio{SúmAÌgâ`ñ2k? Ly²Ù–&`CwvÝ™|ù¸^z¿¾v*uÒJwÐ}®\¡Yô%®·¨­ACB$ÇÌÎqskïMmQ6§þ-<­Æ¿+֥РçÄ_Îêêõüݥ㸋ÜG¸|‡ÎÖÓg6 ›ØäÿÿPK!µU0#õL Î_rels/.rels ¢Ê( Œ’ÏNÃ0 ÆïH¼CäûênH¡¥»LH»!TÀ$îµ£$@÷ö„‚JcÛÑöçÏ?[ÞîæiTb/Nú(A±3b{×jx­ŸV b"giÇŽaWÝÞl_x¤”›b×û¨²‹‹º”ü#b4O ñìr¥‘0QÊahÑ“¨eÜ”å=†¿P-<ÕÁj{ª>ú<ù²·4Mox/æ}b—NŒ@ž;ËvåCf ©ÏÛ¨šBËIƒóœÓÉû"cž&Ú\Oôÿ¶8q"K‰ÐHàó<ߊs@ëë.Ÿh©ø½Î<â§„áMdøaÁÅT_ÿÿPK!>”—ôºxl/_rels/workbook.xml.rels ¢( ¬’ÏJÄ0Æï‚ïænÓ®""›îE„½j}€L›²m2㟾½¡¢Û…e½ôøfÈ÷ý2™íîkÄ&êƒWP%ô&ØÞw Þšç›ÄÚ[= &$ØÕ×WÛ4çKäúH"»xRà˜ã£”dŽšŠÑçNÒ¨9ËÔɨÍAw(7ey/ÓÒêO±· ÒÞÞ‚h¦˜“ÿ÷mÛ| æ}DÏg"$ñ4äˆF§YÁ.2#Èóñ›5ã9é³”óY]b¨Ödø é@‘%’sç"ÌÝš0ätBûÊ)¯Ûò[–åßÉÈ“«¿ÿÿPK!BE T,xl/workbook.xmlŒ‘ÍNÃ0„ïH¼ƒå;ÍMTª:•*@ô‚8”ölâMcÕ±#Û!íÛ³NH'{vío=ãÕúÜ(ò ÖI£Mf1% K#¤>2ú¾{¾[Pâ<ׂ+£Ñ 8º.noV½±§cNÚ1Z{ß.£È•54ÜÍL ;•± ÷(í1r­.\ à¥qœG —šŽ„¥ýÃT•,áÑ”]Ú Š{|¾«eëh±ª¤‚ýèˆð¶}å ¾û¬(QÜù'!=Fç(M ¶k7T¡›ÅŠ«É7K0Q»ZºÃ·{JT¼S~‡¶§©˜c:OÓ<BD{ ½ûIΩ…é½Ï1òËU¡è‡ÎA _3šÆù"›j/ µG|’-â@~á‡`q̰=¸Þ(.üÀù}áÞ.%nìë0Ý*¹*ƒK\†ƒéæÙI‰y0Éù‹Ьªjmò_´/Nµï,ä}Wƒ:=RYþìŽ}¢H9ÈEíò€bAëwöžk}¦mÌËóö ÿÿPK!iÀRŠVxl/theme/theme1.xmlìYMoE¾#ñF{oc'vGuªØ±[HÓF±[Ôãx=Þfvg53NêjHHˆ‚¸ q J­Ä¥üš@©wfv×;ñ˜&%õ!ñÎ>ï÷Ǽ3¾zíAÂÐ’ò´Ô/×DÒiµƒ;Ãþ¥I…Ó1f<%í`FdpmëÝw®âM“„  Oå&n±RÙæÊŠ aËË<#)¼›p‘`"Z | |¶²Z«­¯$˜¦JqloO&4$—4KlÌ{ $¤Jê…‰fMrŠ]œ*Î…ë"g²Ë:¬€ 1?’*@ K/ÚAÍ|‚•­«+x3'bj m…®o>9]N0>\52E4*…ÖûÖ•’¿0µˆëõzÝ^½äg8 ÁT«K•g£¿Qï<+ ûu‘w·Ö¬5\|…ÿڂέN§ÓlåºX¦d¿6ðµõÆöªƒ7 ‹o.àínwÝÁů/àûWZë o@1£éáZ´ßϹ— g7¼ð €oÔrøÙP¦—1á©Zšl ¾ÏEɰ¢)R³ŒLpyÜÅÉHP¬%àM‚+oìR(–´0$CA3ÕÞÏ0ÔĜ߫çß¾zþ½zþää᳓‡?œþÌ—UüÏß}ôÓŸúPBs^|þä—gO^|ññ¯ß<öÀ·UáCš‰n‘ctÀ°Í8ÆÕœŒÄù(†1¦Ž·‡uOÅðÖ 3®C\çÝÐ=|ÀëÓûŽ®ƒXLõHÞ¸Ç9ëpáuÀ®–UñðpšF~ábZÅ`|ä“ÝÅ©ÚÞ4ƒ¾Y$¥ãûnL5÷tU‘”(¤ßñCB<ÖÝ£Ôñë —|¢Ð=Š:˜z]2¤#'‘æD7hq™ùl†P;¾Ù»‹:œù¬Þ!G. 3òCÂ7^ÇS…Ë!NXÕá7±Š}Jf"¬âzRA¤#Â8ꉔ>šÛì­}CÃò†}Í)=ôñ¼‰9¯"wøa7ÆIæÃhW±ïÉCHQŒö¹òÁ÷¸[!úâ€Ó¥á¾K‰î×7‚;4rTš'ˆ~3:–Щþ›ÐôÏš1£Ðm¼mÆí`¶&_IÜ8Õ‚—áþ…wOÓ}¹¾¸ñ¼í»oûnðŸï»Ëjù¬ÝvÞ`¡÷êáÁÆfLN–OÉÊØ@͹)Í ,a·÷aQš3")MY _óîîà" \}@U<ˆqCv=ÐL"™³Ž$ʸ„ÓYöòÖxÔ•=6õ©Á6‰ÕÛå5½\J6fωÌ´´¦œUØÚ•œ)˜ý&ÂêZ©3K«ÕL¯s¤•&CMƒÅÒ›0† ^ÀËëpJ×¢áp‚k¿Û¸‹‰ÂE†HÆxLòi»cT7A*rÅÜ@îxb¤Oz¯ñZEZK³ý ÒΤª¸ÆqEôþJ”Š žGIî©rdiµ8YŠŽÛA«¹Ú Pˆ³v0s-|M2ˆºÔ“f\…ÊÞ·8EZ¦“ œ-fSåóh¶ ÃÜ"¨Ã]…õû‚ÁŽˆLHµƒel%˜Wy °TK²ú¯6Á­e€Íô7Ðbm’áÓü膖L&$TÕ`WV´ïìcÞJùT1ˆÇÇhĦâCøuª‚=c*ázÂtý—iÚÛæ•Ûœó¢«^aœ]Ç,‹qÞnu‰•lᦎKÌSE=°Í«»1îü¦˜’¿ Sªiü?3Eï'p_°6Öá2W`¤ëµp¡b](‹iØ09˜-².dá5$\)›ÿ‚éÿ¶æ,SÖpìS4B‚Â~¤bAÈ>´%“}¯aVÏ÷.Ë’åŒLFUÔ•™U{DŽê¸®÷öÅꦛämÀàNçŸûœWÐ(ÒCNµÞœâm–ž^S4ï ž|l1ƒ<·›¦ð©¢gWµô†¼Ø{Owýù˜Õ(ª„U¶‚V^öo¨Â9·ZÛ±,^mÊA-†År ÊàÖé?°ÿQ2bÒXo¨C~½Á¯ š¤ dõ%;x Ý íâ'»hã¬YY׿£“vçßïRî)gkÍÎïs:»Î\qN-^¤³s;¾¶kK] ‘=]¢°4)N2&0懭êoO|t½wüS¦¤I&øaI`=¦ ø­DCºõÿÿPK!Ø‹&Õ^ xl/styles.xml¬TK‹Û0¾ú„î]%)]Úb{YX… IK¯K¶Uô0Ò8Øûë;²Û{*e{±æù曑³‡ÞvU!jïr¾¿Ûq¦\é¥vuΜï>rœãÊù "(Þ¾É"F¥„‹9oÛÏBIJQâo•#Oåƒ$5Ô"¶AŒ)ÉqØíî…íx‘UÞad¥ïÒ-fC‘ÅgvC–=EVzãC‚§‹ŒVMOê7üìØ \L¡Xm†ÉuH‘*ÌG$¿6f©wHõÈPd- ªàޤ°Y>-UsÔü3Æý%º0ì6 b,Xd$‘½ít2™QÒEƒ®›t¢oé{ñˆÞ’ 5ÔÞ!QÜ2fÚ)•1§4_Õ ì¾b®³G‹_dÎi´‰„›HÌâ„7) ‹6ao`ßYÿËújÁE6ƒ¶5ãѵ³ê¶*pSYãƒ~¦ÓÊ”äW§ÝF]& 1:N¤¯^ÕÁ»ÃÈ31»ß‹á-c`iÍs~Ÿ!É6Ù¥Óµ[¸]gG°²_·a—ZG¸Ð›M{²¢¥ª‚Îàyqæ|•¿)©;ûi‰ú®¯Gˆœ¯ò×´´ûû‘ÞõÇPüÿÿPK!¹/µ7 xl/worksheets/sheet1.xmlŒTMoÜ ½Wê@Ü»x¿šÖ²íÚŠšC¥ªÛöÎÚcÅ6ØÝ6¿¾ÄÎ&Ù(½Á›™÷Ã@rý§ïÈ´rHé|QC)+14)ýùãæÃ'JŒåCÅ;9@Jÿ‚¡×ÙûwÉIê;ÓX‚ ƒIik­Š3e =73©`ÀH-uÏ-nuÃŒÒÀ+_ÔwlEYÏÅ@C¬ÿ‡CÖµ(¡å¡‡Á ·èß´Bš%•À˜;ÑP§t3‹eYâ• 8™³5±|¿ƒJ 6€w°½”w.ñ¡OpŒ¼´â9t¯±7¿ƒÆÚ °Iá|=ªÝøV|Ó¤‚š:û]ž¾€hZ‹²ëÙ•gð·Y@Ö šÒsÅùT<£bþ(€F&ׯXX^´àPgaØàœoñÔSþ2cù4£x™ñЧÕEOõ·váH¡-ofäofà<¿®î.Ìb¥ *Ç÷!;KÀvõ ?ņ”ò0 ×Í„><œE¼Yºæ>÷ó¯q6pÆoà+× é FÊhvE‰î×V*â»ÙKke?îZüç:ša÷k)í¸AÇ»{PDqz'îñúL‰ÔÿðSª¤¶š KI‹ø½Ä@W(ŒÔýnV”{‹*¥ú¶òχMYöÿÿPK!90™áxä'xl/printerSettings/printerSettings1.binÊ`(`0c°`0a0```8É|3ê:/“ãIæ™ ‡™At#”Þ¥=¡ò'žËs132Üaà`®fd`dàd˜Ém‘d±McBf vš¯À`Ä`´¥H[2˜3ä!ÉîI`s" ö…¨ÿÿPK!;ssMmdocProps/core.xml ¢( |’QKÃ0…ßÿCÉ{›¤sNBÛÁ”áƒÁ‰â[Hî¶h“–$Úíß›¶[­L|Lι_ι$›ïu}uª29¢ AQIe¶9z^/ã9Ïäee Gph^\^d¢f¢²ðh«¬Wà¢@2މ:G;ïk†±;ÐÜ%Áa‚¸©¬æ>í×\|ð-à”k¬ÁsÉ=Ç-0®":"¥õ§-;€JÐ`¼Ã4¡øÇëÁj÷ç@§ŒœZùC:ãŽÙRôâàÞ;5›¦IšI#ä§øuõðÔU•iw%™LXྲÅ}²«ÞM´°a‘IíKîü*l|£@.gîsG`wUú@F!뫜”—ÉíÝz‰Š”ÐILÒ˜’52BÙôê­ ðk¾ Û_ècŒÿ‰Ó–˜ÎÖdÆÒFÒñ(2|öAŠoÿÿPK!:Àf‹‰docProps/app.xml ¢( œ’ÁnÛ0 †ïú†îœ`†@V±¥+zذIÛ3+Ó‰PY$ÖHöô£m¤q¶žªÉŸøõ‰”º9´®è0e|%æ³RèM¨­ßUâa{wýU™À×à‚ÇJ1‹}õI­Sˆ˜Èb.ØÂçJì‰âRÊlöØBž±ìYiBj8M;𯼠æµEOrQ–_$}õu|3£ã²£šÖÁô|ùq{Œ ¬Õ·5@üJýËšrh¨øq0è”œŠŠé6h^“¥£.•œ¦jcÀáŠu.£’為G臶›²V-;4R‘íÛBϱǩDÉ‚'ÆêÛÆdˆ]Ì”ô¦—g5z%¹a,á´wÛÏz>4ppÙØŒ ,\"n-9Ì¿›5$z‡x>%FÞç;óWNñ†óEÿX¯BÁYx‹~Zÿ’â6Üáiš—EµÙCšpÒÏuσL®7YíÁï°>õü/ô»?¸ž/f%Ÿaå§š’篬ÿÿÿPK-!È£Í4v[Content_Types].xmlPK-!µU0#õL „_rels/.relsPK-!>”—ôºpxl/_rels/workbook.xml.relsPK-!BE T,¤xl/workbook.xmlPK-!¨^«»% xl/sharedStrings.xmlPK-!;m2KÁB# xl/worksheets/_rels/sheet1.xml.relsPK-!iÀRŠV xl/theme/theme1.xmlPK-!Ø‹&Õ^ Ïxl/styles.xmlPK-!¹/µ7 Ïxl/worksheets/sheet1.xmlPK-!90™áxä'<xl/printerSettings/printerSettings1.binPK-!;ssMmùdocProps/core.xmlPK-!:Àf‹‰}docProps/app.xmlPK &<Spreadsheet-Read-0.93/files/misc_ws.xls0000644000031300001440000001400011761614021017312 0ustar00merijnusersÐÏࡱá;þÿ  þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿþÿÿÿþÿÿÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿ  !"#$%þÿÿÿ'þÿÿÿþÿÿÿ*+,þÿÿÿ.þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ » Ìá°Áâ\pCalc B°aÀ=œ¯¼=@ 8X@"·Ú1ÈÿArial1ÈÿArial1ÈÿArial1ÈÿArial ¤GENERALà¤õÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ ठÀ à+õÿ ðÀ à)õÿ ðÀ à,õÿ ðÀ à*õÿ ðÀ à õÿ ðÀ “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ`… ¡misc… E … ÇfooŒ11ÁÁTëjðbð( 3 ð¿ À@@ñ  ÷ü 1 ÿ n cc » Ì dü©ñÒMbP?_€%Á*+‚ƒ„&ïîîîîîç?'ïîîîîîç?(Ò'}Ò'}ï?)Ò'}Ò'}ï?¡" d,, ¶` ¶`à? ¶` ¶`à?Uý ìPðHðð0ð( ð ð>¶@ggÿÿÿÿ » Ì dü©ñÒMbP?_€%Á*+‚ƒ„&ïîîîîîç?'ïîîîîîç?(Ò'}Ò'}ï?)Ò'}Ò'}ï?¡" d,, ¶` ¶`à? ¶` ¶`à?UìPðH ðð0ð( ð ð>¶@ggÿÿÿÿ » Ì dü©ñÒMbP?_€%Á*+‚ƒ„&ïîîîîîç?'ïîîîîîç?(Ò'}Ò'}ï?)Ò'}Ò'}ï?¡" d,, ¶` ¶`à? ¶` ¶`à?U~ ìPðH0ð ð0ð( ð ð >¶@ggÿÿÿÿ þÿ ÿÿÿÿÀFMicrosoft Excel 97-TabelleBiff8þÿà…ŸòùOh«‘+'³Ù0ÄHPp ˆ ”   ¬ ¸éýMicrosoft CorporationMax Maischein1@Ð@@€&\¤iÜ»@¬Âë—>ÍþÿÕÍÕœ.“—+,ù®DÕÍÕœ.“—+,ù®\éýéýRoot EntryÿÿÿÿÿÿÿÿÀFÀ Workbookÿÿÿÿk CompObjÿÿÿÿÿÿÿÿ&IOle ÿÿÿÿÿÿÿÿÿÿÿÿ(SummaryInformation(ÿÿÿÿÿÿÿÿ)ôDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿ-tÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿSpreadsheet-Read-0.93/files/clear.ods0000644000031300001440000001315510327656236016740 0ustar00merijnusersPK½TZ3…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPK½TZ3Configurations2/PK½TZ3 Pictures/PK½TZ3 content.xml¥VMs›0½÷W0z“Ûi›PÛ™étzJNi;½Êb1šèƒ‘„qþ}%„±pŒÃ´2^½·ûöiY²z8žìA¦ä:ÏnÒ$U9“»uúëçt—>l>¬TQ0 Y®h-@ZD•´îoâØÒdátÖZfŠf2I˜ÌÒLU ¬,Fgm­1ö•O¦·à˜má`§’=vÀ%Ûé•[pÌÎ5i¦’=Ö™Ó 5•|0ʹ.*bÙ™Šgòe–ÖVÆMÓÌšåLéžßßßãö´L{\UkÞ¢rŠƒ/fð|6ÇG¬K¦êóØX’¬Åôdkˆ%onÕìw“'b¿±†–DOž<¼Þe>ýz—yÌÄ–#wr‡ŸÜaûxz<Í‚SkyìÀ*ªY5¹Í€ŽùJ©^ª'„´•»¸¹¹Åáw„n®ÂÍ,èN¯Â)á´w\‰K¦9Ü;‚½Ó~ð½f„°Àḛ|4õŸ§ÇgZ‚ '0{Œ˜4–HïL·Ò{ts\šÁpƒû@á–'*”åf³ Ã߇“ðÛ_â:ýƬ±ˆH~ƒ&É3‘fž&näxÁøë:ýH*e¾^‡ƒ4‰jTÌR7œ{¢™ßh)¾®à')•·æMÍþàŸS_ÐûŸ½ÚÍÜà™†óžDƒ^rÍDÃJcð“½0þtµ §…ßa9/뵯܃¾Ý™ð›RÑÌçD!JR§Ï€k–a&vÉ)É& ’é¡ÕŠO šd3FÍÿ~ëÓbCäBÖ©5O0kÉY;}bõ:÷\\~ÁH‰úk3Óä …˜‚’×B·«œ<:åWi2á*0 /GTâ'Ú P~RºõS„yn²ýµYB>ëVy])*s¾.˜ £ñQ걄RÁÒW?€z¥Ý¿†N†gÃKó¨“f’ý©¦ÒÝ”¢#¯UïLUû#˜¡Ozªÿƒ’g FE N!ÙÁáN}°·–sÑ;‹—.Ž»&¯VW1L7f‰v(Îa=ê/ ‹>[}àJé™}½º²R8íPãÉ?ï$ÌrCûÞ„ƒ<¸õÿ'pzã‹LgV77eé™Bî]DæcÊì[¡hß8!”~Ò½”e®v_¤‘þi¹é  Sx#ƒs~óIôm²õtB‡“5ªÙ(‘lUÈÓHdµ¦¹¡¥{†¥ÍzŸÜ™÷oUóWî0¶àäþþþ.<_lVª3ήcèz4‘0]ÎRÓZ«Ò OpenOffice.org/2.0$Linux OpenOffice.org_project/680m3$Build-8968H.Merijn Brand2005-10-26T12:37:22H.Merijn Brand2005-10-26T12:37:57en-US2PT35SPK½TZ3Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Òå@¼€ƒ Hš1}–e``l÷tq ©˜óö¢#'ƒÏ¶¯î-Oâ94·É!­œß÷³uCù^có3w Š2hÅxÃäãÌZwôÖšûÀ˜aðtõsYç”ÐPK-šöüjÀPK½TZ3 settings.xmlí™[SâJ€ßϯ°òzJ¹ê1”²² x[•·IÒ’ÑÉLjfB€_¿"[š%.†ðp¶äÈ\¾îôôt÷$gßæ>9˜˜Ñs­rTÖ€:ÌÅtz®†—‡§Ú·æ?gìé ;Ðp™ú@å¡)Õq ¦SÑHºÏµÓC‹E>ˆ†t,ºžÖx;º±–´Ì ¦/çš'eÐ(•¢(:ŠjGŒOK]×K«ÞõP‡Ñ'<ÝVT2ú­(ÆØ/Añ„D™•°j¹\/%×ÚÁ«’ïLÓ\Ûa}ûͳWÉÏ!–àǶ9xmŽU;×”ÈÆ CôËjÚ¦yï猱À6ƒ²@[wÊE :1•Z³|Vúò)ð <Éýï±+½MèjõøtgzðÔÛ¨yý¸²-ýÐGÁ!¦.ÌÁMK‚hó­æ(çâ‹mô…¨ë¦”’«õךqçç4¡)=‡HÙãOоŸ2ðde ÷3C.ï1¥òþ‡½ä=ù±@r‡q¼dT"2–·Ì…´ù=Æwðoà;û¢§´_¨ÈýùVÿ=ð Gâ¬è¢Ó óTóÁ×ú³ÖX++¢ìÈ-6v¯©-&%ó?ÞÐø6–eu¯‚ζ ¿ Gñ.‰;;o ‡3BlijÓË9-;aÌ*N¡[:†Ž ÓÔ•ª•r^'@SˆóLJô“œðÇ¢X@K¥Ù—‡¸lIñmÆ ª5Ÿ_Ì8[é/²HîÀ¿cr_è6ÇéÌ^9¦šŒ0žBo¡Jõ¤¦ª§“ÖuVé ¡T}j±¨ÈUUó^„¬‰Š4{ wÅPª“ ¾Íˆ@:!"d@Q0dÒ ]ÄÎJÀ]ñZ.ïM‚B­wfqXÉ‰Óøâ®øAh»x†E¦úÁ7+Ÿ×u¼1Çb° ŽÇÅKȈrV¯‡¥ÍÔÑvûÃpÒr/ðgNÅ_yã/Ë7˜¾ŒIÈ>PÕ¾RÒWJúJIuJú“$#”ÌDÄ ‰ Åã{ꘪîãN]dœ`ç*ëÌw‚«Í¦ØHÀI½…)â ­iEK58¾^7þŸ~eÜ-ƒúäáj½7Œ[㹟\”J§-Ãðêï…«¾¾Ž­öeùq`ÌMÚZ ûãòä¡«C{¼°kÓk»vLTÛãƒØÕº>jë ·s塇þõcUÐýxÙ^\;Õ;ÏnôÛ¡™~Ås|7°}ËCt¼tÛbÓ¾~kFÑÍwCÜÁ³]Ïß"NÇb½a·¬d/íö¸:¹ô·ý®Ož'Ãrd’Vߺ¸›ÙÔ"paynûâ:§;YŒðïH¢âÝÙôGŽò9“ùïûŸntÅ5pjŒh/¤Ž ц牅<,@3'¯a~P“0±’!—œùCðƒ¢ÌB BT9‡ƒ+f›ˆ:@öPR1äZªÞa”,rÜCfq_úíÝW)ë­`ó'PKªéÉpMWPK½TZ3META-INF/manifest.xml­“ÍnÂ0„ï<…ë{ì¶§Ê" ¨T©-¡G7ÙKŽy×Þ¾)@E.”Üü3úfg¤Owµe[ðh—ò'ñȸ¼)Œ«R¾ÎÞ’>ŒÆóå,û^-X­)Iu¶Z¿~¼ÏO¤\¶à–eir¯¤œgsöÙé"[ÊÅg¼{<¯™q(‡§kʃwªÑhP9]*ÊU½Š&58Rõêc2bgpi,$Qè÷ 0:¡} )×mkM®)– ·®G/qi!°õ  Ü?CÊ`mÒjÚ¤\ry—''bŒÈWš*øãg¿ÛìR‚Ï·š÷CW&§ào¥ìHÆÙû©1 <†ä"í-ààØHÿÚË6¡þqÚX”ÔE몡áà DqÿOÕŽåÕ†N~PKƒÐƒ¸99PK½TZ3…l9Š..mimetypePK½TZ3TConfigurations2/PK½TZ3 ‚Pictures/PK½TZ3ûâ¢Êø¨ ©content.xmlPK½TZ3¦u_Ùb  Ústyles.xmlPK½TZ3“ûõõt meta.xmlPK½TZ3-šöüjÀ Thumbnails/thumbnail.pngPK½TZ3ªéÉpMW ?settings.xmlPK½TZ3ƒÐƒ¸99ÆMETA-INF/manifest.xmlPK BSpreadsheet-Read-0.93/files/values.xls0000644000031300001440000003300010313232324017140 0ustar00merijnusersÐÏࡱá>þÿ þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ì0ÍÁ@á°Áâ\ppc16 B°aÀ=œ¯¼=hKL;‚#8X@"·Ú1ÈÿArial1ÈÿArial1ÈÿArial1ÈÿArial7"¬ "\ #,##0_-;"¬ "\ #,##0\-A"¬ "\ #,##0_-;[Red]"¬ "\ #,##0\-C"¬ "\ #,##0.00_-;"¬ "\ #,##0.00\-M$"¬ "\ #,##0.00_-;[Red]"¬ "\ #,##0.00\-q*6_-"¬ "\ * #,##0_-;_-"¬ "\ * #,##0\-;_-"¬ "\ * "-"_-;_-@_-,)'_-* #,##0_-;_-* #,##0\-;_-* "-"_-;_-@_-,>_-"¬ "\ * #,##0.00_-;_-"¬ "\ * #,##0.00\-;_-"¬ "\ * "-"??_-;_-@_-4+/_-* #,##0.00_-;_-* #,##0.00\-;_-* "-"??_-;_-@_-àõÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ à À à+õÿ øÀ à)õÿ øÀ à õÿ øÀ à,õÿ øÀ à*õÿ øÀ à À “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ`… ÇBlad1ŒÁÁ`iü@ A1 labelspaceemptynulonequoteÿu ¥< ì0ÍÁ@ ƒW  dü©ñÒMbP?_*+‚€%ÿÁƒ„¡"ÿà?à?Uÿÿý ý ½ð?ý ý ý ý ý ý ý ×¼@>¶@ï7 þÿà…ŸòùOh«‘+'³Ù0 @HXh € Œ˜äpc16fpc16fMicrosoft Excel@™2 L¹Å@N9L¹ÅþÿÕÍÕœ.“—+,ù®0Ð PXp x€ˆ ˜ ªä PROCURA B.V.We Blad1  Werkbladenþÿÿÿ þÿÿÿþÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀFþÿÿÿWorkbookÿÿÿÿÿÿÿÿÿÿÿÿSummaryInformation(ÿÿÿÿDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿSpreadsheet-Read-0.93/files/perc.xls0000644000031300001440000003300011131150660016573 0ustar00merijnusersÐÏࡱá>þÿ þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ FÍÉÀá°Áâ\pH.Merijn Brand B°aÀ=œ¯¼=àxŒUn78X@"·Ú1ÈÿArial1ÈÿArial1ÈÿArial1ÈÿArial1 ÿArial "â?¬"#,##0_);\("â?¬"#,##0\)% "â?¬"#,##0_);[Red]\("â?¬"#,##0\)&!"â?¬"#,##0.00_);\("â?¬"#,##0.00\)+&"â?¬"#,##0.00_);[Red]\("â?¬"#,##0.00\)=*8_("â?¬"* #,##0_);_("â?¬"* \(#,##0\);_("â?¬"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)E,@_("â?¬"* #,##0.00_);_("â?¬"* \(#,##0.00\);_("â?¬"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_) ¤"€"#,##0_);\("€"#,##0\)%¥ "€"#,##0_);[Red]\("€"#,##0\)&¦!"€"#,##0.00_);\("€"#,##0.00\)+§&"€"#,##0.00_);[Red]\("€"#,##0.00\)=¨8_("€"* #,##0_);_("€"* \(#,##0\);_("€"* "-"_);_(@_)E©@_("€"* #,##0.00_);_("€"* \(#,##0.00\);_("€"* "-"??_);_(@_) ª0.0% «0.000%àõÿ À àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ àõÿ ôÀ à À à+õÿ øÀ à)õÿ øÀ à©õÿ øÀ à¨õÿ øÀ à õÿ øÀ à A À à«A À “€ÿ“€ÿ“€ÿ“€ÿ“€ÿ“€ÿ`… <Blad1ŒÁÁTüÿcc FÍÉÀ ø‚  dü©ñÒMbP?_*+‚€%ÿÁƒ„¡"ÿà?à?U} I ÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿ½@@$@$@½y@@@½i@@@½Y@ð?ð?½D@D@D@½4@4@4@½$@$@$@½@@@½@@@½ ð?ð?ð?~ D@ ü©ñÒMbp? ü©ñÒMbp?~ 4@ ü©ñÒMb`? ü©ñÒMb`?~ $@ ü©ñÒMbP? ü©ñÒMbP?~ @ -Cëâ6:? -Cëâ6:?~ @-Cëâ6*?-Cëâ6*?~ ð?-Cëâ6?-Cëâ6?ü©ñÒMbp?ñh㈵ø?ñh㈵ø?ü©ñÒMb`?ñh㈵øô>ñh㈵øô>ü©ñÒMbP?ñh㈵øä>ñh㈵øä>×*bh22222266>¶@ï7 þÿ à…ŸòùOh«‘+'³Ù0¨@HXp ˆ ” ämerijnH.Merijn BrandMicrosoft Excel@€x2ü¤mÉ@xápÉþÿ ÕÍÕœ.“—+,ù®0Ð PXp x€ˆ ˜ ªä PROCURA B.V.WoA Blad1  Worksheetsþÿÿÿ þÿÿÿþÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀFþÿÿÿWorkbookÿÿÿÿÿÿÿÿÿÿÿÿSummaryInformation(ÿÿÿÿDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿSpreadsheet-Read-0.93/files/test_x.csv0000644000031300001440000000005010313232324017133 0ustar00merijnusersA1=B1==D1 A2=_B2_== A3==C3=D3 A4=B4=C4= Spreadsheet-Read-0.93/files/blank.csv0000644000031300001440000000001513231316207016722 0ustar00merijnusers ,,, ,,, ,,, Spreadsheet-Read-0.93/files/values.ods0000644000031300001440000002427613701030010017126 0ustar00merijnusersPKjBçP…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKjBçP content.xmlÅXQoÛ6~߯4`o´ì¤Á-qÑaØS K ì­ Å“L”5’²ì¿£(É”*9jZd/¶E~w÷Ýñîxòýûc.‚(ÍeñnVë0€"‘ŒÙCøéãŸä6|¿ýé^¦)O f2©r( Idað;@éBÇ¥OÔ4J*UÄ’j®ã‚æ c“IJ„¢“¿–‰»n=SŒ‰‡poLGQ]׫úz%U]­××Q1j(9p¨î$Ž{“OJlîîî¢f·‡j>£zýóôøœì!§„ÚÐ"³{Yª§Råz¹íÌd>«¢­ÅK³4Àí‡Öš^*m±¾lNÍ~&Æ·Ñn6O½gŠÖKmY,æ›oŽ©k¶\üšù²Ž‹ƒd±¾¬6'‹#lÁƒ ¡K…-Ö—•RöñµpWq]:¼‹Üs‡òì¤ÊúºLeU0WRÎ6KPÜnQ·Eìi¸~È;~Ȱä%ZÚ # Ó¥:dŠrWg9Km¹lãÈ µ—ʵ ©œ¡Ÿr]Þõg0J)I®±SP²Œ=i_ÝQðâË|g²»~m—Y¶A²tl|T°,é —•Y–D À*ÒÑfµ‰:l²§jqÉ4`ß’²=i6so"¥T¦¯Nº[^a Ø·•h}m¦"úñïÈî[н_E•ï@-î#x³|UÒxÐõź¬ÇcðàÉExBE2Å庿‹Pï>J¿¢ð­X<Ð0ìµ´¾Èb³Ž,& Ú¬ôÆ…«pÛÍî¾ÑQ¿âŒ@Rša½½wÁí—÷lù>„§xMcgé9§n=º,üÈñ˜ïƒgZè 5¿ÐRêßF8·ÕO2(0zx’ºæZ%7 Þ„ŠÄìɼ@­á|*8ÎT<=Ïr—;iùK좹ãh×ie$Þî–"©Ô„ƒ,ŸibÛóZw&oÛ#pSÇ·™|9Õ£‘"Ìáÿ/©›ný¦AÕ%N]ojòÒœÞÔbQ½mLq xM–N5Øï¥òo%Í«È|sÉø+Vë ó' oäŒ<Ñ`(êžÆÿènÿPK¼óTüPKjBçP styles.xmlí\ûoã6þýþ C‹+v“õpÇnâ ½»^ tƒ¢ÙÅý¸`$JæUж“ýëoH½Ÿ–¿²ØlÐTäp4óÍðãP¯Ûûgßm0‹ îc¬+#XÔ&{§|þô‹z£Ü/ÿvK‡XxaSkí〫ñp4‚ÁA´Ž q©cÍ‚E‰òq´àÖ‚†8H‡.êcò´q»ËlÛ»SVœ‡ MÛn·ãídL™«™º>Ñ\ÍF©‚·ïÒÏ+î7Ž0æó¹&{SQ›ú-ª $T¼“¢T:² y_‡bé¢+e~ßÑB¶8ÖG|ÕâÓö:å>þžyÆÐ¶ï¹„,„·x:›MìþÃ'vq,ÇϽA²Å±2z#,„K aŽú²Å±”Ò _!'xšWZ|œJ{4w’¹Ù4pè:°ãŽÏŸC̈èBÞ"™3 %×7noÇ7®jQ?„3=• N_Ôqf>N˜Ö¬t¤”Ú}Ç>GžêÐó‚½4ï²4BI©êG* 8f4\FÕ={$ø« Do–ðV&®™'¥lKÃgŒ4clh©¬µB¬w†Ká¢QLPHk¢M5†CÊx6™ÐSÿ !…‹ç²¢h›øô§&úT1ÿ2¿‚µÿ„YïiÄ[›—mç4Ú2!+ˆ[âò¬ÝÓt®I¡Ì}=`žŠa‹’†25¢m§†® e”¤oa15•eºr:VMYXµ±åEËÛˬy óA°hÁ¼O|⽤íZ÷àß DU:;zDAÔ æÒèÇŠ\ܨŒJª…¼êâÀ‚ÀE[E%‰p Ö© ÃD v˜&í}xôñ±Õ¶ª`ã^"Žý]ÖimáHÚãº&õÂÆZ{Iµ“jN •™§ZØó”T”»«ŠÍZ3È6zé'ø‚QyrAÌ£[49·­‡¹7J‡ j³ Ò¯Q¡g¼æµ(N 5x~pƒ‡˜1Ñ•SÂÁ‰ßb‡‘Û±¢kUθh„kœÐœH]ä” _ ý‚͹=l6ls‹‚ B8—Ó“#8=È«KD¿Ã“ö98=ÕöH–ƒ¹â?ÍàÌv—DÝ ø7{E¿ú9{ðªçìØ£¸‘I±ëVÎó×&ÕËéý=qR½ÑŠY&Å+’êªëzU H×ÂQÒãÏSÅm4dqÌr™JûÅÌêC%'€fœ ´7E“¯Ô<) ê^© ¨Ùn¥W9"Àôæ8à;r²)trÂUrá°‡*o·*£Ÿªnš’.Vš¢ý®¬\õ(¨ê—J¾-–rE pkgªÃâö&‰j ¦íduL[¹ªÅøv¶š]$[ÍÇV³±Õl'[u,fSãRJª7Tïho ¤:Ã&သ¸¤:1õ×¶}‡)馯%’¤ä”äœi I™`¯(馃nM[,9¤üÜ.¿¤;#QÄô´%Ý¥rå¾%å´úTÅe°åôpl9=[Nw²eëM£éuáVËÙîµ›7ËrfL`‰;%4Pé3Ç;È‹ð»ïÕîíÍi‚ÑÆÆûJÂÂÝûÈ"0‰C,µ›uŒ.Ö1z2¹èÅÏ! Ä i…îXsÖ#_Ùˆû÷“´Ï¡ÌÂv>8"nPx \âÅ^×øWülröžÁŒEÔ#öèÝ.þµsV!ˆùS ¢~Ä þB)v»_ }ü"¨Þ:ÀÔ|;â×蘘sï°‚NH?i#NedÆ´ˆl‰-Þ‹FkN[$ÚŒ á#¬ËëèX3ü?”Úƒt'f ™ã–%çxŸ©¨ë×× |zÌ©ø€×œÊŽ’_Pæó“ƒò3:y–8zbY«î1ù/bÁÐJ² ÊE9öoÆ(;=#¤<í„Ä‘?¯‚d¿Úú'ËOϳe8º[;†X`à†!mH.$Hœ(ö9l-[¶a;WÀ¶G}{VØ&°MN ›-êŽh•×ñ“CQ÷ùˆKM;R£\¬‚7tÍK~ }Cij¸ZBXÍB$¾ìs§ˆ Ë$Xg›ñ) XsTŸÚârSùSïlR«×Š’66𧌅¸vµJ¢9O}_ÙGÌ…;Ь—Y,\i¯Ý)¦Ô‘ãØdObÈÉmä4¬X6F«…¨GhÍ~¡}q+î›ÍñÕ<ß7¦ÙñW¹ô±q“jXÌuñ/ƒ¦ A|€©–"57/=‡.¬äó¤_>?©âsaˆË«ÝÉF€•)#ùwØÄg…"¼ãt|Õ’µž8DÆ|¬OÔõÍæ'â0Ûúsld!X;8ë¡þ÷.æ-žôˆ¯.E£äËfш>ý[Ðð3ªÊ[iÑ¥ÍùoŠ«µÖ:éðQ”©È–í¤Qh꺥Rœ ëz ËòV”\‹0ù­0Ž¥—÷÷÷·Zµ1i +A¨@-€+×Ké}G­¨ìì_’ƒ<Ñ—Fz¾B[Í„TU ôN´Ž» ý3ùÚX²f ÙøˆaWÜ í vÜ -ßÇÿÇ ÷Š¢ññ‡ ¥3–šdòV¬/Ó¥H‰DKÔØdB1!@šë¦®ê3øU–º®É_]O¬‚ËŒRƒýݪåmÓDµ¡/ŒùB¿ϯ cjވϖèúBþfN7¥aÙ¿óåf1­8@~¤i9ŸÄmgÉeáÏ£8þ2u¾üì!»e+Ë•„“RIþï‹^Bûã¤5³¬ÖüÕÖåÿPKªŽâN õUPKjBçP settings.xmlíZ[sÚ8~ß_‘ñëNŠí4ta:æN“°Á¿É¶5²ä•d ùõ+è¦w)ØÙv¦<–¥ï}ç&¸ù¸ ðÅ2Ž(¹U´wªr‰G}Dæ·ÊxÔ¾üKùXûã†ÎfȃUŸzQ‰¸äP9…_Èå„W=JfH.ˆ©RÀ¯@^^•†ì–U_Ï®¦Â6#+ŒÈó­²"¬–Jq¿‹¯ÞQ6/i•J¥”ÞÝMÝhr¬¨­Þ¯DQJ¿Jlf¤ÂtU}_Ú\+Û•¯L£+µv_»Ù>Ëæã $¶¹Ø'ªÝ*Rdu‰`üÅjÊ¡u_¯±G.†ƒ`DCewS¬Cy¡ÔÔ›Ò· ?|g¢ä òÅâ´¦êª~6|¢ùâ êõêXôË„—ˆøpý}I0>¼GéÉ.¶>F_÷ü=%¹`’J-¡ƒöCš& {zŽ€´Ç)úõ’:¾výã” (GB²zÈÔ×§mã×ÈOIrr—2ôB‰Ø 1Ô‡ûÖ_Pv¿!È+ }OûòôÏ×ú€ox-aŠn2Ï0ω޿Ó7瘵ƒ5³Ê™¸ùÆîj AƒJƒ‘DÉ•Ñ ¨ p´ºM§ÚÌaZ¿‹^>ÜZиÃÐ~Ôv)Å¥&XOtâIcBWâQ3Lã{8Þ:KÖ `ž!ìÀàëÌ”u;M!Çúqš\2²WšEÎs£»€e ®~óùl>'ê²hz0˜”'ðí1d4ÕŸçï< ~ŸŠ¢ ‹ñøµA1e颗¯týºœÃ¶`”.àRó( &»ø²*Dˆµ€PÈ@Sz?FBöÐZ.ÅÜ‚ûé=!)㻲xÀI!ƒc‹$q3“Ng8Y[„#j.à>©ò°–Ï´i´ “`B.É•ÙWhú‡£Ý>üáæâLx+r}´DÑþ©ïåsoTÙýªu×ïîòÿi íÎÞª ½Gäy“n²OìþÉè û7iÁ m:ŒHÐÀ^TL~߯{Ù×GûGì.à°ü¾Ž`k¥¶4º–t<ì¿ô´ãç 5{8~ ÃqÓ[÷Gß:1ŒCÿ÷ºe +ùôå›TÙi«O–±júL®UgÚ«Û¸zø<ŽAEŽÙ‘/ç€I%Øõ¥GÌõÓ« ¿ô:{/ê*ùîvV ¿3®8A›{úøÎ´×ŽŽ#§ÓþÛŸöU7Áiªñ}Óà8Þ¬©¬ŽûyåáóðÎëö¹3u°+çI}žÀÄ~€?;£Œt¾&}<wãv½5Ô+R?û}úÃð“Kêšßîs÷jX~ÒÛ/žn«òþŸšK£ej^g…a3lùÓº”µxt5Ss'Ÿ¸3¬Ÿ&>ë¸ìŒÂz?1Ò¼Þ©Úph›3³mG-ûiªj³5ÁjiK§3.?>¯–nà·Žâó¨­O @YR]tŽ<š„0L»ÖÛd):ZDK:¡ûÈlûKßü{£”õ¿–Ú?PKÁ]…vi#PKjBçPmeta.xmlµ”]OÛ0†ï÷+"[ÇIBkµAP4qÁ‚‚v‡\û4˜¹vä8”þû9_]Ù*m ‘æ¢>ç9ïy}âdzúºVÁ ØJ=Cq¡47Bêb†îßðæ_¦fµ’¨0¼^ƒvx ޾TW´°B¨zr®¤„l6›p3 -HE#RÁÃ/6_Q_aŒÙñ¦݉5)éÖ;º]ÍPm55¬’Õl uœ6Ń%ºOÓv#]äUIýó¿x2™6; ‚︲¶ª¥'  éP‘8ŒÉÀ6ø_S ÛYêíí ?]`QÛÖk~³Åw=üWòm ßrUžüA÷áŽÝöÊy‰ÊI´qÇ– 07µvþ¢.ÈA©]lše³“!!Ò+×X,`%5ˆŽlNÏ •åCw2P'aä¯Þà~Å?Dæf]2½EùÍíõüþö,8Â÷Ë\~¼¶Òmûݼ0UvÛÒgWÊ0‡òØ»ôõ¶yéªùÓˆêKc0?„S¼¿ÇU#_.Ì…?Ÿ Ç™‚¹5ågh?1 ~ø“&o>%äÐg;ÿPKº¶«'DôPKjBçP'S22Thumbnails/thumbnail.png‰PNG  IHDRÕÿQ©cáÖPLTE'#!*%!/(".,+/26212679>86;;<=>@>ADA>=C<@ME=PG?CCDCGICHNIEAKIGKKKDJQHPUKQYRICWOIYMDSPNYSOUUUUWXVZ_[UQ[W[_YS[[[FSeMVaMZkRZbR]i]_a[cn\ftaVKj[O`XWd\[l_Xp_Raa_mf^ygW|jZabbefhojekkkdmylkqft~jr}rjerki}sluv{}vu|||ky„n|‰ty~†s„”z‡zŠ—y‹œn^„p_„p`…ym‰tcŽyg‹zkƒ{sŽ~p‘}i‡‚}•€n‘‡|–Š~š†r‰u Œy¦‘}©“~…„…€‚‰Š†ƒŒ‹ŠƒˆˆŒ“‡‘œ’Š™‘‹“‘’—˜™š˜–˜™šƒ”¤ƒ–©Œ˜¥Ššª‹Ÿ±–Ÿ©Œ¡¶Ž£¸£®’¤²‘¦»•©»Ÿ°¼«–®™…«œ¤š‘¬Ÿ‘±‰¢ ž¯ ‘®¦ž´¡Ž³£’²¦™·ªº§”¼¬š££¢¤¦®¡ª¯®¬«£¬³¤°»­°²«³º´¬¤±­¬º­ ±°®½³¬³³³¶¸¶µ¸¾¹¸¶º¹¸–«Àš¯Ãœ±Ä£·É§»Å¥¹Ìª½Î«¾Ñµ¿Ç°¾Ë¸¿È­Á˯ÂÓ´ÁλÆÌ³ÅÔ°ÅØ¶ÊÓµÊÛºÅÑ»ÈÒ¼ÌÛÁ¯œÂ°Ã³¢Ì»©Å¼³À¿ÁÌûÒijÖɺÅÅÅÁÇËÏÇÂÉÉÄÉÉÉÂÌ×ÄÏÙÌÏÒÃÒßÌÔÜÖÍÆÓÍÉÛÎÂÚÒÊÑÑÓÓ×ÚÞ×ÐßÙÓØØØÂÓáËÚæÏÝéÒÚâÝÞàÖâíÚáçÞéñáÖÉåÛÎãÚÑáÜØèßÕëâ×ìãÙæææåæèäéíéæåïèáëëëâìóìïòíôùòíãñïëðïðöòåõñëøóîôôóôöøôûýùöñûùóþþþÿÿÿŽà‡ØIDATxÚíÖÿOUuÇqXYWJXÈv½S9&¡Vë‹×áÔÄ](œw×îä ”,(Š«ÐÀ· çU (“yK®L±/jKAp9üR.·´{ çõ^¸ï¡köÓõ~k‘gcÏÏÎÎgŸ×Îù<ö9ç¼?q2[œÈ`C ýVå‰Ü,:5óû‘=žØTY ãr#µXe•¶eæ¥(‘Çm"K†cRyg¿['竬réåó¢dœŸTݱ½uÓÓ¯a‰ÊªL9P-d·Åü]Íéú:ýg9§òZyuþÒý§úc¡H§A.nVù»ÚþÄ|_´ÌþOc^«±ÀyìïCÝ66A™þ“³^MJÕ{ßx÷!<òÎÃP=¯kn¼?ÌrMÈ]7FºøÂ„M~cx•NNäÕ7¯7ø­Æß2CªzM=RST=þI^4¿7›nGF o×îjÈ÷ì(¨íß»Cú/E,¦Ñ齤DØ6™Šîî2ç{¾3ö„‹x ê?®‘Á³'×õôÆ÷kè¼9ΤmÏv=µ3ûˆVJåO<Û$š¶åÛ^?šx*ýXnékÓ‚3/¿ÿÞúÇ%•¯mžÒµ°1ézÆí•#A‘Œò·ßTdÓéªYmïlHù0§4á›ôÁ0‘ ʱ¿ñô±gö¥ŒÌ8’ýeHÕ\Ϫ’„-ò’~™aiH•4ÍKõèåǬU¹SËêdTY]¼<8’h0äè$Óe·éÅ^¦È;—G2]פIñ™*­xÅûC†¦dÅÑ0Å#zØõ[ÄfS¼Vï½Vç¦[ã6i-3›ž«Î ­J«Mј­]dŽ?l»ýË«Á‘ìüÂ­Š¬¶Û±¤öÍ›²ûAÕµ5S«5‘ÖjAáâ·ô¾3¹OZ_¼®Zç™”ÙæY›5Öi}É7R,‹O…TuHû§³Ò-ŽJwwÈ:w¹bHtíimqܪ¼.íUîàˆ¯µÅ×!ݾ_¯êZ‡Äñ“_ûÀN¡ÛwËy¥ê¸«3¼êϯڥS†û~©86ÓæPÜUç¯^ Ì©£Ï]uè?Õ«¥ÿ.¸¬üûmûV¨P…Ußz±cB… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B…jR´¿1À.9ŒåN IEND®B`‚PKjBçPConfigurations2/accelerator/PKjBçPConfigurations2/statusbar/PKjBçPConfigurations2/toolpanel/PKjBçPConfigurations2/toolbar/PKjBçPConfigurations2/progressbar/PKjBçPConfigurations2/menubar/PKjBçPConfigurations2/floater/PKjBçPConfigurations2/popupmenu/PKjBçPConfigurations2/images/Bitmaps/PKjBçP manifest.rdfÍ“Ínƒ0„ï<…eÎØ@/r(ʹjŸÀ5†X/òšÞ¾Ž“VQ¤ªêŸÔã®F3ߎ´›íaÈ‹²¨ÁT4c)%ÊHhµé+:».¹¥Û:ÚØ¶+šñjƒ¥Ÿ*ºwn*9_–…-7 lϳ¢(xšóv„Ýõu(#Ú| Ђ5r4ÄN¨è8ºŒNSˆ T:dÂÖX‘ó¨qî¨çš åUÜ”/Òó±sÝ›çƒdñtèáXÜ cËó‘ìïˆ'z`C}•ʧGmúÇIöूC`Z •KÂʹMßhTúáÚõ:qËþ½øÝ/PKN´Ît2,PKjBçP…l9Š..mimetypePKjBçP¼óTü Tcontent.xmlPKjBçPªŽâN õU ‰styles.xmlPKjBçPÁ]…vi# settings.xmlPKjBçPº¶«'Dô²meta.xmlPKjBçP'S22,Thumbnails/thumbnail.pngPKjBçP”Configurations2/accelerator/PKjBçPÎConfigurations2/statusbar/PKjBçP Configurations2/toolpanel/PKjBçP> Configurations2/toolbar/PKjBçPt Configurations2/progressbar/PKjBçP® Configurations2/menubar/PKjBçPä Configurations2/floater/PKjBçP!Configurations2/popupmenu/PKjBçPR!Configurations2/images/Bitmaps/PKjBçP´÷hÒƒ !manifest.rdfPKjBçPN´Ît2,Î"META-INF/manifest.xmlPKeC$Spreadsheet-Read-0.93/files/empty.txt0000644000031300001440000000000011275744326017024 0ustar00merijnusersSpreadsheet-Read-0.93/MANIFEST0000644000031300001440000000474514766041535015200 0ustar00merijnusersMANIFEST This file README Changes Change history CONTRIBUTING.md Guide in how to contribute SECURITY.md Guide for reporting security issues cpanfile Requirements, recommendations, and suggestions Makefile.PL Makefile generator Read.pm Spreadsheet processor scripts/ss2tk Display a spreadsheet with perl/Tk notebook scripts/ssdiff Deep-diff two spreadsheets scripts/xlscat Display, filter, and convert spreadsheets scripts/xlsx2csv Convert spreadsheet to CSV examples/ss-dups-tk.pl files/Active2.xls files/Active2.xlsx files/attr.gnumeric files/attr.ods files/attr.xls files/attr.xlsx files/blank.csv files/blank.ods files/blank.xls files/blank.xlsx files/clear.ods files/content.xml files/Dates.gnumeric files/Dates.ods files/Dates.xls files/Dates.xlsx files/empty.csv files/empty.ods files/empty.sc files/empty.sxc files/empty.txt files/empty.xls files/empty.xlsx files/example.xlsx files/gnumeric.gnumeric files/gnumeric.xml files/hidden.xlsx files/macosx.csv files/macosx.xls files/merged.gnumeric files/merged.ods files/merged.xls files/merged.xlsx files/misc.ods files/misc_ws.xls files/misc.xls files/misc.xlsx files/perc.ods files/perc.xls files/perc.xlsx files/test.csv files/test.gnumeric files/test_m.csv files/test_m.txt files/test.ods files/test.sc files/test.sxc files/test_t.csv files/test_t.txt files/test.txt files/test_x.csv files/test.xls files/test.xlsx files/test_x.txt files/values.ods files/values.xls files/values.xlsx t/10_basics.t t/11_call.t t/200_csv.t t/201_csv.t t/202_csv.t t/203_csv.t t/204_csv.t t/205_csv.t t/210_csv.t t/211_csv.t t/212_csv.t t/213_csv.t t/214_csv.t t/220_csv.t t/221_csv.t t/222_csv.t t/223_csv.t t/224_csv.t t/30_xls.t t/31_clr.t t/33_misc.t t/32_fmt.t t/34_dates.t t/35_perc.t t/36_xls.t t/37_merged.t t/410_ods.t t/411_clr.t t/412_fmt.t t/413_misc.t t/414_dates.t t/415_perc.t t/417_merged.t t/420_sxc.t t/425_ods.t t/426_clr.t t/50_sc.t t/51_sc.t t/600_xlsx.t t/601_clr.t t/602_fmt.t t/603_misc.t t/604_dates.t t/605_perc.t t/607_merged.t t/610_xlsx.t t/611_clr.t t/612_fmt.t t/613_misc.t t/614_dates.t t/615_perc.t t/617_merged.t t/620_xlsx.t t/621_clr.t t/622_fmt.t t/623_misc.t t/624_dates.t t/625_perc.t t/627_merged.t t/630_xlsx.t t/631_clr.t t/632_fmt.t t/633_misc.t t/634_dates.t t/635_perc.t t/637_merged.t t/700_gnumeric.t t/701_clr.t t/702_fmt.t t/704_dates.t t/707_merged.t t/999_fail.t META.yml Module YAML meta-data (added by MakeMaker) META.json Module JSON meta-data (added by MakeMaker) Spreadsheet-Read-0.93/README0000644000031300001440000000441114736746433014723 0ustar00merijnusers=head1 NAME Spreadsheet::Read - Meta-Wrapper for reading spreadsheet data =head1 SYNOPSIS use Spreadsheet::Read; my $ref = ReadData ("file.xls"); =head1 DESCRIPTION Spreadsheet::Read offers a uniformed wrapper to Spreadsheet::ParseExcel and Spreadheet::ReadSXC to give the end-user a single point of view to various types of spreadsheets and deal with these in a transparent way. For more thorough documentation please refer to the perl documentation in the module in pod format, or $ man Spreadsheet::Read after installation. =head1 INSTALLATION $ perl Makefile.PL $ make $ make test $ make install If the C warns you in the xls tests, read the message and apply the generated patch. Spreadsheet::ParseExcel has a small bug in the parsing of the default format regarding UTF-8. This module requires perl-5.8.1 or newer. It might still work under perl-5.8.0 or perl-5.6.x, but only if Encode is also available. The code might need some minor changes. Recent changes can be (re)viewed in the public GIT repository at https://github.com/Tux/Spreadsheet-Read Feel free to clone your own copy: $ git clone https://github.com/Tux/Spreadsheet-Read Spreadsheet-Read or get it as a tgz: $ wget --output-document=Spreadsheet-Read-git.tgz \ 'https://github.com/Tux/Spreadsheet-Read/archive/master.tar.gz' =head1 TOOLS Installing this module will optionally (default is yes) also install some useful tools that use Spreadsheet::Read. At least two are know to cause a possible name clash: * xls2csv also exists as https://metacpan.org/release/KEN/xls2csv-1.06 Mine existed before that script, and this version dates from 2005 * ssdiff also exists in the gnumeric package with similar functionality =head1 TODO * Make tests for scripts/xlscat * Support Parsers native module options * Check if Tk is installed before asking if ss2tk is wanted * Test diagnostics output * Support Spreadsheet::Perl * Support Data::XLSX::Parser * Steal options from other CSV/Spreadsheet tools to implement in xlscat and xlsgrep =head1 AUTHOR H.Merijn Brand =head1 COPYRIGHT AND LICENSE Copyright (C) 2005-2025 H.Merijn Brand This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut Spreadsheet-Read-0.93/Makefile.PL0000644000031300001440000001172314736746005016014 0ustar00merijnusersuse strict; require 5.008001; use ExtUtils::MakeMaker; use File::Copy; if ($ENV{PERLBREW_HOME} and $ENV{PERLBREW_HOME} eq "/home/njh/.perlbrew") { warn "Your smokers have been blocked because of consistent failures that\n"; warn " are all caused by the smoking setup and not by module errors. If\n"; warn " you have fixed that all, please inform the authors, so this block\n"; warn " can be lifted again.\n"; exit 0; } sub link_or_copy { my ($source, $dest) = @_; link ($source, $dest) or copy ($source, $dest); } # link_or_copy my @exe; unless (exists $ENV{AUTOMATED_TESTING} and $ENV{AUTOMATED_TESTING} == 1) { -f "scripts/xls2csv" or link_or_copy "scripts/xlsx2csv", "scripts/xls2csv"; -f "scripts/xlsgrep" or link_or_copy "scripts/xlscat", "scripts/xlsgrep"; for ( [ "xlscat", "Convert Spreadsheet to plain text or CSV" ], [ "xlsgrep", "Grep pattern from Spreadsheet" ], [ "ss2tk", "Show a Spreadsheet in Perl/Tk" ], [ "ssdiff", "Show diff between two spreadsheets" ], [ "xls2csv", "Wrapper around xlscat for easy XLS => CSV" ], [ "xlsx2csv", "Wrapper around xlscat for easy XLSX => CSV" ], ) { prompt ("Do you want to install $_->[0]\t$_->[1] ?", "y") =~ m/[Yy]/ and push @exe, "scripts/$_->[0]"; } } my %wm = ( NAME => "Spreadsheet::Read", DISTNAME => "Spreadsheet-Read", ABSTRACT => "Read the data from a spreadsheet", AUTHOR => "H.Merijn Brand ", VERSION_FROM => "Read.pm", EXE_FILES => [ @exe ], PREREQ_FATAL => 0, PREREQ_PM => { # Core modules "Exporter" => 0, "Encode" => 0, "Carp" => 0, "Data::Dumper" => 0, "File::Temp" => 0.22, "IO::Scalar" => 0, # Optional "List::Util" => 0, # For testing "Test::More" => 0.88, "Test::NoWarnings" => 0, # for ss2tk # "Tk" => 804.032, # "Tk::NoteBook" => 4.009, # "Tk::TableMatrix::Spreadsheet" => 1.2, }, macro => { TARFLAGS => "--format=ustar -c -v -f", }, ); $ExtUtils::MakeMaker::VERSION > 6.30 and $wm{LICENSE} = "perl"; if ($ENV{EXTENDED_TESTING}) { # for CpanCover and masochists # Backend parsers, all optional # Versions also need to be declared inside Read.pm ! $wm{PREREQ_PM}{"Text::CSV_PP"} = "1.97"; $wm{PREREQ_PM}{"Text::CSV_XS"} = "1.36"; $wm{PREREQ_PM}{"Spreadsheet::ReadSXC"} = "0.26"; $wm{PREREQ_PM}{"Spreadsheet::ParseODS"} = "0.26"; $wm{PREREQ_PM}{"Spreadsheet::ParseExcel"} = "0.65"; $wm{PREREQ_PM}{"Spreadsheet::ParseXLSX"} = "0.27"; $wm{PREREQ_PM}{"Spreadsheet::XLSX"} = "0.15"; $wm{PREREQ_PM}{"Spreadsheet::Perl"} = "0"; } my $rv = WriteMakefile (%wm); # perlcriticrc uses Config::Tiny, which does not support nesting if (-f ".perlcriticrc" && -s "$ENV{HOME}/.perlcriticrc") { open my $fh, ">", ".perlcriticrc"; print $fh do { local (@ARGV, $/) = ("$ENV{HOME}/.perlcriticrc"); <> }; print $fh join "\n" => "", "[-Bangs::ProhibitDebuggingModules]", "[-BuiltinFunctions::ProhibitBooleanGrep]", "[-BuiltinFunctions::ProhibitStringyEval]", # Guarded "[-Compatibility::PodMinimumVersion]", # Lvalgrind.log ); my @pc = -f ".perlcriticrc" ? ("\tperlcritic -1 Read.pm") : (); $] >= 5.010 && -d "xt" && ($ENV{AUTOMATED_TESTING} || 0) != 1 and push @pc, '', 'test::', ' -@env TEST_FILES="xt/*.t" make -e test_dynamic'; join "\n" => 'cover test_cover:', ' ccache -C', ' cover -test', '', 'leakcheck:', " $valgrind", ' -@tail -5 valgrind.log', '', 'leaktest:', q{ sandbox/leaktest $(FULLPERLRUN) "test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')" $(TEST_FILES)}, '', 'spellcheck:', ' pod-spell-check --aspell --ispell', '', 'checkmeta: spellcheck', ' perl sandbox/genMETA.pl -c', '', 'fixmeta: distmeta', ' perl sandbox/genMETA.pl', ' ls -l */META.yml', '', 'tgzdist: doc checkmeta fixmeta $(DISTVNAME).tar.gz distcheck', ' -@mv -f $(DISTVNAME).tar.gz $(DISTVNAME).tgz', ' -@cpants_lint.pl $(DISTVNAME).tgz', ' -@rm -f Debian_CPANTS.txt', '', 'doc docs: doc/Spreadsheet-Read.md doc/Spreadsheet-Read.html doc/Spreadsheet-Read.man', 'doc/Spreadsheet-Read.md: Read.pm', ' perl doc/make-doc.pl', @pc, ''; } # postamble 1; Spreadsheet-Read-0.93/scripts/0000755000031300001440000000000014766041535015524 5ustar00merijnusersSpreadsheet-Read-0.93/scripts/xlsx2csv0000755000031300001440000001504214736746421017253 0ustar00merijnusers#!/usr/bin/perl # xls2csv: Convert supported spreadsheet formats to CSV # (m)'24 [2024-12-16] Copyright H.M.Brand 2008-2025 require 5.008001; use strict; use warnings; our $VERSION = "3.11"; (my $cmd = $0) =~ s{.*/}{}; use Text::CSV_XS; use List::Util qw( first ); use Spreadsheet::Read qw( ReadData row ); sub usage { my $err = shift and select STDERR; print "usage: $cmd [-A [-N | -J c] | -o file.csv] [-s sep] [-f] [-i] file.xls\n"; print " $cmd --help | --man | --info\n"; print " --list List supported spreadsheet formats and exit\n"; print " -A --all Export all sheets (filename-sheetname.csv)\n"; print " -N --no-pfx No filename prefix on -A (sheetname.csv)\n"; print " -Z --zip Convert sheets to CSV's in ZIP\n"; print " -J s --join=s Use s to join filename-sheetname (-)\n"; print " -o f --out=f Set output filename\n"; print " -i f --in=f Set input filename\n"; print " -f --force Force overwrite output if exists\n"; print " -s s --sep=s Set CSV separator character\n"; print "Unless -A is used, all other options are passed on to xlscat\n"; @_ and print join "\n", @_, ""; exit $err; } # usage use Getopt::Long qw( :config bundling noignorecase passthrough ); GetOptions ( "help|?" => sub { usage 0; }, "V|version" => sub { print "$cmd [$VERSION]\n"; exit 0; }, "man" => sub { pod_nroff (); }, "info" => sub { pod_text (); }, "list" => sub { list_parsers (); }, "o|c|out=s" => \ my $csv, "i|x|in=s" => \ my $xls, "f|force!" => \ my $opt_f, "s|sep=s" => \ my $opt_s, "A|all!" => \ my $opt_A, "N|no-pfx!" => \ my $opt_N, "Z|zip!" => \ my $opt_Z, "J|join=s" => \(my $opt_J = "-"), "v|verbose:1" => \(my $opt_v = 0), ) or usage 1; sub list_parsers { print "Ext Parser module Req Has Def\n"; print "----- ----------------------- ----- ----- ---\n"; for (Spreadsheet::Read::parsers ()) { printf "%-5s %-23s %5s %5s %s\n", $_->{ext}, $_->{mod}, $_->{min}, $_->{vsn}, $_->{def} ? "<==" : ""; } exit 0; } # list_parsers sub pod_text { require Pod::Text::Color; my $m = $ENV{NO_COLOR} ? "Pod::Text" : "Pod::Text::Color"; my $p = $m->new (); open my $fh, ">", \my $out; $p->parse_from_file ($0, $fh); close $fh; print $out; exit 0; } # pod_text sub pod_nroff { first { -x "$_/nroff" } grep { -d } split m/:+/ => $ENV{PATH} or pod_text (); require Pod::Man; my $p = Pod::Man->new (); open my $fh, "|-", "nroff", "-man"; $p->parse_from_file ($0, $fh); close $fh; exit 0; } # pod_nroff unless ($xls) { foreach my $i (reverse 0 .. $#ARGV) { -f $ARGV[$i] or next; $xls = splice @ARGV, $i, 1; last; } } $xls or usage 1, "No input file"; -r $xls or usage 1, "Input file unreadable"; -s $xls or usage 1, "Input file empty"; my @known_ext = Spreadsheet::Read::parses (0); @known_ext or @known_ext = qw( csv ods sc sxc xls xlsx ); my $valid_ext = do { local $" = "|"; qr{ \. (?: @known_ext )}xi }; if ($opt_Z) { require Archive::Zip; $@ and die "--zip requires Archive::Zip, which could not be loaded\n"; } my %e = (n => "\n", t => "\t", e => "\e", r => "\r"); $opt_s and $opt_s =~ s/\\+([nter])/$e{$1}/g; if ($opt_A || $opt_Z) { $opt_v and warn "Reading $xls ...\n"; my $ss = ReadData ($xls) or die "Cannot read/parse $xls\n"; my $az = $opt_Z ? Archive::Zip->new : undef; $csv and $xls = $csv; $xls =~ s/$valid_ext $//ix; $csv = Text::CSV_XS->new ({ binary => 1, auto_diag => 1, eol => "\r\n" }); $opt_s and $csv->sep_char ($opt_s); foreach my $si (1 .. $ss->[0]{sheets}) { my $s = $ss->[$si] or next; $s->{maxcol} or next; my $mr = $s->{maxrow} or next; my $sn = $s->{label} || "sheet-$si"; $sn =~ s/\s+$//; $sn =~ s/^\s+//; $sn =~ s/[^-\w.]+/_/g; # remove any special chars from worksheet name if ($opt_Z) { open my $fh, ">:encoding(utf-8)", \my $data; $csv->print ($fh, [ row ($s, $_) ]) for 1 .. $mr; close $fh; $az->addString ($data, "$sn.csv"); next; } my $fn = $opt_N ? "$sn.csv" : "$xls$opt_J$sn.csv"; -f $fn && !$opt_f and die "$fn already exists\n"; warn "Saving sheet to $fn ...\n"; open my $fh, ">:encoding(utf-8)", $fn or die "$fn: $!\n"; $csv->print ($fh, [ row ($s, $_) ]) for 1 .. $mr; close $fh; } if ($opt_Z) { my $fn = "$xls.zip"; -f $fn && $opt_f and unlink $fn; -f $fn and die "$fn already exists\n"; $az->writeToFileNamed ($fn) == 0 or die "$fn: $!\n"; } exit; } $csv or ($csv = $xls) =~ s/$valid_ext $/.csv/xi; if (-f $csv) { $opt_f or die "$csv already exists\n"; unlink $csv; } warn "Converting $xls to $csv ...\n"; open STDOUT, ">", $csv or die "$csv: $!\n"; $^O eq "MSWin32" and $xls = qq{"$xls"}; $opt_s and unshift @ARGV => "--sep=$opt_s"; $opt_v and unshift @ARGV => "--verbose=$opt_v"; exec { "xlscat" } "xlscat", "-c", @ARGV, $xls; __END__ =pod =head1 NAME xlsx2csv - convert spreadsheet to CSV(s) =head1 SYNOPSIS xlsx2csv [ -A [ -N || -J str ] | -o file.csv ] [-f] [-i] file.xls xlsx2csv --help | --man | --info =head1 DESCRIPTION Convert a spreadsheet (all formats supported by L) to CSV (using L). =head1 OPTIONS =over =item -? =item --help Print short usage and exit. =item --man Print this help using nroff and exit. =item --info Print this help and exit. =item -V =item --version Print the version and exit. =item -f =item --force Overwrite existing output file. =item -A =item --all Output data from all sheets. Each sheet will go to extra file with name built from output CSV-file and sheet name. =item -N =item --no-pfx If specified, dump all will not use output CSV-file but sheet name only. =item -J str =item --join=str If specified, output file names under C<-A> will join on C instead of the default C<->. =item -o CSV-file =item -c CSV-file =item --out=CSV-file Output file name (used only with C<< --all >> and without C<< --no-pfx >>). Default value is derived from XLS-file. =item -i XLS-file =item -s XLS-file =item --in=XLS-file Allows to specify input xls file. Default: Last ARGUMENT file that exists. =back =head1 SEE ALSO L, L, L =head1 AUTHOR H.Merijn Brand =head1 COPYRIGHT AND LICENSE Copyright (C) 2008-2025 H.Merijn Brand This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut Spreadsheet-Read-0.93/scripts/xlscat0000755000031300001440000005657114736746410016767 0ustar00merijnusers#!/usr/bin/perl # xlscat: show supported spreadsheet file as Text # xlsgrep: grep pattern # (m)'24 [2024-12-31] Copyright H.M.Brand 2005-2025 require 5.008001; use strict; use warnings; our $VERSION = "3.32"; (my $CMD = $0) =~ s{.*[\/]}{}; my $is_grep = $0 =~ m/grep$/; # xlsgrep sub usage { my $err = shift and select STDERR; my $p = $is_grep ? " pattern" : ""; print join "\n" => "usage: $CMD\t[-s ] [-L] [-n] [-A] [-u] [Selection]$p file.xls", " \t[-c | -m] [-u] [Selection]$p file.xls", " \t -i [-S sheets]$p file.xls", " Generic options:", " -v[#] Set verbose level (xlscat/xlsgrep)", " -d[#] Set debug level (Spreadsheet::Read)", " --list Show supported spreadsheet formats and exit", " -u Use unformatted values", " --strip[=#] Strip leading and/or traing spaces of all cells", " # & 01 = leading, # & 02 = trailing, 3 = default", " --clip=# Clip cells to max length #", " --noclip Do not strip empty sheets and", " trailing empty rows and columns", " --no-empty Skip empty rows", " --no-nl[=R] Replace all newlines in cells with R (default space)", " -e Set encoding for input and output", " -b Set encoding for input", " -a Set encoding for output", " -U Set encoding for output to utf-8 (short for -a utf-8)", " Input CSV:", " --in-sep=c Set input sep_char for CSV (c can be 'TAB')", " Input XLS:", " --dtfmt=fmt Specify the default date format to replace 'm-d-yy'", " the default replacement is 'yyyy-mm-dd'", " --passwd=pw Specify the password for workbook", " if pw = -, read password from keyboard", " --formulas Show the formula instead of the value", " Output Text (default):", " -s Use separator . Default '|', \\n allowed", " Overrules ',' when used with --csv", " -L Line up the columns", " -B --box Like -L but also add outer frame", " -n [skip] Number lines (prefix with column number)", " optionally skip (header) lines", " -A Show field attributes in ANSI escapes", " -h[#] Show # header lines", " -D Dump each record with Data::Peek or Data::Dumper", " --hash Like -D but as hash with first row as keys", " Output CSV:", " -c Output CSV, separator = ','", " -m Output CSV, separator = ';'", $is_grep ? ( " Grep options:", " -i Ignore case", " -w Match whole words only") : ( " Output Index only:", " -i Show sheet names and size only"), " Output HTML:", " -H Output HTML", " Selection:", " -S Only print sheets . 'all' is a valid set", " Default only prints the first sheet", " -R Only print rows . Default is 'all'", " Ranges and lists supported as 2,4-7,8-", " Trailing - is to end of data", " Negative rows count from tail -8--2 is allowed", " --head[=n] Alias for -R1..n where n defaults to 10", " --tail[=n] Alias for -R-n- where n defaults to 10", " --first=C Only show rows where column C is a 'new' value", " (suppress rows where value in column C is seen", " before in column C). That includes empty fields", " -C Only print columns . Default is 'all'", " -F Only fields e.g. -FA3,B16", " Ordering (column numbers in result set *after* selection):", " --sort=spec Sort output (e.g. --sort=3,2r,5n,1rn+2)", " +# - first # lines do not sort (header)", " # - order on column # lexical ascending", " #n - order on column # numeric ascending", " #r - order on column # lexical descending", " #rn - order on column # numeric descending", "", "Examples:", " xlscat -i foo.xls", " xlscat --in-sep=: --sort=3n -L /etc/passwd", " xlsgrep pattern file.ods", ""; @_ and print join "\n", @_, ""; exit $err; } # usage use Encode qw( encode decode ); use List::Util qw( first ); use Data::Dumper; use Spreadsheet::Read; use Getopt::Long qw(:config bundling noignorecase passthrough); my $opt_c; # Generate CSV my $opt_F = ""; # Fields to print my $opt_v = 0; # Verbosity for xlscat my $opt_d = 0; # Debug level for Spreadsheet::Read my $opt_h = 0; # Number of header lines for grep or -L my $opt_D = 0; # Dump: 0 = none, 1 = array, 2 = hash my $clip = 1; my $enc_bom; # CSV input encoding derived from BOM my $enc_i; # Input encoding my $enc_o; # Output encoding GetOptions ( "help|?" => sub { usage (0); }, "V|version" => sub { print "$CMD [$VERSION] Spreadsheet::Read [$Spreadsheet::Read::VERSION]\n"; exit 0; }, "list" => sub { list_parsers (); }, # Input CSV "c|csv" => sub { $opt_c = "," }, "m|ms" => sub { $opt_c = ";" }, "insepchar". "|in-sep". "|in-sep-char=s" => \my $sep, # Input field sep for CSV # Input XLS "dtfmt". "|date-format=s" => \my $dtfmt, # Default date-format for Excel "f|formulas!" => \my $opt_f, # Show the formula instead of the value "password=s" => \my $passwd, # For encrypted spreadsheets # Output "i|index". "|ignore-case!" => \my $opt_i, # Index (cat) | ignore_case (grep) "s|separator|sep". "|outsepchar". "|out-sep". "|out-sep-char=s" => \my $opt_s, # Text separator "S|sheets=s" => \my $opt_S, # Sheets to print "R|rows=s" => \my $opt_R, # Rows to print "head:10" => \my $opt_head, "tail:10" => \my $opt_tail, "first=s" => \my $opt_first, "C|columns=s" => \my $opt_C, # Columns to print "F|fields=s" => \ $opt_F, "L|fit|align!" => \my $opt_L, # Auto-size/align columns "B|box|frame!" => \my $opt_B, # Align and add outer frame "P|pivot!" => \my $pivot, "n|number:0" => \my $opt_n, # Prefix lines with column number "A|ansi|color!" => \my $opt_A, # Show field colors in ANSI escapes "u|unformatted!" => \my $opt_u, # Show unformatted values "v|verbose:1" => \$opt_v, "d|debug:1" => \$opt_d, "D|dump!" => \ $opt_D, # Use Data::Peek or Data::Dumper "hash!" => sub { $opt_D = 2 }, "H|html:1" => \my $opt_H, # Output in HTML "noclip" => sub { $clip = 0 }, "strip:3" => \my $strip, "clip=i" => \my $clip_len, "sort=s" => \my $sort_order, "no-empty" => \my $skip_empty, "N|no-nl:s" => \my $opt_N, # Encoding "e|encoding=s" => sub { $enc_i = $enc_o = $_[1] }, "b|encoding-in=s" => \$enc_i, "a|encoding-out=s" => \$enc_o, "U|utf-8|utf8" => sub { $enc_o = "utf-8" }, # Grep "w|word!" => \my $opt_w, # Grep words "h|header:1" => \$opt_h, ) or usage 1, "GetOpt: $@"; sub list_parsers { my $err = shift || 0; print "Ext Parser module Req Has Def\n"; print "-------- ------------------------- ----- ----- ---\n"; for (Spreadsheet::Read::parsers ()) { $_->{ext} =~ m/^zzz/ and next; printf "%-8s %-25s %5s %5s %s\n", $_->{ext}, $_->{mod}, $_->{min}, $_->{vsn}, $_->{def} ? "<==" : ""; } exit $err; } # list_parsers $opt_head and $opt_R = "1-$opt_head"; $opt_tail and $opt_R = "-$opt_tail-"; $opt_B and $opt_L++; unless ($is_grep) { $opt_i && $opt_L and usage 1, "Options i and L are mutually exclusive"; $opt_i && $opt_s and usage 1, "Options i and s are mutually exclusive"; $opt_i && $opt_c and usage 1, "Options i and c are mutually exclusive"; $opt_i && $opt_u and usage 1, "Options i and u are mutually exclusive"; $opt_i && $opt_S and usage 1, "Options i and S are mutually exclusive"; $opt_i && $opt_R and usage 1, "Options i and R are mutually exclusive"; $opt_i && $opt_C and usage 1, "Options i and C are mutually exclusive"; $opt_i && $opt_F and usage 1, "Options i and F are mutually exclusive"; $opt_i && $opt_H and usage 1, "Options i and H are mutually exclusive"; } $opt_c && $opt_H and usage 1, "Options c and H are mutually exclusive"; $opt_s && $opt_H and usage 1, "Options s and H are mutually exclusive"; my %e = (a => "\a", b => "\b", e => "\e", f => "\f", n => "\n", r => "\r", t => "\t"); $opt_s and $opt_s =~ s/\\+([abefnrt])/$e{$1}/g; defined $opt_S or $opt_S = $opt_i || $is_grep ? "all" : "1"; defined $opt_N && !length $opt_N and $opt_N = " "; $opt_i && !$is_grep && $opt_v < 1 and $opt_v = 1; $opt_f and $opt_A = 1; if ($opt_c) { $opt_L = 0; # Cannot align CSV if ($opt_s) { $opt_c = $opt_s; $opt_s = undef; } $opt_c =~ m/^1?$/ and $opt_c = ","; $opt_c = Text::CSV_XS->new ({ binary => 1, sep_char => $opt_c, eol => "\r\n", }); } # Debugging. Prefer Data::Peek over Data::Dumper if available { my $dp = eval { require Data::Peek; 1 }; sub ddumper { $dp ? Data::Peek::DDumper (@_) : print STDERR Dumper (@_); } # ddumper } my @RDarg; for (reverse 0 .. $#ARGV) { $ARGV[$_] =~ m/^--([-\w]+)(?:=(.*))?$/ or next; push @RDarg, $1, defined $2 ? $2 : 1; $RDarg[-2] =~ tr/-/_/; splice @ARGV, $_, 1; } my $pattern; if ($is_grep) { $pattern = shift or usage 1; $opt_w and $pattern = "\\b$pattern\\b"; $opt_i and $pattern = "(?i:$pattern)"; $pattern = qr{$pattern}; $opt_v > 1 and warn "Matching on $pattern\n"; } my $file = shift; if (defined $file and $file ne "-") { $opt_v > 1 and warn "Using $file as input\n"; -f $file or usage 1, "the file argument is not a regular file"; -s $file or usage 1, "the file is empty"; if ($file =~ m/\.csv$/i and open my $fh, "<", $file) { # Auto-BOM my $l = <$fh>; close $fh; if ($l =~ s/^\x00\x00\xfe\xff//) { $enc_bom = "utf-32be" } elsif ($l =~ s/^\xff\xfe\x00\x00//) { $enc_bom = "utf-32le" } elsif ($l =~ s/^\xfe\xff//) { $enc_bom = "utf-16be" } elsif ($l =~ s/^\xff\xfe//) { $enc_bom = "utf-16le" } elsif ($l =~ s/^\xef\xbb\xbf//) { $enc_bom = "utf-8" } elsif ($l =~ s/^\xf7\x64\x4c//) { $enc_bom = "utf-1" } elsif ($l =~ s/^\xdd\x73\x66\x73//) { $enc_bom = "utf-ebcdic" } elsif ($l =~ s/^\x0e\xfe\xff//) { $enc_bom = "scsu" } elsif ($l =~ s/^\xfb\xee\x28//) { $enc_bom = "bocu-1" } elsif ($l =~ s/^\x84\x31\x95\x33//) { $enc_bom = "gb-18030" } elsif ($l =~ s/^\x{feff}//) { $enc_bom = "" } if ($enc_bom and open $fh, "<:encoding($enc_bom)", $file) { $opt_v > 1 and warn "Opened $file with encoding $enc_bom after BOM detection\n"; read $fh, (my $bom), 1; # Skip BOM $file = $fh; push @RDarg, parser => "CSV"; } } } else { $opt_v > 1 and warn "Working as a pipe\n"; $file = *ARGV; } if ($opt_c) { Spreadsheet::Read::parses ("csv") or die "No CSV module found\n"; eval q{use Text::CSV_XS}; } if ($opt_H) { $enc_o = "utf-8"; $opt_H = sub { $_[0]; }; eval q{ use HTML::Entities; $opt_H = sub { encode_entities (Encode::is_utf8 ($_[0]) ? $_[0] : decode ("utf-8", $_[0])); }; }; } if ($sep) { my %sep = ( tab => "\t", pipe => "|", colon => ":", semicolon => ";", comma => ",", ); $sep = $sep{lc $sep} || $sep; } push @RDarg, debug => $opt_d, clip => $clip; $opt_A and push @RDarg, attr => 1; defined $sep and push @RDarg, sep => $sep, parser => "csv"; defined $dtfmt and push @RDarg, dtfmt => $dtfmt; $strip and push @RDarg, strip => $strip; $pivot and push @RDarg, pivot => $pivot; if ($passwd) { if ($passwd eq "-") { print STDERR "Password: "; eval "use Term::ReadKey;"; eval { ReadMode ("noecho"); }; chomp ($passwd = ); eval { ReadMode ("echo"); }; } push @RDarg, passwd => $passwd; } $opt_v > 4 and warn "ReadData ($file, @RDarg);\n"; my $xls = eval { ReadData ($file, @RDarg) }; $opt_v > 7 and ddumper ($xls); unless ($xls) { warn "cannot read $file\n"; if ($@) { my $e = $@; $e =~ s{\s+at\s+\S+\s+line\s.*}{}s; $e =~ s{\s+\(perhaps you forgot to load.*}{}s; warn "$e\n"; } if (my @e = sort grep m/^SPREADSHEET_READ_/ => keys %ENV) { warn "\n"; warn " $_ is set to $ENV{$_}\n" for @e; warn "\n"; } if ($@ =~ m/cannot|can't/) { print "Supported parsers per spreadsheet:\n"; list_parsers (-1); } exit -1; } if ($xls->[0]{parser} =~ m/Spreadsheet::XLSX/) { warn "You parse with Spreadsheet::XLSX, which is deprecated\n"; warn "Please use Spreadsheet::ParseXLSX for more reliable results\n"; } my $sc = $xls->[0]{sheets} or die "No sheets in $file\n"; $opt_v and warn $opt_v > 1 ? join " " => "Spreadsheet::Read-$Spreadsheet::Read::VERSION", "parsed $file with $sc sheets", "using $xls->[0]{parser}-$xls->[0]{version}\n" : "Parsed $file with $sc sheets\n"; $opt_S eq "all" and $opt_S = "1..$sc"; # all $opt_S =~ s/-$/-$sc/; # 3,6- $opt_S =~ s/-/../g; my %print; eval "%{\$print{sheet}} = map { \$_ => 1 } $opt_S"; my $v_fmt = $opt_C || $opt_R || $opt_F ? "" : "%6d x %6d%s"; # New style xterm (based on ANSI colors): # 30 Black # 31 Red # 32 Green # 33 Yellow # 34 Blue # 35 Magenta # 36 Cyan # 37 White sub color_reduce { my ($rgb, $base) = @_; defined $rgb or return ""; my ($r, $g, $b) = map { hex >> 7 } ($rgb =~ m/^\s*#?([\da-f]{2})([\da-f]{2})([\da-f]{2})/); $base + 4 * $b + 2 * $g + $r; } # color_reduce sub ansi_color { my ($fg, $bg, $bold, $ul) = @_; # warn "$fg on $bg $bold $ul\n"; my $attr = join ";", 0, grep { /\S/ } $bold ? 1 : "", $ul ? 4 : "", color_reduce ($fg, 30), color_reduce ($bg, 40); "\e[${attr}m"; } # ansi_color sub css_color { my ($fg, $bg, $bold, $ul, $ha) = @_; my @css; $bold and push @css, "font-weight: bold"; $ul and push @css, "text-decoration: underline"; $fg and push @css, "color: $fg"; $bg and push @css, "background: $bg"; $ha and push @css, "text-align: $ha"; local $" = "; "; @css ? qq{ style="@css"} : ""; } # css_color binmode STDERR, ":encoding(utf-8)"; $enc_o and binmode STDOUT, ":encoding($enc_o)"; if ($opt_H) { print <<"EOH"; $file EOH } my %first; if ($opt_first) { $opt_first =~ m/^([a-zA-Z]+)[0-9]*$/ and $opt_first = (cell2cr (uc $1 . "1"))[0]; $opt_first =~ m/^[0-9]+$/ && $opt_first > 0 or die "--first=C requires a numeric column index or a column index letter\n"; } my $name_len = 30; if ($opt_i) { my $nl = 0; foreach my $sn (keys %{$xls->[0]{sheet}}) { length ($sn) > $nl and $nl = length $sn; } $nl and $name_len = $nl; } my @opt_F = split m/[^A-Z\d]+/ => $opt_F; foreach my $si (1 .. $sc) { my @data; exists $print{sheet}{$si} or next; $opt_v > 1 and warn "Opening sheet $si ...\n"; my $s = $xls->[$si] or next; $opt_v > 5 and ddumper ($s); my @r = (1, $s->{maxrow}); my @c = (1, $s->{maxcol}); my ($sn, $nr, $nc) = ($s->{label}, $r[-1], $c[-1]); defined $nr or next; defined $nc or next; defined $sn or $sn = ""; my $active = $s->{active} ? " (Active)" : ""; my $hidden = $s->{hidden} ? " (Hidden)" : ""; my $eolt = $s->{eolt} ? ", EOL = $s->{eolt}" : ""; $eolt =~ s/\n/\\n/g; $eolt =~ s/\r/\\r/g; $eolt =~ s/\t/\\t/g; $eolt =~ s/([\x00-\x1f])/sprintf "\\x{%02x}", ord $1/ge; $opt_v and printf STDERR "%s - %02d: [ %-*s ] %3d Cols, %5d Rows%s%s%s\n", $file, $si, $name_len, $sn, $nc, $nr, $active, $hidden, $eolt; $opt_i && !$is_grep and next; if (@opt_F) { foreach my $fld (@opt_F) { $is_grep && defined $s->{$fld} && $s->{$fld} !~ $pattern and next; print "$fld:",$s->{$fld},"\n"; } next; } if (my $rows = $opt_R) { $rows eq "all" and $rows = "1..$nr"; # all $rows =~ s/--(\d+)/-($nr+1-$1)/ge; # 3--2 $rows =~ s/-(\d+)(?=-)/($nr+1-$1)/ge; # -3- $rows =~ s/-$/-$nr/; # 3,6- $rows =~ s/-/../g; eval "%{\$print{row}} = map { \$_ => 1 } $rows"; } if (my $cols = $opt_C) { $cols eq "all" and $cols = "1..$nc"; # all if ($cols =~ m/[A-Za-z]/) { # -C B,D => -C 2,4 my %ct = map { my ($cc, $rr) = cell2cr (uc "$_".1); ($_ => $cc) } ($cols =~ m/([a-zA-Z]+)/g); $cols =~ s/([A-Za-z]+)/$ct{$1}/g; } $cols =~ s/-$/-$nc/; # 3,6- $cols =~ s/-/../g; eval "\$print{col} = [ map { \$_ - 1 } $cols ]"; $nc = @{$print{col}}; } $opt_v >= 8 and ddumper (\%print); $opt_H and print qq{

$sn

\n\n\n}; my $undef = $opt_v > 2 ? "-- undef --" : ""; my ($h, @w) = (0, (0) x $nc); # data height, -width, and default column widths my @align = ("") x $nc; foreach my $r ($r[0] .. $r[1]) { exists $print{row} && !exists $print{row}{$r} and next; my @att; my @row = map { my $cell = cr2cell ($_, $r); my ($uval, $fval) = map { defined $_ ? $enc_i ? decode ($enc_i, $_) : $_ : $undef } $s->{cell}[$_][$r], $s->{$cell}; if (defined $opt_N) { s/\n/$opt_N/go for grep { defined } $uval, $fval; } if ($clip_len) { $_ = substr $_, 0, $clip_len - 1 for grep { length > $clip_len } $uval, $fval; } $opt_v > 2 and warn "$_:$r '$uval' / '$fval'\n"; $opt_A and push @att, [ @{$s->{attr}[$_][$r]}{qw( fgcolor bgcolor bold uline halign )} ]; $opt_f && $s->{attr}[$_][$r]{formula} ? "=".$s->{attr}[$_][$r]{formula} : defined $s->{cell}[$_][$r] ? $opt_u ? $uval : $fval : ""; } $c[0] .. $c[1]; $r == 1 && $row[0] && defined $enc_bom and $row[0] =~ s/^\N{BOM}//; exists $print{col} and @row = @row[grep{$_<@row}@{$print{col}}]; $is_grep && $r > $opt_h && ! first { defined $_ && $_ =~ $pattern } @row and next; $skip_empty && ! first { length } @row and next; if ($opt_first) { @row >= $opt_first && $first{$row[$opt_first - 1]}++ and next; } if ($opt_D) { ddumper ($opt_D == 1 ? \@row : { map { $s->{cell}[$_ + 1][1] => $row[$_] } 0 .. $#row }); next; } if ($opt_H) { # HTML print " "; if (defined $opt_n) { my $x = $r - $opt_n; $x <= 0 and $x = ""; my $c = $r % 2 ? qq{ class="odd"} : ""; print qq{}; } foreach my $c (0 .. $#row) { my $css = css_color (@{$att[$c]}); $r % 2 and $css .= qq{ class="odd"}; my $td = $opt_H->($row[$c]); print "$td"; } print "\n"; next; } if (defined $opt_n) { unshift @row, $r; unshift @att, [ "#ffffff", "#000000", 0, 0 ]; } if ($opt_L || $sort_order) { # Autofit / Align / order push @data, [ [ @row ], [ @att ] ]; next; } if ($opt_c) { # CSV $opt_c->print (*STDOUT, \@row) or die $opt_c->error_diag; next; } if ($opt_A) { foreach my $c (0 .. $#row) { $row[$c] = ansi_color (@{$att[$c]}). $row[$c] . "\e[0m"; } } line (0, $opt_s => @row); } continue { ++$h % 100 == 0 && $opt_v && $v_fmt and printf STDERR $v_fmt, $nc, $h, "\r"; } $opt_H and print "
$x
\n\n"; $v_fmt && $v_fmt and printf STDERR $v_fmt, $nc, $h, "\n"; if ($sort_order) { my @o; my @h; $sort_order =~ s/\+([0-9]+)\b// and @h = splice @data, 0, $1; for ($sort_order =~ m/([0-9]+[rn]*)/g) { m/^([0-9]+)(.*)/; push @o, { col => $1 - 1, map { $_ => 1 } split m// => $2 }; } my $sort = sub { my $d = 0; foreach my $o (@o) { my ($A, $B) = map { $_->[0][$o->{col}] || 0 } $a, $b; $d = $o->{n} ? $o->{r} ? $B <=> $A : $A <=> $B : $o->{r} ? $B cmp $A : $A cmp $B and return $d; } return $d; }; @data = (@h, sort $sort @data); } if ($opt_c && @data) { # CSV $opt_c->print (*STDOUT, $_->[0]) for @data; next; } $opt_L || $sort_order or next; if (defined $opt_n) { unshift @w, length $data[-1][0][0]; unshift @align, ""; } $opt_n = 0; if ($opt_L) { foreach my $r (0 .. $#data) { my $R = $data[$r][0]; foreach my $c (0 .. $#$R) { my $d = $R->[$c]; my $l = length $d; $l > $w[$c] and $w[$c] = $l; # Number alignment won't be effective if first row is empty and # second row has column headers $r && $d =~ m/\S/ or next; $d =~ m/^(?:-|\s*(?:-\s*)?[0-9][0-9 .,]*)$/ or $align[$c] = "-"; } } if ($skip_empty) { # Skip empty columns. Rows have already been skipped foreach my $i ( reverse 0 .. $#w) { $w[$i] and next; splice @w, $i, 1; splice @align, $i, 1; splice @$_, $i, 1 for grep { $#$_ >= $i } map { @{$_} } @data; } } } $opt_B and line (1, $opt_s => map { "-" x $w[$_] } 0..$#{$data[0][0]}); for (@data) { my ($row, $att) = @$_; my @row = @$row; for (0 .. $#row) { my $l = length $row[$_]; my $w = $l < $w[$_] ? " " x ($w[$_] - $l) : ""; if ($align[$_]) { $_ < $#row || $opt_B and $row[$_] .= $w; } else { substr $row[$_], 0, 0, $w; } if ($opt_A) { substr $row[$_], 0, 0, ansi_color (@{$att->[$_]}); $row[$_] .= "\e[0m"; } } line (0, $opt_s => @row); ++$opt_n == $opt_h and line (2, $opt_s => map { "-" x $w[$_] } 0..$#row); } $opt_B and line (3, $opt_s => map { "-" x $w[$_] } 0..$#{$data[0][0]}); } $opt_H and print "\n\n"; sub line { my $uh = "\x{2500}"; # BOX DRAWINGS LIGHT HORIZONTAL my $uv = "\x{2502}"; my @tpl = ($uv, "\x{250c}", "\x{251c}", "\x{2514}"); my @tpm = ($uv, "\x{252c}", "\x{253c}", "\x{2534}"); my @tpr = ($uv, "\x{2510}", "\x{2524}", "\x{2518}"); my $type = shift; # 0: data, 1: top, 2: middle, 3: bottom my $sep = shift || " $uv "; my @dta = @_; if ($opt_L) { $type > 0 and $sep =~ s/ /-/g; if ($sep =~ m/$uv/) { $sep =~ s/-/$uh/g; $sep =~ s/$uv/$tpm[$type]/; if ($type > 0) { s/-/$uh/g for grep { length } @dta; } } elsif ($type > 0) { $sep =~ s/\|/+/; } } my $line = join $sep => @dta; if ($opt_B) { # Cannot use s///r for 5.8.x (my $s1 = $sep) =~ s/^(?:\s|$uh)[\x{2500}-\x{25ff}]/$tpl[$type]/; substr $line, 0, 0, $s1; (my $s2 = $sep) =~ s/[\x{2500}-\x{25ff}](?:\s|$uh)$/$tpr[$type]/; $line .= $s2; } !$enc_o && Encode::is_utf8 ($line) and $line = encode ("utf-8", $line); print $line; print "\n"; } # line END { if ($opt_v >= 7) { my %seen; print "\nNon-CORE modules loaded:\n", "-" x 25, " ", "--------\n"; foreach my $mod (sort keys %INC) { my $path = $INC{$mod}; $mod =~ s{\.pm$}{} or next; $mod =~ s{/}{::}g; $path =~ s{.*/site_perl/}{} or next; grep { $mod =~ m/^${_}::/ } keys %seen and next; $seen{$mod}++; my $v = $mod->VERSION () || eval "\$${mod}::VERSION" || "?"; printf "%-25s %s\n", $mod, $v; } } } Spreadsheet-Read-0.93/scripts/ss2tk0000755000031300001440000001524414736746377016543 0ustar00merijnusers#!/usr/bin/perl # ss2tk: show SpreadSheet file in Tk::TableMatrix::Spreadsheet (*) # (m)'22 [2022-01-31] Copyright H.M.Brand 2005-2025 use strict; use warnings; our $VERSION = "2.81"; sub usage { my $err = shift and select STDERR; print "usage: ss2tk [options] [X11 options] file.xls []\n", " -w use as column width\n", " -L Add spreadsheet tags to top (A, B, ..Z, AB, ...)\n", " and left (1, 2, ...)\n", " --fs[=7] Set font size (default 7 if no value)\n", " --fn=name Set font Face name (default is DejaVu Sans Mono\n", " if font size is given\n"; exit $err; } # usage use Getopt::Long qw(:config bundling passthrough); my $opt_fs; GetOptions ( "help|?" => sub { usage (0); }, "w|width=i" => \my $opt_w, "L|ss|labels!" => \my $opt_L, "a|align!" => \my $opt_a, "fn|font-name=s" => \my $opt_fn, "fs|font-size:7" => \ $opt_fs, "fs-4" => sub { $opt_fs = 4; }, "fs-5" => sub { $opt_fs = 5; }, "fs-6" => sub { $opt_fs = 6; }, "fs-7" => sub { $opt_fs = 7; }, "fs-8" => sub { $opt_fs = 8; }, "fs-9" => sub { $opt_fs = 9; }, # For restarts "G|geometry=s" => \my $geometry, "W|column-widths=s" => \my $col_widths, ) or usage (1); use Data::Peek; use Spreadsheet::Read; use Tk; use Tk::Balloon; use Tk::NoteBook; use Tk::TableMatrix::Spreadsheet; # This will allow ~/.Xdefaults to have lines like #ss2tk*font: -misc-fixed-medium-r-semicondensed--12-110-75-75-c-60-iso10646-1 Tk::CmdLine->LoadResources (); # This will allow calls like # ss2tk -fg Blue4 blah.csv Tk::CmdLine->SetArguments (); @ARGV && -f $ARGV[0] or usage (1); my $title = $ARGV[0]; my $sfn = shift; my $ref = Spreadsheet::Read->new ($sfn) or die "Cannot read $sfn\n"; $ref->[0]{sheets} or die "No sheets in $title\n"; fork and exit; $opt_fn || $opt_fs and $opt_fn = "{".($opt_fn|| "DejaVu Sans Mono")."} ".($opt_fs||7); my $pat = @ARGV ? qr/$ARGV[0]/i : undef; my $mw = MainWindow->new (-title => $title); $geometry and $mw->geometry ($geometry); my $balloon = $mw->Balloon ( -state => "balloon", -initwait => 300, -foreground => "#000000", -background => "#ffffff", ); my $nb = $mw->NoteBook ()->pack (qw(-side top -expand 1 -fill both )); my @nb; foreach my $sht (1 .. $ref->[0]{sheets}) { my $s = $ref->[$sht]; $title .= " [ " . $s->{label} . " ]"; my ($data, @data) = ({}); my ($h, $w, @w) = get_data ($data, $s, \@data); $nb[$sht] = $nb->add ($sht, -label => $s->{label}, -state => "normal", -anchor => "nw"); my @ff = $opt_fn ? (-font => $opt_fn) : (); my $ss = $nb[$sht]->Scrolled ('Spreadsheet', -rows => $h, -cols => $w, -width => 10, -height => 20, -titlecols => $opt_L ? 1 : 0, -titlerows => $opt_L ? 2 : 1, -selectmode => "extended", -resizeborders => "both", -justify => "left", -anchor => "w", -variable => $data, @ff, )->pack (-expand => 1, -fill => "both", -side => "top", -anchor => "nw"); $ss->Subwidget ("${_}scrollbar")->configure (-width => 6) for qw( x y ); $ss->tagConfigure ("title", -bg => "#ffffe0", -justify => "left"); $ss->tagConfigure ("active", -bg => "#ffff40", -justify => "left"); $ss->tagConfigure ("sel", -bg => "gray95", -justify => "left"); my ($pv, $sv, $si) = ("", "", 0); sub search { $sv or return; $sv eq $pv && !$_[0] and return; $ss->selectionClear ("all"); foreach my $i ($_[0] .. $#data, 0 .. ($_[0] - 1)) { $data->{$data[$i]} =~ m/$sv/i or next; $si = $i; $ss->activate ($data[$si = $i]); $ss->selectionSet ($data[$si]); $ss->see ($data[$si]); $pv = $sv; last; } } # search my $reload = sub { $ss->clearCache; $data->{$_} = "" for @data; @data = (); $ref = Spreadsheet::Read->new ($sfn) or die "Cannot read $sfn\n"; $s = $ref->[$sht]; get_data ($data, $s, \@data); }; # reload # Search frame my $sf = $nb[$sht]->Frame ()->pack (-side => "left", -expand => 1, -fill => "both"); $sf->Label ( -text => "Search", )->pack (-side => "left", -anchor => "sw"); my $sb = $sf->Entry ( -textvariable => \$sv, )->pack (-side => "left", -anchor => "sw"); $sb->bind ("" => sub { search ($si = 0); }); $sf->Button ( -text => "Next", -command => sub { search (++$si) }, )->pack (-side => "left", -anchor => "sw"); # Control frame my $cf = $nb[$sht]->Frame ()->pack (-side => "right", -expand => 1, -fill => "both"); $cf->Button ( -text => "\x{2718}", -foreground => "#8b0000", -command => \&exit, )->pack (-side => "right", -anchor => "se"); $balloon->attach ($cf->Button ( # Restart -text => "\x{21f5}", # Restart -foreground => "#ffa500", -command => sub { my $geo = $mw->geometry; # Add column widths here exec $0, "--geometry=$geo"; }, )->pack (-side => "right", -anchor => "se"), -balloonposition => "mouse", -balloonmsg => "Restart", -msg => { Background => "Restart", separator => "Restart", }); $balloon->attach ($cf->Button ( # Reload -text => "\x{21bb}", -foreground => "#008b00", -command => $reload, )->pack (-side => "right", -anchor => "se"), -balloonposition => "mouse", -balloonmsg => "Reload", -msg => { Background => "Reload", separator => "Reload", }); my $swss = $ss->Subwidget ("spreadsheet"); # autosize columns on data (not on headers) $swss->colWidth (map { $_ => ($opt_w || $w[$_] || 4) } 0 .. $#w); $opt_a or next; $swss->tagConfigure ("numeric", -justify => "right"); foreach my $rc (keys %$data) { $data->{$rc} && $data->{$rc} =~ m/^\d+$/ or next; $swss->tagCell ("numeric", $rc); } DDumper $swss; } sub get_data { my ($dta, $s, $adta) = @_; my @c = (1, $s->{maxcol}); my ($h, $w, @w) = (0, 1, 0, (0) x $c[1]); # data height, -width, and default column widths if ($opt_L) { foreach my $c (0 .. $s->{maxcol}) { $dta->{"$h,$c"} = $c ? $ref->col2label ($c) : ""; push @$adta, "$h,$c"; } $h++; } foreach my $r (1 .. $s->{maxrow}) { my @row = map { defined $s->{cell}[$_][$r] ? $s->{cell}[$_][$r] : ""; } 1 .. $s->{maxcol}; $pat and "@row" =~ $pat || next; $opt_L and unshift @row, $r; foreach my $c (0 .. $#row) { length $row[$c] or next; $c >= $w and $w = $c + 1; $dta->{"$h,$c"} = $row[$c]; push @$adta, "$h,$c"; my $l = length $row[$c]; $l > $w[$c] and $w[$c] = $l; } ++$h % 100 or printf STDERR "%6d x %6d\r", $w, $h; } printf STDERR "%6d x %6d\n", $w, $h; #use DP;DDumper { S => $dta, A => $adta }; ($h, $w, @w); } # get_data MainLoop; Spreadsheet-Read-0.93/scripts/ssdiff0000755000031300001440000000466214372725102016730 0ustar00merijnusers#!/usr/bin/perl use 5.014000; use warnings; our $VERSION = "0.03"; our $CMD = $0 =~ s{.*/}{}r; sub usage { my $err = shift and select STDERR; print "usage: $CMD [--verbose[=1]] file.xls file.xlsx\n"; exit $err; } # usage use Spreadsheet::Read; use List::Util qw( max ); use Getopt::Long qw(:config bundling); GetOptions ( "help|?" => sub { usage (0); }, "V|version" => sub { print "$CMD [$VERSION]\n"; exit 0; }, "ccdiff!" => \ my $opt_cc, "v|verbose:2" => \(my $opt_v = 1), ) or usage (1); my $file1 = shift or usage (1); my $file2 = shift or usage (1); binmode STDOUT, ":encoding(utf-8)"; my $ss1 = Spreadsheet::Read->new ($file1) or die "Cannot read $file1: $!\n"; my $ss2 = Spreadsheet::Read->new ($file2) or die "Cannot read $file2: $!\n"; say for $ss1->sheets; if ($opt_cc) { require App::ccdiff; $@ || $App::ccdiff::VERSION lt "0.29" and die "App::ccdiff-0.29 or higher required for --cc\n" } print "< $file1\t(", scalar $ss1->sheets, " sheets)\n"; print "> $file2\t(", scalar $ss2->sheets, " sheets)\n"; foreach my $s (1 .. max map { scalar $_->sheets } $ss1, $ss2) { my $s1 = $ss1->sheet ($s); my $s2 = $ss2->sheet ($s); unless ($s1) { print "$s: not in $file1\n"; last; } unless ($s2) { print "$s: not in $file2\n"; last; } printf "Sheet %d\n\t< %5d x %5d %s\n\t> %5d x %5d %s\n", $s, $s1->maxcol, $s1->maxrow, $s1->label, $s2->maxcol, $s2->maxrow, $s2->label; if ($opt_cc) { my @c; foreach my $ss ($s1, $s2) { push @c => [ map { join ("|" => @$_) . "\n" } [ map { $ss->col2label ($_) } 1 .. $ss->maxcol ], map { [ $ss->row ($_) ] } 1 .. $ss->maxrow ]; } App::ccdiff::ccdiff (@c, { header => 0, unified => 3, "utf-8" => 1 }); next; } my $mc = max map { $_->maxcol } $s1, $s2; foreach my $r (1 .. max map { $_->maxrow } $s1, $s2) { if ($r > $s1->maxrow) { print "$s: EOS in $file1 at row $r\n"; last; } if ($r > $s2->maxrow) { print "$s: EOS in $file2 at row $r\n"; last; } my @r1 = $s1->row ($r); my @r2 = $s2->row ($r); foreach my $c (1 .. $mc) { my $c1 = $r1[$c]; my $c2 = $r2[$c]; if (defined $c1) { if (defined $c2) { $c1 eq $c2 and next; print "$s: ($r, $c)\n\t< $c1\n\t> $c2\n"; next; } print "$s: ($r, $c)\n\t< $c1\n\t> -- undefined --\n"; next; } defined $c2 or next; print "$s: ($r, $c)\n\t< -- undefined --\n\t> $c2\n"; } } } Spreadsheet-Read-0.93/Changes0000644000031300001440000004656514766041321015341 0ustar00merijnusers0.93 - 17 Mar 2025, H.Merijn Brand * Add ranges and cellranges 0.92 - 06 Jan 2025, H.Merijn Brand * Make strict_eol default to 1 for CSV when supported * Show detected EOL for CSV in xlscat when known * Add SECURITY.md * It's 2025 0.91 - 27 Aug 2024, H.Merijn Brand * Exclude OLE::Storage_Lite-0.21 * xlscat --head[=10], --tail[=10], --first=C * Make (re)defining ->get_active_sheet safer * Tested with perl-5.40 * xlscat --no-empty to skip empty columns too * Spreadsheet::ParseExcel::FmtDefault might not be available 0.90 - 13 Feb 2024, H.Merijn Brand * Consistent return value for parses ($type) on failure (issue#52) * New options for xlscat (--no-empty, --clip=N) * Support for hidden sheets 0.89 - 02 Jan 2024, H.Merijn Brand * Auto-use BOM in CSV *files* with xlscat script * Fix duplicate option letter (typo) (Erix) * It's 2024 0.88 - 07 Nov 2023, H.Merijn Brand * Guard $_ globbering from external bitrotted code * Use recommended and suggested versions based on known CVEs * Improve user feedback on failing xlsx2csv & xlscat * Fix static docs for groff-1.24 * Basic support for Excel::ValueReader::XLSX (issue#50) * Allow backend for parser option without version check 0.87 - 22 Feb 2023, H.Merijn Brand * Change default #! to /usr/bin/perl (Tinita) * Improve ->sheets (safer and docs) * Update to Spreadsheet::ReadGnumeric 0.2 (attributes and small fixes) 0.86 - 07 Feb 2023, H.Merijn Brand * Add Gnumeric support (Bob Rogers, THANKS!) - work in progress, use with care, feedback welcome 0.85 - 04 Jan 2023, H.Merijn Brand * Suggest the preferred parser if none found * It's 2022 * xlscat --box and improvements for -L * Add balloons to ss2tk buttons * Fix typo in help (Erix) * It's 2023 0.84 - 26 Feb 2021, H.Merijn Brand * It's 2021 * Alias pivot to transpose (issue#36) * Alias strip to trim (issue#36) * Check for consistent return values of parses () 0.83 - 21 Dec 2020, H.Merijn Brand * Require ParseODS 0.26 * Add ::parsers to get list of supported formats * Add --list to xlscat and xls2csv * Update xls2csv to be identical to xlsx2csv * ::parses ("") will return list of supported types * Move installables from examples/ to scripts/ * Tested on FreeBSD-12.2-RELEASE with all supported backends * Fix META issue for bugtracker 0.82 - 26 Sep 2020, H.Merijn Brand * Move pod tests to xt (and do not distribute) * Fix some links in the docs * Add ".xlsm" to known XLSX file extensions * Spreadsheet::ReadSXC has a new maintainer (Corion) - support file handles - suggest version 0.24 (0.22 causes fails) * First attempt in supporting Spreadsheet::ParseODS (alpha code) - version 0.25 should now pass the limited tests - thanks to Corion for making this happen! * It's 2020 * Fallback to Pod::Text if nroff not available in tools * Extended support for merged cells with merge option - Added $sheet->merged_from ("C2") * Add --no-nl[=x] to xlscat * xlscat: Align-right more numerics on -L (was only positive integers) * xlsx2csv -Z : generate a ZIP file with a CSV for every sheet * Doc fix (issue#33) 0.81 - 25 Aug 2019, H.Merijn Brand * It's 2019 * Allow -c + --sep in xlscat * Add --sep= to xls2csv for -A * Add xlsx2csv to distribution (xlsx2csv has -A) * Add -J s / --join str to xlsx2csv * Add cpanfile * Add explicit documentation about formatted vs unformatted * Improve ->new behavior * Auto-detect fallback for CSV now includes '|' for sep_char (PR#26) 0.80 - 31 Dec 2018, H.Merijn Brand * Raise Spreadsheet::ParseXLSX minimum version to 0.24 * Improve docs on attributes * Add attribute accessors 0.79 - 29 Aug 2018, H.Merijn Brand * Environmant control hardening * ReadData () docs (opening from scalar ref: issue#21) * Check for XLSX content on opening from plain scalar content * Fix typo in ss-dup-tk.pl (PRC, Branislav Zahradnik) * Allow source from command line option in xls2csv (PRC, Branislav Zahradnik) * Allow --in-sep=tab in xlscat/xlsgrep * Add --hash to xlscat/xlsgrep * Help and usage for examples/xls2csv (PR#23) 0.78 - 29 Jan 2018, H.Merijn Brand * Spreadsheet::ParseExcel supports the active flag as of version 0.61 * Fix typo in docs (SPROUT, RT#124214) 0.77 - 22 Jan 2018, H.Merijn Brand * Note possible name clashes with example/tool files * Clipping and stripping more efficient 0.76 - 01 Jan 2018, H.Merijn Brand * Allow streaming in xlscat * Add --dump to xlscat * Add error for opening ODS/SXC from reference * It's 2018 0.75 - 09 Nov 2017, H.Merijn Brand * Windows does not like an exec with arguments that have spaces (PR#15) Three fixes by Andrew Gregory ). Thanks! * Fix column clipping * Manually generate cells to delete when clipping * Skip cell deletion if they were never generated * File names cannot have \0 in newer perls 0.74 - 27 Aug 2017, H.Merijn Brand * Re-enable opening files with bad characters in the filename (issue#14) 0.73 - 30 Jul 2017, H.Merijn Brand * Spreadsheet::XLSX::Reader::LibXML support completely dropped * New options for ss2tk (font specs and SS labels) * Safer xls2csv option parsing/passing * Pass unknown command-line options to the parser * Fix ReadData ("a,b,c\n1,2,3\n", parser => "csv") * Drop 5.8.0 support. 5.8.1 is now minimum 0.72 - 25 May 2017, H.Merijn Brand * get_active_sheet is only available as of Spreadsheet::ParseExcel 0.61 * Support password protected spreadsheets (implementation just for Excel) * Do not warn on undefined labels (xlscat) 0.71 - 13 May 2017, H.Merijn Brand * Use -w as intended * Add option pivot * No trailing spaces on xlscat -L * Lexicalize code snippet (issue#12) * Add attr method * Remove special chars from worksheet name component (Windows, PR#13) * Add refresh to ss2tk / csv2tk * Add shortcut for UTF-8 output to xlscat * Upgrade recommended modules to required for cpancover 0.70 - 02 Mar 2017, H.Merijn Brand * Add label functionality to ::Sheet * Add ->column and ->cellcolumn for ::Sheet * Add col2label sub/method * Sanitize xls2csv export filenames * Fix sorting in xlscat for un-aligned columns * It's 2017 * Be overly verbose about maxrow and maxcol being 1-based (RT#120476) 0.69 - 02 Dec 2016, H.Merijn Brand * Several OO fixes, more tests, more docs 0.68 - 29 Nov 2016, H.Merijn Brand * List non-core modules/version used on very verbose in xlscat * Option to export all sheets in a spreadsheet to CSV (UTF-8 only) * Add OO interface * Feature: add new spreadsheets to existing book (even of different types) 0.67 - 17 Jun 2016, H.Merijn Brand * CPANTESTERS showed that some versions really messed op numeric/percentage 0.66 - 16 Jun 2016, H.Merijn Brand * Remove Spreadsheet::XLSX::Reader::LibXML test files from distribution * Allow old versions of Spreadsheet::ParseXLSX to "fail" on percentage tests 0.65 - 15 Jun 2016, H.Merijn Brand * Test with perl-5.24.0 * Show parser-version used under debug * No more Spreadsheet::XLSX::Reader::LibXML * Cells will inherit hidden state from hidden rows and columns * Require 5.8.0 as 5.6.x does not include required Encode 0.64 - 22 Apr 2016, H.Merijn Brand * It's 2016 * Allow inconsistent Spreadsheet::XLSX releases on Debian (tests) * Decode utf-16be entries in Excel when appropriate * Two examples in xlscat 0.63 - 10 Oct 2015, H.Merijn Brand * Guard against negative MinRow in XLSX * Documentation updated * Support Spreadsheet::XLSX::Reader::LibXML disabled on author request * Fix warning in utilities * Check minimum parser version for pre-selected parser 0.62 - 16 Aug 2015, H.Merijn Brand * Fix documentation structure * Test all supported parsers (not just the preferred one) * Basic support for Spreadsheet::XLSX::Reader::LibXML (work in progress) * Copy example file if link fails (Alan Berndt) * Add a contributing guide 0.61 - 13 Jun 2015, H.Merijn Brand * Discourage Spreadsheet::XLSX * A space is not an empty field in XLS * Strip the correct selection (RT#105197) 0.60 - 30 Mar 2015, H.Merijn Brand * No merged cell support in Spreadsheet::XLSX 0.59 - 26 Mar 2015, H.Merijn Brand * Minimal support (+ docs) for merged cells * Make parser errors report at one level up * Don't select non-existing columns in xlscat 0.58 - 11 Feb 2015, H.Merijn Brand * Remove perl recommendation from META as it breaks cpan clients * Move sort instruction to correct place in xlscat's help 0.57 - 08 Feb 2015, H.Merijn Brand * Moved project to github * Add --sort to xlscat * Clip before conversion * Removed an unneeded localizing of $/ (related to p5 RT#123218) 0.56 - 05 Jan 2015, H.Merijn Brand * printf does not play nice with encoding (related to RT#98436) * default output UTF-8 if whole line is UTF-8 0.55 - 01 Jan 2015, H.Merijn Brand * Mention Spreadsheet::CSV in documentation * Add ssdiff to examples * Amend xlscat -n to also number in HTML * Updated copyright to 2015 0.54 - 30 Jan 2014, H.Merijn Brand * Optional features required versions now builtin 0.53 - 29 Jan 2014, H.Merijn Brand * Updated copyright to 2014 * Prefer Data::Peek over Data::Dumper * Support (and prefer) Spreadsheet::ParseXLSX for .xlsx 0.52 - 05 Dec 2013, H.Merijn Brand * Store CSV parse error - if any - in $ss->[0]{error} 0.51 - 30 Oct 2013, H.Merijn Brand * Link xlsgrep during install 0.50 - 24 Oct 2013, H.Merijn Brand * Added xlsgrep to examples * Allow -C B,D for xlscat * More prominent reference to xlscat in docs 0.49 - 11 May 2013, H.Merijn Brand * /dev/null cannot be used for tests on Windows 0.48 - 14 Mar 2013, H.Merijn Brand * Improve documentation consistency (RT#80409) * Updated copyright to 2013 * Force old(er) tar format (ustar) - assumes GNU tar on release box * Fix yml/json optional_features * Install utilities from example by default * Several minor changes (for maint) 0.47 - 30 Jun 2012, H.Merijn Brand * Note that empty sheets are skipped when clip is true (RT#75277) * Allow undef as valid value for the options (Max Maischein) * Don't generate warnings when stripping whitespace and only generating one of cells or rc. (Max Maschein) * Fix test warning under perl-5.17.x 0.46 - 14 Feb 2012, H.Merijn Brand * Updated copyright to 2012 * Support passing attributes to the underlying parser * Do not strip fields in sheets with no cells at all (RT#74976) 0.45 - 07 Sep 2011, H.Merijn Brand * NAME / DISTNAME in Makefile.PL 0.44 - 07 Sep 2011, H.Merijn Brand * More cross-checks for META data 0.43 - 02 Aug 2011, H.Merijn Brand * Changed name in META.yml (RT#69574) 0.42 - 01 Jun 2011, H.Merijn Brand * Add --html output option to xlscat * Force CSV parser when in-sep is given * Prefer Data::Peek over Data::Dumper if available 0.41 - 06 Oct 2010, H.Merijn Brand * Spell-check * Fixed requiring optional modules (RT#61928 - Roderick Schupp) 0.40 - 31 Mar 2010, H.Merijn Brand * Default option for clip fixed (RT#56151 - Alan James) 0.39 - 16 Mar 2010, H.Merijn Brand * Doc fix (RT#54507, Patrick Cronin) * Upped Copyright notices to 2010 * Drop YAML version to 1.0 0.38 - 15 Dec 2009, H.Merijn Brand * Add row () and cellrow () * Updated META.yml to meet most recent specs (optional_features = map) 0.37 - 09 Nov 2009, H.Merijn Brand * IO streams improvements * MANIFEST fix 0.36 - 06 Nov 2009, H.Merijn Brand * Add strip option * Spreadsheet::XLSX 0.12 still does not support attributes * Require Text::CSV_XS-0.69 for CSV for auto-detection of \r * New attribute "parser" to force format * Allow CSV streams * Allow SC streams * Allow XLS streams 0.35 - 03 Jun 2009, H.Merijn Brand * Add Test::NoWarnings, which is not run in AUTOMATED_TESTING * Switched to Test::More using tests_done () * Text::CSV_XS requires 0.43 or up, as we use ->eof () still prefer a really new release, like 0.65, which is Test::NoWarnings safe * Spreadsheet::XLSX 0.10 still does not support attributes * Added -n to xlscat * XLSX tests skip on feature, not on version 0.34 - 27 Jan 2009, H.Merijn Brand * Spreadsheet::XLSX 0.09 still does not support attributes still think it is better to follow closely. 0.09 is much better than 0.08 0.33 - 23 Jan 2009, H.Merijn Brand * A few Perl::Critic inspired changes * Modified tests to prevent rounding errors (we were not checking for that) * Added examples/ss-dups-tk.pl 0.32 - 06 Jan 2009, H.Merijn Brand * Add basic support for M$ Excel 2007 using Spreadsheet::XLSX * Test suite reports the parsers it found 0.31 - 04 Jan 2009, H.Merijn Brand * Upped Copyright notices to 2009 * Detection of percentage type * Even more reliable detection of Date types 0.30 - 22 Dec 2008, H.Merijn Brand * Wrong e-mail in META.yml * CSV files from a Mac, with \r as eol, would not parse 0.29 - 19 Oct 2008, H.Merijn Brand * Make Read safer for files that do not match extension, like HTML in foo.xls * YAML declared 1.4 (META.yml) instead of 1.1 (YAML) * Bring Makefile.PL in sync with META.yml * Recommend Text-CSV-0.56 0.28 - 04 Sep 2008, H.Merijn Brand * More tests on date formats * Declare Spreadsheet::ParseExcel::FmtDefault in META.yml * Add 'size' from Excel font size * Update docs about Excel quirks and CPAN links * Reference to public git repo * Some typo's 0.27 - 31 Aug 2008, H.Merijn Brand * Fixed META.yml (the specs are inconsistent) * Added --dtfmt to xlscat 0.26 - 29 Aug 2008, H.Merijn Brand * Added examples/xls2csv * Upped copyright to 2008 in examples * Don't ask to install examples under automated testing * die => croak * Added tgzdist target * Added encoding options to examples/xlscat * Added date-type checks for SS:PE > 0.32 0.25 - 02 Jan 2008, H.Merijn Brand * Spreadsheet-Read now under git * Upped copyrights to 2008 * Added all prereq's to Makefile.PL, even core mods * Tested under perl-5.10.0 * Text::CSV as of 1.00 is OK 0.24 - 05 Oct 2007, H.Merijn Brand * -? and --help in utils moved to Getopt::Long * Adjusted copyright notice in utils * removed prototypes in utils * next is illegal in do {} while (); (Johan Vromans) only happens with old Text::CSV_XS 0.23 - 21 Jun 2007, H.Merijn Brand * Use IO::Scalar instead of File::Temp when installed Thanks to David Cantrell for making a OpenBSD test box available! * use binmode () when opening files * Also use 3-arg open in test files * die if test files cannot be opene'ed 0.22 - 18 Jun 2007, H.Merijn Brand * 0.21 should already support Text::CSV_PP 1.05 Tested Text::CSV_PP 1.05 on bleadperl. * Better detection of (not) installed modules * Module requires perl 5.6.x 0.21 - 18 Jun 2007, H.Merijn Brand * Text::CSV_XS uses keep_meta_info instead of get_flags * Removed always_quote from xlscat's CSV output 0.20 - 31 May 2007, H.Merijn Brand * perlcritic OK * CSV parsing now uses getline (), and auto-detects eol Assumes first line does not contain embedded eol. This implies that parsing CSV with embedded eol sequences is now safe. * As I now also maintain Text::CSV_XS, I changed the references * Changed TODO's from Text::CSV to Text::CSV_PP (::CSV is dated 1997) 0.19 - 04 May 2007, H.Merijn Brand * Could not retreive '0' fields from OpenOffice (Jim Kelly) 0.18 - 27 Apr 2007, H.Merijn Brand * use strict in Makefile.PL * Added test_cover make target * Added "ods" for OpenOffice conversions * Added color tests for ods (but SR::RS doesn't support that yet) * Switched from \d to 0-9 in regexp * Added more test files and tests (increase coverage) 0.17 - 04 Jul 2006, H.Merijn Brand * xlscat new option: --ansii to (try to) use the ansi colors for fields * Fixed a color attribute off-by-one error * Added test cases (not yet complete) * Added bold and underline 0.16 - 04 Jul 2006, H.Merijn Brand * xlscat new option: --in-sep-char to force-define input sep-char for CSV * More debug lines * Parser name info in $ref->[0] * SquirrelCalc now reports Spreadsheet::Read and its version for parser info * Most of the attributes for Excel now implemented. Tested, but no test case 0.15 - 21 Jun 2006, H.Merijn Brand * Small doc change from AnnoCPAN * Sheets with undefined labels might cause havoc * Clip now skips empty xls sheets (TODO: sxc) * xlscat clips by default * xlscat new options -d and --noclip * xlscat usage () from -?/--help to STDOUT from fault to STDERR 0.14 - 20 Jan 2006, H.Merijn Brand * maxrow and maxcol were swapped in csv sheets * promoted internal debug flag to option * small doc changes 0.13 - 04 Nov 2005, H.Merijn Brand * Control attrib 'cells' was misinterpreted * New option: clip, default is true if {cell} is selected, false otherwise Removes trailing lines and columns in each sheet that have no visible data * new test t/11_call.t for checking options. Not complete yet * Added test_cover target to Makefile.PL 0.12 - 31 Oct 2005, H.Merijn Brand * Added ss2tk to examples 0.11 - 26 Oct 2005, H.Merijn Brand * Allow ods (OpenOffice 2.0) for sxc * include real ods test files and new test * Check if sc.version is undef, not 0 0.10 - 19 Sep 2005, H.Merijn Brand * More test coverage * cr2cell () returns "" for illegal col/row values * cell2cr () returns (0, 0) for illegal cell values * rows () tests even better for valid reference pointer * Renamed the test files 0.09 - 18 Sep 2005, H.Merijn Brand * Added Test::Pod * Added Test::Pod::Coverage * Spreadsheet::ReadSXC 0.20 now required (too many tests fail on 0.12) * Small changes to the docs * More secure handling of false values * Mention a bug in Spreadsheet::ParseExcel 0.08 - 22 Aug 2005, H.Merijn Brand * Slightly changed the Synopsis 0.07 - 06 Jul 2005, H.Merijn Brand * Added function rows () * Added function parses () * Made all modules optional * Prepared for Spreadsheet::Perl * Doc updates 0.06 - 22 Jun 2005, H.Merijn Brand * Repaired error in label names in metadata for SXC 0.05 - 17 Jun 2005, H.Merijn Brand * Spreadsheet::ReadSXC >= 0.20 supports sheet order * Spreadsheet::ReadSXC has new data structure (we still support the old) * Added "version" to the meta data for parser version * More tests 0.04 - 14 Jun 2005, H.Merijn Brand * Changed TODO * Added options "rc", and "cell" * Added CSV * Added CSV options "sep", and "quote" * Support xls from content * Added basic support for SquirrelCalc format * Updated pod * xlscat -R option for row selection was a one-off * xlscat now supports selecting fields with -F 0.03 - 19 May 2005, H.Merijn Brand * Expanded xlscat to support -i for index * Optionally install xlscat 0.02 - 19 May 2005, H.Merijn Brand * Typoes in the doc * Small change in organization so it actually installs 0.01 - 12 May 2005, H.Merijn Brand * Initial CPAN version. A lot can still change Spreadsheet-Read-0.93/SECURITY.md0000644000031300001440000001012114757632332015622 0ustar00merijnusers# Security Policy for the Spreadsheet::Read distribution. Report issues via email at: H.Merijn Brand . This is the Security Policy for Spreadsheet::Read. The latest version of the Security Policy can be found in the [git repository for Spreadsheet::Read](https://github.com/Tux/Spreadsheet-Read). This text is based on the CPAN Security Group's Guidelines for Adding a Security Policy to Perl Distributions (version 1.0.0) https://security.metacpan.org/docs/guides/security-policy-for-authors.html # How to Report a Security Vulnerability Security vulnerabilities can be reported by e-mail to the current project maintainers at H.Merijn Brand . Please include as many details as possible, including code samples or test cases, so that we can reproduce the issue. Check that your report does not expose any sensitive data, such as passwords, tokens, or personal information. If you would like any help with triaging the issue, or if the issue is being actively exploited, please copy the report to the CPAN Security Group (CPANSec) at . Please *do not* use the public issue reporting system on RT or GitHub issues for reporting security vulnerabilities. Please do not disclose the security vulnerability in public forums until past any proposed date for public disclosure, or it has been made public by the maintainers or CPANSec. That includes patches or pull requests. For more information, see [Report a Security Issue](https://security.metacpan.org/docs/report.html) on the CPANSec website. ## Response to Reports The maintainer(s) aim to acknowledge your security report as soon as possible. However, this project is maintained by a single person in their spare time, and they cannot guarantee a rapid response. If you have not received a response from them within 10 days, then please send a reminder to them and copy the report to CPANSec at . Please note that the initial response to your report will be an acknowledgement, with a possible query for more information. It will not necessarily include any fixes for the issue. The project maintainer(s) may forward this issue to the security contacts for other projects where we believe it is relevant. This may include embedded libraries, system libraries, prerequisite modules or downstream software that uses this software. They may also forward this issue to CPANSec. # Which Software This Policy Applies To Any security vulnerabilities in Spreadsheet::Read are covered by this policy. Security vulnerabilities are considered anything that allows users to execute unauthorised code, access unauthorised resources, or to have an adverse impact on accessibility or performance of a system. Security vulnerabilities in upstream software (embedded libraries, prerequisite modules or system libraries, or in Perl), are not covered by this policy unless they affect Spreadsheet::Read, or Spreadsheet::Read can be used to exploit vulnerabilities in them. Security vulnerabilities in downstream software (any software that uses Spreadsheet::Read, or plugins to it that are not included with the Spreadsheet::Read distribution) are not covered by this policy. ## Supported Versions of Spreadsheet::Read The maintainer(s) will only commit to releasing security fixes for the latest version of Spreadsheet::Read. Note that the Spreadsheet::Read project only supports major versions of Perl released in the past 5 years, even though Spreadsheet::Read will run on older versions of Perl. If a security fix requires us to increase the minimum version of Perl that is supported, then we may do so. # Installation and Usage Issues The distribution metadata specifies minimum versions of prerequisites that are required for Spreadsheet::Read to work. However, some of these prerequisites may have security vulnerabilities, and you should ensure that you are using up-to-date versions of these prerequisites. Where security vulnerabilities are known, the metadata may indicate newer versions as recommended. ## Usage Please see the software documentation for further information. Spreadsheet-Read-0.93/CONTRIBUTING.md0000644000031300001440000000245313531672470016267 0ustar00merijnusers# General I am always open to improvements and suggestions. Use [issues](https://github.com/Tux/Spreadsheet-Read/issues) # Style I will never accept pull request that do not strictly conform to my style, however you might hate it. You can read the reasoning behind my [preferences](http://tux.nl/style.html). I really do not care about mixed spaces and tabs in (leading) whitespace Perl::Tidy will help getting the code in shape, but as all software, it is not perfect. You can find my preferences for these in [.perltidy](https://github.com/Tux/Release-Checklist/blob/master/.perltidyrc) and [.perlcritic](https://github.com/Tux/Release-Checklist/blob/master/.perlcriticrc). # Mail Please, please, please, do *NOT* use HTML mail. [Plain text](https://useplaintext.email) [without](http://www.goldmark.org/jeff/stupid-disclaimers/) [disclaimers](https://www.economist.com/business/2011/04/07/spare-us-the-e-mail-yada-yada) will do fine! # Requirements The minimum version required to use this module is stated in [Makefile.PL](./Makefile.PL). That does however not guarantee that it will work for all underlying parsers, as they might require newer perl versions. # New parsers I am all open to support new parsers. The closer the API is to that of Spreadsheet::ParseExcel, the easier it will be to support it. Spreadsheet-Read-0.93/examples/0000755000031300001440000000000014766041535015653 5ustar00merijnusersSpreadsheet-Read-0.93/examples/ss-dups-tk.pl0000755000031300001440000001670114736746372020242 0ustar00merijnusers#!/usr/bin/perl # ss-dup-tk.pl: Find dups in spreadsheet # (m)'18 [28-03-2018] Copyright H.M.Brand 2005-2025 use strict; use warnings; sub usage { my $err = shift and select STDERR; print "usage: $0 [-t] [-S ] [-R ] [-C columns] [-F ]\n", "\t-t Only check on true values\n", "\t-S sheets Check sheet(s). Default = 1, 1,3-5,all\n", "\t-R rows Check row(s). Default = all, 6,19-66\n", "\t-C columns Check column(s). Default = all, 2,5-9\n", "\t-F fields Check field(s). Default = all, A1,A2,B15,C23\n"; exit $err; } # usage use Spreadsheet::Read; use Getopt::Long qw(:config bundling nopermute noignorecase); my $opt_v = 0; my $opt_t = 0; # Only check on true values my @opt_S; # Sheets to print my @opt_R; # Rows to print my @opt_C; # Columns to print my @opt_F; GetOptions ( "help|?" => sub { usage (0); }, "S|sheets=s" => \@opt_S, "R|rows=s" => \@opt_R, "C|columns=s" => \@opt_C, "F|fields=s" => \@opt_F, "t|true" => \$opt_t, "v|verbose:1" => \$opt_v, ) or usage (1); @opt_S or @opt_S = (1); use Tk; use Tk::ROText; my $file = shift || (sort { -M $b <=> -M $a } glob "*.xls")[0]; my ($mw, $is, $ss, $dt) = (MainWindow->new, "1.0"); sub ReadFile { $file or return; $dt->delete ("1.0", "end"); unless ($ss = ReadData ($file)) { $dt->insert ("end", "Cannot read $file as spreadsheet\n"); return; } my @ss = map { qq{"$ss->[$_]{label}"} } 1 .. $ss->[0]{sheets}; my @finfo = ( "File: $file", ( map { "Sheet $_: '$ss->[$_]{label}'\t($ss->[$_]{maxcol} x $ss->[$_]{maxrow})" } 1 .. $ss->[0]{sheets} ), "=============================================================="); $dt->insert ("end", join "\n", @finfo, ""); $is = (@finfo + 1).".0"; return $ss; } # ReadFile my $tf = $mw->Frame ()->pack (qw( -side top -anchor nw -expand 1 -fill both )); $tf->Entry ( -textvariable => \$file, -width => 40, -vcmd => \&ReadFile, )->pack (qw(-side left -expand 1 -fill both)); my %ftyp; for ([ xls => [ "Excel Files", [qw( .xls .XLS )] ] ], [ xlsx => [ "Excel Files", [qw( .xlsx .XLSX )] ] ], [ sxc => [ "OpenOffice Files", [qw( .sxc .SXC )] ] ], [ ods => [ "OpenOffice Files", [qw( .ods .ODS )] ] ], [ csv => [ "CSV Files", [qw( .csv .CSV )] ] ], ) { my ($ft, $r) = @$_; Spreadsheet::Read::parses ($ft) or next; push @{$ftyp{$r->[0]}}, @{$r->[1]}; push @{$ftyp{"All spreadsheet types"}}, @{$r->[1]}; } $tf->Button ( -text => "Select file", -command => sub { $ss = undef; $file = $mw->getOpenFile ( -filetypes => [ ( map { [ $_, $ftyp{$_} ] } sort keys %ftyp ), [ "All files", "*" ], ], ); ReadFile (); }, )->pack (qw(-side left -expand 1 -fill both)); $tf->Button ( -text => "Detect", -command => \&Detect, )->pack (qw(-side left -expand 1 -fill both)); $tf->Button ( -text => "Show", -command => \&Show, )->pack (qw(-side left -expand 1 -fill both)); $tf->Button ( -text => "Exit", -command => \&exit, )->pack (qw(-side left -expand 1 -fill both)); my $mf = $mw->Frame ()->pack (qw( -side top -anchor nw -expand 1 -fill both )); my $sw = $mf->Scrolled ("ROText", -scrollbars => "osoe", -height => 40, -width => 85, -foreground => "Black", -background => "White", -highlightthickness => 0, -setgrid => 1)->pack (qw(-expand 1 -fill both)); $dt = $sw->Subwidget ("scrolled"); #$sw->Subwidget ("xscrollbar")->packForget; $dt->configure ( -wrap => "none", -font => "mono 12", ); my $bf = $mw->Frame ()->pack (qw( -side top -anchor nw -expand 1 -fill both )); $bf->Checkbutton ( -variable => \$opt_t, -text => "True values only", )->pack (qw(-side left -expand 1 -fill both)); { my $opt_S = @opt_S ? join ",", @opt_S : 1; $bf->Label ( -text => "Sheet(s)", )->pack (qw(-side left -expand 1 -fill both)); $bf->Entry ( -textvariable => \$opt_S, -width => 10, -validate => "focusout", -vcmd => sub { @opt_S = grep m/\S/, split m/\s*,\s*/ => $opt_S; 1; }, )->pack (qw(-side left -expand 1 -fill both)); } { my $opt_R = join ",", @opt_R; $bf->Label ( -text => "Rows(s)", )->pack (qw(-side left -expand 1 -fill both)); $bf->Entry ( -textvariable => \$opt_R, -width => 10, -validate => "focusout", -vcmd => sub { @opt_R = grep m/\S/, split m/\s*,\s*/ => $opt_R; 1; }, )->pack (qw(-side left -expand 1 -fill both)); } { my $opt_C = join ",", @opt_C; $bf->Label ( -text => "Columns(s)", )->pack (qw(-side left -expand 1 -fill both)); $bf->Entry ( -textvariable => \$opt_C, -width => 10, -validate => "focusout", -vcmd => sub { @opt_C = grep m/\S/, split m/\s*,\s*/ => $opt_C; 1; }, )->pack (qw(-side left -expand 1 -fill both)); } sub ranges (@) { my @g; foreach my $arg (@_) { for (split m/,/, $arg) { if (m/^(\w+)\.\.(\w+)$/) { my ($s, $e) = ($1, $2); $s =~ m/^[1-9]\d*$/ or ($s, $e) = (qq("$s"), qq("$e")); eval "push \@g, $s .. $e"; } else { push @g, $_; } } } $opt_v and print STDERR "( @g )\n"; @g; } # ranges sub Detect { $ss or ReadFile (); $dt->delete ($is, "end"); $dt->insert ("end", join "\n", "", "Shts: @opt_S", "Rows: @opt_R", "Cols: @opt_C", "--------------------------------------------------------------", ""); my %done; my @S = $opt_S[0] eq "all" ? (1 .. $ss->[0]{sheets}) : ranges (@opt_S); my @R = ranges (@opt_R); my @C = ranges (@opt_C); my %f = map { uc $_ => 1 } ("@opt_F" =~ m/(\b[A-Z]\d+\b)/ig); foreach my $s (@S) { my $xls = $ss->[$s] or die "Cannot read sheet $s\n"; my @r = @R ? @R : (1 .. $xls->{maxrow}); my @c = @C ? @C : (1 .. $xls->{maxcol}); foreach my $r (@r) { foreach my $c (@c) { defined $xls->{cell}[$c][$r] or next; my $v = uc $xls->{cell}[$c][$r]; my $cell = cr2cell ($c, $r); @S > 1 and $cell = $xls->{label} . "[$cell]"; $opt_t && !$v and next; @opt_F && !exists $f{$cell} and next; if (exists $done{$v}) { $dt->insert ("end", sprintf "Cell %-5s is dup of %-5s '%s'\n", $cell, $done{$v}, $v); next; } $done{$v} = $cell; } } } } # Detect sub Show { $ss or ReadFile (); $dt->delete ($is, "end"); $dt->insert ("end", join "\n", "", "Shts: @opt_S", "Rows: @opt_R", "Cols: @opt_C"); my @S = $opt_S[0] eq "all" ? (1 .. $ss->[0]{sheets}) : ranges (@opt_S); my @R = ranges (@opt_R); my @C = ranges (@opt_C); my %f = map { uc $_ => 1 } ("@opt_F" =~ m/(\b[A-Z]\d+\b)/ig); foreach my $s (@S) { my $xls = $ss->[$s] or die "Cannot read sheet $s\n"; $dt->insert ("end", "\n--------------------------------------------------------------". "\nSheet $s: '$xls->{label}'\t($xls->{maxcol} x $xls->{maxrow})\n"); my @r = @R ? @R : (1 .. $xls->{maxrow}); my @c = @C ? @C : (1 .. $xls->{maxcol}); $dt->insert ("end", " |"); for (@c) { (my $ch = cr2cell ($_, 1)) =~ s/1$//; $dt->insert ("end", sprintf "%11s |", $ch); } $dt->insert ("end", "\n-----+"); $dt->insert ("end", "------------+") for @c; foreach my $r (@r) { $dt->insert ("end", sprintf "\n%4d |", $r); foreach my $c (@c) { my $cell = cr2cell ($c, $r); my $v = defined $xls->{cell}[$c][$r] ? $xls->{$cell} : "--"; length ($v) < 12 and substr $v, 0, 0, " " x (12 - length $v); $dt->insert ("end", substr ($v, 0, 12). "|"); } } } } # Show MainLoop; Spreadsheet-Read-0.93/Read.pm0000755000031300001440000026643114764777164015301 0ustar00merijnusers#!/usr/bin/perl package Spreadsheet::Read; =head1 NAME Spreadsheet::Read - Read the data from a spreadsheet =head1 SYNOPSIS use Spreadsheet::Read; my $book = ReadData ("test.csv", sep => ";"); my $book = ReadData ("test.sxc"); my $book = ReadData ("test.ods"); my $book = ReadData ("test.xls"); my $book = ReadData ("test.xlsx"); my $book = ReadData ("test.xlsm"); my $book = ReadData ("test.gnumeric"); my $book = ReadData ($fh, parser => "xls"); Spreadsheet::Read::add ($book, "sheet.csv"); my $sheet = $book->[1]; # first datasheet my $cell = $book->[1]{A3}; # content of field A3 of sheet 1 my $cell = $book->[1]{cell}[1][3]; # same, unformatted # OO API my $book = Spreadsheet::Read->new ("file.csv"); my $sheet = $book->sheet (1); my $cell = $sheet->cell ("A3"); my $cell = $sheet->cell (1, 3); $book->add ("test.xls"); =cut use 5.008001; use strict; use warnings; our $VERSION = "0.93"; sub Version { $VERSION } use Carp; use Exporter; our @ISA = qw( Exporter ); our @EXPORT = qw( ReadData cell2cr cr2cell ); our @EXPORT_OK = qw( parses rows cellrow row add ); use Encode qw( decode ); use List::Util qw( min max ); use File::Temp qw( ); use Data::Dumper; my @parsers = ( [ csv => "Text::CSV_XS", "0.71" ], [ csv => "Text::CSV_PP", "1.17" ], [ csv => "Text::CSV", "1.17" ], [ ods => "Spreadsheet::ParseODS", "0.26" ], [ ods => "Spreadsheet::ReadSXC", "0.26" ], [ sxc => "Spreadsheet::ParseODS", "0.26" ], [ sxc => "Spreadsheet::ReadSXC", "0.26" ], [ sxc => "Spreadsheet::ReadSXC__BAD", "0.26" ], # For testing [ xls => "Spreadsheet::ParseExcel", "0.34" ], [ xlsx => "Spreadsheet::ParseXLSX", "0.24" ], [ xlsm => "Spreadsheet::ParseXLSX", "0.24" ], [ xlsx => "Spreadsheet::XLSX", "0.13" ], [ xlsx => "Excel::ValueReader::XLSX", "1.13" ], # [ prl => "Spreadsheet::Perl", "" ], [ sc => "Spreadsheet::Read", "0.01" ], [ gnumeric => "Spreadsheet::ReadGnumeric", "0.2" ], [ zzz1 => "Z10::Just::For::Testing", "1.23" ], [ zzz2 => "Z20::Just::For::Testing", "" ], [ zzz3 => "Z30::Just::For::Testing", "1.00" ], # Helper modules [ ios => "IO::Scalar", "" ], [ dmp => "Data::Peek", "" ], ); my %can = ( supports => { map { $_->[1] => $_->[2] } @parsers }); foreach my $p (@parsers) { my $format = $p->[0]; $can{$format} and next; $can{$format} = ""; my $preset = $ENV{"SPREADSHEET_READ_\U$format"} or next; my $min_version = $can{supports}{$preset}; unless ($min_version) { # Catch weirdness like $SPREADSHEET_READ_XLSX = "DBD::Oracle" $can{$format} = "!$preset is not supported for the $format format"; next; } if (eval "local \$_; require $preset" and not $@) { # forcing a parser should still check the version my $ok; my $has = $preset->VERSION; $has =~ s/_[0-9]+$//; # Remove beta-part if ($min_version =~ m/^v([0-9.]+)/) { # clumsy versions my @min = split m/\./ => $1; $has =~ s/^v//; my @has = split m/\./ => $has; $ok = (($has[0] * 1000 + $has[1]) * 1000 + $has[2]) >= (($min[0] * 1000 + $min[1]) * 1000 + $min[2]); } else { # normal versions $ok = $has >= $min_version; } $ok or $preset = "!$preset"; } else { $preset = "!$preset"; } $can{$format} = $preset; } delete $can{supports}; foreach my $p (@parsers) { my ($flag, $mod, $vsn) = @$p; $can{$flag} and next; eval "require $mod; \$vsn and ${mod}->VERSION (\$vsn); \$can{\$flag} = '$mod'" and next; $p->[0] = "! Cannot use $mod version $vsn: $@"; $can{$flag} = $@ =~ m/need to install|can(?:not|'t) locate/i ? 0 # Not found : ""; # Too old } $can{sc} = __PACKAGE__; # SquirrelCalc is built-in # Define ->get_active_sheet if not defined (yet) sub _def_gas { for ([ 0.61, $Spreadsheet::ParseExcel::VERSION, *Spreadsheet::ParseExcel::Workbook::get_active_sheet ], [ 0.25, $Spreadsheet::ParseODS::VERSION, *Spreadsheet::ParseODS::Workbook::get_active_sheet ], [ 9.99, $Excel::ValueReader::XLSX::VERSION, *Excel::ValueReader::XLSX::get_active_sheet ], ) { my ($mv, $v, $cb) = @$_; defined $v && $v < $mv or next; defined $cb && defined *{$cb}{CODE} and next; *{$cb} = sub { undef }; } } # _def_gas my $debug = 0; my %def_opts = ( rc => 1, cells => 1, attr => 0, clip => undef, # $opt{cells}; strip => 0, pivot => 0, dtfmt => "yyyy-mm-dd", # Format 14 debug => 0, passwd => undef, parser => undef, sep => undef, quote => undef, label => undef, merge => 0, ); my @def_attr = ( type => "text", fgcolor => undef, bgcolor => undef, font => undef, size => undef, format => undef, halign => "left", valign => "top", bold => 0, italic => 0, uline => 0, wrap => 0, merged => 0, hidden => 0, locked => 0, enc => "utf-8", # $ENV{LC_ALL} // $ENV{LANG} // ... formula => undef, ); # Helper functions sub _dump { my ($label, $ref) = @_; if ($can{dmp}) { print STDERR Data::Peek::DDumper ({ $label => $ref }); } else { print STDERR Data::Dumper->Dump ([$ref], [$label]); } my @c = caller (1); print STDERR "<<- $c[1]:$c[2]|$c[3]\n"; } # _dump sub _parser { my $type = shift or return ""; if ($type =~ m/::/ and my @p = grep { $_->[1] eq $type } @parsers) { my $format = $p[0][0]; $ENV{"SPREADSHEET_READ_\U$format"} = $type; eval "local \$_; require $type"; $@ and croak ("Forced backend $type for $format fails to load:\n$@"); $can{$format} = $type; $type = $format; } $type = lc $type; my $ods = $can{ods} ? "ods" : "sxc"; # Aliases and fullnames $type eq "excel" and return "xls"; $type eq "excel2007" and return "xlsx"; $type eq "xlsm" and return "xlsx"; $type eq "oo" and return $ods; # $type eq "sxc" and return $ods; $type eq "openoffice" and return $ods; $type eq "libreoffice" and return $ods; $type eq "perl" and return "prl"; $type eq "scalc" and return "sc"; $type eq "squirrelcalc" and return "sc"; return exists $can{$type} ? $type : ""; } # _parser sub new { my $class = shift; my $r = ReadData (@_); unless ($r) { @_ and return; # new with arguments failed to open resource $r = [{ parsers => [], error => undef, sheets => 0, sheet => { }, }]; } bless $r => $class; } # new sub parsers { ref $_[0] eq __PACKAGE__ and shift; my @c; for (sort { $a->[0] cmp $b->[0] || $a->[1] cmp $b->[1] } grep { $_->[0] !~ m{^(?:dmp|ios|!.*)$} } @parsers) { my ($typ, $mod, $min) = @$_; eval "local \$_; require $mod"; my $vsn = $@ ? "-" : eval { $mod->VERSION }; push @c => { ext => $typ, mod => $mod, min => $min, vsn => $vsn, def => $can{$typ} eq $mod ? "*" : "", }; } @c; } # parsers # Spreadsheet::Read::parses ("csv") or die "Cannot parse CSV" sub parses { ref $_[0] eq __PACKAGE__ and shift; my $type = shift or return sort grep { !m/^(?:dmp|ios)/ && $can{$_} !~ m{^!} } keys %can; $type = _parser ($type) or return 0; if ($can{$type} =~ m/^!\s*(.*)/) { $@ = $1; return 0; } return $can{$type} || 0; } # parses sub sheets { my $ctrl = shift->[0]; wantarray or return $ctrl->{sheets}; my $s = $ctrl->{sheet} or return (); # No labels defined sort { $s->{$a} <=> $s->{$b} } keys %$s; } # sheets # col2label (4) => "D" sub col2label { ref $_[0] eq __PACKAGE__ and shift; my $c = shift; defined $c && $c > 0 or return ""; my $cell = ""; while ($c) { use integer; substr $cell, 0, 0, chr (--$c % 26 + ord "A"); $c /= 26; } $cell; } # col2label # cr2cell (4, 18) => "D18" # No prototype to allow 'cr2cell (@rowcol)' sub cr2cell { ref $_[0] eq __PACKAGE__ and shift; my ($c, $r) = @_; defined $c && defined $r && $c > 0 && $r > 0 or return ""; col2label ($c) . $r; } # cr2cell # cell2cr ("D18") => (4, 18) sub cell2cr { ref $_[0] eq __PACKAGE__ and shift; my ($cc, $r) = (uc ($_[0]||"") =~ m/^([A-Z]+)([0-9]+)$/) or return (0, 0); my $c = 0; while ($cc =~ s/^([A-Z])//) { $c = 26 * $c + 1 + ord ($1) - ord ("A"); } ($c, $r); } # cell2cr # my @row = cellrow ($book->[1], 1); # my @row = $book->cellrow (1, 1); sub cellrow { my $sheet = ref $_[0] eq __PACKAGE__ ? (shift)->[shift] : shift or return; ref $sheet eq "HASH" && exists $sheet->{cell} or return; exists $sheet->{maxcol} && exists $sheet->{maxrow} or return; my $row = shift or return; $row > 0 && $row <= $sheet->{maxrow} or return; my $s = $sheet->{cell}; map { $s->[$_][$row] } 1..$sheet->{maxcol}; } # cellrow # my @row = row ($book->[1], 1); # my @row = $book->row (1, 1); sub row { my $sheet = ref $_[0] eq __PACKAGE__ ? (shift)->[shift] : shift or return; ref $sheet eq "HASH" && exists $sheet->{cell} or return; exists $sheet->{maxcol} && exists $sheet->{maxrow} or return; my $row = shift or return; $row > 0 && $row <= $sheet->{maxrow} or return; map { $sheet->{cr2cell ($_, $row)} } 1..$sheet->{maxcol}; } # row # Convert {cell}'s [column][row] to a [row][column] list # my @rows = rows ($book->[1]); sub rows { my $sheet = ref $_[0] eq __PACKAGE__ ? (shift)->[shift] : shift or return; ref $sheet eq "HASH" && exists $sheet->{cell} or return; exists $sheet->{maxcol} && exists $sheet->{maxrow} or return; my $s = $sheet->{cell}; map { my $r = $_; [ map { $s->[$_][$r] } 1..$sheet->{maxcol} ]; } 1..$sheet->{maxrow}; } # rows sub sheet { my ($book, $sheet) = @_; $book && $sheet or return; my $class = "Spreadsheet::Read::Sheet"; $sheet =~ m/^[0-9]+$/ && $sheet >= 1 && $sheet <= $book->[0]{sheets} and return bless $book->[$sheet] => $class; exists $book->[0]{sheet}{$sheet} and return bless $book->[$book->[0]{sheet}{$sheet}] => $class; foreach my $idx (1 .. $book->[0]{sheets}) { $book->[$idx]{label} eq $sheet and return bless $book->[$idx] => $class; } return; } # sheet # If option "clip" is set, remove the trailing rows and # columns in each sheet that contain no visible data sub _clipsheets { my ($opt, $ref) = @_; unless ($ref->[0]{sheets}) { $ref->{sheet} ||= {}; return $ref; } my ($rc, $cl) = ($opt->{rc}, $opt->{cells}); my ($oc, $os, $oa) = ($opt->{clip}, $opt->{strip}, $opt->{attr}); # Strip leading/trailing spaces if ($os || $oc) { foreach my $sheet (1 .. $ref->[0]{sheets}) { $ref->[$sheet]{indx} = $sheet; my $ss = $ref->[$sheet]; $ss->{maxrow} && $ss->{maxcol} or next; my ($mc, $mr) = (0, 0); foreach my $row (1 .. $ss->{maxrow}) { foreach my $col (1 .. $ss->{maxcol}) { if ($rc) { defined $ss->{cell}[$col][$row] or next; $os & 2 and $ss->{cell}[$col][$row] =~ s/\s+$//; $os & 1 and $ss->{cell}[$col][$row] =~ s/^\s+//; if (length $ss->{cell}[$col][$row]) { $col > $mc and $mc = $col; $row > $mr and $mr = $row; } } if ($cl) { my $cell = cr2cell ($col, $row); defined $ss->{$cell} or next; $os & 2 and $ss->{$cell} =~ s/\s+$//; $os & 1 and $ss->{$cell} =~ s/^\s+//; if (length $ss->{$cell}) { $col > $mc and $mc = $col; $row > $mr and $mr = $row; } } } } $oc && ($mc < $ss->{maxcol} || $mr < $ss->{maxrow}) or next; # Remove trailing empty columns foreach my $col (($mc + 1) .. $ss->{maxcol}) { $rc and undef $ss->{cell}[$col]; $oa and undef $ss->{attr}[$col]; $cl or next; my $c = col2label ($col); delete $ss->{"$c$_"} for 1 .. $ss->{maxrow}; } # Remove trailing empty rows foreach my $row (($mr + 1) .. $ss->{maxrow}) { foreach my $col (1 .. $mc) { $cl and delete $ss->{cr2cell ($col, $row)}; $rc and undef $ss->{cell} [$col][$row]; $oa and undef $ss->{attr} [$col][$row]; } } ($ss->{maxrow}, $ss->{maxcol}) = ($mr, $mc); } } if ($opt->{pivot}) { foreach my $sheet (1 .. $ref->[0]{sheets}) { my $ss = $ref->[$sheet]; $ss->{maxrow} || $ss->{maxcol} or next; my $mx = $ss->{maxrow} > $ss->{maxcol} ? $ss->{maxrow} : $ss->{maxcol}; foreach my $row (2 .. $mx) { foreach my $col (1 .. ($row - 1)) { $opt->{rc} and ($ss->{cell}[$col][$row], $ss->{cell}[$row][$col]) = ($ss->{cell}[$row][$col], $ss->{cell}[$col][$row]); $opt->{cells} and ($ss->{cr2cell ($col, $row)}, $ss->{cr2cell ($row, $col)}) = ($ss->{cr2cell ($row, $col)}, $ss->{cr2cell ($col, $row)}); } } ($ss->{maxcol}, $ss->{maxrow}) = ($ss->{maxrow}, $ss->{maxcol}); } } $ref; } # _clipsheets # Convert a single color (index) to a color sub _xls_color { my $clr = shift; defined $clr or return undef; $clr eq "#000000" and return undef; $clr =~ m/^#[0-9a-fA-F]+$/ and return lc $clr; $clr == 0 || $clr == 32767 and return undef; # Default fg color return "#" . lc Spreadsheet::ParseExcel->ColorIdxToRGB ($clr); } # _xls_color # Convert a fill [ $pattern, $front_color, $back_color ] to a single background sub _xls_fill { my ($p, $fg, $bg) = @_; defined $p or return undef; $p == 32767 and return undef; # Default fg color $p == 0 && !defined $bg and return undef; # No fill bg color $p == 1 and return _xls_color ($fg); $bg < 8 || $bg > 63 and return undef; # see Workbook.pm#106 return _xls_color ($bg); } # _xls_fill sub _missing_parser { my ($type, $suggest) = (shift, ""); foreach my $p (@parsers) { $p->[0] eq lc $type or next; $suggest = "\nPlease install $p->[1]"; } "No parser for $type found$suggest\n"; } # _missing_parser sub _txt_is_xml { # Return true if $txt is gzipped or contains XML. If we are also passed # $ns_uri_of_interest, $txt must contain it in the first 1000 or so # characters (but we try to search quickly rather than precisely). my ($txt, $ns_uri_of_interest) = @_; ref $txt and return; # Can't tell (unless we assume the stream is seekable). if ($txt =~ m/\A\037\213/) { # Literal gzipped string (/usr/share/misc/magic). [this is a hack that # works only because Gnumeric is the only format that uses gzip. -- # rgr, 13-Jan-2023] return 1; } if ($txt =~ m/\A<\?xml/) { $ns_uri_of_interest or return 1; $ns_uri_of_interest =~ s/([^\w\d])/\\$1/g; my $prefix = length ($txt) > 10000 ? substr $txt, 0, 1000 : $txt; return $prefix =~ m/xmlns:\w+=.$ns_uri_of_interest/; } $txt =~ m/\n/ and return; # safeguard for older perl versions open my $in, "<", $txt or return; read $in, my $block, 1000 or return; return _txt_is_xml ($block, $ns_uri_of_interest); } # _txt_is_xml sub ReadData { my $txt = shift or return; my %opt; if (@_) { if (ref $_[0] eq "HASH") { %opt = %{shift @_} } elsif (@_ % 2 == 0) { %opt = @_ } } # Aliasses exists $opt{transpose} && !exists $opt{pivot} and $opt{pivot} = delete $opt{transpose}; exists $opt{trim} && !exists $opt{strip} and $opt{strip} = delete $opt{trim}; exists $opt{rc} or $opt{rc} = $def_opts{rc}; exists $opt{cells} or $opt{cells} = $def_opts{cells}; exists $opt{attr} or $opt{attr} = $def_opts{attr}; exists $opt{clip} or $opt{clip} = $opt{cells}; exists $opt{strip} or $opt{strip} = $def_opts{strip}; exists $opt{dtfmt} or $opt{dtfmt} = $def_opts{dtfmt}; exists $opt{merge} or $opt{merge} = $def_opts{merge}; # $debug = $opt{debug} || 0; $debug = defined $opt{debug} ? $opt{debug} : $def_opts{debug}; $debug > 4 and _dump (Options => \%opt); my %parser_opts = map { $_ => $opt{$_} } grep { !exists $def_opts{$_} } keys %opt; my $_parser = _parser ($opt{parser}); my $io_ref = ref ($txt) =~ m/GLOB|IO/ ? $txt : undef; my $io_fil = $io_ref ? 0 : $txt =~ m/\0/ ? 0 : do { no warnings "newline"; -f $txt }; my $io_txt = $io_ref || $io_fil ? 0 : 1; $io_fil && ! -s $txt and do { $@ = "$txt is empty"; return }; $io_ref && eof $txt and do { $@ = "Empty stream"; return }; if ($opt{parser} ? $_parser eq "csv" : ($io_fil && $txt =~ m/\.(csv)$/i)) { $can{csv} or croak _missing_parser ("CSV"); my $label = defined $opt{label} ? $opt{label} : $io_fil ? $txt : "IO"; $debug and print STDERR "Opening CSV $label using $can{csv}-", $can{csv}->VERSION, "\n"; my @data = ( { type => "csv", parser => $can{csv}, version => $can{csv}->VERSION, parsers => [ { type => "csv", parser => $can{csv}, version => $can{csv}->VERSION, }], error => undef, quote => '"', sepchar => ',', sheets => 1, sheet => { $label => 1 }, }, { parser => 0, label => $label, maxrow => 0, maxcol => 0, cell => [], attr => [], merged => [], active => 1, hidden => 0, }, ); my ($sep, $quo, $in) = (",", '"'); defined $opt{sep} and $sep = $opt{sep}; defined $opt{quote} and $quo = $opt{quote}; $debug > 8 and _dump (debug => { data => \@data, txt => $txt, io_ref => $io_ref, io_fil => $io_fil }); if ($io_fil) { unless (defined $opt{quote} && defined $opt{sep}) { open $in, "<", $txt or return; my $l1 = <$in>; $quo = defined $opt{quote} ? $opt{quote} : '"'; $sep = # If explicitly set, use it defined $opt{sep} ? $opt{sep} : # otherwise start auto-detect with quoted strings $l1 =~ m/["0-9];["0-9;]/ ? ";" : $l1 =~ m/["0-9],["0-9,]/ ? "," : $l1 =~ m/["0-9]\t["0-9,]/ ? "\t" : $l1 =~ m/["0-9]\|["0-9,]/ ? "|" : # If neither, then for unquoted strings $l1 =~ m/\w;[\w;]/ ? ";" : $l1 =~ m/\w,[\w,]/ ? "," : $l1 =~ m/\w\t[\w,]/ ? "\t" : $l1 =~ m/\w\|[\w,]/ ? "|" : "," ; close $in; } open $in, "<", $txt or return; } elsif ($io_ref) { $in = $txt; } elsif (ref $txt eq "SCALAR") { open $in, "<", $txt or croak "Cannot open input: $!"; } elsif ($txt =~ m/[\r\n,;]/) { open $in, "<", \$txt or croak "Cannot open input: $!"; } else { warn "Input type ", ref $txt, " might not be supported. Please file a ticket\n"; $in = $txt; # Now pray ... } $debug > 1 and print STDERR "CSV sep_char '$sep', quote_char '$quo'\n"; if (!exists $parser_opts{strict_eol} and my $ka = $data[0]{parser}->can ("known_attributes")) { if (grep m/^strict_eol$/ => $ka->()) { #use DP;::diag DDumper \@data; unless ($data[0]{parser} =~ m/CSV_PP$/ && $data[0]{version} le "2.06") { $parser_opts{strict_eol} = 1; } } } my $csv = $can{csv}->new ({ %parser_opts, sep_char => ($data[0]{sepchar} = $sep), quote_char => ($data[0]{quote} = $quo), keep_meta_info => 1, binary => 1, auto_diag => 1, }) or croak "Cannot create a csv ('$sep', '$quo') parser!"; while (my $row = $csv->getline ($in)) { my @row = @$row or last; my $r = ++$data[1]{maxrow}; @row > $data[1]{maxcol} and $data[1]{maxcol} = @row; foreach my $c (0 .. $#row) { my $val = $row[$c]; my $cell = cr2cell ($c + 1, $r); $opt{rc} and $data[1]{cell}[$c + 1][$r] = $val; $opt{cells} and $data[1]{$cell} = $val; $opt{attr} and $data[1]{attr}[$c + 1][$r] = { @def_attr }; } } $parser_opts{strict_eol} and $data[1]{eolt} = $csv->eol_type; $csv->eof () or $data[0]{error} = [ $csv->error_diag ]; close $in; for (@{$data[1]{cell}}) { defined or $_ = []; } return _clipsheets \%opt, [ @data ]; } if ($io_txt) { # && $_parser !~ m/^xlsx?$/) { if ( # /etc/magic: Microsoft Office Document $txt =~ m{\A(\376\067\0\043 |\320\317\021\340\241\261\032\341 |\333\245-\0\0\0)}x # /usr/share/misc/magic || $txt =~ m{\A.{2080}Microsoft Excel 5.0 Worksheet} || $txt =~ m{\A\x09\x04\x06\x00\x00\x00\x10\x00} ) { $can{xls} or croak _missing_parser ("XLS"); my $tmpfile; if ($can{ios}) { # Do not use a temp file if IO::Scalar is available $tmpfile = \$txt; } else { $tmpfile = File::Temp->new (SUFFIX => ".xls", UNLINK => 1); binmode $tmpfile; print $tmpfile $txt; close $tmpfile; } open $io_ref, "<", $tmpfile or do { $@ = $!; return }; $io_txt = 0; $_parser = _parser ($opt{parser} = "xls"); } elsif ( # /usr/share/misc/magic $txt =~ m{\APK\003\004.{4,30}(?:\[Content_Types\]\.xml|_rels/\.rels)} ) { $can{xlsx} or croak _missing_parser ("XLSX"); my $tmpfile; if ($can{ios}) { # Do not use a temp file if IO::Scalar is available $tmpfile = \$txt; } else { $tmpfile = File::Temp->new (SUFFIX => ".xlsx", UNLINK => 1); binmode $tmpfile; print $tmpfile $txt; close $tmpfile; } open $io_ref, "<", $tmpfile or do { $@ = $!; return }; $io_txt = 0; $_parser = _parser ($opt{parser} = "xlsx"); } elsif ( # /usr/share/misc/magic $txt =~ m{\APK\003\004.{9,30}\Qmimetypeapplication/vnd.oasis.opendocument.spreadsheet} ) { $can{ods} or croak _missing_parser ("ODS"); my $tmpfile; if ($can{ios}) { # Do not use a temp file if IO::Scalar is available $tmpfile = \$txt; } else { $tmpfile = File::Temp->new (SUFFIX => ".ods", UNLINK => 1); binmode $tmpfile; print $tmpfile $txt; close $tmpfile; } open $io_ref, "<", $tmpfile or do { $@ = $!; return }; $io_txt = 0; $_parser = _parser ($opt{parser} = "ods"); } elsif (!$io_ref && $txt =~ m/\.xls[xm]?$/i) { $@ = "Cannot open $txt as file"; return; } } if ($opt{parser} ? $_parser =~ m/^(?:xlsx?)$/ : ($io_fil && $txt =~ m/\.(xls[xm]?)$/i && ($_parser = _parser ($1)))) { my $parse_type = $_parser =~ m/x$/i ? "XLSX" : "XLS"; my $parser = $can{lc $parse_type} or croak _missing_parser ($parse_type); #$debug and print STDERR __FILE__, "#", __LINE__, " | $_parser | $parser | $parse_type\n"; $debug and print STDERR "Opening $parse_type ", $io_ref ? "" : $txt, " using $parser-", $can{lc $parse_type}->VERSION, "\n"; $opt{passwd} and $parser_opts{Password} = $opt{passwd}; my $oBook = eval { $io_ref ? $parse_type eq "XLSX" ? $can{xlsx} eq "Spreadsheet::XLSX" ? $parser->new ($io_ref) # Spreadsheet::XLXS ($io) : $can{xlsx} eq "Excel::ValueReader::XLSX" ? $parser->new (xlsx => $io_ref, %parser_opts) # Excel::ValueReader::XLSX ($io / $content) : $parser->new (%parser_opts)->parse ($io_ref) # Spreadsheet::ParseXLSX ($io) : $parser->new (%parser_opts)->Parse ($io_ref) # Spreadsheet::ParseExcel ($io) : $parse_type eq "XLSX" ? $can{xlsx} eq "Spreadsheet::XLSX" ? $parser->new ($txt) # Spreadsheet::XLXS ($file / $content) : $can{xlsx} eq "Excel::ValueReader::XLSX" ? $parser->new (xlsx => $txt, %parser_opts) # Excel::ValueReader::XLSX ($file / $content) : $parser->new (%parser_opts)->parse ($txt) # Spreadsheet::ParseXLSX ($file / $content) : $parser->new (%parser_opts)->Parse ($txt); # Spreadsheet::ParseExcel ($file / $content) }; unless ($oBook) { # cleanup will fail on folders with spaces. (my $msg = $@) =~ s/ at \S+ line \d+.*//s; croak "$parse_type parser cannot parse data: $msg"; } $debug > 8 and _dump (oBook => $oBook); # WorkBook keys: # aColor _CurSheet Format SheetCount # ActiveSheet _CurSheet_ FormatStr _skip_chart # Author File NotSetCell _string_contin # BIFFVersion Flg1904 Object Version # _buffer FmtClass PkgStr Worksheet # CellHandler Font _previous_info my @data = ( { type => lc $parse_type, parser => $can{lc $parse_type}, version => $can{lc $parse_type}->VERSION, parsers => [{ type => lc $parse_type, parser => $can{lc $parse_type}, version => $can{lc $parse_type}->VERSION, }], error => undef, sheets => $oBook->{SheetCount} || 0, sheet => {}, } ); # Overrule the default date format strings my %def_fmt = ( 0x0E => lc $opt{dtfmt}, # m-d-yy 0x0F => "d-mmm-yyyy", # d-mmm-yy 0x11 => "mmm-yyyy", # mmm-yy 0x16 => "yyyy-mm-dd hh:mm", # m-d-yy h:mm ); $oBook->{FormatStr}{$_} = $def_fmt{$_} for keys %def_fmt; my $oFmt = eval { $parse_type eq "XLSX" ? $can{xlsx} eq "Spreadsheet::XLSX" ? Spreadsheet::XLSX::Fmt2007->new : Spreadsheet::ParseExcel::FmtDefault->new : Spreadsheet::ParseExcel::FmtDefault->new }; $debug > 20 and _dump ("oBook before conversion", $oBook); if ($can{xlsx} eq "Excel::ValueReader::XLSX" and !exists $oBook->{SheetCount}) { my @sheets = $oBook->sheet_names; $data[0]{sheet} = { map { $sheets[$_] => $_ + 1 } 0 .. $#sheets }; $data[0]{sheets} = scalar @sheets; foreach my $sheet_name (@sheets) { my $grid = $oBook->values ($sheet_name); my $sheet = { label => $sheet_name, minrow => 1, mincol => 1, indx => 1, merged => [], }; # Transpose to column vectors. # The A1, B5 etc items could be added here as well. my @c; foreach my $r (0 .. $#$grid) { my $row = $grid->[$r]; foreach my $c (0 .. $#$row) { # add 1 for array base 1 my $val = $grid->[$r][$c]; my $cell = cr2cell ($c + 1, $r + 1); $opt{rc} and $sheet->{cell}[$c + 1][$r + 1] = $val; $opt{cells} and $sheet->{$cell} = $val; $c[$c] = 1; } } # First entry in @t is padding so number of items # is the max index. $sheet->{maxcol} = scalar @c; # No padding of first entry in $grid so # number of items is the array length. $sheet->{maxrow} = @$grid; push @data => $sheet; } #use DP;die DDumper { oBook => $oBook, oFmt => $oFmt, data => \@data, parser_type => $parse_type }; } if ($parse_type eq "ODS" and !exists $oBook->{SheetCount}) { my $styles = delete $oBook->{_styles}; my $sheets = delete $oBook->{_sheets}; if ($sheets && ref $sheets eq "ARRAY") { $styles = ($styles || {})->{styles} || {}; $data[0]{sheets} = $oBook->{SheetCount} = scalar @{$sheets}; $oBook->{Worksheet} = []; *S::R::Sheet::get_merged_areas = sub { [] }; my $x = 0; foreach my $sh (@{$sheets}) { push @{$oBook->{Worksheet}} => bless { Name => $sh->{label}, Cells => [], MinRow => $sh->{col_min}, MaxRow => $sh->{row_max}, MinCol => $sh->{col_min}, MaxCol => $sh->{row_max}, SheetHidden => $sh->{sheet_hidden} || 0, RowHidden => $sh->{hidden_rows}, ColHidden => $sh->{hidden_cols}, _SheetNo => $x++, } => "S::R::Sheet"; # header_cols # header_rows # print_areas # sheet_hidden # tab_color *S::R::Cell::Value = sub { $_[0]{Raw} }; *S::R::Cell::is_merged = sub { 0 }; my $r = 0; foreach my $row (@{$sh->{data}}) { $#$row > $oBook->{Worksheet}[-1]{MaxCol} and $oBook->{Worksheet}[-1]{MaxCol} = $#$row; $oBook->{Worksheet}[-1]{Cells}[$r++] = [ map { bless { Code => undef, Format => $_->{format}, Formula => $_->{formula}, Hidden => undef, Merged => undef, # use || instead of // for now # even though it is undesirable Type => $_->{type} || "", Val => $_->{value} || $_->{unformatted}, Raw => $_->{unformatted} || $_->{value}, _Style => $styles->{$_->{style} || ""} || $_->{style}, # hyperlink } => "S::R::Cell" } @{$row} ]; } --$r > $oBook->{Worksheet}[-1]{MaxRow} and $oBook->{Worksheet}[-1]{MaxRow} = $r; } } } $debug and print STDERR "\t$data[0]{sheets} sheets\n"; _def_gas (); my $active_sheet = $oBook->get_active_sheet || $oBook->{ActiveSheet} || $oBook->{SelectedSheet}; my $current_sheet = 0; foreach my $oWkS (@{$oBook->{Worksheet}}) { $debug > 8 and _dump ("oWkS", $oWkS); $current_sheet++; $opt{clip} and !defined $oWkS->{Cells} and next; # Skip empty sheets my %sheet = ( parser => 0, label => $oWkS->{Name}, maxrow => 0, maxcol => 0, cell => [], attr => [], merged => [], active => 0, hidden => $oWkS->{SheetHidden} || 0, ); # $debug and $sheet{_parser} = $oWkS; defined $sheet{label} or $sheet{label} = "-- unlabeled --"; exists $oWkS->{MinRow} and $sheet{minrow} = $oWkS->{MinRow} + 1; exists $oWkS->{MaxRow} and $sheet{maxrow} = $oWkS->{MaxRow} + 1; exists $oWkS->{MinCol} and $sheet{mincol} = $oWkS->{MinCol} + 1; exists $oWkS->{MaxCol} and $sheet{maxcol} = $oWkS->{MaxCol} + 1; $sheet{merged} = [ map { $_->[0] } sort { $a->[1] cmp $b->[1] } map {[ $_, pack "NNNN", @$_ ]} map {[ map { $_ + 1 } @{$_}[1,0,3,2] ]} @{$oWkS->get_merged_areas || []}]; my $sheet_idx = 1 + @data; $debug and print STDERR "\tSheet $sheet_idx '$sheet{label}' $sheet{maxrow} x $sheet{maxcol}\n"; if (defined $active_sheet) { # _SheetNo is 0-based my $sheet_no = defined $oWkS->{_SheetNo} ? $oWkS->{_SheetNo} : $current_sheet - 1; $sheet_no eq $active_sheet and $sheet{active} = 1; } # Sheet keys: # _Book FooterMargin MinCol RightMargin # BottomMargin FooterMergin MinRow RightMergin # BottomMergin HCenter Name RowHeight # Cells Header NoColor RowHidden # ColFmtNo HeaderMargin NoOrient Scale # ColHidden HeaderMergin NoPls SheetHidden # ColWidth Kind Notes _SheetNo # Copis Landscape PageFit SheetType # DefColWidth LeftMargin PageStart SheetVersion # DefRowHeight LeftMergin PaperSize TopMargin # Draft LeftToRight _Pos TopMergin # FitHeight MaxCol PrintGrid UsePage # FitWidth MaxRow PrintHeaders VCenter # Footer MergedArea Res VRes if (exists $oWkS->{MinRow}) { my $hiddenRows = $oWkS->{RowHidden} || []; my $hiddenCols = $oWkS->{ColHidden} || []; if ($opt{clip}) { my ($mr, $mc) = (-1, -1); foreach my $r ($oWkS->{MinRow} .. $sheet{maxrow}) { foreach my $c ($oWkS->{MinCol} .. $sheet{maxcol}) { my $oWkC = $oWkS->{Cells}[$r][$c] or next; defined (my $val = $oWkC->{Val}) or next; $val eq "" and next; $r > $mr and $mr = $r; $c > $mc and $mc = $c; } } ($sheet{maxrow}, $sheet{maxcol}) = ($mr + 1, $mc + 1); } foreach my $r ($oWkS->{MinRow} .. $sheet{maxrow}) { foreach my $c ($oWkS->{MinCol} .. $sheet{maxcol}) { my $oWkC = $oWkS->{Cells}[$r][$c] or next; #defined (my $val = $oWkC->{Val}) or next; my $val = $oWkC->{Val}; if (defined $val and my $enc = $oWkC->{Code}) { $enc eq "ucs2" and $val = decode ("utf-16be", $val); } my $cell = cr2cell ($c + 1, $r + 1); $opt{rc} and $sheet{cell}[$c + 1][$r + 1] = $val; # Original my $fmt; my $FmT = $oWkC->{Format}; if ($FmT) { unless (ref $FmT) { $fmt = $FmT; $FmT = {}; } } else { $FmT = {}; } foreach my $attr (qw( AlignH AlignV FmtIdx Hidden Lock Wrap )) { exists $FmT->{$attr} or $FmT->{$attr} = 0; } exists $FmT->{Fill} or $FmT->{Fill} = [ 0 ]; exists $FmT->{Font} or $FmT->{Font} = undef; unless (defined $fmt) { $fmt = $FmT->{FmtIdx} ? $oBook->{FormatStr}{$FmT->{FmtIdx}} : undef; } lc $oWkC->{Type} eq "float" and $oWkC->{Type} = "Numeric"; if ($oWkC->{Type} eq "Numeric") { # Fixed in 0.33 and up # see Spreadsheet/ParseExcel/FmtDefault.pm $FmT->{FmtIdx} == 0x0e || $FmT->{FmtIdx} == 0x0f || $FmT->{FmtIdx} == 0x10 || $FmT->{FmtIdx} == 0x11 || $FmT->{FmtIdx} == 0x16 || (defined $fmt && $fmt =~ m{^[dmy][-\\/dmy]*$}) and $oWkC->{Type} = "Date"; $FmT->{FmtIdx} == 0x09 || $FmT->{FmtIdx} == 0x0a || (defined $fmt && $fmt =~ m{^0+\.0+%$}) and $oWkC->{Type} = "Percentage"; } defined $fmt and $fmt =~ s/\\//g; $opt{cells} and # Formatted value $sheet{$cell} = $oFmt && defined $val ? $FmT && exists $def_fmt{$FmT->{FmtIdx}} ? $oFmt->ValFmt ($oWkC, $oBook) : $oWkC->Value : undef; if ($opt{attr}) { my $FnT = $FmT->{Font}; my $fmi = $FmT->{FmtIdx} ? $oBook->{FormatStr}{$FmT->{FmtIdx}} : undef; $fmi and $fmi =~ s/\\//g; my $merged = (defined $oWkC->{Merged} ? $oWkC->{Merged} : $oWkC->is_merged) || 0; $sheet{attr}[$c + 1][$r + 1] = { @def_attr, type => lc $oWkC->{Type}, enc => $oWkC->{Code}, merged => $merged, hidden => ($hiddenRows->[$r] || $hiddenCols->[$c] ? 1 : defined $oWkC->{Hidden} ? $oWkC->{Hidden} : $FmT->{Hidden}) || 0, locked => $FmT->{Lock} || 0, format => $fmi, halign => [ undef, qw( left center right fill justify ), undef, "equal_space" ]->[$FmT->{AlignH}], valign => [ qw( top center bottom justify equal_space )]->[$FmT->{AlignV}], wrap => $FmT->{Wrap}, font => $FnT->{Name}, size => $FnT->{Height}, bold => $FnT->{Bold}, italic => $FnT->{Italic}, uline => $FnT->{Underline}, fgcolor => _xls_color ($FnT->{Color}), bgcolor => _xls_fill (@{$FmT->{Fill}}), formula => $oWkC->{Formula}, }; #_dump "cell", $sheet{attr}[$c + 1][$r + 1]; if ($opt{merge} && $merged and my $p_cell = Spreadsheet::Read::Sheet::merged_from (\%sheet, $c + 1, $r + 1)) { warn $p_cell; $sheet{attr}[$c + 1][$r + 1]{merged} = $p_cell; if ($cell ne $p_cell) { my ($C, $R) = cell2cr ($p_cell); $sheet{cell}[$c + 1][$r + 1] = $sheet{cell}[$C][$R]; $sheet{$cell} = $sheet{$p_cell}; } } } } } } for (@{$sheet{cell}}) { defined or $_ = []; } push @data => { %sheet }; # $data[0]{sheets}++; if ($sheet{label} eq "-- unlabeled --") { $sheet{label} = ""; } else { $data[0]{sheet}{$sheet{label}} = $#data; } } return _clipsheets \%opt, [ @data ]; } if ($opt{parser} ? $_parser =~ m/^(ods)$/ : ($io_fil && $txt =~ m/(ods)$/i && ($_parser = _parser ($1))) and ($can{$_parser} || "") !~ m/sxc/i) { my $parse_type = "ODS"; my $parser = $can{lc $parse_type} or croak _missing_parser ($parse_type); #$debug and print STDERR __FILE__, "#", __LINE__, " | $_parser | $parser | $parse_type\n"; $debug and print STDERR "Opening $parse_type ", $io_ref ? "" : $txt, " using $parser-", $can{lc $parse_type}->VERSION, "\n"; $opt{passwd} and $parser_opts{Password} = $opt{passwd}; my $oBook = eval { $io_ref ? $parser->new (readonly => 1, %parser_opts)->parse ($io_ref) : $parser->new (readonly => 1, %parser_opts)->parse ($txt) }; unless ($oBook) { # cleanup will fail on folders with spaces. (my $msg = $@) =~ s/ at \S+ line \d+.*//s; croak "$parse_type parser cannot parse data: $msg"; } $debug > 8 and _dump (oBook => $oBook); my @data = ( { type => lc $parse_type, parser => $can{lc $parse_type}, version => $can{lc $parse_type}->VERSION, parsers => [{ type => lc $parse_type, parser => $can{lc $parse_type}, version => $can{lc $parse_type}->VERSION, }], error => undef, sheets => scalar $oBook->worksheets, sheet => {}, } ); # $debug and $data[0]{_parser} = $oBook; $debug and print STDERR "\t$data[0]{sheets} sheets\n"; _def_gas (); my $active_sheet = $oBook->get_active_sheet; my $current_sheet = 0; foreach my $oWkS ($oBook->worksheets) { $current_sheet++; $opt{clip} && $oWkS->row_max < $oWkS->row_min && $oWkS->col_max < $oWkS->col_min and next; # Skip empty sheets my %sheet = ( parser => 0, label => $oWkS->label, maxrow => $oWkS->row_max+1, maxcol => $oWkS->col_max+1, cell => [], attr => [], merged => [], active => 0, hidden => 0, ); # $debug and $sheet{_parser} = $oWkS; defined $sheet{label} or $sheet{label} = "-- unlabeled --"; $sheet{merged} = [ map { $_->[0] } sort { $a->[1] cmp $b->[1] } map {[ $_, pack "NNNN", @$_ ]} map {[ map { $_ + 1 } @{$_}[1,0,3,2] ]} @{$oWkS->get_merged_areas || []}]; my $sheet_idx = 1 + @data; $debug and print STDERR "\tSheet $sheet_idx '$sheet{label}' $sheet{maxrow} x $sheet{maxcol}\n"; if (defined $active_sheet) { my $sheet_no = $current_sheet - 1; $sheet_no eq $active_sheet and $sheet{active} = 1; } my $hiddenRows = $oWkS->hidden_rows || []; my $hiddenCols = $oWkS->hidden_cols || []; if ($opt{clip}) { my ($mr, $mc) = (-1, -1); foreach my $r ($oWkS->row_min .. $sheet{maxrow}-1) { foreach my $c ($oWkS->col_min .. $sheet{maxcol}-1) { my $oWkC = $oWkS->get_cell($r, $c) or next; defined (my $val = $oWkC->value) or next; $val eq "" and next; $r > $mr and $mr = $r; $c > $mc and $mc = $c; } } ($sheet{maxrow}, $sheet{maxcol}) = ($mr + 1, $mc + 1); } foreach my $r ($oWkS->row_min .. $sheet{maxrow}) { foreach my $c ($oWkS->col_min .. $sheet{maxcol}) { my $oWkC = $oWkS->get_cell($r, $c) or next; my $val = $oWkC->unformatted; #if (defined $val and my $enc = $oWkC->{Code}) { # $enc eq "ucs2" and $val = decode ("utf-16be", $val); # } my $cell = cr2cell ($c + 1, $r + 1); $opt{rc} and $sheet{cell}[$c + 1][$r + 1] = $val; # Original my $fmt; my $styleName = $oWkC->style; my $FmT; if ($styleName && defined (my $s = $oBook->_styles->{$styleName})) { $fmt = $s; } defined $fmt and $fmt =~ s/\\//g; $opt{cells} and # Formatted value $sheet{$cell} = defined $val ? $oWkC->value : undef; if ($opt{attr}) { # my $FnT = $FmT ? $FmT->{font_face} : undef; my $fmi; #my $fmi = $FmT ? $FmT->{FmtIdx} # ? $oBook->{FormatStr}{$FmT->{FmtIdx}} # : undef; #$fmi and $fmi =~ s/\\//g; my $type = $oWkC->type || ''; $type eq "float" and $type = "numeric"; my $merged = $oWkC->is_merged || 0; $sheet{attr}[$c + 1][$r + 1] = { @def_attr, type => $type, # enc => $oWkC->{Code}, merged => $merged, hidden => ($hiddenRows->[$r] || $hiddenCols->[$c] ? 1 : $oWkC->is_hidden ? $oWkC->is_hidden : undef) || 0, # locked => $FmT->{Lock} || 0, format => $fmi, # halign => [ undef, qw( left center right # fill justify ), undef, # "equal_space" ]->[$FmT->{AlignH}], # valign => [ qw( top center bottom justify # equal_space )]->[$FmT->{AlignV}], # wrap => $FmT->{Wrap}, # font => $FnT->{Name}, # size => $FnT->{Height}, # bold => $FnT->{Bold}, # italic => $FnT->{Italic}, # uline => $FnT->{Underline}, # fgcolor => _xls_color ($FnT->{Color}), # bgcolor => _xls_fill (@{$FmT->{Fill}}), formula => $oWkC->formula, }; #_dump "cell", $sheet{attr}[$c + 1][$r + 1]; if ($opt{merge} && $merged and my $p_cell = Spreadsheet::Read::Sheet::merged_from(\%sheet, $c + 1, $r + 1)) { $sheet{attr}[$c + 1][$r + 1]{merged} = $p_cell; if ($cell ne $p_cell) { my ($C, $R) = cell2cr ($p_cell); $sheet{cell}[$c + 1][$r + 1] = $sheet{cell}[$C][$R]; $sheet{$cell} = $sheet{$p_cell}; } } } } } for (@{$sheet{cell}}) { defined or $_ = []; } push @data, { %sheet }; if ($sheet{label} eq "-- unlabeled --") { $sheet{label} = ""; } else { $data[0]{sheet}{$sheet{label}} = $#data; } } return _clipsheets \%opt, [ @data ]; } if ($opt{parser} ? _parser ($opt{parser}) eq "sc" : $io_fil ? $txt =~ m/\.sc$/ : $txt =~ m/^# .*SquirrelCalc/) { if ($io_ref) { local $/; my $x = <$txt>; $txt = $x; } elsif ($io_fil) { local $/; open my $sc, "<", $txt or return; $txt = <$sc>; close $sc; } $txt =~ m/\S/ or return; my $label = defined $opt{label} ? $opt{label} : "sheet"; my @data = ( { type => "sc", parser => "Spreadsheet::Read", version => $VERSION, parsers => [{ type => "sc", parser => "Spreadsheet::Read", version => $VERSION, }], error => undef, sheets => 1, sheet => { $label => 1 }, }, { parser => 0, label => $label, maxrow => 0, maxcol => 0, cell => [], attr => [], merged => [], active => 1, hidden => 0, }, ); for (split m/\s*[\r\n]\s*/, $txt) { if (m/^dimension.*of ([0-9]+) rows.*of ([0-9]+) columns/i) { @{$data[1]}{qw(maxrow maxcol)} = ($1, $2); next; } s/^r([0-9]+)c([0-9]+)\s*=\s*// or next; my ($c, $r) = map { $_ + 1 } $2, $1; if (m/.* \{(.*)}$/ or m/"(.*)"/) { my $cell = cr2cell ($c, $r); $opt{rc} and $data[1]{cell}[$c][$r] = $1; $opt{cells} and $data[1]{$cell} = $1; $opt{attr} and $data[1]{attr}[$c + 1][$r] = { @def_attr }; next; } # Now only formula's remain. Ignore for now # r67c7 = [P2L] 2*(1000*r67c5-60) } for (@{$data[1]{cell}}) { defined or $_ = []; } return _clipsheets \%opt, [ @data ]; } if ($opt{parser} ? _parser ($opt{parser}) eq "gnumeric" : _txt_is_xml ($txt, "http://www.gnumeric.org/v10.dtd")) { $can{gnumeric} or croak _missing_parser ("gnumeric"); my $gnm = $can{gnumeric}->new (%parser_opts, attr => $opt{attr}, cells => $opt{cells}, merge => $opt{merge}, rc => $opt{rc}, gzipped_p => $opt{gzipped_p}); return _clipsheets \%opt, $gnm->parse ($txt); } if ($opt{parser} ? _parser ($opt{parser}) eq "sxc" : ($txt =~ m/^<\?xml/ or -f $txt)) { $can{sxc} or croak _missing_parser ("SXC"); ref $txt && $can{sxc}->VERSION <= 0.23 and croak ("Sorry, references as input are not supported by Spreadsheet::ReadSXC before 0.23"); my $using = "using $can{sxc}-" . $can{sxc}->VERSION; my $sxc_options = { %parser_opts, OrderBySheet => 1 }; # New interface 0.20 and up my $sxc; if ($txt =~ m/\.(sxc|ods)$/i) { $debug and print STDERR "Opening \U$1\E $txt $using\n"; $debug and print STDERR __FILE__, "#", __LINE__, "\n"; $sxc = Spreadsheet::ReadSXC::read_sxc ($txt, $sxc_options) or return; } # treat all refs as a filehandle elsif (ref $txt) { $debug and print STDERR "Opening SXC filehandle\n"; $sxc = Spreadsheet::ReadSXC::read_sxc_fh ($txt, $sxc_options) or return; } elsif ($txt =~ m/\.xml$/i) { $debug and print STDERR "Opening XML $txt $using\n"; $sxc = Spreadsheet::ReadSXC::read_xml_file ($txt, $sxc_options) or return; } # need to test on pattern to prevent stat warning # on filename with newline elsif ($txt !~ m/^<\?xml/i and -f $txt) { $debug and print STDERR "Opening XML $txt $using\n"; open my $f, "<", $txt or return; local $/; $txt = <$f>; close $f; } !$sxc && $txt =~ m/^<\?xml/i and $sxc = Spreadsheet::ReadSXC::read_xml_string ($txt, $sxc_options); $debug > 8 and _dump (sxc => $sxc); if ($sxc) { my @data = ( { type => "sxc", parser => "Spreadsheet::ReadSXC", version => $Spreadsheet::ReadSXC::VERSION, parsers => [{ type => "sxc", parser => "Spreadsheet::ReadSXC", version => $Spreadsheet::ReadSXC::VERSION, }], error => undef, sheets => 0, sheet => {}, } ); my @sheets = ref $sxc eq "HASH" # < 0.20 ? map { { label => $_, data => $sxc->{$_}, } } keys %$sxc : @{$sxc}; foreach my $sheet (@sheets) { my @sheet = @{$sheet->{data} || []}; my %sheet = ( parser => 0, label => $sheet->{label}, maxrow => scalar @sheet, maxcol => 0, cell => [], attr => [], merged => [], active => 0, hidden => 0, ); my $sheet_idx = 1 + @data; $debug and print STDERR "\tSheet $sheet_idx '$sheet{label}' $sheet{maxrow} rows\n"; foreach my $r (0 .. $#sheet) { my @row = @{$sheet[$r]} or next; foreach my $c (0 .. $#row) { defined (my $val = $row[$c]) or next; my $C = $c + 1; $C > $sheet{maxcol} and $sheet{maxcol} = $C; my $cell = cr2cell ($C, $r + 1); $opt{rc} and $sheet{cell}[$C][$r + 1] = $val; $opt{cells} and $sheet{$cell} = $val; $opt{attr} and $sheet{attr}[$C][$r + 1] = { @def_attr }; } } for (@{$sheet{cell}}) { defined or $_ = []; } $debug and print STDERR "\tSheet $sheet_idx '$sheet{label}' $sheet{maxrow} x $sheet{maxcol}\n"; push @data, { %sheet }; $data[0]{sheets}++; $data[0]{sheet}{$sheet->{label}} = $#data; } return _clipsheets \%opt, [ @data ]; } } if (!ref $txt and $txt =~ m/\.\w+$/) { # Return (localized) system message open my $fh, "<", $txt and croak "I can open file $txt, but I do not know how to parse it\n"; $@ = $!; } return; } # ReadData sub add { my $book = shift; my $r = ReadData (@_) or return; $book && (ref $book eq "ARRAY" || ref $book eq __PACKAGE__) && $book->[0]{sheets} or return $r; my $c1 = $book->[0]; my $c2 = $r->[0]; unless ($c1->{parsers}) { $c1->{parsers}[0]{$_} = $c1->{$_} for qw( type parser version ); $book->[$_]{parser} = 0 for 1 .. $c1->{sheets}; } my ($pidx) = (grep { my $p = $c1->{parsers}[$_]; $p->{type} eq $c2->{type} && $p->{parser} eq $c2->{parser} && $p->{version} eq $c2->{version} } 0 .. $#{$c1->{parsers}}); unless (defined $pidx) { $pidx = scalar @{$c1->{parsers}}; $c1->{parsers}[$pidx]{$_} = $c2->{$_} for qw( type parser version ); } foreach my $sn (sort { $c2->{sheet}{$a} <=> $c2->{sheet}{$b} } keys %{$c2->{sheet}}) { my $s = $sn; my $v = 2; while (exists $c1->{sheet}{$s}) { $s = $sn."[".$v++."]"; } $c1->{sheet}{$s} = $c1->{sheets} + $c2->{sheet}{$sn}; $r->[$c2->{sheet}{$sn}]{parser} = $pidx; push @$book, $r->[$c2->{sheet}{$sn}]; } $c1->{sheets} += $c2->{sheets}; return $book; } # add package Spreadsheet::Read::Attribute; use Carp; use vars qw( $AUTOLOAD ); sub AUTOLOAD { my $self = shift; (my $attr = $AUTOLOAD) =~ s/.*:://; $self->{$attr}; } # AUTOLOAD package Spreadsheet::Read::Sheet; use List::Util qw( min max ); sub cell { my ($sheet, @id) = @_; @id == 2 && $id[0] =~ m/^[0-9]+$/ && $id[1] =~ m/^[0-9]+$/ and return $sheet->{cell}[$id[0]][$id[1]]; @id && $id[0] && exists $sheet->{$id[0]} and return $sheet->{$id[0]}; } # cell sub attr { my ($sheet, @id) = @_; my $class = "Spreadsheet::Read::Attribute"; @id == 2 && $id[0] =~ m/^[0-9]+$/ && $id[1] =~ m/^[0-9]+$/ and return bless $sheet->{attr}[$id[0]][$id[1]] => $class; if (@id && $id[0] && exists $sheet->{$id[0]}) { my ($c, $r) = $sheet->cell2cr ($id[0]); return bless $sheet->{attr}[$c][$r] => $class; } undef; } # attr sub maxrow { my $sheet = shift; return $sheet->{maxrow}; } # maxrow sub maxcol { my $sheet = shift; return $sheet->{maxcol}; } # maxrow sub col2label { $_[0] =~ m/::/ and shift; # class unused return Spreadsheet::Read::col2label (@_); } # col2label sub cr2cell { $_[0] =~ m/::/ and shift; # class unused return Spreadsheet::Read::cr2cell (@_); } # cr2cell sub cell2cr { $_[0] =~ m/::/ and shift; # class unused return Spreadsheet::Read::cell2cr (@_); } # cell2cr sub label { my ($sheet, $label) = @_; defined $label and $sheet->{label} = $label; return $sheet->{label}; } # label sub active { my $sheet = shift; return $sheet->{active}; } # label sub hidden { my $sheet = shift; return $sheet->{hidden}; } # label # my @row = $sheet->cellrow (1); sub cellrow { my ($sheet, $row) = @_; defined $row && $row > 0 && $row <= $sheet->{maxrow} or return; my $s = $sheet->{cell}; map { $s->[$_][$row] } 1..$sheet->{maxcol}; } # cellrow # my @row = $sheet->row (1); sub row { my ($sheet, $row) = @_; defined $row && $row > 0 && $row <= $sheet->{maxrow} or return; map { $sheet->{$sheet->cr2cell ($_, $row)} } 1..$sheet->{maxcol}; } # row # my @col = $sheet->cellcolumn (1); sub cellcolumn { my ($sheet, $col) = @_; defined $col && $col > 0 && $col <= $sheet->{maxcol} or return; my $s = $sheet->{cell}; map { $s->[$col][$_] } 1..$sheet->{maxrow}; } # cellcolumn # my @col = $sheet->column (1); sub column { my ($sheet, $col) = @_; defined $col && $col > 0 && $col <= $sheet->{maxcol} or return; map { $sheet->{$sheet->cr2cell ($col, $_)} } 1..$sheet->{maxrow}; } # column # my $arrayref = $sheet->cellrange ("B3:D5"); # my $arrayref = $sheet->cellrange (2, 3, 4, 5); sub cellrange { my ($sheet, @r) = @_; my $s = $sheet->{cell}; if (@r == 1 && $r[0] =~ m/^([A-Za-z]+[0-9]+):([A-Za-z]+[0-9]+)$/) { my ($cl, $rt) = cell2cr (uc $1); my ($cr, $rb) = cell2cr (uc $2); $cl = min ($sheet->{maxcol}, max (1, $cl)); $rt = min ($sheet->{maxrow}, max (1, $rt)); $cr = min ($sheet->{maxcol}, max (1, $cr)); $rb = min ($sheet->{maxrow}, max (1, $rb)); my @R; foreach my $c ($cl .. $cr) { push @R => [ map { $s->[$c][$_] } $rt .. $rb ]; } return \@R; } if (@r == 4 and $r[0] =~ m/^-?[0-9]+/ && $r[1] =~ m/^-?[0-9]+/ && $r[2] =~ m/^-?[0-9]+/ && $r[3] =~ m/^-?[0-9]+/) { $r[0] < 0 and $r[0] = $sheet->{maxcol} + 1 + $r[0]; $r[1] < 0 and $r[1] = $sheet->{maxrow} + 1 + $r[1]; $r[2] < 0 and $r[2] = $sheet->{maxcol} + 1 + $r[2]; $r[3] < 0 and $r[3] = $sheet->{maxrow} + 1 + $r[3]; $r[0] = min ($sheet->{maxcol}, max (1, $r[0])); $r[1] = min ($sheet->{maxrow}, max (1, $r[1])); $r[2] = min ($sheet->{maxcol}, max (1, $r[2])); $r[3] = min ($sheet->{maxrow}, max (1, $r[3])); my @R; foreach my $c ($r[0] .. $r[2]) { push @R => [ map { $s->[$c][$_] } $r[1] .. $r[3] ]; } return \@R; } } # cellrange # my $hashref = $sheet->range ("A3:D7") # my $hashref = $sheet->range (1, 3, 4, 7) sub range { my ($sheet, @r, $R) = @_; if (@r == 1 && $r[0] =~ m/^([A-Za-z]+[0-9]+):([A-Za-z]+[0-9]+)$/) { my ($cl, $rt) = cell2cr (uc $1); my ($cr, $rb) = cell2cr (uc $2); $cl = min ($sheet->{maxcol}, max (1, $cl)); $rt = min ($sheet->{maxrow}, max (1, $rt)); $cr = min ($sheet->{maxcol}, max (1, $cr)); $rb = min ($sheet->{maxrow}, max (1, $rb)); foreach my $c ($cl .. $cr) { foreach my $r ($rt .. $rb) { my $C = $sheet->cr2cell ($c, $r); $R->{$C} = $sheet->{$C}; } } return $R; } if (@r == 4 and $r[0] =~ m/^-?[0-9]+/ && $r[1] =~ m/^-?[0-9]+/ && $r[2] =~ m/^-?[0-9]+/ && $r[3] =~ m/^-?[0-9]+/) { $r[0] < 0 and $r[0] = $sheet->{maxcol} + 1 + $r[0]; $r[1] < 0 and $r[1] = $sheet->{maxrow} + 1 + $r[1]; $r[2] < 0 and $r[2] = $sheet->{maxcol} + 1 + $r[2]; $r[3] < 0 and $r[3] = $sheet->{maxrow} + 1 + $r[3]; $r[0] = min ($sheet->{maxcol}, max (1, $r[0])); $r[1] = min ($sheet->{maxrow}, max (1, $r[1])); $r[2] = min ($sheet->{maxcol}, max (1, $r[2])); $r[3] = min ($sheet->{maxrow}, max (1, $r[3])); foreach my $c ($r[0] .. $r[2]) { foreach my $r ($r[1] .. $r[3]) { my $C = $sheet->cr2cell ($c, $r); $R->{$C} = $sheet->{$C}; } } return $R; } } # range # Convert {cell}'s [column][row] to a [row][column] list # my @rows = $sheet->rows (); sub rows { my $sheet = shift; my $s = $sheet->{cell}; map { my $r = $_; [ map { $s->[$_][$r] } 1..$sheet->{maxcol} ]; } 1..$sheet->{maxrow}; } # rows sub merged_from { my ($sheet, @id, $col, $row) = @_; my $ma = $sheet->{merged} or return; if (@id == 2 && $id[0] =~ m/^[0-9]+$/ && $id[1] =~ m/^[0-9]+$/) { ($col, $row) = @id; } elsif (@id && $id[0] && exists $sheet->{$id[0]}) { ($col, $row) = cell2cr ($id[0]); } defined $row && $row > 0 && $row <= $sheet->{maxrow} or return; defined $col && $col > 0 && $col <= $sheet->{maxcol} or return; foreach my $range (@{$ma}) { my ($ctl, $rtl, $cbr, $rbr) = @{$range}; $col >= $ctl && $col <= $cbr or next; $row >= $rtl && $row <= $rbr or next; return cr2cell ($ctl, $rtl); } } # cell 1; BEGIN { $INC{"Z10/Just/For/Testing.pm"} = $0; $INC{"Z20/Just/For/Testing.pm"} = $0; $Z10::Just::For::Testing::VERSION = "1.00"; $Z20::Just::For::Testing::VERSION = undef; } package Z10::Just::For::Testing; 1; package Z20::Just::For::Testing; 1; __END__ =head1 DESCRIPTION Spreadsheet::Read tries to transparently read *any* spreadsheet and return its content in a universal manner independent of the parsing module that does the actual spreadsheet scanning. The parser has to be available and is not provided by this module. =head2 Supported spreadsheets =head3 OpenOffice and LibreOffice (C and C) For OpenOffice and/or LibreOffice this module uses L or L =head3 Microsoft Excel (C and C) For Microsoft Excel this module uses L, L, L, or L (strongly discouraged). =head3 CSV (C) For CSV this module uses L or L. =head3 Gnumeric (C) For Gnumeric this module uses L. =head3 SquirrelCalc (C) For SquirrelCalc there is a very simplistic built-in parser =head2 Data structure The data is returned as an array reference: $book = [ # Entry 0 is the overall control hash { sheets => 2, sheet => { "Sheet 1" => 1, "Sheet 2" => 2, }, parsers => [ { type => "xls", parser => "Spreadsheet::ParseExcel", version => 0.59, }], error => undef, }, # Entry 1 is the first sheet { parser => 0, label => "Sheet 1", maxrow => 2, maxcol => 4, cell => [ undef, [ undef, 1 ], [ undef, undef, undef, undef, undef, "Nugget" ], ], attr => [], merged => [], active => 1, hidden => 0, A1 => 1, B5 => "Nugget", }, # Entry 2 is the second sheet { parser => 0, label => "Sheet 2", : : To keep as close contact to spreadsheet users, row and column 1 have index 1 too in the C element of the sheet hash, so cell "A1" is the same as C [1, 1] (column first). To switch between the two, there are helper functions available: C, C, and C. The C hash entry contains unformatted data, while the hash entries with the traditional labels contain the formatted values (if applicable). The control hash (the first entry in the returned array ref), contains some spreadsheet meta-data. The entry C is there to be able to find the sheets when accessing them by name: my %sheet2 = %{$book->[$book->[0]{sheet}{"Sheet 2"}]}; =head2 Formatted vs Unformatted The difference between formatted and unformatted cells is that the (optional) format is applied to the cell or not. This part is B implemented on the parser side. Spreadsheet::Read just makes both available if these are supported. Options provide means to disable either. If the parser does not provide formatted cells - like CSV - both values are equal. To show what this implies: use Spreadsheet::Read; my $file = "files/example.xlsx"; my $workbook = Spreadsheet::Read->new ($file); my $info = $workbook->[0]; say "Parsed $file with $info->{parser}-$info->{version}"; my $sheet = $workbook->sheet (1); say join "\t" => "Formatted:", $sheet->row (1); say join "\t" => "Unformatted:", $sheet->cellrow (1); Might return very different results depending one the underlying parser (and its version): Parsed files/example.xlsx with Spreadsheet::ParseXLSX-0.27 Formatted: 8-Aug Foo & Barr < Quux Unformatted: 39668 Foo & Barr < Quux Parsed files/example.xlsx with Spreadsheet::XLSX-0.15 Formatted: 39668 Foo & Barr < Quux Unformatted: 39668 Foo & Barr < Quux =head2 Functions and methods =head3 new my $book = Spreadsheet::Read->new (...) or die $@; All options accepted by ReadData are accepted by new. With no arguments at all, $book will be an object where sheets can be added using C my $book = Spreadsheet::Read->new (); $book->add ("file.csv"); $book->add ("file.cslx"); =head3 ReadData my $book = ReadData ($source [, option => value [, ... ]]); my $book = ReadData ("file.csv", sep => ',', quote => '"'); my $book = ReadData ("file.xls", dtfmt => "yyyy-mm-dd"); my $book = ReadData ("file.ods"); my $book = ReadData ("file.sxc"); my $book = ReadData ("content.xml"); my $book = ReadData ($content); my $book = ReadData ($content, parser => "xlsx"); my $book = ReadData ($fh, parser => "xlsx"); my $book = ReadData (\$content, parser => "xlsx"); Tries to convert the given file, string, or stream to the data structure described above. Processing Excel data from a stream or content is supported through a L temporary file or L when available. L does preserve sheet order as of version 0.20. Choosing between C<$content> and C<\\$content> (with or without passing the desired C option) may be depending on trial and terror. C does try to determine parser type on content if needed, but not all combinations are checked, and not all signatures are builtin. Currently supported options are: =over 2 =item parser X Force the data to be parsed by a specific format. Possible values are C, C (or C), C (or C), C (or C, C, C, C) C (or C), and C (or C). When parsing streams, instead of files, it is highly recommended to pass this option. Spreadsheet::Read supports several underlying parsers per spreadsheet type. It will try those from most favored to least favored. When you have a good reason to prefer a different parser, you can set that in environment variables. The other options then will not be tested for: env SPREADSHEET_READ_CSV=Text::CSV_PP ... You can also directly pass the required backend, forcing the matching type, but this excludes version checking. # Checks for minimal version BEGIN { $ENV{SPREADSHEET_READ_CSV} = "Text::CSV_PP" } my $book = ReadData ("test.csv", parser => "csv"); vs # NO check for minimal version my $book = ReadData ("test.csv", parser => "Text::CSV_PP"); =item cells X Control the generation of named cells ("C" etc). Default is true. =item rc Control the generation of the {cell}[c][r] entries. Default is true. =item attr Control the generation of the {attr}[c][r] entries. Default is false. See L below. =item clip If set, L|/ReadData> will remove all trailing rows and columns per sheet that have no data, where no data means only undefined or empty cells (after optional stripping). If a sheet has no data at all, the sheet will be skipped entirely when this attribute is true. =item trim =item strip If set, L|/ReadData> will remove trailing- and/or leading-whitespace from every field. strip leading strailing ----- ------- --------- 0 n/a n/a 1 strip n/a 2 n/a strip 3 strip strip C and C are aliases. If passed both, C is ignored because of backward compatibility. =item transpose =item pivot Swap all rows and columns. When a sheet contains data like A1 B1 C1 E1 A2 C2 D2 A3 B3 C3 D3 E3 using C or C will return the sheet data as A1 A2 A3 B1 B3 C1 C2 C3 D2 D3 E1 E3 C and C are aliases. If passed both, C is ignored because of backward compatibility. =item sep Set separator for CSV. Default is comma C<,>. =item quote Set quote character for CSV. Default is C<">. =item dtfmt Set the format for MS-Excel date fields that are set to use the default date format. The default format in Excel is "C", which is both not year 2000 safe, nor very useful. The default is now "C", which is more ISO-like. Note that date formatting in MS-Excel is not reliable at all, as it will store/replace/change the date field separator in already stored formats if you change your locale settings. So the above mentioned default can be either "C" OR "C" depending on what that specific character happened to be at the time the user saved the file. =item merge Copy content to all cells in merged areas. If supported, this will copy formatted and unformatted values from the top-left cell of a merged area to all other cells in the area. =item debug Enable some diagnostic messages to STDERR. The value determines how much diagnostics are dumped (using L). A value of C<9> and higher will dump the entire structure from the back-end parser. =item passwd Use this password to decrypt password protected spreadsheet. Currently only supports Excel. =back All other attributes/options will be passed to the underlying parser if that parser supports attributes. =head3 col2label my $col_id = col2label (col); my $col_id = $book->col2label (col); # OO C converts a C<(column)> (1 based) to the letters used in the traditional cell notation: my $id = col2label ( 4); # $id now "D" my $id = col2label (28); # $id now "AB" =head3 cr2cell my $cell = cr2cell (col, row); my $cell = $book->cr2cell (col, row); # OO C converts a C<(column, row)> pair (1 based) to the traditional cell notation: my $cell = cr2cell ( 4, 14); # $cell now "D14" my $cell = cr2cell (28, 4); # $cell now "AB4" =head3 cell2cr my ($col, $row) = cell2cr ($cell); my ($col, $row) = $book->cell2cr ($cell); # OO C converts traditional cell notation to a C<(column, row)> pair (1 based): my ($col, $row) = cell2cr ("D14"); # returns ( 4, 14) my ($col, $row) = cell2cr ("AB4"); # returns (28, 4) =head3 row my @row = row ($sheet, $row) my @row = Spreadsheet::Read::row ($book->[1], 3); my @row = $book->row ($sheet, $row); # OO Get full row of formatted values (like C<< $sheet->{A3} .. $sheet->{G3} >>) Note that the indexes in the returned list are 0-based. C is not imported by default, so either specify it in the use argument list, or call it fully qualified. See also the C method on sheets. =head3 cellrow my @row = cellrow ($sheet, $row); my @row = Spreadsheet::Read::cellrow ($book->[1], 3); my @row = $book->cellrow ($sheet, $row); # OO Get full row of unformatted values (like C<< $sheet->{cell}[1][3] .. $sheet->{cell}[7][3] >>) Note that the indexes in the returned list are 0-based. C is not imported by default, so either specify it in the use argument list, or call it fully qualified or as method call. See also the C method on sheets. =head3 rows my @rows = rows ($sheet); my @rows = Spreadsheet::Read::rows ($book->[1]); my @rows = $book->rows (1); # OO Convert C<{cell}>'s C<[column][row]> to a C<[row][column]> list. Note that the indexes in the returned list are 0-based, where the index in the C<{cell}> entry is 1-based. C is not imported by default, so either specify it in the use argument list, or call it fully qualified. =head3 parses parses ($format); Spreadsheet::Read::parses ("CSV"); $book->parses ("CSV"); # OO C returns Spreadsheet::Read's capability to parse the required format or C<0> if it does not. L|/ReadData> will pick its preferred parser for that format unless overruled. See L|/parser>. C is not imported by default, so either specify it in the use argument list, or call it fully qualified. If C<$format> is false (C, C<"">, or C<0>), C will return a sorted list of supported types. @my types = parses (""); # e.g: csv, ods, sc, sxc, xls, xlsx =head3 parsers my @p = parsers (); C returns a list of hashrefs with information about supported parsers, each giving information about the parser, its versions and if it will be used as default parser for the given type, like: { ext => "csv", # extension or type mod => "Text::CSV_XS", # parser module min => "0.71", # module required version vsn => "1.45", # module installed version def => "*", # is default for ext } As the modules are actually loaded to get their version, do only use this to analyse prerequisites. =head3 Version my $v = Version () my $v = Spreadsheet::Read::Version () my $v = Spreadsheet::Read->VERSION; my $v = $book->Version (); # OO Returns the current version of Spreadsheet::Read. C is not imported by default, so either specify it in the use argument list, or call it fully qualified. This function returns exactly the same as C<< Spreadsheet::Read->VERSION >> returns and is only kept for backward compatibility reasons. =head3 sheets my $sheets = $book->sheets; # OO my @sheets = $book->sheets; # OO In scalar context return the number of sheets in the book. In list context return the labels of the sheets in the book. This list only returns known unique labels in sorted order. Sheets could have no label or there can be more sheets with the same label (depends on the spreadsheet format and the parser used). =head3 sheet my $sheet = $book->sheet (1); # OO my $sheet = $book->sheet ("Foo"); # OO Return the numbered or named sheet out of the book. Will return C if there is no match. Will not work for sheets I with a number between 1 and the number of sheets in the book. With named sheets will first try to use the list of sheet-labels as stored in the control structure. If no match is found, it will scan the actual labels of the sheets. In that case, it will return the first matching sheet. If defined, the returned sheet will be of class C. =head3 add my $book = ReadData ("file.csv"); Spreadsheet::Read::add ($book, "file.xlsx"); my $book = Spreadsheet::Read->new ("file.csv"); $book->add ("file.xlsx"); # OO =head2 Methods on sheets =head3 maxcol my $col = $sheet->maxcol; Return the index of the last in-use column in the sheet. This index is 1-based. =head3 maxrow my $row = $sheet->maxrow; Return the index of the last in-use row in the sheet. This index is 1-based. =head3 cell my $cell = $sheet->cell ("A3"); my $cell = $sheet->cell (1, 3); Return the value for a cell. Using tags will return the formatted value, using column and row will return unformatted value. =head3 attr my $cell = $sheet->attr ("A3"); my $cell = $sheet->attr (1, 3); Return the attributes of a cell. Only valid if attributes are enabled through option C. =head3 col2label my $col_id = $sheet->col2label (col); C converts a C<(column)> (1 based) to the letters used in the traditional cell notation: my $id = $sheet->col2label ( 4); # $id now "D" my $id = $sheet->col2label (28); # $id now "AB" =head3 cr2cell my $cell = $sheet->cr2cell (col, row); C converts a C<(column, row)> pair (1 based) to the traditional cell notation: my $cell = $sheet->cr2cell ( 4, 14); # $cell now "D14" my $cell = $sheet->cr2cell (28, 4); # $cell now "AB4" =head3 cell2cr my ($col, $row) = $sheet->cell2cr ($cell); C converts traditional cell notation to a C<(column, row)> pair (1 based): my ($col, $row) = $sheet->cell2cr ("D14"); # returns ( 4, 14) my ($col, $row) = $sheet->cell2cr ("AB4"); # returns (28, 4) =head3 col my @col = $sheet->column ($col); Get full column of formatted values (like C<< $sheet->{C1} .. $sheet->{C9} >>) Note that the indexes in the returned list are 0-based. =head3 cellcolumn my @col = $sheet->cellcolumn ($col); Get full column of unformatted values (like C<< $sheet->{cell}[3][1] .. $sheet->{cell}[3][9] >>) Note that the indexes in the returned list are 0-based. =head3 row my @row = $sheet->row ($row); Get full row of formatted values (like C<< $sheet->{A3} .. $sheet->{G3} >>) Note that the indexes in the returned list are 0-based. =head3 cellrow my @row = $sheet->cellrow ($row); Get full row of unformatted values (like C<< $sheet->{cell}[1][3] .. $sheet->{cell}[7][3] >>) Note that the indexes in the returned list are 0-based. =head3 cellrange my $arrayref = $sheet->cellrange ("B3:D5"); my $arrayref = $sheet->cellrange (2, 3, 4, 5); my $arrayref = $sheet->cellrange (-4, -5, -1, -1); Return an arrayref with the selected cells from C<< $sheet->{cell} >>. When the range is given as (top-left, bottom-right) numeric CR pairs, negative values are allowed (count from rigth/bottom) and automatically clipped to be inside the existing data set. =head3 range my $hashref = $sheet->range ("B3:D5"); my $hashref = $sheet->range (2, 3, 4, 5); my $hashref = $sheet->range (-4, -5, -1, -1); Return a hashref with all the fields in the given range. When the range is given as (top-left, bottom-right) numeric CR pairs, negative values are allowed (count from rigth/bottom) and automatically clipped to be inside the existing data set. =head3 rows my @rows = $sheet->rows (); Convert C<{cell}>'s C<[column][row]> to a C<[row][column]> list. Note that the indexes in the returned list are 0-based, where the index in the C<{cell}> entry is 1-based. =head3 merged_from my $top_left = $sheet->merged_from ("C2"); my $top_left = $sheet->merged_from (3, 2); If the parser supports merged areas, this method will return the label of the top-left cell in the merged area the requested cell is part of. If the requested ID is valid and withing the sheet cell range, but not part of a merged area, it will return C<"">. If the ID is not valid or out of range, it returns C. See L for more details. =head3 label my $label = $sheet->label; $sheet->label ("New sheet label"); Set a new label to a sheet. Note that the index in the control structure will I be updated. =head3 active my $sheet_is_active = $sheet->active; Returns 1 if the selected sheet is active, otherwise returns 0. Currently only works on XLS (as of Spreadsheed::ParseExcel-0.61). CSV is always active. =head3 hidden my $sheet_is_hidden = $sheet->hidden; Returns 1 if the selected sheet is hidden, otherwise returns 0. Fully depends on the backend supporting this. CSV and SC are never hidden. =head2 Using CSV In case of CSV parsing, L|/ReadData> will use the first line of the file to auto-detect the separation character if the first argument is a file and both C and C are not passed as attributes. L (or L) is able to automatically detect and use C<\r> line endings. CSV can parse streams too, but be sure to pass C and/or C if these do not match the default C<,> and C<">. When an error is found in the CSV, it is automatically reported (to STDERR). The structure will store the error in C<< $ss->[0]{error} >> as anonymous list returned by Lerror_diag >>|https://metacpan.org/pod/Text::CSV_XS#error_diag>. See L for documentation. my $ss = ReadData ("bad.csv"); $ss->[0]{error} and say $ss->[0]{error}[1]; As CSV has no sheet labels, the default label for a CSV sheet is its filename. For CSV, this can be overruled using the I/L pair. =item Spreadsheet::Perl L offers a Pure Perl implementation of a spreadsheet engine. Users that want this format to be supported in Spreadsheet::Read are hereby motivated to offer patches. It is not high on my TODO-list. =item Spreadsheet::CSV L offers the interesting approach of seeing all supported spreadsheet formats as if it were CSV, mimicking the L interface. =item xls2csv L offers an alternative for my C, in the xls2csv tool, but this tool focuses on character encoding transparency, and requires some other modules. =back =head1 AUTHOR H.Merijn Brand =head1 COPYRIGHT AND LICENSE Copyright (C) 2005-2025 H.Merijn Brand This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut Spreadsheet-Read-0.93/cpanfile0000644000031300001440000000473614766041535015553 0ustar00merijnusersrequires "Carp"; requires "Data::Dumper"; requires "Data::Peek"; requires "Encode"; requires "Exporter"; requires "File::Temp" => "0.22"; # ignore : CVE-2011-4116 requires "List::Util"; recommends "Data::Dumper" => "2.183"; recommends "Data::Peek" => "0.53"; recommends "Encode" => "3.21"; recommends "File::Temp" => "0.2311"; recommends "IO::Scalar"; suggests "Data::Dumper" => "2.189"; on "configure" => sub { requires "ExtUtils::MakeMaker"; recommends "ExtUtils::MakeMaker" => "7.22"; suggests "ExtUtils::MakeMaker" => "7.72"; }; on "test" => sub { requires "Test::Harness"; requires "Test::More" => "0.88"; requires "Test::NoWarnings"; recommends "Test::More" => "1.302209"; }; feature "opt_csv", "Provides parsing of CSV streams" => sub { requires "Text::CSV_XS" => "0.71"; recommends "Text::CSV" => "2.06"; recommends "Text::CSV_PP" => "2.06"; recommends "Text::CSV_XS" => "1.60"; }; feature "opt_gnumeric", "Provides parsing of Gnumeric spreadsheets" => sub { requires "Spreadsheet::ReadGnumeric" => "0.2"; recommends "Spreadsheet::ReadGnumeric" => "0.4"; }; feature "opt_ods", "Provides parsing of OpenOffice spreadsheets" => sub { requires "Spreadsheet::ParseODS" => "0.26"; recommends "Spreadsheet::ParseODS" => "0.39"; }; feature "opt_sxc", "Provides parsing of OpenOffice spreadsheets old style" => sub { requires "Spreadsheet::ReadSXC" => "0.26"; recommends "Spreadsheet::ReadSXC" => "0.39"; }; feature "opt_tools", "Spreadsheet tools" => sub { recommends "Tk" => "804.036"; recommends "Tk::NoteBook"; recommends "Tk::TableMatrix::Spreadsheet"; }; feature "opt_xls", "Provides parsing of Microsoft Excel files" => sub { requires "OLE::Storage_Lite" => "!= 0.21"; requires "Spreadsheet::ParseExcel" => "0.34"; requires "Spreadsheet::ParseExcel::FmtDefault"; recommends "OLE::Storage_Lite" => "0.22"; recommends "Spreadsheet::ParseExcel" => "0.66"; }; feature "opt_xlsx", "Provides parsing of Microsoft Excel 2007 files" => sub { requires "Spreadsheet::ParseExcel::FmtDefault"; requires "Spreadsheet::ParseXLSX" => "0.24"; recommends "Spreadsheet::ParseXLSX" => "0.36"; }; Spreadsheet-Read-0.93/META.yml0000644000031300001440000000354414766041536015315 0ustar00merijnusers--- abstract: Meta-Wrapper for reading spreadsheet data author: - H.Merijn Brand configure_requires: ExtUtils::MakeMaker: 0 dynamic_config: 1 generated_by: Author, CPAN::Meta::Converter version 2.150010 license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Spreadsheet-Read optional_features: opt_csv: description: Provides parsing of CSV streams requires: Text::CSV_XS: '0.71' opt_gnumeric: description: Provides parsing of Gnumeric spreadsheets requires: Spreadsheet::ReadGnumeric: '0.2' opt_ods: description: Provides parsing of OpenOffice spreadsheets requires: Spreadsheet::ParseODS: '0.26' opt_sxc: description: Provides parsing of OpenOffice spreadsheets old style requires: Spreadsheet::ReadSXC: '0.26' opt_tools: description: Spreadsheet tools opt_xls: description: Provides parsing of Microsoft Excel files requires: OLE::Storage_Lite: "!= 0.21" Spreadsheet::ParseExcel: '0.34' Spreadsheet::ParseExcel::FmtDefault: 0 opt_xlsx: description: Provides parsing of Microsoft Excel 2007 files requires: Spreadsheet::ParseExcel::FmtDefault: 0 Spreadsheet::ParseXLSX: '0.24' provides: Spreadsheet::Read: file: Read.pm version: '0.93' recommends: Data::Dumper: '2.183' Data::Peek: '0.53' Encode: '3.21' File::Temp: '0.2311' IO::Scalar: 0 Test::More: '1.302209' requires: Carp: 0 Data::Dumper: 0 Data::Peek: 0 Encode: 0 Exporter: 0 File::Temp: '0.22' List::Util: 0 Test::Harness: 0 Test::More: '0.88' Test::NoWarnings: 0 perl: '5.008001' resources: bugtracker: https://github.com/Tux/Spreadsheet-Read/issues license: http://dev.perl.org/licenses/ repository: https://github.com/Tux/Spreadsheet-Read version: '0.93' Spreadsheet-Read-0.93/META.json0000644000031300001440000001152314766041536015461 0ustar00merijnusers{ "generated_by" : "Author", "dynamic_config" : 1, "resources" : { "bugtracker" : { "web" : "https://github.com/Tux/Spreadsheet-Read/issues" }, "license" : [ "http://dev.perl.org/licenses/" ], "repository" : { "url" : "https://github.com/Tux/Spreadsheet-Read", "type" : "git", "web" : "https://github.com/Tux/Spreadsheet-Read" } }, "author" : [ "H.Merijn Brand " ], "prereqs" : { "runtime" : { "suggests" : { "Data::Dumper" : "2.189" }, "recommends" : { "Data::Dumper" : "2.183", "File::Temp" : "0.2311", "IO::Scalar" : "0", "Data::Peek" : "0.53", "Encode" : "3.21" }, "requires" : { "Encode" : "0", "List::Util" : "0", "Exporter" : "0", "Carp" : "0", "Data::Peek" : "0", "perl" : "5.008001", "Data::Dumper" : "0", "File::Temp" : "0.22" } }, "test" : { "requires" : { "Test::More" : "0.88", "Test::Harness" : "0", "Test::NoWarnings" : "0" }, "recommends" : { "Test::More" : "1.302209" } }, "configure" : { "suggests" : { "ExtUtils::MakeMaker" : "7.72" }, "recommends" : { "ExtUtils::MakeMaker" : "7.22" }, "requires" : { "ExtUtils::MakeMaker" : "0" } } }, "license" : [ "perl_5" ], "version" : "0.93", "optional_features" : { "opt_sxc" : { "prereqs" : { "runtime" : { "recommends" : { "Spreadsheet::ReadSXC" : "0.39" }, "requires" : { "Spreadsheet::ReadSXC" : "0.26" } } }, "description" : "Provides parsing of OpenOffice spreadsheets old style" }, "opt_tools" : { "prereqs" : { "runtime" : { "recommends" : { "Tk::TableMatrix::Spreadsheet" : "0", "Tk::NoteBook" : "0", "Tk" : "804.036" } } }, "description" : "Spreadsheet tools" }, "opt_csv" : { "prereqs" : { "runtime" : { "requires" : { "Text::CSV_XS" : "0.71" }, "recommends" : { "Text::CSV_PP" : "2.06", "Text::CSV_XS" : "1.60", "Text::CSV" : "2.06" } } }, "description" : "Provides parsing of CSV streams" }, "opt_gnumeric" : { "description" : "Provides parsing of Gnumeric spreadsheets", "prereqs" : { "runtime" : { "requires" : { "Spreadsheet::ReadGnumeric" : "0.2" }, "recommends" : { "Spreadsheet::ReadGnumeric" : "0.4" } } } }, "opt_ods" : { "description" : "Provides parsing of OpenOffice spreadsheets", "prereqs" : { "runtime" : { "recommends" : { "Spreadsheet::ParseODS" : "0.39" }, "requires" : { "Spreadsheet::ParseODS" : "0.26" } } } }, "opt_xls" : { "description" : "Provides parsing of Microsoft Excel files", "prereqs" : { "runtime" : { "requires" : { "OLE::Storage_Lite" : "!= 0.21", "Spreadsheet::ParseExcel" : "0.34", "Spreadsheet::ParseExcel::FmtDefault" : "0" }, "recommends" : { "Spreadsheet::ParseExcel" : "0.66", "OLE::Storage_Lite" : "0.22" } } } }, "opt_xlsx" : { "prereqs" : { "runtime" : { "requires" : { "Spreadsheet::ParseExcel::FmtDefault" : "0", "Spreadsheet::ParseXLSX" : "0.24" }, "recommends" : { "Spreadsheet::ParseXLSX" : "0.36" } } }, "description" : "Provides parsing of Microsoft Excel 2007 files" } }, "release_status" : "stable", "abstract" : "Meta-Wrapper for reading spreadsheet data", "name" : "Spreadsheet-Read", "provides" : { "Spreadsheet::Read" : { "version" : "0.93", "file" : "Read.pm" } }, "meta-spec" : { "version" : 2, "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec" } }