diff options
-rw-r--r-- | Build/source/texk/texlive/linked_scripts/ChangeLog | 5 | ||||
-rw-r--r-- | Build/source/texk/texlive/linked_scripts/Makefile.am | 2 | ||||
-rwxr-xr-x | Build/source/texk/texlive/linked_scripts/texcount/texcount.pl (renamed from Build/source/texk/texlive/linked_scripts/texcount/TeXcount.pl) | 427 | ||||
-rw-r--r-- | Master/texmf-dist/doc/support/texcount/QuickReference.pdf | 754 | ||||
-rw-r--r-- | Master/texmf-dist/doc/support/texcount/QuickReference.tex | 16 | ||||
-rw-r--r-- | Master/texmf-dist/doc/support/texcount/TeXcount.pdf | bin | 147012 -> 148874 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/support/texcount/TeXcount.tex | 16 | ||||
-rwxr-xr-x | Master/texmf-dist/scripts/texcount/texcount.pl (renamed from Master/texmf-dist/scripts/texcount/TeXcount.pl) | 427 |
8 files changed, 937 insertions, 710 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/ChangeLog b/Build/source/texk/texlive/linked_scripts/ChangeLog index beaba4b46b0..f254495b394 100644 --- a/Build/source/texk/texlive/linked_scripts/ChangeLog +++ b/Build/source/texk/texlive/linked_scripts/ChangeLog @@ -1,3 +1,8 @@ +2009-05-08 Karl Berry <karl@tug.org> + + * Makefile.am (nobase_dist_script_SCRIPTS): TeXcount.pl is now + texcount.pl. + 2009-04-11 Karl Berry <karl@tug.org> * Makefile.am (nobase_dist_script_SCRIPTS): add accfonts scripts. diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.am b/Build/source/texk/texlive/linked_scripts/Makefile.am index 20877952a41..74267c1ac87 100644 --- a/Build/source/texk/texlive/linked_scripts/Makefile.am +++ b/Build/source/texk/texlive/linked_scripts/Makefile.am @@ -83,7 +83,7 @@ nobase_dist_script_SCRIPTS = \ purifyeps/purifyeps \ splitindex/perl/splitindex.pl \ svn-multi/svn-multi.pl \ - texcount/TeXcount.pl \ + texcount/texcount.pl \ texdirflatten/texdirflatten \ texloganalyser/texloganalyser \ thumbpdf/thumbpdf.pl \ diff --git a/Build/source/texk/texlive/linked_scripts/texcount/TeXcount.pl b/Build/source/texk/texlive/linked_scripts/texcount/texcount.pl index 8b68e4984c0..96fac5cd220 100755 --- a/Build/source/texk/texlive/linked_scripts/texcount/TeXcount.pl +++ b/Build/source/texk/texlive/linked_scripts/texcount/texcount.pl @@ -2,12 +2,13 @@ use strict; use warnings; use Term::ANSIColor; +use Encode; use POSIX qw(locale_h); use locale; setlocale(LC_CTYPE,"no_NO"); -my $versionnumber="2.1"; -my $versiondate="2008 Nov 02"; +my $versionnumber="2.2"; +my $versiondate="2009 Apr 30"; ###### Set CMD specific settings and variables @@ -19,14 +20,18 @@ my $showsubcounts=0; my $htmlstyle=0; my $includeTeX=0; my $briefsum=0; -my $totalflag=0; my @sumweights; -my $globalworkdir=""; +my $utf8flag=0; # Global variables my $blankline=0; +my $errorcount=0; + +# CMD specific global variables +my $totalflag=0; my @filelist; my $workdir; +my $globalworkdir=""; ###### Set global settings and variables @@ -118,7 +123,7 @@ my %TeXgroup=('document'=>1,'letter'=>1,'titlepage'=>0, 'abstract'=>1,'quote'=>1,'quotation'=>1,'verse'=>1,'minipage'=>1,'verbatim'=>1, 'description'=>1,'enumerate'=>1,'itemize'=>1,'list'=>1, 'theorem'=>1,'lemma'=>1,'definition'=>1,'corollary'=>1,'example'=>1, - 'math'=>6,'displaymath'=>7,'equation'=>7,'eqnarray'=>7, + 'math'=>6,'displaymath'=>7,'equation'=>7,'eqnarray'=>7,'align'=>7, 'figure'=>-1,'float'=>-1,'picture'=>-1,'table'=>-1, 'tabbing'=>0,'tabular'=>0,'thebibliography'=>0,'lrbox'=>0); @@ -161,7 +166,7 @@ $STYLES[1]={%{$STYLES[0]}, 'grouping'=>'red','document'=>'red','mathgroup'=>'magenta', 'state'=>'cyan underline','sumcount'=>'yellow'}; $STYLES[2]={%{$STYLES[1]}, - 'command'=>'green','exclgroup'=>'yellow','exclmath'=>'yellow', + 'command'=>'green','exclcommand'=>'yellow','exclgroup'=>'yellow','exclmath'=>'yellow', 'ignore'=>'cyan'}; $STYLES[3]={%{$STYLES[2]}, 'tc'=>'bold yellow','comment'=>'yellow','option'=>'yellow', @@ -170,10 +175,15 @@ $STYLES[4]={%{$STYLES[3]}}; ### Word regexp pattern list # List of regexp patterns that should be analysed as words. +# Use @ to represent a letter, will be substituted with $LetterPattern. +my @WordPatterns=('(@+\.)+@+\.?','@+([\-\']@+)*'); my $specialchars='\\\\(ae|AE|o|O|aa|AA)'; my $modifiedchars='\\\\[\'\"\`\~\^\=](\w|\{\w\})'; -my @WordPatterns=('(\w+\.)+\w+\.?','\w+([\-\']\w+)*'); -my @WordPatternsRelaxed=('([\w\-\']|'.$modifiedchars.'|'.$specialchars.'(\{\})?|\{'.$specialchars.'\})+'); +my $LetterPattern='\w'; +my $LetterPatternRelaxed='([\w\-\']|'.$modifiedchars.'|'.$specialchars.'(\{\})?|\{'.$specialchars.'\}|\{\w\})'; +my %NamedWordPattern; +$NamedWordPattern{'chinese'}='\p{script=Han}'; +$NamedWordPattern{'japanese'}='(\p{script=Han}|\p{script=Hiragana}|\p{script=Katakana})'; ### Macro option regexp list # List of regexp patterns to be gobbled as macro option in and after @@ -183,6 +193,7 @@ my @MacroOptionPatternsRelaxed=('\[[^\[\]\n]*\]'); ###### Main script + ################################################### MAIN(@ARGV); @@ -200,13 +211,14 @@ sub MAIN { my @toplevelfiles=Parse_Arguments(@args); Apply_Options(); if (scalar(@toplevelfiles)==0) { - if ($showcodes>1) {print_help_style();} - else {print_error("No files specified.","p","error");} + conditional_print_help_style() + || print_error("No files specified.","p","error"); } else { conditional_print_help_style(); my $totalcount=parse_file_list(@toplevelfiles); conditional_print_total($totalcount); } + Report_ErrorCount(); Close_Output(); } @@ -265,9 +277,18 @@ sub parse_options_parsing { elsif ($arg eq '-noinc') {$includeTeX=0;} elsif ($arg eq '-dir') {$globalworkdir=undef;} elsif ($arg=~/^-dir=(.*)$/) {$globalworkdir=$1;} + elsif ($arg=~/^-(utf8|unicode)$/) {$utf8flag=1;} + elsif ($arg=~/^-(ch|chinese|zhongwen)$/) { + $utf8flag=1; + @WordPatterns=($NamedWordPattern{'chinese'},@WordPatterns); + } + elsif ($arg=~/^-(jp|japanese)$/) { + $utf8flag=1; + @WordPatterns=($NamedWordPattern{'japanese'},@WordPatterns); + } elsif ($arg eq '-relaxed') { @MacroOptionPatterns=@MacroOptionPatternsRelaxed; - @WordPatterns=@WordPatternsRelaxed; + $LetterPattern=$LetterPatternRelaxed; } else {return 0;} return 1; @@ -307,9 +328,9 @@ sub option_sum { sub parse_options_format { my $arg=shift @_; - if ($arg eq '-brief') {$briefsum=1; return 1;} - elsif ($arg eq '-total') {$totalflag=1; return 1;} - elsif ($arg eq '-1') {$briefsum=1;$totalflag=1;} + if ($arg eq '-brief') {$briefsum=1;} + elsif ($arg eq '-total') {$totalflag=1;} + elsif ($arg eq '-1') {$briefsum=1;$totalflag=1;$verbose=-1;} elsif ($arg eq "-html" ) {option_no_colours();$htmlstyle = 2;} elsif ($arg eq "-htmlcore" ) {option_no_colours();$htmlstyle = 1;} elsif ($arg=~/^\-(nocol|nc$)/) {option_no_colours();} @@ -329,7 +350,8 @@ sub parse_options_output { elsif ($arg eq '-vv' || $arg eq '-v2') {$verbose=2;} elsif ($arg eq '-vvv' || $arg eq '-v3' || $arg eq '-v') {$verbose=3;} elsif ($arg eq '-vvvv' || $arg eq '-v4') {$verbose=3; $showstates=1;} - elsif ($arg =~ /^\-showstates?$/ ){$showstates=1;} + elsif ($arg =~ /^\-showstates?$/ ) {$showstates=1;} + elsif ($arg =~ /^-(q|-?quiet)$/ ) {$verbose=-1;} else {return 0;} return 1; } @@ -361,7 +383,7 @@ sub parse_file { my $fpath=$f; $fpath=~s/^((.*[\\\/])?)[^\\\/]+$/$1/; if (!defined $tex) { - #print_error("File not found or not readable: ".$f."\n"); + print STDERR "File not found or not readable: ".$f."\n"; formatprint("File not found or not readable: ".$f."\n","p","error"); } else { parse($tex); @@ -377,22 +399,26 @@ sub parse_file { return $filetotalcount; } + ###### ###### Subroutines ###### -###### Option handling +###### CMD specific implementations -# Apply options to set values -sub Apply_Options { - %STYLE=%{$STYLES[$verbose]}; - if ($htmlstyle>1) {html_head();} + +sub add_file_to_list { + my $fname=shift @_; + push @filelist,$workdir.$fname; } -# Close the output, e.g. adding HTML tail -sub Close_Output { - if ($htmlstyle>1) { - html_tail(); +sub print_with_style { + my ($text,$style,$colour)=@_; + #if ($utf8flag || $htmlstyle) {utf8::encode($text);} + if ($htmlstyle) { + print "<span class='".$style."'>".$text."</span>"; + } else { + print Term::ANSIColor::colored($text,$colour); } } @@ -415,7 +441,22 @@ sub conditional_print_total { } } -###### TeX File handle +###### Option handling + + +# Apply options to set values +sub Apply_Options { + %STYLE=%{$STYLES[$verbose]}; + if ($utf8flag) {binmode STDOUT,':utf8';} + if ($htmlstyle>1) {html_head();} + foreach (@WordPatterns) { + s/\@/$LetterPattern/g; + } +} + + +###### TeX code handle + sub TeXfile { my $filename=shift @_; @@ -423,6 +464,30 @@ sub TeXfile { return TeXcode($file,$filename); } +sub read_file { + my $filename=shift @_; + if ($utf8flag) { + open(FH,"<:utf8",$filename) || return undef; + } else { + open(FH,"<".$filename) || return undef; + } + if ($verbose>0) { + formatprint("File: ".$filename."\n",'h2'); + $blankline=0; + } + my @text=<FH>; + close(FH); + my $latexcode=join('',@text); + if ($utf8flag) { + $latexcode =~ s/^\x{feff}//; + } + return $latexcode; +} + +###### Parsing routines + + +# Make TeXcode handle sub TeXcode { my ($texcode,$filename,$title)=@_; my %TeX=(); @@ -454,20 +519,7 @@ sub TeXcode { return \%TeX; } -sub read_file { - my $filename=shift @_; - open(FH,"<".$filename."") || return undef; - if ($verbose) { - formatprint("File: ".$filename."\n",'h2'); - $blankline=0; - } - my @text=<FH>; - close(FH); - return join('',@text); -} - -###### Parsing routines - +# Parse LaTeX document sub parse { my ($tex)=@_; if ($htmlstyle && $verbose) {print "<p class=parse>\n";} @@ -477,6 +529,7 @@ sub parse { if ($htmlstyle && $verbose) {print "</p>\n";} } +# Parse one block or unit sub parse_unit { # Status: # 0 = exclude from count @@ -542,52 +595,7 @@ sub parse_unit { set_style($tex,'ignore'); } elsif ($tex->{'type'}==3) { # macro call - if (my $label=$BreakPoints{$next}) { - if ($tex->{'line'}=~ /^[*]?(\s*\[.*?\])*\s*\{(.+?)\}/ ) { - $label=$label.': '.$2; - } - add_subcount($tex,$label); - } - set_style($tex,'command'); - if ($next eq '\begin' && $status!=-2) { - parse_begin_end($tex,$status); - } elsif (($status==-1) && ($substat=$TeXfloatinc{$next})) { - # text included from float - gobble_macro_parms($tex,$substat); - } elsif ($status==-9 && defined ($substat=$TeXpreamble{$next})) { - # parse preamble include macros - if (defined $TeXheader{$next}) {inc_count($tex,4);} - gobble_macro_parms($tex,$substat,1); - } elsif ($status<0) { - # ignore - gobble_option($tex); - } elsif ($next eq '\(') { - # math inline - parse_math($tex,$status,6,'\)'); - } elsif ($next eq '\[') { - # math display - parse_math($tex,$status,7,'\]'); - } elsif ($next eq '\def') { - # ignore \def... - $tex->{'line'} =~ s/^([^\{]*)\{/\{/; - flush_next($tex); - print_style($1.' ','ignore'); - parse_unit($tex,-2); - } elsif (defined (my $addsuffix=$TeXfileinclude{$next})) { - # include file: queue up for parsing - parse_include_file($tex,$status,$addsuffix); - } elsif (defined ($substat=$TeXmacro{$next})) { - # macro: exclude options - if (defined $TeXheader{$next}) {inc_count($tex,4);} - gobble_macro_parms($tex,$substat,$status); - } elsif (defined ($substat=$TeXmacroword{$next})) { - # count macro as word (or a given number of words) - inc_count($tex,$status,$substat); - set_style($tex,'word'.$status); - } elsif ($next =~ /^\\[^\w\_]/) { - } else { - gobble_option($tex); - } + parse_macro($tex,$next,$status,$substat); } elsif ($next eq '$') { # math inline parse_math($tex,$status,6,'$'); @@ -601,16 +609,56 @@ sub parse_unit { } } -sub gobble_option { - my $tex=shift @_; - flush_next($tex); - foreach my $pattern (@MacroOptionPatterns) { - if ($tex->{'line'}=~s/^($pattern)//) { - print_style($1,'option'); - return $1; +sub parse_macro { + my ($tex,$next,$status,$substat)=@_; + if (my $label=$BreakPoints{$next}) { + if ($tex->{'line'}=~ /^[*]?(\s*\[.*?\])*\s*\{(.+?)\}/ ) { + $label=$label.': '.$2; } + add_subcount($tex,$label); + } + set_style($tex,$status>0?'command':'exclcommand'); + if ($next eq '\begin' && $status!=-2) { + parse_begin_end($tex,$status); + } elsif (($status==-1) && ($substat=$TeXfloatinc{$next})) { + # text included from float + set_style($tex,'command'); + gobble_macro_parms($tex,$substat); + } elsif ($status==-9 && defined ($substat=$TeXpreamble{$next})) { + # parse preamble include macros + set_style($tex,'command'); + if (defined $TeXheader{$next}) {inc_count($tex,4);} + gobble_macro_parms($tex,$substat,1); + } elsif ($status<0) { + # ignore + gobble_option($tex); + } elsif ($next eq '\(') { + # math inline + parse_math($tex,$status,6,'\)'); + } elsif ($next eq '\[') { + # math display + parse_math($tex,$status,7,'\]'); + } elsif ($next eq '\def') { + # ignore \def... + $tex->{'line'} =~ s/^([^\{]*)\{/\{/; + flush_next($tex); + print_style($1.' ','ignore'); + parse_unit($tex,-2); + } elsif (defined (my $addsuffix=$TeXfileinclude{$next})) { + # include file: queue up for parsing + parse_include_file($tex,$status,$addsuffix); + } elsif (defined ($substat=$TeXmacro{$next})) { + # macro: exclude options + if (defined $TeXheader{$next}) {inc_count($tex,4);} + gobble_macro_parms($tex,$substat,$status); + } elsif (defined ($substat=$TeXmacroword{$next})) { + # count macro as word (or a given number of words) + inc_count($tex,$status,$substat); + set_style($tex,'word'.$status); + } elsif ($next =~ /^\\[^\w\_]/) { + } else { + gobble_option($tex); } - return undef; } sub parse_tc { @@ -635,7 +683,10 @@ sub parse_tc { elsif ($instr eq 'header') {$TeXheader{$macro}=$param;$TeXmacro{$macro}=$param;} elsif ($instr eq 'macroword') {$TeXmacroword{$macro}=$param;} elsif ($instr eq 'preambleinclude') {$TeXpreamble{$macro}=$param;} - elsif ($instr eq 'group') {$TeXmacro{'begin'.$macro}=$param;$TeXgroup{$macro}=$option;} + elsif ($instr eq 'group') { + $TeXmacro{'begin'.$macro}=$param; + $TeXgroup{$macro}=$option; + } elsif ($instr eq 'floatinclude') {$TeXfloatinc{$macro}=$param;} elsif ($instr eq 'fileinclude') {$TeXfileinclude{$macro}=$param;} elsif ($instr eq 'breakmacro') {$BreakPoints{$macro}=$param;} @@ -715,13 +766,24 @@ sub parse_include_file { my $fname=$1; if ($addsuffix==2) {$fname.='.tex';} elsif ($addsuffix==1 && ($fname=~/^[^\.]+$/)) {$fname.='.tex';} - #if ($includeTeX) {push @filelist,$tex->{'filepath'}.$fname;} - if ($includeTeX) {push @filelist,$workdir.$fname;} + if ($includeTeX) {add_file_to_list($fname);} } else { print_style($&,'ignored'); } } +sub gobble_option { + my $tex=shift @_; + flush_next($tex); + foreach my $pattern (@MacroOptionPatterns) { + if ($tex->{'line'}=~s/^($pattern)//) { + print_style($1,'option'); + return $1; + } + } + return undef; +} + sub gobble_options { while (gobble_option(@_)) {} } @@ -774,7 +836,7 @@ sub next_token { if ($type==0) { print_style($next,'comment'); } elsif ($type==9) { - if ($verbose) {line_return(1,$tex);} + if ($verbose>0) {line_return(1,$tex);} } else { return $next; } @@ -797,9 +859,10 @@ sub get_next_token { # 666: TeXcount instruction (%TC:instruction) my $tex=shift @_; my $next; - (defined ($next=get_token($tex,'\%+TC:[^\n]*',666))) && return $next; - (defined ($next=get_token($tex,'\%[^\n]*',0))) && return $next; - (defined ($next=get_token($tex,'\n',9))) && return $next; + (defined ($next=get_token($tex,'\%+TC:\s*endignore\b[^\r\n]*',666))) && return "%TC:endignore"; + (defined ($next=get_token($tex,'\%+TC:[^\r\n]*',666))) && return $next; + (defined ($next=get_token($tex,'\%[^\r\n]*',0))) && return $next; + (defined ($next=get_token($tex,'(\r|\n|\r\n)',9))) && return $next; (defined ($next=get_token($tex,'\\\\[\{\}]',2))) && return $next; foreach my $pattern (@WordPatterns) { (defined ($next=get_token($tex,$pattern,1))) && return $next; @@ -830,6 +893,7 @@ sub get_token { ###### Count handling routines + sub new_count { my ($title)=@_; my @cnt=(0,0,0,0,0,0,0,0); @@ -944,6 +1008,7 @@ sub add_subcount { ###### Printing routines + sub set_style { my ($tex,$style)=@_; if (!(($tex->{'style'}) && ($tex->{'style'} eq '-'))) {$tex->{'style'}=$style;} @@ -977,11 +1042,7 @@ sub print_style { my $colour; ($colour=$STYLE{$style}) || return; if (($colour) && !($colour eq '-')) { - if ($htmlstyle) { - print "<span class='".$style."'>".$text."</span>"; - } else { - print Term::ANSIColor::colored($text,$colour); - } + print_with_style($text,$style,$colour); if ($state) { print_style($state,'state'); } @@ -994,9 +1055,12 @@ sub print_style { sub print_error { my $text=shift @_; - line_return(1); - print_style("### ".$text." ###",'error'); - line_return(1); + $errorcount++; + if ($verbose>=0) { + line_return(1); + print_style("!!! ".$text." !!!",'error'); + line_return(1); + } } sub formatprint { @@ -1021,12 +1085,87 @@ sub flush_next { $tex->{'style'}='-'; } + +# Close the output, e.g. adding HTML tail +sub Close_Output { + if ($htmlstyle>1) { + html_tail(); + } +} + + +# Report if there were any errors occurring during parsing +sub Report_ErrorCount { + if ($errorcount==0) {return;} + if ($briefsum && $totalflag) {print " ";} + if ($htmlstyle) { + print_error("Errors:".$errorcount,"p","error"); + } else { + print "(errors:".$errorcount.")"; + } +} + + +sub print_help_style { + if ($verbose<=0) {return;} + formatprint("Format/colour codes of verbose output:","h2"); + print "\n\n"; + if ($htmlstyle) {print "<p class='stylehelp'>";} + help_style_line('Text which is counted',"word1","counted as text words"); + help_style_line('Header and title text',"word2","counted as header words"); + help_style_line('Caption text and footnotes',"word3","counted as caption words"); + help_style_line("Ignored text or code","ignore","excluded or ignored"); + help_style_line('\documentclass',"document","document start, beginning of preamble"); + help_style_line('\macro',"command","macro not counted, but parameters may be"); + help_style_line('\macro',"exclcommand","macro in excluded region"); + help_style_line("[Macro options]","option","not counted"); + help_style_line('\begin{group} \end{group}',"grouping","begin/end group"); + help_style_line('\begin{group} \end{group}',"exclgroup","begin/end group in excluded region"); + help_style_line('$ $',"mathgroup","counted as one equation"); + help_style_line('$ $',"exclmath","equation in excluded region"); + help_style_line('% Comments',"comment","not counted"); + help_style_line('%TC:TeXcount instructions',"tc","not counted"); + help_style_line("File to include","fileinclude","not counted but file may be counted later"); + if ($showstates) { + help_style_line('[state]',"state","internal TeXcount state"); + } + if (@sumweights) { + help_style_line('[sumcount]',"sumcount","cumulative sum count"); + } + help_style_line("ERROR","error","TeXcount error message"); + if ($htmlstyle) {print "</p>";} + print "\n\n"; +} + +sub help_style_line { + my ($text,$style,$comment)=@_; + if ($htmlstyle) { + $comment=" .... ".$comment; + } else { + $comment=" .... ".$comment; + } + if (print_style($text,$style)) { + print $comment; + linebreak(); + } +} + +# Print output style codes if conditions are met +sub conditional_print_help_style { + if ($showcodes) {print_help_style();} + return $showcodes; +} + ###### HTML routines + + sub html_head { + print "<html>\n<head>"; + if ($utf8flag) { + print "\n<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">"; + } print ' -<html> -<head> <style> <!-- body {width:auto;padding:5;margin:5;} @@ -1035,6 +1174,7 @@ body {width:auto;padding:5;margin:5;} .word2 {font-weight: 700;} .word3 {font-style: italic;} .command {color: #c00;} +.exclcommand {color: #f99;} .option {color: #cc0;} .grouping, .document {color: #900; font-weight:bold;} .mathgroup {color: #090;} @@ -1071,6 +1211,8 @@ sub html_tail { ###### Help routines + + sub print_version { print "TeXcount version ".$versionnumber.", ".$versiondate.'.'; } @@ -1091,6 +1233,7 @@ Options: -v4 Same as -v3 -showstate -showstate Show internal states (with verbose) -brief Only prints a brief, one line summary of counts + -q, -quiet Quiet mode, no error messages (use is discouraged!) -sum, -sum= Make sum of all word and equation counts. May also use -sum=#[,#] with up to 7 numbers to indicate how each of the counts (text words, header words, caption @@ -1114,6 +1257,18 @@ Options: -dir, -dir= Specify the working directory using -dir=path. Remember that the path must end with \ or /. If only -dir is used, the directory of the parent file is used. + -utf8, -unicode Turns on Unicode (UTF-8) for input and output. This + is automatic with -chinese, and is required to handle + e.g. Korean text. Note that the TeX file must be save + in UTF-8 format (not e.g. GB2312 or Big5), or the + result will be unpredictable. + -ch, -chinese, -zhongwen Turns on support for Chinese characters. + TeXcount will then count each Chinese character as a + word. Automatically turns on -utf8. + -jp, -japanese Turns on support for Japanese characters. TeXcount + will count each Japanese character (kanji, hiragana, + and katakana) as one word, i.e. not do any form of + word segmentation. Automatically turns on -utf8. -codes Display output style code overview and explanation. This is on by default. -nocodes Do not display output style code overview. @@ -1199,7 +1354,6 @@ options or the output will be riddled with colour codes. Instead, you can use -html to produce HTML code, write this to file and view with your favourite browser. '; - print_help_style(); print_reference(); } @@ -1235,52 +1389,3 @@ Rdland being the current maintainer. '; } -sub print_help_style { - if ($verbose<=0) {return;} - formatprint("Format/colour codes of verbose output:","h2"); - print "\n\n"; - if ($htmlstyle) {print "<p class='stylehelp'>";} - help_style_line('Text which is counted',"word1","counted as text words"); - help_style_line('Header and title text',"word2","counted as header words"); - help_style_line('Caption text and footnotes',"word3","counted as caption words"); - help_style_line("Ignored text or code","ignore","excluded or ignored"); - help_style_line('\documentclass',"document","document start, beginning of preamble"); - help_style_line('\macro',"command","macro not counted, but parameters may be"); - help_style_line("[Macro options]","option","not counted"); - help_style_line('\begin{group} \end{group}',"grouping","begin/end group"); - help_style_line('\begin{group} \end{group}',"exclgroup","begin/end group in excluded region"); - help_style_line('$ $',"mathgroup","counted as one equation"); - help_style_line('$ $',"exclmath","equation in excluded region"); - help_style_line('% Comments',"comment","not counted"); - help_style_line('%TC:TeXcount instructions',"tc","not counted"); - help_style_line("File to include","fileinclude","not counted but file may be counted later"); - if ($showstates) { - help_style_line('[state]',"state","internal TeXcount state"); - } - if (@sumweights) { - help_style_line('[sumcount]',"sumcount","cumulative sum count"); - } - help_style_line("ERROR","error","TeXcount error message"); - if ($htmlstyle) {print "</p>";} - print "\n\n"; -} - -sub help_style_line { - my ($text,$style,$comment)=@_; - if ($htmlstyle) { - $comment=" .... ".$comment; - } else { - $comment=" .... ".$comment; - } - if (print_style($text,$style)) { - print $comment; - linebreak(); - } -} - -# Print output style codes if conditions are met -sub conditional_print_help_style { - if ($showcodes) {print_help_style();} - return $showcodes; -} - diff --git a/Master/texmf-dist/doc/support/texcount/QuickReference.pdf b/Master/texmf-dist/doc/support/texcount/QuickReference.pdf index 0661b721af4..146b8595e07 100644 --- a/Master/texmf-dist/doc/support/texcount/QuickReference.pdf +++ b/Master/texmf-dist/doc/support/texcount/QuickReference.pdf @@ -16,7 +16,7 @@ endobj /Subtype/Type1 /Name/F1 /FontDescriptor 9 0 R -/BaseFont/ZDNJCT+NimbusRomNo9L-Regu +/BaseFont/MVLJLK+NimbusRomNo9L-Regu /FirstChar 1 /LastChar 255 /Widths[333 556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 @@ -39,7 +39,7 @@ endobj /Subtype/Type1 /Name/F2 /FontDescriptor 12 0 R -/BaseFont/JGUGLT+CMSY10 +/BaseFont/NSJRDV+CMSY10 /FirstChar 33 /LastChar 196 /Widths[1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 @@ -61,7 +61,7 @@ endobj /Subtype/Type1 /Name/F3 /FontDescriptor 15 0 R -/BaseFont/PILQXE+NimbusRomNo9L-Medi +/BaseFont/QZBNFR+NimbusRomNo9L-Medi /FirstChar 1 /LastChar 255 /Widths[333 556 556 167 333 667 278 333 333 0 333 570 0 667 444 333 278 0 0 0 0 0 @@ -85,7 +85,7 @@ endobj /Subtype/Type1 /Name/F4 /FontDescriptor 18 0 R -/BaseFont/MTDDJC+NimbusMonL-Regu +/BaseFont/IESHQM+NimbusMonL-Regu /FirstChar 1 /LastChar 255 /Widths[600 600 600 600 600 600 600 600 600 0 600 600 0 600 600 600 600 0 0 0 0 0 @@ -109,7 +109,7 @@ endobj /Subtype/Type1 /Name/F5 /FontDescriptor 21 0 R -/BaseFont/RZRCUW+NimbusMonL-ReguObli +/BaseFont/EBPJJD+NimbusMonL-ReguObli /FirstChar 1 /LastChar 255 /Widths[600 600 600 600 600 600 600 600 600 0 600 600 0 600 600 600 600 0 0 0 0 0 @@ -133,7 +133,7 @@ endobj /Subtype/Type1 /Name/F6 /FontDescriptor 24 0 R -/BaseFont/EFLDGF+NimbusMonL-Bold +/BaseFont/ARYKSQ+NimbusMonL-Bold /FirstChar 1 /LastChar 255 /Widths[600 600 600 600 600 600 600 600 600 0 600 600 0 600 600 600 600 0 0 0 0 0 @@ -156,7 +156,7 @@ endobj /Subtype/Type1 /Name/F7 /FontDescriptor 27 0 R -/BaseFont/AFCVQE+CMSY6 +/BaseFont/FJIVFI+CMSY6 /FirstChar 33 /LastChar 196 /Widths[1222.2 638.9 638.9 1222.2 1222.2 1222.2 963 1222.2 1222.2 768.5 768.5 1222.2 @@ -174,16 +174,19 @@ endobj 30 0 obj << /Filter[/FlateDecode] -/Length 1758 +/Length 1896 >> stream -xڕXKs6WH͘ߏ&N͌DBk -PA2Eю{bp|ν>8ܾz8AF];A$q<'iܾsons2hD\^D3}-E;5}H(OIIa㚑VP8ް揾.^fgbZwLbAIeǝ! PO1bp$'I7/}}+[+T($Cj)7GTʞ1RhOziΒ0~UT饰`ޱǑ˓ae8p|K½[
q,"щ>5!LIʏ$VTk0f.3юfRֻvx-=[ng-F,C4_F顂d9BH[K[k1-L -:O($PE:Z7F>¥})A'J\˚w-*`lm|hKo({9o֜qg -ШA}YdHyR#(}4O3Sc -Vc&yptiAó4a!߮ -G0Z193%5yw:N"ڋDvDVUuka:;L2S^ڲE)*~ TX&z9pOk7n>YBVHGVehn`ZH;)ղoؑKCWnR3$M -CӘ1M,e4J3T: 1hLk Vs<m#Ħ|Sҿ98_>`Sv^ۦj'aQLַp)) ٘q#E*xsM=F]|ATW3E S=.)kMG
+Q,=o syN +xڕXKs۶WpI͘(AtN&L&Nog,hP +q|= +Jŀ;s'6냗 +RJsɞ({,|u`O{ލ8XC#?͝ۅiawa@ϱP3|J>%~-ByyD +!Vx8 ?5li݆V,Rty6ع9V&]GXA8NQ8b;c' +Sڠ|/L^$e!;u@TG/6y>1BepGcE@ P3crd{;
\aݨQun},v<ƋY7-NZ"g$(`dPݢOf T$3xw#!wI^.694%@ϙ8N[[wuƕɒ +GtSͻo/"4Zb{~f?nډ0ztOQD$ܶ-IѴ+=au@"мEne8&i^`?8W+%9ES7_6daa:#yC6o$Rp]ټWgWTmvQFűLeQfѼn^GvQi&=)bRf> +E8Yd*-(Y/. +,b&tV?)`d@qOk!k+j>l"n;SoGN^{围HSEMwṳ9veLs9Px7 +D4mwgOTrOgoc0 endstream endobj 32 0 obj @@ -210,7 +213,7 @@ endobj /Subtype/Type1 /Name/F8 /FontDescriptor 36 0 R -/BaseFont/XNWCOG+NimbusMonL-BoldObli +/BaseFont/OQNBWV+NimbusMonL-BoldObli /FirstChar 1 /LastChar 255 /Widths[600 600 600 600 600 600 600 600 600 0 600 600 0 600 600 600 600 0 0 0 0 0 @@ -233,7 +236,7 @@ endobj /Subtype/Type1 /Name/F9 /FontDescriptor 39 0 R -/BaseFont/WQYJPP+CMMI10 +/BaseFont/RRCJKY+CMMI10 /FirstChar 33 /LastChar 196 /Widths[622.5 466.3 591.4 828.1 517 362.8 654.2 1000 1000 1000 1000 277.8 277.8 500 @@ -248,50 +251,23 @@ endobj 570 517 571.4 437.2 540.3 595.8 625.7 651.4 277.8] >> endobj -43 0 obj -<< -/Type/Font -/Subtype/Type1 -/Name/F10 -/FontDescriptor 42 0 R -/BaseFont/MWYZOO+CMR10 -/FirstChar 33 -/LastChar 196 -/Widths[277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 -500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 -750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 -680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 -277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 -500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 -500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 625 833.3 -777.8 694.4 666.7 750 722.2 777.8 722.2 777.8 0 0 722.2 583.3 555.6 555.6 833.3 833.3 -277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 -277.8 500] ->> -endobj -44 0 obj +41 0 obj << /Filter[/FlateDecode] -/Length 2691 +/Length 2325 >> stream -xڥˮu߯Ц -D -Sg-|k;kю3`jDV4oH>B#+ }@\2fM78!(Cal[ ~8c)B~fJj7M2ۅ>G}h휷.]{:cūd -^ q2ȈJ (U=cfgaur(VRx]y#фmѵ2R-Z| -?SnyN~ZBH50AhuIxԐQ5
g,r%~;6C]잧kDdۦ||mN_7XV'}%|j1KP6To"z5s\:{V$ҘPoHм -n -4
ZMAWn
3pe(~I恦!OE2i֭oU0jvƚ5h}08ccsZXYatS-4B:,eQcvNb3+V -b>Apq{
" G^ L0M]ak}c2[7\PqwLP`~ 4*sU!u{9y\X47F'w$\eBk< -rg CjI -8Cڢ&-ĎdH} -qZ'$#pqEۂzX8KەkRW CRx%g#u<N֍dO{{# ->آx{cPӑ)k &E,]Q)O snJY|W NmJMQSɛX؆C|VnqHetb83h[X,<=0)bD6 p&"%,~)t -h}5'Ǜk(\9mkQkl\4J}ث:N>ݶ2ƥ
l19PAeK'2euU|b0+whMs`F=NN$'xdrl^ +}ckU5[SL2XC`<Oჶ-^LNeyLhAiT-u}US[ -'ÝYS%!QgU_Ǝ(8t@*,lb*[.*{ZqۜDWE(&ʧY~mnyYq^#)zL2 ES-Csۧaq3~WH_{dRZz{NN,WDX,6leP֜'sG &IݤNP]dhv?m0<^DC&^VSςn%a ,AU5 N(Z?їIX w8IW`Vepڨ=>"ӻ(2DGPBv(j¤yRw!Sv?]<|Uetnp5FBP zPWW}/ +xڥYY6~_d͑DK0$LX{mkF:[)ђ42OxŪ9na͇x,0Y٩Xf+Nw]ثk۩mϺ~C@*JyclwAy-cJqnKӫ*N7VˋAw=睝hfХBs5'ݣ`]d"EP&"|?(`Ef[%2
h1>_KN-O}+gIdwk&i#FJ}}?U0?l`gL"đʵd12W4Ed RkeX_;9|Ov+GRj4sxl-57r+@~V"Ȱ/u7|6P6<=UzF3^9ɶu;v<H%5O.
grc0PֺfKWZ")bRj*2B0cC{|am}Cim +?64vάwʘY(]y
omko]ʛBFapY<Ad(z^34"F*t/GU
G'3NpbF*Ei#`2{r01D4$Lc%X 3Gt+Krȟ㣕Ċ>Yͷ+Q#+,Ix#qψKA` (ZG!x@fJj3MVo + c)W8 ,̕ȥcLJR0rDu#A7qmuwߐJT::!h*:];^86':(˥Ǥ2(,~;6K䆻F' "S)oouIhi mR,\"{ë^ΑC5+.Pۢ;" +Ej9<E9lAbZc)-2N&ٽ-9¨b29ʬK ʔRS([d[(ǓyfmxM/Bە'МV8fxp1/uޟԧ_%,eZK:4
zM+va9cq]T"nQd4@Eo-$xƦo +Z]qݎXS\(<4qo!!^%k +>GQ"=o +P)m M4/,tڸ2ѩtwyi=a2_S&QsɛX$.R9uG# iFlNkX,ΰGdzt1>Gp&A(+4
`R +c'XwJuoy瘿"2G<w)%
rS]ɃIM'crNvLsf^pm~Mw:&?LLrW݇1r0`B!$db^qo_O endstream endobj -45 0 obj +42 0 obj << /F6 25 0 R /F1 10 0 R @@ -300,28 +276,50 @@ endobj /F5 22 0 R /F8 37 0 R /F9 40 0 R -/F10 43 0 R -/F2 13 0 R >> endobj 34 0 obj << /ProcSet[/PDF/Text/ImageC] -/Font 45 0 R +/Font 42 0 R +>> +endobj +47 0 obj +<< +/Type/Font +/Subtype/Type1 +/Name/F10 +/FontDescriptor 46 0 R +/BaseFont/ZZIIWZ+CMR10 +/FirstChar 33 +/LastChar 196 +/Widths[277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 +500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 +750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 +680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 +277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 +500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 +500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 625 833.3 +777.8 694.4 666.7 750 722.2 777.8 722.2 777.8 0 0 722.2 583.3 555.6 555.6 833.3 833.3 +277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 +277.8 500] >> endobj 48 0 obj << /Filter[/FlateDecode] -/Length 1436 +/Length 2069 >> stream -x}WKs6WHD0 ޚiҦg: -^mDeIT4&1ɵUSG^S$mz -#p_.\(,Nؕp{/\ -YJ\,I`{N')֤i4: -̰p'.C9kN/,1acݵ'%4xM*sIm$J+>`æ,T{%){5
(pSB(6_K%g5~[^ƨ2hXuɷqpPJ;QʲYg߭"Sq(ZbU
ɒ(UoGWAظ{]ӼN$gȋ{jnm:41Rx%̍uVmI:ȫsm"};cu%C˳릹VL2IG_ZOgyAr`>5&]4x'q
7݁nΰ1v;p8#}hU"[sZZNIa.6 $XLߎkhu-[HltJM]뒥;bn @^GgeK:z]Tx(XI;zݢH¿Ss|=gVK=on<8#H mҖ?ѮU]{SY#p=|b
QʔK2${!Eg4HB/eF2u{Dxgye:KMf\zË\c43PSv20S߆Ikl["Пx@&sزD QPj^*PQS:Rv~h* -@:\2a;9`gYWԭH#hb;@Jkld~r\ˍk=Fb9Q)vsu>֓n05a9ی_sbXF*(RrH?l^oc>;47膗@D<K +x}X˒+F$]\mH%BR!)\$$F³~inbǛˆqlS2ϛLd84K2ˌ&USs~tZDӵUBqlSMl:#I㵿5o>UQ6U<B7[tOitk&^^C.Ua6$Q%
ƴHak3@anF7fp5gO4ҀG +-l<nW<Dnu}lztG')#FMo}pn +Q7wbT*OсEv^sYCy(=h.dQIԓbRGi֑mh0U]umNW^,*#8zr$k= p鬈H'[ZZer.y<W;(BCT3Luo'G/r?U֚0,y*;@S|GDjzp2JL0vrlMJM'u\{`>03VN\Z6)l;U黑cZUERF^lmϿ:HA]tNuom%:GBi"[{ӝ{V'g*Sru:aK?dњ[azXKy»J $->(С8*QE'@Fo6I5 +H*YJ}WRpg)^ZCmCy +HDW(2/ +WzvΒȋ^L4j ~PP6^\熪m߹K EX=$8;U)I2ms +G,9>'st֡Hf66UagNԺ\]ssmj\Aiʁb(,%WN'܀ݗOGkm,ՃZ3T-S
EAf#Wj&?`;F<WW"CsZYRk<Kfɚs~h[,&/[HM59n|2,Y*㱃[d<K!S 8,CbHjN[[@ה]έTK:Y8{z)$PΝJϙ*n5np)F@{2ړF@ۥ*5g55b=+C%Ř>#57PaRAK셀Qzr@?%C >DDĊL?%h)3RUG!}<S~y1k<9*\"YaS|9z2 +es\ffb4AGIg( Fp2a!ǼuVt o QoT O]˵еV㶀>4 ܖ9B}1)qUW,𗀄g1H
\)ȗBWP}w<0O'<VdCJ65_zbj^@}d}PN +<L(eshygIX endstream endobj 49 0 obj @@ -329,9 +327,12 @@ endobj /F6 25 0 R /F1 10 0 R /F4 19 0 R +/F5 22 0 R +/F10 47 0 R +/F2 13 0 R >> endobj -47 0 obj +44 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 49 0 R @@ -344,7 +345,7 @@ endobj /Ascent 850 /Descent -200 /FontBBox[-168 -281 1000 924] -/FontName/ZDNJCT+NimbusRomNo9L-Regu +/FontName/MVLJLK+NimbusRomNo9L-Regu /ItalicAngle 0 /StemV 85 /FontFile 8 0 R @@ -355,102 +356,90 @@ endobj << /Filter[/FlateDecode] /Length1 1662 -/Length2 19288 +/Length2 19695 /Length3 532 -/Length 20223 +/Length 20636 >> stream -xڬct}&v*mtR1*vGضmtl3}?̜y;e|k_k:=3uuQsSvSdRts!PQI8[& ~9@`CH88z:-@ -dffbfkڛ[8-_e0'&p[eao3ۮgѓT`[_r=%G\`besob?J& g@olJ?Hٛ93; {?_;M{"q;!ׁ[^XXxX!Dï3l3.G4;o)@۹1v/TP'7|e?.?c1}!"zфx;e -l' yeۓA:>EH$Ӂi!lװ)5?YFN;c>WL^㎽,\U"j0;ǣ}$ɴVU/ΊC$!tbǒ Aw_vLr*cwQrWwkH~`5/ݠx5@ -K8= Y"A/$mRiw\6 -=B8 olO!cc<E9R5)NDEҋSԜ_zceE><a#HeY_V"
xw}GKIhI+9QS@s詞aqew# -s,)AVPMZ0}hC7" [2땴ȇwbJVWG-n+T
GrBPxhޙto`ң_z?RV`Ǚ`<$۴Z\6}]vtD)p:W;2$^x{ēP"_Z6hgfmB` 2R==(.&{-{5 /]S8xzB/ <]b^G* -H?;q,U3Iɢ}fܝK:Αl'Q|&ԭ1@ ӾuCN[8;K~R]9"WI<ajR^aHʸ!%BoSm@6=vC L終[f!~u?ag#c+-IVL`d;``E;(_>"^rZۑ$p822a]=}5*")(S!m63_#qD\y0m|F˒/ JMYo2LnhUqF!x-L3W_屲~q'E&VɌ¢N4oDAuP[ݍ:շ[Q:Z*5/yYX)EQ-qCۢ,x/':*|iup&^|l,_
B}4̕PlR?'rfI2Ǎ'xҼcs\kۼo`ɴw-VnAdfj-Ve&lKǷ;@VYCM>x]πDHuWU6t;&h*epor*o(*ajNS[wʂeTޯ& e.>x"l˄ -#k/ԿPjMݬ,T` -]&T.V5Y/TZET&N˃bЫǚͧPi[.
y~$:fA6EE~N~(nM~?7W\@9t/a@!k؍{]5Gycuj@sПD[@El'\#RuL -^>J^ -gOd@ -@l/7Hu4VzeH#OFV`T7M[+fN!b)sh&QWOZqfU0hZ59;Ċ?]գ@b76h3k]:8M#A4E72 DS{kwɧ m5:7S㜒7KϻcgiFj_Q}Bٞx(bIbHx3㦲Ȝdq/Ee?Sq&Tv̿vn+`ckr|ē)RܜrGrdOMf=L{98 >UYlCy~%ծR˟0X&/߄yagewZ0"Y:* -(qQjk#vv$:n9}HfPAG삂Z5GYg_ھdD63pGy'{c^3,.Ќjo3eC8ҡ,2,{[ø5''-\,wV6:;EcZ#buP߹(,g*yW:gT2r-/2_y.aToW>:vt!Re5$B5"6>P02KW߈FJ氷2ғWKT@,\{HQvRriҵ<ݚ4$Uy6MK9Θ%luHbeYdoptd~NSelMPFo{% }/ {T+tD\ZD)4~ޱc̹r<q>y^P5[/8dHCQHP~:t^w 76O W']EGVMԲb[(L1^{Xꆃ&8hP`WP:yR:f%սFfܞft>yԽo8SΠ$g\v''d*9PcqB:n>)[af
yK&DJE]&cz)wͲ4ݞp~PO H#Lc5KDW9TF%9yxACDni¼K_^0v6 -;W\M'VxiQ*.y -į%)/ܸfF2@U<ʊ<{ 1ӌbn="/<fۡ8_;m9-T m
Ktag3zGbjE7JSF2Bo@ӵK KH$eQi6u?uDS -{o|^62Yw[y3v9P`f+WԚP1ݣvqC8º0 -@9E'U eYFucКM?h]I/҄fD=Z, HzDN>jH()L9h`vtt2|AvLK@76c('6#Nyc@ݭs'=B8҈cSMw2$61&D>Ԋtbbi[_,&
8},j߬!3{#RyyE#ۛBY&iMM9ӟ>D/:#~+g`>Ղ}X#;<Sz*JPJ,O0qgH2>;2oclI -GFRz}H-c`?yfP{\;(xS$'1N5f].)D"!?~Tj g`e1yL#sF&cDǦD[2ǴsizK3c%fnl+ҩv#X6t@'L[jsUf#4[_CXJ}$> -
ՇT^+5% Ѡ]{n־}?vux&znj}K_
Gw%_lIz9BJ3qAO!R |[9eע5MC<>ք)[wKdKe{n5Q3<*8*!]_Ҹb<H;u[X.fBM
/z2^}<Y<Ƿsցɒ#-Vtkq)*Zz>@I)P\zU -HA -T*_maBwpG)MCqthB -ZW/PJG]Zx3} -*I=ykFHU{(m -5b1̪VE=9<RG<7bPQFc<s3vz3-:U(#`*<_E}VP\m! i
\X4Ƃajfb,p4|^>mx|{lFݟPf`'qjQu: k~Dm59ݜfqa -Yje\VpwSjZ1mۇ5L|Q!'S -}Aؼ붢MYf;כa KwMaJb{LPMi.\'{$<s6Vr_CРWݜVZVC{=G,SzPNm -1_Zswp55$h=t[%"23,
g}ÎVϏK8GQmqj5.,gQ+I@B -`rO() -wn5T}DL -sL
F{{qeC#a "CDs(SX)t߃ -4]bɜYPшON.x*.+F+,
Pf=xH@<z@4JҳB:9 dKG
L$]+ARNS|9AWq2'I0a3ﴈv'6vw>-%b(lٻZ1o{ȃB`i>w傪q߱fr,4Lqݏjp#,_F#!OibOg+t92dE(NOWxd\Άoh3`H}Eu@p -!.2ÃYKAF:h
Kڢ$C5qbA7 7shKY]yqK]fpaȅ@Kc)Ϗ;Yo)!J6-b_!LӐc?EU&o щ|Fhr<縋O[Y֎!uMXwb9KE/-;Ș.b -
귚<X'Vˉ6ྕ@1rU,||gGVRc)Gx
-cqnzMrE*"3,HM6B446fqϲaTk۟9AB>$@2Qyz$J$fCuᭋdkyi;-nP[kQr"7XsHa&.
-tB24Sry_kҷ&}! `d+8%"
j,דeـ0 ˜A=`lgS
˅ -)XW=n *Ҽ YqZYFFϞƝv D+he VF:=o$cDEB7Qj',^F -X*작0ԗ mlWblA/%]ߔ*S< -$GIY_Mm*:×~YvJ#vocM:k#y(2Z9="\1<*(Ϝ8{@DF
χGr̰TXJ"H.(7+*Cm - -ol_S v(y mЅi$@Ua^kUѳс%<3*#;XgmCZV74FU?]UO] -`qjCc(zj+)#mX2 Q<'*{+z/ۍrB뇀Bu7'
o|Ԅ)? df<!]j3.Ctvu%T!>8ISv%)ihm" OmFsѦ^(L4M e/IsNMGt`eB|L[W҈3X<^KoHFi:վ2жOF>:sZ<N0bSdA< -MiL<lJU%aiNwX~rb ˟,ԑA_S#pnDA1mz͑X\v%檿_XpNC,c#9v_x,%V(,*(6M!+lq<[97+Gڕ.{1Eoé/x0(ȍ$6
QQCj\. -{+Cb}K~Z,^抺Ny* 7?L{?7j?opQ#*Bp-gujȌY0G_IRR&[! -nlug//r0"WJ6' -J)יvףxJV糢 -bzyJk>}8kSkL|2כXN#?&_h(~(|sYX{MLnZ~CҾ{H,^'rgvP -vYiކOy&{d>ꞪץX% PJ zp$ߣdga}>9TVYh33XEn4lYMvgS}wahm+u-P$^J:*Nop@Yz<ϩ'~zР -ϞG6h#YԊR# -`,.yL,dӠF*V>`O%^LGEwJ:ys&V"Hhl1ETGrZ`Ma -aY~͞L -<63"N:Nva,˙fpK<c7<&!Mo_r4M~݁#$tXՈ>b|ˮB8RxceʷqO6?v[x\S}c<-9w-jcO7M -U%ҡO_aCJS+7@1#V(<]Y@Kr<^UO+$,W@vX%(+IZ5i7I-%t8ksfOJebε aǭSk;CjFEk}:YlD7 -Y͌g>$sƱmK:AKN~42yæRoCԍ,v|ßtSe))aTnU7BX@'k_t|7nZ~{c|nt&`xɐ-QZz8ѐӠgGu\
;}#Dߥ,S2Ц -^/)1zvU(`0LTv 1zT.B$<Ro&vo*C4% |`ixr%< -EuM~G} gpXG[, -S<6[~u`EےMc -Fom)(ĄOA* - gU%4XklmYJt|3c//BMOe0+ftSFPZt:|LOd6K)(l~ܒ4 8@ʪq3>-IP1aML&~0h&ӹocHg(*R'@xhB~CPz>ܮPØ{& 9SI%)t(#SjdNo@Ir'tS4?sALYC^;|3fZv'"2{qĆ3 /<}9H@4DY_ kdx}I-PFP)JUbBbF=5Y#:W$i>cmHW]=/@@3ḵ-?Ye2cśG)ؼ孄=\{#-u3e
ۦ|נ'XΏZ¢]@IQb -q 2cH)I=4hi*@J|"i㒠X] ÔUoW!1@HەAHmGY*9tss&!m?61N*A[rIsjBnoN -ʳ|:wve"ha٠p4? -ϸ{bh7u}XV~gh}T7<뿳,mmWӟS+(8;4x6qGQdYd`4|V#.p7*dȽIqO1ticpvD.KXKM+G29Yvq< -u닥u[<?H_DtZ^a`' -NCW8q(a>ΜirL{EdTX挶"
]?P:?kgqk -E&~$N6xsҩ{&v~&t?:-On:Џuk4`;7w͇ʎ9§:_<8rD1zC(*#\N0R94
?5Q#&vwzGYpu<27.ڼeIN}fI>Gw0Ǽp6a*[L\}F&җ3h~_iTeX^.~]e -[e"gtRvOPc* -j't - -/`tmCY,watlfi`)#ͰxwfS9_v)˂#|rd\lf%3EoYl]vhR9*"Z"ns_5Hoãʪ{UFiTM14*bؒ173b$cny -7noQ5zdb)='6!W2eϤexu
>Дp0p*^Co;:{_@Iq3;aOך9鼇&8o|S_]drݺB|nu7Ok`K?l_8YlMVrTwu2? 1jPd{-x/[z n)9yZ\qSؐM@fWMFbLB/<D
,M^k46ry?>)+iEb|LqHyQwa˨9.Ԝk7a;
7}JB2Z6Yޢh4"e'n;џJDڪCā- =W[jsW$ce_sz*lq -/d} 9}!2b^6zF/u8v1zUN$x4N=<ٝmnfUF\ 7:oy)9+>dD{
$6J]Fo8g>.
9%;
-qW0`SgH{ſDk#^}4o*~+ʙf!Ҵ_
po0?+T1dHD@AfI{w0 cK9fQn@]KKǘ!VܾgbJ\[\b6{RvgqPPWTbD:JxMf䵑H>W \;1?CR;=rW,ز:'ZCpFеfT(ש&l'eeak EҠPuJ^Ոfa6>_s@Θ'5蟽X]x1;""Ko131]t]KD<Y8R$hRc>U_
1O~D'\zi!r-usbK^sT">2pz Nr#R9FZ%ی^$* -ӱC<L.g:i({\%V[2!5JsNFbɀ)8ϦuH.P(|ceLf;_5Ӿl46ze'l= -8-ڈzupt4=lջ
ť(j)/}:w%5keLMlL*0>M"mU8ْYECɴkG;`>hh}5!n}>\")`d0ڜ}%y$!\̸Ճ |'ZW~Sy֩ -}$^- <M_ȿNA2U(u>Ap86$t),p몐L:XaJf(L9
e2Ӗd@{0ߏ9m.JYqYOݒ{MP}:0I>y~ᅵ'z|b:{8SI!u($5E<2S8[ۖZi֊Z9<P~JTne0s@zu(č隲kOᮠn:矱F(1>rN93#UY1xa3"cP(&ڢZ/aeKD>#f2HQ2`dU}5!_lٜ4 -s#/e-轙<9@,×iU
j1!D]ΕQ>xKm#GzbwRAlW[Ʃ3ѧ^^nl8$,Ic -]B1_XrlXUǚa(dKhVѐ-jcii,տZ[N[tHXYb_aK!r4Fڙ8twwwv8]wČ:5Lw}6tw1ݼy?S!8 -y/u&D q뗺Qfov;G{pݞj3Nue4%TLpŴè^uW2svØI5}^Ym -نA$Q'pp0/ZY!4\dkٟlDOQ8l[!zc. -h?n3p&x[7;\dimr&l NM']?qtQ9W2j"Fҋ}U6aw}Rɫ>E8Ux $aq.ыy3yra£P̻S!qY}:|5zwr -_EstD1d PJ7S?n2x5 -Ȳ5;1/nλ89.#PX\YnW9$ӏXOys닮 -M)U[" -e`MVݾa$kag -z=$ya -l*:w|/WBo5xF 4d7TV$Vv8@9^:mZu}&:VJqS=b*gB$ze8n
qauG2m ۜMt1TSQm^$T+.=Tpg:UsLfTqsÕQ2nX`F3(mZ*ֆ[dpSzY HS]6l\[Wa+@ג)%0-Xn箑'F
kBQ -o xMTfCd ,RH}b<(:#*zʠwdxOfiNL;WɷwHƴ骞TK}< -Ow`q'_gK"cv &Jz=3PZf5a+ -<}[#dL\l2[m%ANpt4k]'s&+W&ػO'meyc8GN`H-;`i/6W,SD6 ͐UĩY0m`07SUp =Վpp>fsD8-p3_@Yzs`#2u -d1{\^صڮG̫<Z_}9>q~N]3Yuaw0T7C1Tףt17#.˦(ܼ51| -)0j% ѸkYѻǫE>8Ԗg58Q˅E<87f7>dI\~ -hZM"loEUep+/YCܱ3|9lXz᫇Lb -zwM-ozJ'isI6gK`XPPWibWBN%w1YI}xs3l@l)]\ۈ?琶yd(jhk<3ye|iBBF>S%!EǕVE0CQ7!l??[%})w -j&
`f?^ +xڬct}&ul;۶S1*vǶٱm;cw:L33g|9joZEI(j`b.`bdeb(L\]TxU-] 1Ȝen07Xyyy)@K+FCU?$ +fajhltq
+/Ժ*~諜9BqBv!UE&/<S|J-HI"|ly$qY*jixktGbL8 ɋ]5Ulo1QP=(gZ1"Sl/
~Eո~l>g'klT6
I z^7 +} kJbVP䗜-zn{b2Du%p;n$0->Ft)o}qԏ.A&[+D)9\6\}oZp!WybɀS\6qΒB,@SZ|M[z 4a)A*^c/ +@ZFgEH=&O)b28:~zVKgʜyDί6y6!h"lIGt V,3Zh1LGYk߇ȞcWE^Ug?(6Lܬew\'T.Pwԃ1.^۾EUGT( t'N*bjG-'HP9j.,~Q/in;5g@657&M#~N+=~nm~ +4E?7\@Gya0@akŸֱ;^UGojT.f ?Q˾Sg=ƩE@e3llb#uL?oS7<#3xԢByV$84c.OK-&ƶ2"PJkWbE"q}e(iؒ?Yԑ3Av)^o{_#uݥt2\[C\"MF65EAlWd!MBCُX+SY0\/n8%ѡeir~ҧy +uIeJb(9;CM?EX|&?,o [7\\ #[˗0*{mTcY"ehYrc7HAYZŽ761F%o`h$w +LkV@nn[,Tv*̚Xξ]\Y.Bڙ߀?Ze! +@=Q +M)|.s˶0ӑPA`&w H#L}5[XwTf:%YX~cDNY㟢^v6q|{ޖ]bL'Vxiu*/,rrCkZ6Ach钾ddkW-`kDt7U,'vi8>xڹ6q)c>w>\-~Z^Z>~Vx'38L
'?#Y +[?ԾT芋j+KSd@Э$g<!&u?$u4zLXBZ'uldwZκiChsOZr@RT$?:k8|]'&\I +`rn1Btv`4Ǵ- HR +kBQzG5!$K fW`<ݍ¶B׆9&㠌CnINۑ#±..d5\'+AxXxχuzn(\lL˖;y=.U+Tޝ$FN!CtԦ+o7V-ʲsX!fKP?crST y6c:dt'u_Oj +Z +c}<Pwy1bF#֧HFrs% +Hi!fTY|p,v +**=bHxmЉ1*}SȜu@֖EPN2 B{M3aۗJ
߿}BipZnEw"DL]JGq^dX\2Հ;bL<. !J-ߟQj$-j"?WZ bGUpkZX^>6lK&%NقyF\x|64"]8,c܃gt֪zdXˤ<Y +WƮPa뎤)53.IR·.͔Vf)LOQ>*f]LπM{\p5`h>Հ,Pm68E3jeV4mgP>%+9jOwhL12a ! wH}8odJչե}7E_CJni1F#GhZ +,}ea;&3lci6,vۥ?*K{:K}2u6^͐6n/6Zלԏ-9/cƘ_ +$°,yq0uU{IV3bĎFpahF/!D%-<{|]Ч%D
2Kh=jc`2UU^ZZ2u +@u,J]lC3m{G6]> ;8l[$](;sP!u[);9g @m%,uj<VF:\{$;#0"M&"܇ \>=18-էR6}n}QRP*/d"j1wJ,C5i.Jn!^CSaAY9 eIT1oڬJOa>F䍎oql H!s.U77\PxhK,]`m-x=.1AqZT+u믢^uwbAi)n9lAїV}3S&$S<ai/>𖦹Cf)$j*i [r2~Vrk,22pj4^1]!4^eq>r~M̕o0e5PГ4m/sSq7Kc :}a +ƹ_w9efO!:Z&_%@ECO~'"RbF5k+"uZ~7tdӚG5Ov?)Qu8bd;䟏gya}@VPO;I0%><3~+(tFo}Y!̝
oaw#XԼ^(u>}1lGgL?oeԇ){Q}?k7ORY~T:0,1|wwpU30 +6GP":/D|NO m +_@a/&o;mOu,F=
#û9S|POt?b=m8k/%?*K)XAּ"M:@7"_~ǃYJ6?.MLiXʽ}tY4>+ML%珓f?T|HJȚ4A.:j0o)^ +LAy3i `qvpu+\Z,NWS>p$j`$kvU#cS9zšk;Z٪I K|'bCjyI+m~D73
*9cSZaAoq +#@OS^xO{MS/c\Y;s[z6K(ss:N*u³]CGѶ#i7'4}wgK=CY\G0<7g6bEʦe=Jp}rSQ& +4jvmzK: +.LcҐ }:p]zwLn5F5>y\QhcRa:x +
]{Iz.6|1AG>5z+LbR`1P=\PT'n`/R">F3~9EUU/:Dn@b#(aVɼ3KY9tq驂tp!@ǒ?cOTtYm!Zkl996d_!X#}^(O^[#ҊD*kk?+wLZ֍!uOua9KF3,;oIϛc^6=[&V$*jL^(W N\RvyЀ̥8S:ΣW&˶'
E,DԑgYB&R$4.:®e㼉?Ri\HDe8:OO"+4w嗅n&3IqƭPiCĦC0U1_\cMy84_S`$Sr65Z-qQm(a08^m¤.dB8|s
^]EL纃0!IveA5Tƴa1$YFbHFuE=#sI8D$_a\u{+C%1"oK!뙽Zxm-'k$㌇J6Q9By؆J]$)hIoPwc2}) +yrQ +#gELA3bM!屯Y- +ўvRZG"
^hNg46gP.Hq͔_xc +2H7PǾF0q܅2!#c+9Fkvg-2s.d.~6ECzQqyYLiQ'n,kNl)WR[%}'b7NeDvud*<Nr;KC=K>ޙl>ȼ.g9j b=5Z;{=dl"F]cb1sT7)V㸩d\j4_z"CFuyZb +rcE`Nlns=U#Q.'$
~j̆w'"ȃ]_hހ9{A뱚l+c_([;'Zv8QPȮHxmȚ3ӌo/
NںPonw>E؆\m_Z'q_=Mw:]wɤ@F؎gyĺ1<բU˓3NnÄ|*en~|g`F>Fr5K9˻<{5=}{PU]i^y4L-tS,,|\>&Τ
+VjhsVW쾮/nE4ęznڌ0l8Z*A{F]2[U\O υ:9G<ڟYcDtrghF" V_qF~;_&̄g}칩70;]&unLܻGepb?s$SH|*j5% +ŤUvU,V
GI{ŭCE)cg&r}SkG0jPX<fckcOM
;apzݗd6:SQN݆ޠ/@?xi+qYvVᄛ0CYzo?
ͩ4~~W˙ƢC2踖 +#YЌV%
+~=9KBiDv.9Hh]<&$T J0=9o^:Ci_:pb1LeV$ᄩmz,5[&|k*x^iO@zoANӵI? +]]V&D'AuG{c"my'[q0^:s<xs6l琶䒔9Mr|{PrX]h~8ύU|r6S) + +[2.p7
rEOo +aQ:ZRScFm6ѸƉ:̳֊|bWH&Y<U}m̈r<a>f<)G'kS:\ˋ/--?(LJhV6O`J/De[ȡg62oxe}k_yZt;1&!D(&r[~̧)_L'AZyzHk=,Qp2yn}Ck>ә0;S`~h4>Dq3a1+Q+vɏ\&f<<Dϥ7c +> *2,nWXPv95}]d0hFJ|q}ώğ
LC<jĭZOK4\V&1|IRH +#ΊEpb82_dD0L)w|vлJLz8J+J2~:TImXN3# +4>t랷Y3 +yݱ|id uC@U%ਗ਼vWMƍ M^rq"#2&Ή*Ydø*$q#ilm&k&jڜ=~| $SE`m * cp[4,Z)|* +BH݉`8y5NrҾ"n@Jh)w|E-jԮ4[zhba(zG:+qĩ +N 18FъP?}2tͳb1*@>w8UKPd$8S:4q
8d`e,deMUYM,V;sA#G:
%R:mp{{$G#o*܃X.1g"'DI_O*ᔝtyfN58 #J~ȿ/qXsԅ+
v0rut^QWibCaDǺa@9$"/FC1ܚ̯,-c^|,bX}l"9-GY0:a
Q/]÷TCĭw|@fK*huA]jʍ*H&G|ITf&9S;>5&銍F9{,t=l=+K-BlSIwZaCZ^XH7Pu+L.m^lfPP{n`xuaFn:34upx\b54ɭͦ4ay <Sߚi~9"6Ȉg.I2_M> :+2Eeeݥjn &g2&5ao>jV[4ݩG=\i/"\Aʭ^DZ@m&чYq=ﬔ)s%0~|::
|0 !dLqx`Lb}ժ[x,m |[l'z>YEy륤H}QA]0@s r +Uocol8,bÍ-+DYK>Q8̷W< +Ω2>[-K݈C%rR~Ga'3By״,lFU1/
*V77?7W(Q [r4{zˍ<K"=Z/C=;aK=;LDN=ʙTb͖rC@a^8US[bA~#}֚n=|:
=r.5"xy(*2aǿjn0͉'! '(<c@r%CdR4Eų,o-ޗȆC"KP{TGh#cZr +)mxXUn/ A:NWXB +?]ƠDZRtH63*C]YUFć|Nqƀ +yH(rb*FĴyhy݃TT+?Z|96^ _~1@AnΡ+|@+
jɾ#S +/9;jk[c"mS)GOIJEIrA]b4N*֠ztr1#7&!W"uudm
.p(p2A]+ +\A}qefM?.PJR#icv, O!ɲX26"x"6^R(_gP7],@lBQXQMuY=lzF?|NO4Ed*]yK^zmqK^#[2=pUh#TUZ#\5)cQ<'zp-2,wZ5 +H؍N-}{y'~羄ǥH''+`g +=iPOp&(R)wKjT?>;"[FDvجF2̕oWH^M$>5+dlP{M`$%Ǹ+ʣTy!^̎\yJMwNAu
dNY=}f\MJ!t- +:UKVm`\:,Y)os15Uxgu,~AX^|.ʡMm2kl+IVUrBE0@X5nB+@n9r˧2sKBʖEa?X[G{FWy26Ȇ[ߡFcV!LWkZmss.FPP
OEy>"f>$d"/كZ6Z_*WH^p4B}&6ue|8bu"%p{B,(֞{y4wH.8K86wL;gAXK| +^3n55l/.m-1ە̃G7Ú.EӐF߿ÏTSʋ0,Q.4d&W:%הq?>VBչ`A?6M), + +uma3;fs2ԫFaҵK1Z'd$#sz<0CU_]@T s!XUObviaWe,îc>.cM(a&O!X^|겕Iƌg=+ JtISx~1ε*l!0=Ȟ,Gl
_-S0Ba6!j58lOVAaD+tת*f.oשO95C?E̗EձD=יΪdlf*|ċk `uGN,s#p*&3b;/ǍɇT"shpM?лQ +[9)giKO{pR2C_a}IW;5mLs@.;S%AN,]AAs"WX&x ݇P*B<b*2$+dWHa]/RFZ/ÂATIwkT#˽g+I7z-T[8#44)o[t +0XOG,^#!ܿO"sa"i{C +D)eaй,3q˃e
BxES@AsWê2aSuRf1>DEyBC6ڂJwy,ƥX҅5s_y,vlif.t?K_Nia}F7<N3IRNc֟㑓hdhtܲ3nۼEg#[SbӲ+I)rj2~,Wx=+;JswC>|N$>sлL;Qo[igdUfhTW.1<iL= +|;gL-Skٜii>dEɵmZ&~C;%o*lg!ޜ#g0(ޅ~,@djOl4z6 }wvX翵_mM0VF!= ptʤAnTs8)'n`z>w" +Q~ +?vWIwyYJ
Q[E\
$D]U3篨]R*a<q :u/l
zUK| [T~Z'r%uxLk=[
+5sg<u8Nn墉CR h͞0,)XshpkKGo +Yj +x6T0%)p;ή!|?jcK +fP29чq_ՌFKCo-MI?w +.U="P>oՈX^=Y')<Ύc(m*7/5b֬(U̳8nDnT0c5/?%q4i%d]JFJVJ(LXVB8
edTqSyUMRJ/Iq? +:(<L?
K=Bw,|0*@0+?4tPU^|V'@fO+uc%G)'=3r5A5ڕ$$\!JsI`)J +]$UgD֚u赛 +L{hx@'^#bd1<D&9~Xns{r^bQw
v +9J_[hD +1H(SmM
lGEBAw4(۩ggIl1wat]Vo.aGI) +V}ڔ +?$~^S-s)~&ڝn7Tj\J-8bzj8\d)?ʇul-&BepNwxl{5jg9rVGhCcRe6ydw x/cJwX[^x{F}l{9ƑzW*4%ɟX,5qqۍ4dԛ% Q/.ֆ-d|Q`ŶT^OkƘtmEyxLEJUKpEhr@E닇\aŊGS_x䈺/NC7%I:.>4qy?7QD(~X0%E)/WajF~Lİf5{O2gZ~au봼EPiA'ujuhʢWuБ99RnС'wV[SHv"v'>Cn+R95pFn +TQO=. endstream endobj 12 0 obj @@ -460,7 +449,7 @@ endobj /Ascent 850 /Descent -200 /FontBBox[-29 -960 1116 775] -/FontName/JGUGLT+CMSY10 +/FontName/NSJRDV+CMSY10 /ItalicAngle -14.035 /StemV 85 /FontFile 11 0 R @@ -473,15 +462,15 @@ endobj /Length1 802 /Length2 803 /Length3 533 -/Length 1383 +/Length 1382 >> stream -xRkPWU`Q;ժjQ@ !eInf6H`,2(Ў@XD OKR TANJ -t??|; @b* 'E2(u~
(Pri18Ez`tPW|mGw*RGp,v_2 -m)8|{4㰿 8)Z -~ٳ-}eeaIخ$^p>Kwy}hW/{SWYNEs:p|bt v~9*Rn`x,a&$@EY%tn&OLWCNYB7tyK݃G[m8BPz]?p={k+s5YޏNxATqvw ]32q!W< -ӎW -_3-un|SʲsOZ/HUD*iJ7سV<~`5oFᅯDʐH1 hiQ-צt[`-3 oUXt!mJ婙aV?Qjz(_>%D_?Q@F@f(FGp8 +xRkPWUWvU6CC$7ae
$8BQhB,RPTcESNuz{s˛ vaЋXks~ +0<My,tP7`| +P' +M)h I5hȨ9]`!sTi9T "9-Xߨ]KC"\5T~بp\EZa!h9dT)F5fqQJkl
j +F>|;lm'B%9 +c.2hrLA<5=lEjZLoڦ^\d$VL H endstream endobj 15 0 obj @@ -491,7 +480,7 @@ endobj /Ascent 850 /Descent -200 /FontBBox[-168 -341 1000 960] -/FontName/PILQXE+NimbusRomNo9L-Medi +/FontName/QZBNFR+NimbusRomNo9L-Medi /ItalicAngle 0 /StemV 140 /FontFile 14 0 R @@ -507,58 +496,58 @@ endobj /Length 15624 >> stream -xzctefUmTPVl۶mFŨ8s=Ow{5c|&9MA bbkqb`adYX9;*Z2|X -mtκ0S{2=$>qչ).50e -*9=vȝׁ*(( -.6j(ƺGB^%tb庝YGBȢ$}9/MmA@Hɪ3AKS٨d7+6lfn**1
-^&S/DG]`}Fa4'E#^]n>Lpe8TCKȠ>ZʪfBwlzoFƍpb{%B 1=3dcucWe -6R -%P*ҕƤEKbpFaψڰٱ%X_W.1gF
IU?rm'a'BglD",qlV0Z5&|YbVoSX8bxjdJ
x>=>2SS /AEDlm25F[ҐOCM{uEM`ĚiF5*a\.e&JP'~#ߟˁѰx}hr+Tl{('N@)" 8Χഄ3ר9j,A mw[#[ϥPр -Sb 1%#3{bS -5RԫvK"g"<;87s\0ҋxujD~Kw#}ʃ1gj>ɦ#aU -,)[ϔ8nnEJ$yi7*rfFZcU5.K]sr+> -16L鞕jxkTKt6ߦ|7~ -2Dm
{;"v<^)UªC@ 522N#S^> аnq~sqrcXZ>*1H'~{ﮍZ$ߡ|"+du)niυA?}T ǟ\ߑGRު -?lNABwo|'XO\9j:,Aqt -/<pQZVfZnj゚!Lǁ3
[?N3"I$SڡXc˨CYDL"V1#֜/5Ba<
5Zbi/MM8Ua-IoY*@@B* <6QkB%7u!/0AD -6:|awF՛Jk@- e PctBM_.<̱QM?b/9iF⡼$m}$캡q(+u%SjϖN')J~G*v -K(S
LȚ5=)
$\i gjJûu5ۚ`C.FA>iU/4feONHlpxr[ni//"n`(#0Z*ٚ왟%v*lܾŌ`I|v'aaѫű_)2^p.el*YʃKǃ)4d+&aCQP-.=ߜUUqVIV)̀.Of6UMZNh.'ym)f2%~.K8^k?Dޣ|^_m7EQz"PzSRDx4/4[W8 UEnIVԒf%Y\ܽr놌\6:Vw[o<01<d>Cj3 -kHFL7l~QQ% MD@T7,Fddc.<'^E;Bp=P#Du'4go9*\uPkƇʹ4
CFqQƈ%g"+Q9r|#ڤcwj2T,!>n5(`C|nnCJϬ024'9ըmq+2h5VV8,fs6dEq!ݙ좜J/ҡC8h1LhQrg?y-WUq(MO͔,x"C7gFl3C.BXEg~pN,dܩ;giٝcڴ5IT,::|kT0n -*-H(>QIjc#1NlqBtYrޙJa 5{r~lQ$+2CdQC?K%;Vs)K9$ -V"utF} OWO1&6#9"|:xd!qQT^gxIb]",ڎ<;\Gyi7@fF${,^R=_Cgg\𨯯b_`t͛<DgV͞ -kp(:0~Յ;Ѷn8՝P}S|tٽq5
M>cIpu~&*aAyK&5 OOWNЏO#(%;NZkUajGuo0~a|8eC)8$7u/3=̇gѹ]m$ -V+Regٚ,̊'藕.hw5^_~ 嗌@h Ush.ŘIT2PnͭhyEd -x{a(*yhڕKlVV ^$25}2켤 ס+?U1)\6.[Y>/4fJ$q,C{/#YhokA7Xe{Ѱ
%R֓:-kϵi*P#H==OʣiaojP*o'RkDB)Z)8ʾ?Y`yH:+%!7>l
P FlzIL}2r 910 -<b1;W1AqRnT98ݷNMDIv#wC۲eXf"ۺO'PӪz%8SV䅏!kŀ+d<=bLں&M|$KX~=ch &z=CrXOk*rUdXp -U
LQm|c5[Tk xkJrW^(HD}i@
1PYׯq=M?{vbR>h!Ea
t]$탷ZHmFh{PN%
d2o\eN2D,!]nZIEÔll]W[~ -P FQ+s9x'*ſR2P ɛԁrx&REOPoBhi2%0Zmg -!B"%,lɰcf0Btm\j.ؑMtCLހ -q5gڐ_
I!op𬈮>xz\S2`[I*ƾ4[qg=RDʻ:IF -_(W˕RrLÎm?~d^Ngg{)i -Yb$bXZ,]sڽ"T;bqMv`?AOܲ --O/lP -Y#V5/m9į=mt%r:^%Ej&KyWuGHYQ>p)D@5sA'Dq0\?ɼ-<Ĩ8r7v9UX&>6~u/ɱIl1k YS^`]ц=h; eͿ~%^;٩p{rѩ4 -o\!Ǹq}"1C'ChhP-!{Ԉ(.N@g]gښl#b\)[!0lFi`wVׇ}> -,!tw~
6'$Q!%NOƶ<?'-9!h 1Dv>*v
nOKNJ0MvFOwd c&sLsdD3pypaR0Iۻ߽.fPx?J~
{ɶxH*I^!h[wdKߛM]Y?qv1Jˑ2`|XsP<
_0}1|ɕC\SCB9,vsrdMjs*
[!ZIV>005)!JU˓/I)ZJD}zQU1zµ}䧫5'wP9(hǽ9-bZUCQ
Ć~435(~yK׆cpQi#:=N:Tja7
w.:ޞlDP|0cXvs|+ܝ<F_d9@!4928lP sc}AYگCkH+Cr0CnCnEҷ
UpޢӍyYzYeNFN~$)̽u+Ɔ -b/UkܭYY<IGV -X#ߴ{31'ʴ6Rfe\ɧ -IQ+ÀSP:JG})A{BP+Z.c捔
?̢<W:vۅBf!fxh7X^{f#GKn>{g71GG}-FL~m6\TqӪKnN fmi,Y쐫p_vEH
!t"}(pѕ* ^cTg ilͼNQk)Y]蒧&%dp0Q_FS0S=8#x.g^j
wjKΕ -3"*=v{Ԓuڶk-Yx+hBSU5Azj"LP38,=f%mr6Hh7Ml,`V$U:Bm81xhZhb+
ʚ)+ꈇuk5M"CfsY_Z=JR(Ssh~6]`퐥#3-q &<`|Πνe~ȒEH_w۵.BCQLnNPY&$#R} -avS`zt[PEi:~"[TAYwّ!T*(L:xCG8|
wN9"mB47,_b4HʉH{ڧyV5r% k{ߛAbobPv4,sѽ9/-ANXEr"FֹT~Wƹ"0^Qqz{|<xH -xwGSRxtW$~܉O~4a#}&tj̀i'V5<,J_Ȅm8a=eqρ6Z*ކc=uQ+ě c3$.zn χ<y'LǵD@\$ -d,@Ob|ݫߏA=N$Qq)YM}SK!p<%/I'6RXSy<c|qpWoZWDcV2pUidR%]N`. P:0*]U7'4-a^V}sϢS+846:ymݤoss IfYQCn|B
Gln -\vJlEW-su_Rhl,cSbyI9E7\BL@I?G7,Fo@*+LNFˉjPW*@.XwH,,
)J/ 4MƃlsCedļ!l8Si<TI -T:i1Yq[4 -zz٧Oת<Λo#%Zs&]=iv`q% +.QbW(dnqs&G[LeI<
Bxӟ_6.zvMh`1 -U*n{2
tdociXJ"+quxx'J)quo
07*:I@KO_[td&slcTOPf3:T+COEO@]oկ #5߸5$S,Nh&|[)|1qNG_GO]uM8aH-!&,Uϩ=P~jq,8V+vNBt4zBv -W"xaPK'R@pȒn#2G|,鰰_3@H 0s\|^g6NF:8/%Pf_|eG+GO>m v"(`hs`vONjbkZb[+o0=,:<1r8n
W @D`'>I}t-5o4=
e$´(^h(."N~/g,̢ eB-"cGhG>5
*C+e680\pE7$:W*rGK?3 -kx%ԮԸJ&rǩ| 'r1iv*Nm^5 }ns60^#<C3SCИRa)-6y
_sE8#uE|K<,=dNvWP/8uO]*Q!
9覽yKC*8-~ӿ=+$@j`&rn$~Gb9fX[A@l'&2&ê_3atA+^VD%G,4^bWVmhYBozZh%ϣZs{}N"OVdt*L,1#Y (>`̤ε$]Z~RNr1IǸMf<qo-vWR>A/x7vq&U _kP ^#ѴTHþS+lB}cJE.ƪU'aw{]+(}7q؟? -df%gSn"_QfE9VG9K̕ZfgI<
DǚrÉ`l'ま-wt4k7I:/Xw?=;L|ѽV*Aς17W]we_Y:x]#ea=Jҗ
^zG8Y}kyѱv49=Y×U&M*TCN*)kCڎ[nւI2mZ KrQP3"Jj bRLwVmXT力 --FT `~_lκv̐˭J53zN'O@Q4緣@+߅+7uHBD7h|/NMA© ^VO1,3W?X!
:W;2QH@%Î#y-=lkn±Mh.4QgBn#k6)==Ҧ:L#w`)[KG@P|;WhYRǯELT/@f*"sJČa%]i4/T_8>eՠ& -!cL,r -^O?dĶUn82C_6a3gjC)*jR(R=5e,sR#3 - ӵQ7mifj$i4-!WCk}|g̻m.tV?4ݴ 8yT|Db(EV6eo|gSv@ BE6ni턊#<~1d -a۸E -@Uq!pXtꢿOe&Fypj&TLkHe<oaHu+F-R_ ߎ04<S&ToS9]զ1S͑L](Ay +xzctefUmTPVl۶mFŨ8s=Ow{5c|&9MA bbkqb`adYX9;*Z2|X +``0|p2{ob
7C'WęYNt拍_sdhcgC?۩X;oß{9ʿ@+$~ ӺEi6ǹe.Gh^FLESfVAsttQ{r"$O}t|9ŬB0 +6Nܘi2mh?i]^zTXw +<(q{1TbN1u"ħKv&s5zG>5$ +rz5c]#!ɒ~:vrά#!dQ>͜慦 YA $dU͙)lTx637AW[rᘆq۩B"#.>ʂ0y^Ϣl/.Fl8C2*!LQdc-ey3;J6wַF F|j1:屫2 +3XNǎKN -};E*P7y4|?-sJ"x3yÙ/%
t,I_ϻP}kpǢ/@q}RrهIC*Gj?3#Gs&Ĭ7}`}cdԢ$ew +ٻPdY)^5E#píF_Pv#f/-ZT+>6l 0Z^AEh"_GqmYXHj'Soq^yN{jŎKDS8Z{=K"}_P9rIfEƚMo1viuaՓ9YJjp ZﴼǾM͒"$0tMi,]a\q%G)TYf^.O@X%3§TǔU}G21ޒ{}$zA#y|d +"n~!U{ݻ\.Fak{Q`m6ɩV_,*crGJh9V ChUjdvf6yn=ZqK_ѫo[h%wGCjowO8uTU]*S~CC[lq.}4OA$I:>g"sOH_D8QpLJhE1r_FX\2;%Ed<mBu@IB/bߩ%! #ZJ!AyZ-X}&6!+-fȍjOBaG,֒5(TV]zGF͗Tfˣ"U\b ++6lsx+L/QGˤ7\_5"G,Q5xJ(^|?JTcҢy%18r߰g^ +Pmؿ 3*Bv0HX
d3q"QX^8B6w+j>sY,O)NDGX]`<J2I[I^uFd?y)R{UPRVIo"H"6xq-iȧ=&0jb̴kC0~y2~R%(ڑZhXJ<>4_n^*y=ߓ^'}SpZkT?z5 }6;ӭ˭wFEh@4 7PaXkϲ%m-τf,|a +\L{ +:5j"?vx{I>A瘳D5dSى*gJx~O@Qyh"%ټ93`Rʱ9UzGt?W]SgA5{NP:mcoS>i?}bzʆJ~Xs;k*abi˄U\i'L)c/hX~89VrLis{WKf9ԉ1UL-WieRF?wF~P>KrҴʾA*Oȏ|_CMoUc6h w!7E'OD58t:{pZQcLf-d\qX!}C@OV1&)YvTͮ +e#Wԫqu{OSREH/gr3d{˝hTlݐ&ǝV= I[|RH169DRW+g>Z^n'I|y
b\a +_8%t<;pe49 +Fҳ3H\k&Ņ +ћM҇B*ӎat )D4c5+i鍭ƀ'JUܾ:N`eMBBk/Ñ6&Tf
rFp$=x"\V*)[ +M~Ж2B1Br\/FxuJ(~\Gn^gsPV +Ј> +v8Cj5gKݓCJ?#C;E +k!tDԡr+9Jax +h[YlŅfN)t>|:k^G&q`]:P +unAJ
Wټ%oԚX
Q+'XǧXq'*0a570>JswHi`γ\?6N)|JynnlMfJNoC/? +[]KF 494`YcbLӤ{
*
R{eU7V]E<Ţ + /Nw>L~v^RnЕ*kR.c,ɇQR3ZB8!^mDF,7 ʊhX偆}pQx
)J}떵ڴG̑^$ОYXܧmp0`r{(G7֓r
)5kBoRGge_ß,W<d6T#V6=$Y&>9X +کvBUQb2YMs1Jm]&h~ >d~,hgKTuDT9'еHtuZ9*z`QCb8%Rl't݃,ui1s7QX)tdg3PRwI^Tk_c茫ܕ"]-LRH-J4#0& ܝ#a2Tc*OW +(6>ڀS1ܚ-p<I5%Fǂ+R/L$jEs,ʈոxᦟ=Z1["O.[Q-M#=({hqV^x7Q' +rl`Ԑ.\7{-"MJRaJi_6+-jS(qX9qrq~)^}(Mh@y݃U~9ۅe<mkezǧwS(7|jo!M4vYq_v63^@r$nqn]&W~EPϜQeΐ乊8ՂEVP{jf!T
dj1N\3H!6D\.5ˏ +
A!L +&o@ +S,`tCuo`0]wʽ,RpqqA]RkiEr(hy(K2/b,W#1ehy=Dd57B7qC,LUs+3K:[2 +&^C@)ek쫐t7Qr}ݠi*mGzFP/);.@3+Nq># +㟓yd4pQed;uE_f7'%f'Ռuw|ȦE;'D21iaa2<0$Zv]^hmZzu(i<%dIV<sM/4-}_C],P8J@HT[aUt(/Ǎ{! .)!!Y;r|{9&hOnӭ +@W$+W
hTv*I-hCwAxOm=ȨAl
Z}>՚S\(
j~ޜ1*!`ڨbCH?ҙӌ?ѼYmk1(lÞHDuu*S5ఛ};K
NoO6"Ej(>1K,9PxNKHi/2oϜ N]ٜTthWяѹ`1>ʇ,Wڡ5!{xF!7!7"ۆ*8oiF,,2'q#'?t:ەcC +*6trJXE<4m-4Æce͔TuWMKxɚ&ӡH3gz z/pr%ixԩoK9r4sm.Nv㙖8y +aBhoc>gP2?d"$kh/˻Z +!(`i&MA7'Le|Kw~ӑyAF0AO +)UNY}Utq-4Vf-N*͠HZt*CCGbh&C|!D#grW;6!drX/T1z]$yDjS<ǚJYK5=͠pI7cq(hr9^x@KA,"9j# zTV*?+fj
߃d[W=yp><$gjx{A9坙بfV;)W)CZGejρX:o+?tiz'\Ͱ>Xq fd}ӋNFTvxWdSKŶݰ2~tZ@iwI[-AUaoȱѺ ̈́iX|XC<LjZD" GMep2' ՊG A'ywY8,d쀾H{̩Oy[)S<X1y87+q"A+`4y).Y0U
(uXsgbJv*{\0/gѩhis6znR9ùۄu3tج(!?Z>Z!#Q7^.XW;V6IR¢˺d/R)`6@Z1)`ټpoܢ~@.}zb!I&o ك{|? ~q'D5+rNn$A_&9nqb6Q)Cc +Їށ~Mt$ +%Qadr|P$ 'F +@rNAʎЉ!hL)XMMBq/P҅9By"ú"P@JK2d^F+(IX|Ft_Į̨hGt<ۥYՈ +zFŘl}0fRZ^p.k)wl'{qJ9Ƙc܁&3뷖;+)L|c<~8B@An({KihZx*a߇t6!\kwJ1ڢ_cU]׀qժ0=.V|8xyOUsqz|qR|Β鳋gz +UP)CC/@(`J3Gv@+ ⣜q%J-QY$gcMDG0Cg@H;[:ŵe +AkY^As xgAZu+ԮxrgsM瑲lKNX#ML\>V5X^;XAEܬ˪J&NP!n'{`!Jmȋj-EkA$]6PX%O9ێ((h5{1);R
G^rMM +a!;~$->ATүOp('{XnPnvbOoyւJ'e y߈A?[? +SEMQTm-n=㪄uA>gy3}D֧
f3jF!,!FK +lppD0zk|g]BEfHntP=e'擧\ z(DsQBSNÛH$Rf] +v:nZ_Es<N*fHNˍkr"KO+7B>3);[d"MvBő@qKpC[}2MFϏ +0@m\kyD`8}zrDN:u'2n~~<sN{] 5r*&MOk20gm\|)үoGHscڊ))ߜ^jS)DL. <<v?l#nQcnoR@4|È[hǔ٥V`,XfrNUv +ږ=g'|'V R#`| +:' J)|C-'fO">R"8/!Q->n)#p42xh(tL?7 +fx܄PCǴc-tv0BT= 0HY@y2o#1)&ͪcOfA#:YLP(Ug;ߨ$)xX +g<20Y endstream endobj 18 0 obj @@ -568,7 +557,7 @@ endobj /Ascent 850 /Descent -200 /FontBBox[-12 -237 650 811] -/FontName/MTDDJC+NimbusMonL-Regu +/FontName/IESHQM+NimbusMonL-Regu /ItalicAngle 0 /StemV 41 /FontFile 17 0 R @@ -584,7 +573,7 @@ endobj /Length 17916 >> stream -xڬUPݲ%[,pw(uP[{nߗ"9rd+( l +xڬUPݲ%[,pw(uP[{nߗ"9rd+( l ̊9"Mn) T9ڟc+J_xxh ڂ6|$<9+sޙ:rmv~ۯeJ9)#֪O?D8瑧]@XEo?PRkh rg=ޭR+n*;*E-h qFvC/gY6d =eeix;@ vc]pY!bM}5
@i/QAdڜFs"Jg(q.3p-D'ek.~1l!T\~uVfkeb|_bug렛&cۤ&ACTY/gP<Kcú Qȃ+v2#c{s4ojfNw$y"} kF IvmT#{Q~e~Fd\1oD @@ -651,7 +640,7 @@ Mo}2l9zg
0|ȢΟYȈ1zC^S}㔺V
&A"埂l7 7?51~HƧ0_f`RM<Cp@]|sޞ,*/j*/S#Sw(㵁U9]O#۳XaC}:00wƙVk`h!iS#Ul9+J>3VyxeYl܋Ic3`9Й_H"蹏2!zW~HvL7ڄ Mo$KX6Upç˞t7(H66xRW5WJDSURzwy gP!$φ rVt-CP
QKoxo1:a?"[sA>*dr̽j?C=Kl\Zw?:ZqB0 T҉y!z-}4^8HwC%|/WV:ܪ7>mE~4ǐMעdĺx?[E8{[ܛ85!Hc꾞~zb⊦%@]4S֒13֔}"r`*v"0k1cfIMjQ?
bCzDh-EրUvD;rQP-]G9Sa鍒(*u!-4KQ&ڄA2;ټ8W
jUpdbs}fC3}dz'38<E3Q]sO9T!bQk0RC"]G2AK3L:m{W#],?I6j'n6<(
?EKݐ4L߾EԶnBǝ7Y⑆#C Z>ֱ%U_&Ũ2moGn
!rQIJ^Uk]=moV|gO'+z4.,ްuF}Fac-Sl]6xF2=;2ʸAz??u\U(m2%hظn%ZZXUjxK:(M0} Eh *P@lIO9<Y?s{hTMКK&ubov-Q5'^0K^I3æ]n.Nf;Ѫz9i|WS.T9SS 8t.|W߭h|SrfƵղύ:{r`=sb\0EfԧJL[VsO]W`/B* /RU[nS~^b7A5{-5E=|*"iQѺTg$U-w\u]ӥsM/#pʴWv?ꃉ2~Q<URLߣiVNM胫SǼZN OEc2ȧ:yk}bܜ -k"s?y}`̇Oxo|ʛry;5[b77/غ nUλd-tZWlM6Rq(ߍ)f+ѻ3$;vQ&]ߣQlu߰^?}+iɓ[N/KfԠ/`sÃǛ<o#K?>3KZ;RkβB2?j|/ϝ/aӅMWV9D=Tc2Yw(^aWrQGy9SW\>]Prˆ>֗'z.DbVڿnWZ`]4G_[*"s?c,at6eqk'Ml-Vf09If[kNf^oWwO5*/`/M0bYQ֠_Z'>Y*q~{t~w7}v"GsNzzI{^[kX%W] "VL=|v}wn/~\cES<&]1lj.#=oiRx^u$wPfV4D$gBv3W<dH}K;sDo9]-W{Wjr9GGINۆiIenG-Q^z})2.F=~q_=V:gl=j:]3N\
s~]f!*BM[eSgO8j$͆FWebFGO^a3$Sz-S|7N%J}Flr^1U2ޣ趆kԀaa@rNjbQI~nbQ6 +k"s?y}`̇Oxo|ʛry;5[b77/غ nUλd-tZWlM6Rq(ߍ)f+ѻ3$;vQ&]ߣQlu߰^?}+iɓ[N/KfԠ/`sÃǛ<o#K?>3KZ;RkβB2?j|/ϝ/aӅMWV9D=Tc2Yw(^aWrQGy9SW\>]Prˆ>֗'z.DbVڿnWZ`]4G_[*"s?c,at6eqk'Ml-Vf09If[kNf^oWwO5*/`/M0bYQ֠_Z'>Y*q~{t~w7}v"GsNzzI{^[kX%W] "VL=|v}wn/~\cES<&]1lj.#=oiRx^u$wPfV4D$gBv3W<dH}K;sDo9]-W{Wjr9GGINۆiIenG-Q^z})2.F=~q_=V:gl=j:]3N\
s~]f!*BM[eSgO8j$͆FWebFGO^a3$Sz-S|7N%J}Flr^1U2ޣ趆kԀaa@rNjbQI~nbQ6 endstream endobj 21 0 obj @@ -661,7 +650,7 @@ endobj /Ascent 850 /Descent -200 /FontBBox[-61 -237 774 811] -/FontName/RZRCUW+NimbusMonL-ReguObli +/FontName/EBPJJD+NimbusMonL-ReguObli /ItalicAngle -12 /StemV 43 /FontFile 20 0 R @@ -679,7 +668,7 @@ endobj stream xweT\].-ܡqwwwwwhN=|s;̯Y:ԮsTEQ(PٛՀVnfv Rh rt0u -`wjzjՄ{+jx9G[?9z>3rع +`w̒b*rrՄ{+jx9G[?9z>3rع ʚ&kr'םa4cq3)Yh6jXF9joGbqM;atC6>UBګ8.:/:=kMꮠnCI[t
]+Y/|TCe1JhR")5Gu5]0\d8jf_J*r?f̻j%͈@)>;JS_~s樐Ax3 lK @mY+n{1OSҭ+BYAlob}U)IBT[cOFsSKƫ`$^ c6/JdUԕӻ&c8nDȞidY{l% #^oUcsoƴkY)ࢦYF삱ňr'Ks+DgP?`цm}CHяY}YՒ^h:?FiO5a6_:MkM!C:.^
Vݾ$}=<Oܯy~zpgJ/X?'uHV:#bYvsΆR^ ?~*ƱWACBM:u [&vuƫrƙ:#>S'ȟ;'ID:FCGBm6c<?BJ)4 2+Eev+,Y>|"2Zmr[9(kO4ƠN˩VzT:~P] 1..,KPMԀ/Y6"Ö0.Yn +Vί%Ԟ,e<YFF^cCN?pm!0HƭPqnngm'hӟff~y(Qܯc#*;kfтkpJ~.ѲkUkts KqR(-bkm|zV3˶*0''VӺs56^"nc] @@ -722,7 +711,7 @@ V-4]-j*uFߍ-nYUw_!à-:lIN͜Q Ve&%Bm]ɐ:6Ѥ}\R
lKJ]Lϳ/QOؕ79ZܲsPRP5.,|@iC:QAmlCLkKΫ;V Bcj
kH2%JʵiOq(y.1IA;)/'?0*nȢTDEb{'-e>RahaqV*ّxE |ĊcUIڝvT-j3_4m`Yr| Ś+|E|.4_<#tWOaY*xlkf~ f,:]E8O QkYHouJڜH¬IYGOPy[ᨂJw
lLGZ\0:O.ҿ7+{)- &Uj<&Bl'"|ozO(34o} -ތ ?A$;D2E{G2^B.y!' +ތ ?A$;D2E{G2^B.y!' endstream endobj 24 0 obj @@ -732,7 +721,7 @@ endobj /Ascent 850 /Descent -200 /FontBBox[-43 -278 681 871] -/FontName/EFLDGF+NimbusMonL-Bold +/FontName/ARYKSQ+NimbusMonL-Bold /ItalicAngle 0 /StemV 101 /FontFile 23 0 R @@ -743,70 +732,79 @@ endobj << /Filter[/FlateDecode] /Length1 1638 -/Length2 17083 +/Length2 17670 /Length3 532 -/Length 18014 +/Length 18601 >> stream -xڬeX]%wqgn݂;$h -489J| -r_V#hd1Q:Z=YtqqJ_VswWzkm\ - -juDOg7m#1d -Ձ%lHuEsg݂?×h&Uod*ivQLߩD:SBWB^?[fm#$
zϝ1[~3dSɠgoAY,D\:ySP:'yHȨ~SQ@n244Dmܠf=GAٽ&BTޕ:}[UgW%on~PݚJ˹W15ľAThtնכ-!@S~5Rl#C).WHVYG֍A=JHiR$& M`MkΗlF&bT\^Q2[꜍#a?m_7cOtb~,;tY{$边!"7
jWՖ{Qoܻ;zw".= -
E-\*ڍ 6eFLR)_Y_3Zu~MH_"k\D(g~B*)B'
,@jcN{ՒkG$zԬ}\tvtIB[ %g[BX#gX(ѝq͆T?/ -<V(9Tsժ'7dXO舴ܝ+mrLni3$l;KKVw(I Y ->@}A+ZMtD3]zbv?T]'@S3),Q^_H~A:f,\\8tYgnBbcYtօfT:eur8@lvXrÔ=*bǮ]^F+1ˋzme*{ʓGdDm{wl?~TCe"nZvIͩ84/TBTF|H2<kpO@j -b鸎n\y:mH$CY݇ftʮd#u4[@L2ax~vĦƯS:4UY3[c~1y,,6MZ5*?R站xآf%y/NeW _)I6lsaH§Ĭߕ#ݖLCqU_8q(r? R)XFhη1u66g5DjpgFWTlCxhGZ -|{ИYGvs`zYk&el5m#8-SԮ|c1.ب7zQs+IE20AB(ӌϗ_Y
o+ӌD}a)fjLs)B&<)wcG2mQ1Ȟ}*zVãQgdMSqv&O:gț/>4f:MiG7 -CjgY֖ 6%pho6xcs}Vy/3&{B'Wswԝ
h} <S=<"*m0?)X~H+!nÑn,2k{"ItżOa1aB73&B@|OC?
1 -^}^K`S5U '`Hy[Y7={7>H,2@:,з\}2=?x-?&>x6~9?tb28bp&Jitf4=V~öUZdz=sxbujx]B.6ufG>q@$;ΩzIyf҅#M[oШ|?P{ iF0_5#P_X>C;#|% urWI0OYwZR[T!hWb}ɺT,=mFL|Vu!>gLZ̐!n<
\ڰgi7u[l͢桮cs -+o9x;LqMl z}3IʨSoh\`n4ΦwJnrP` jƄñ!ZKT.72$gFp&$ذTӂ;k
Ro{5; -hTm:*#Y /lejq=x]RVtC
MTj<\L?M [QDLFC\Y_;kNvL?U."n~Rʨ eXTnT -J^ҹ\.~Nm7n4
6@Fk,ʮ:) -gҹKN!ws2]aQh۾1^WbS]Hf<'!hf"^|ͥb[ -XGN)DO$Z<$fi - -\Q _QY&ТG$9@%We4c
PKDk\2ĢĦһDvlHZ9GKɼ9.X4JB &H -1j<ZM]71ll Iȥ4T{tEOo[o>] :fW"Oc#:spى^su_6Y -6;dd2tzR.B1k5<LhL#yχB.Y`~Q}^WC8X(gA%o3?HmOwh _6E}>pC{|&27IUԎG)wn7ar}vGnټ$ˡC - G\ckdmS.0݉ -)N*]T@-Ϥg -Wx3uA2Heԙ8|c@ᯍ?HHIJAAVtW -N>&gϵxhȅʏ3w{ZL=Rl [nߡWlLч5$eظFu|VQB@3{8qmx".Ƃ2 CW Q6QxNvX&1]d@8l; -`a; .+Dr9y?(m{)B6<`.iFH5D1-Q˨-)9h1DŶz\(pgД]`H͑ަ -W1d}GJpfyy0/ ','ݚIpP5e"ؓȘӧ -tȍk6W-bƤ#k~YY>2u4,oMoWZȢ<=L -Wդ~_sW&DNI({x-ZgI'F?jr -G ;O2S4vɬU><vLC*̭g߮P!J-:RLH9EzAEV@KD'ňjsț:_!(#vޛSsܺAٌ]#$%Gҧ=Ngч`
B8>0{⻥puxp!Nno^M^1{{*{C3,dnߪ,+Z,<>bR.Dxo){IS$2{`4!ݪI
,/.Jʔ =뤭_sL\P7i\~ +vשI=4aw -6/F狿T~vG{e7ưNFŮqoەKڈuaQ3W5wsK*H&R3pvK9die~?s!,)=C+66]}kYs/9Tˬsx@Òc$(bUg1(pF\tFB$>v\CÏ"gVq1"dHa2+DBK`uyjsߗ1ft!k#?,ӱN:x{}KtB -J>⼎ܧ4T 4,cG'1}Z9Xucu'\?gb~6H9D8q -Iu4\+^A7L3tcK1SbYV#^?IIqBg[6(![IU"..y 瓁qyG^>OGZ[e'Trlw-|X8}5[9'2[P˘'HdYN%C'MӄvAz)y<T:v,`1B&)ZS|OY}7}dd%'JWXZ
CH{bkG]43F>HWXAu+Lckο߅e˚q7})9WpPVatƔ -tHg:&i -BQ+M+\NE հݡjpTΧ wWD7ʓ;@wxǘΊ%kEb+?yܲѽ-~R]*n<Q*(,#ofHDezq*zQk5huy5uo^}L>LmhEL2IS٢ćUR[Oljz9prs){EKhUE˶v -'0[u>K$~%uvU<t T3#VI0L{ER(I/%ʇE%;wFm;ˇ}=3(px&M?@e3ڇp.hwj:P7cBD.MB?^g)F^lt >hy]:n7(@ǧkd7h|T]4G?Jӛҙ~Ֆ gKmTČ:V,/:8eX'Y?oֈU8uDĵ$&02;p/ZK;^ǶUwWpX48tfB,oU);Ijȥvp-{dGqe}n_.`
l/!-[R*`冹poR9tPƏ21ǟRG0 -ECq(|b{-}K_A$vϰ7ʊ#7X~HjC۪,,)(iqbt:֧Mik_uϗmr>Ɠ -~fMMd'&}ᤩOL.i}boNv'<dѠ8{#p N9)GzAOUn#!mUùhr9~!D֢Q}.wd@sTb*{Eh#2Cu}M%ߵаN\\\/4uSh#)^"{p|gl i*Wl/a|IF #ySR+UQOp>͡@%0*A]9֣tsnw&|Rb |^U{V1M<j/'͘`|%q#TEjD#ݟLE\|p"e\BUm$t.E]IjؓF~
%Bf~:ȖiHV|P=z*(騢?h@.
Nanmh7:{ -tϞPWCjU<Ѧ+5ǏYFr+1"pwp H>W\3n}/J$+j -M_0;bǃJ]7cI)|Kz>x߰bPNTTB5
/DǦ|=ô9.)r1Ֆs.x_W!Դr -nO5M%th+%
$^tq{4K
҇k)H
u .2槚6>7o,GwD^DO^8u4\Xy@ -6!cLn# gۄ0&'p+e\\#U9fF%-41SPV nv*C4WQ,HŅb, -JPu"xc<A_p٢ղdPwrzYYNJ ->(㮵'1lT$!HD}m2tvʌvf)źjL`Poh,PBTj_
Rx<acuiXW:i.yM 7Q/;F혴ҥH& u֣$ -mp&G9XR_m (<X
2|n -9`)W(Vi)^ʹp9y۔Y -fF8^Xl/` qތLg:^Q
I]KK?"A"
H^ R3lѿE>~=ShSHz=~Dq\%`KWkVC;aq(a2?-2fOVYN=5{p:ME{7%l:w=>AacJ"\M 73ogE7
TyZHk2;Wca]RnpfOn=_@
{9eߤn].V{cDjX黨FPyAj(<ٞdw击)ޓ!G,ѱZH`HX"-Ev/+ Mjpl:}wUȾ Rw|<أiބ;A On48j;sX͊N@bz%l<w}xgM]|?N-b_-qx<Jmm;w!֠nP_Ϯ+DGM}J<Ɔn~2NBU#H߄0^t
h`2\Ne*70۱;ӿK]Lš=7Ôl9֜Pg>fpNDY\M'V9Fy-~'INxvoŌ|_6 -_#W*0)GWȁH0;9'jv
rI? -^٘R2'ԍa/50^g<y?~(T'wܱFU)JmA`]ب1+4ksTw±7[CUd],rZ$&y*}X"
**>!bV5y˥U30bD YGBS[yyHw)#N)HfEK8|"^=k*o"P -N -k(n᭙^ɨpِtF
_!QrNqZ@E~Tt.ЇS>Cb-5,zxb3cuA]E[ѹ#dk(C3R+8nvbK&Q\͋0IL7E=x"#b,3`"-_^snj:Q)Svh/s-&Hf@-,
[uKf<|4(nvI+7LpD >:,FQ+vJ~f0)]-.G\{Ebswʲ[iIscįѿöpymQ.Ea)D7Vpv%~4x)[i}38lSퟝ%*:Ģk.zzdLE69;q35$O^qJ"0]TDo]ŏ5 - Ob,Vh]NTfGޜV/*Gh8/愨d`'u:B5ZVbݙS sۖj>ׁ{3h9:~YĈ.aLKc( -Yeh+I>~my]}IB0K33<A;<Ûf|hHnX -Tmܘ3I5msU*rsBۮɶ!454Gn1+|3l,-l=.:q#J^J"2:ӍjZ -"zf;܍q$l!.MуĬ5릶bB-sk& ۹cFeJI0NnWJZ #`j֑Hj_M+tevf=z1LKo4T.C2K#E|Oq?V+{VĕOmǔ*W&h\if)Yo&Զz߮pX\ O2߿g<7RjrlEHv֮Aځz5(M1ODmU6PUYh5ݢ6'ٻin@ -nѶ~#u*"(c势 :GFfC2q8&3ч<f@}JBgiK_.}̨ՙ+ / -sQC^{*?8IB/ϝ]"β **25xkֻJ -%7%`^3ɠbFs>}?o "[p:*l*
Va$dͩ7q
9$=v)UB[DN,Q\ax
FU1b8 F9<WlQXҋa#h'r&7OU"qR. d%;>]KyM]EmsdOP_y]y&Jfȍԇ_s/ԍ̋EbXɉz}@a M -w s=M悐`U~nL@ZZD'aaXb7+c4ATQ,RQmcv'{f@!@nS8`a]Myp,g~ vL? \lߣݖ +xڬeX]%@p6!;ظlK ns{nXϳfUQjY{/JR%U3{ +
n +tEp +8m:6e#@Y&'k!s:-#ݘ=*MsE!AWoum:>@<BNDE{'%Vl\ +govu|QKJhb/&*V ++F@ ֳ )RhNlo>}Q#d$|Z I}Z/֎Znr$%[pv[Rbʿ묱
uE6Xk +#Oe<ce_9O#au6Ntܜ9h˪6}+8P6FQ%|gO3k:a~xKGرCN6?na +n6*;JgGrv'#yx>z2i-
;.3գ\p_R0^gqK:hÈyJ)Yý|MUw0c(͂@Wf>"\ds˦YRD#:Ƀ~XBމ;рZ_&9feϿoב-0|d$ +
ICI]C}Y0,Ll=3LjL@<"7+KPG^OR$u&_JJ?)uykwM5F
buO" (T+ÌϢGTC\R*H߶`\yZ#'eA84jO}dJs'C4e~K=k%Ռ^`9*>v}8`<kK%qzg2E*z:ү؟ůwaGᆋӢl5S@k{?݃=pzZ`8A=.YHPc,Hvt\B
bѻu[L]Z>HT "wi0%O-dzUs&=~X5+!;ьPuT9Y&x]Nٰ xX9%b!7eKA,ߣeμv}& +}*LdiTQC%"!sF__]Crm9Tl%N"K=7`,6~(o/!+AivAZkޤ0ѯy)5ɺu珡*%T{2[)r$>AN1$2ѕ8Q ɩ*^r\gUdI1$.DEHbLV +Ocpk|cO5Z`Urh?!Qx0ND,*b#ԧ~dz w@-Z,zXOu3 +/dilJ.czE/(+~EqӿbXac[;,J@7TMm^3,1]u] +x,7e6Ɇx"^w50UxYr~P}֠ +Fl"~נ;_w\ޤGb@ƶ*UghP#8H0F T`ya |rݾԧt,<Ϳ%|4ڈ[Q +ٱWd.4k]b@ ഊbЭZ~pg9
D;uLȇB[\a3 {y{+L8h-C* gf+s܃giY
bii2$>,x?_"҈w&TOEooNd(AdǝN$:BO[ׁMxv<8*^mi۾۟p,(Ҏw<&/Ϸ-ϛ*< Q1%1_v{ [P Sf%s◷FmhIojeo +Wnhn9P䥝ǵՆx8}-lu˶s<Un4Q[0 Nx՜R\tx}UlM.4Tܞ1`}%Dc I !p:I8KnV0>Av+P%mFfh|PP+m&ݽճ!^AUzN +sVDYPjGyyg2R nw¾"_fd~VB] +<L +C"8@zƀ|e&@ӥ)g-?L;[ܜn3 6!8SAmg`6i*e/N)TU&fw!"s@o\lm{ [9^#&j:FT>&=ۿ\ԍDݰu`ƘaAO^uTeInagK-mUxaXL# +۷mݡ[eM]Faљ`uX&uaw+Lqw{~?)L=b')jb:}6)3&K|P)$Cn`1 }kkWrKK丛5v(M,@^%>nݕh,~KB!kxl8DhbQp97I-vV`FpFuj%Ӊ~ enVC3`ֶ8s4>(ۻ+jc<EܻL +'J)z5I=3y#QC7˽-Nae$kXFwz-Kn{NvF̹!rgsO#!.f}* +s#^Ɉ*Ozղ0'Z3@k32.)-15kvs`65.9%kwhT;XZKkDӭ2\^U +g/Cѵ +\-]dw-^@6d)+׃6# {/9].*OXTpD&o|
g[
BdݗTfZR4aq0
8}>F?d_Xr.ТR^{6~jiuQ؛v8dXD|L;м62C׃'e{ +r&%4bm?*=t`=Fi0:hD(1
U +1=>=}_K I`FOa"qv$RPFR}ujp4yȬOrX.hxT$z?;ce1QF<p| +/R[G +xqےEKa4!X|IP?B)\H.-hJ97^D֚܅ o㡓1I0 +gl(t:sDы:ݚvk3Omj:,wB)S~DLQDSv|(vBo4
cJ'VQRhN§_nE 1|45 |ڢᄴs> {.bG&M{tzlh03J$줁7wR̯ѯ_/z}:RѐA,vNqwIDWiu?HD Co坄&l|뗸<RLۺچFXęC=F*Tт:{i`3_wi^QZ)˸ouXR]:f +1GB{Y+zݨ,q@&[64$;SCV$P:m1-|d!q($7-
HXAM`eR7A?\2ͦzgH痡-$3*u\VT힃s ;r5xdf[{.p~>?%VR]f?f=oܮTWNɘQ}[?:P;+m`͑Nh}c\g2 + -*HqzNlML0MOA{_^cRt~Te=!fIirḿS`6 -F +/~U H}o^v +ln=1٦PY&*Hx\ +[ EPry-wψYƿLq|cV_iN%nt+[ЍnFS%3Q4tgzdr&l;ßS6|7wl&@{h8̾q'[A,j.fBpL(`:?C4h
5CA{R+iIDy>R=^K>WbffV2d]l:MUmA +Si=k?ؑeJҙ99|a筂,kcOۚxN>A!HaoXooaR0lieCAE?ϸ쉱&+>>qӲFVi8/]{Lw@O8 +ߥԗ#e$1\}T6T784 +٬ݬUVh~da +&>p"6䑊=r|S[p)v<fWh.(0[Bz>8\Sj>Pu/ zlˊ&(zЄ?*8'Ak)N%a-'ѬOB\$pn9ͧ#EWjdT]}'s]N2{(qwb,6ʡ[5LkmKr='sB@%hiCc1}DSk>"2DO&PW6R,i?7A:JgP̙<
y,jKrh@e/jNM%2k*Ť"mZzNr!~4H2j(`6pA.\;1&ŃCn&<iGprNSh%.ũ`6)HN'%luҋ7!ܮqJEKo/ŋpZC +yKZ$?GB}WPaC/0.t*g<e C[zAXF83$ҖRNN }0xZ ^%U^R-4ʳ㜡aFB~퉌C^Nn&fu'{?뷗m|4w.R)P'7bIO]<tZսk1ܓѵ#_;Q*^j "CxQb#UE'BJ;q<kk:(oy"Sj!t+qg](ߘu|J9y $VN58knYBq?pykr~k$NCvVm)H5xBs1\VOkz]ȱ[^Ѕkxhxb@nJ=cD͚ +duF/$U3E %))GU%/BgՃdk,h74qůO땢apэ[~ -GƜe]{v1?(pld]lg +)hw=vUD
zSHTw]:cqBgun~*||N^bNfZEo*~羔8wB2"{pE-`Uբoq +%S{n>9giA*DI4Z)~Ѥ5Ïp-4 +RT!ӡ'?}X3*I)XV| +)}+MOgեb;!?gyoaR?EfuS.{N72H!a,TZ/|B;F|T5^kbɎ$@뚲=Ed +xV\%ysxn|$l1z&UfcOAҸ߹v g{#*ԏN]}BC9cA)wGt,KW5!eНtV9]Z +-.:ސ4Oȍl=(qwܧRO!%NAviJ5 +2+\Y8}I&41{zUkucdZg5͡b>2dx+zR>*t"=_d*?;()NDv>V50g<:xR<:[^\vwc6Q)
6fRplxˬw͟o"^h|;ud.z4([Pyy
F\j& +yO] u&eCǨE`c&/=*b} 1r'n|m郵GTԮw;9m@a[Pe8ZiO*&:iSjFH)M)C唌 +u[0ZQZ~qqYt$w#;"[+["@Ɋ[QIWh}CDz)!vVHVӣaEa6N_QJ<txBzsyqryoN`xq'ߒ +o)3sM'c!Q6FA:l9 +<|QݑΩp >Y,gwsb <.v&铞δTqc0=}R(9?fz'9992} +2ܰcFxX +x@\tY +ʕfC77Nߊ3a%d$}h3Ikwԍs>PCk0 +A2̑{vDMMjj +5?H´WWy!VPM1}1fyui5&nT]4_'46~h{<t/ڶRk[ +?y`9XX#EJaCm6h}һzsPp(mҵB@I J'9C\C#[YUӏxGS<^S#Z.uM,}YF| +&nUK|B%K+G0tw%]9r Am +%pP_p):>Ab䏻$wHO>FyM>ss(dx`&:~Q Ǒ9ĜYDz߭-9&ى'*GAΡGz&DiK+>U;a+P1Cr[yϵ~wkoirk*g Ùo/ +aPVh1U~=ΐ|Z8S +Lr~1Ψ*V{z5u\)u,a\(8sO3-݄oQlِ eMs,*%Z,F"0 +dB=&GԻra Y&cx{?]HdU25!vB){`g1ģzc4ϫ20lnzvܛ~pz:4??n(0?9L(
c5Au
PE=^ͧ^jb !yu騈Jȱ<0StJB_Gܮhh +״_[Ac:Ri`ʎ{=1H~F[\j@C閣5ɞU]4:xDpm)Ω>|NqQ9]S,0b&HBuC
-'ff"AaM->@g]lBfϲ?K+.cB|~Û3Vae+^ŝy'SH鎷Vkԓ|a;}/4 Vn\5V DD˥JƦ0@?y6O&}٪zpZp\X
Ɛpum͔6t&p_8VĘpHe``YnI8XA:X!1wo5gEMhncG/K6k<c +bS tkIb)2H;4%'*K:F#fH +rlPu_uw",QE6)mra] ^G9 ؛7Vdx?|Jv!@]u+H + 1j!&=nt<BՍ4ڢtmqg6z-O7c>UWz~֝x5Xj ߖx݂:಄wXsc2ޕ]ͱU!#UE!ۖuI;FiU'Q>MAWE?[6j*Qeg5G;2"mV};*E`v%:O[Ï~2
}lNoD7!*Uٷq}>'&6I a +ӟn1z0
Yfk/~@J:~Q7|!5ΫF1G9.)}g-_jlp^:HU͆WH,?X2nؓCQn`dRkk-aJ*8E~4~\MQ-֓>RbCؕliBz_> ̛B[Mx=f0`*O1x +u]e[8^0Ir_F*.i7!XW4s/=otZ)W2Liwl^RVo+/L=o}v~}+
3K/j'H +[ endstream endobj 27 0 obj @@ -816,7 +814,7 @@ endobj /Ascent 850 /Descent -200 /FontBBox[-4 -948 1329 786] -/FontName/AFCVQE+CMSY6 +/FontName/FJIVFI+CMSY6 /ItalicAngle -14.035 /StemV 93 /FontFile 26 0 R @@ -832,13 +830,11 @@ endobj /Length 1321 >> stream -xRkPWAŵvUJE n UB*5KiPus,lva IBUyA*GkV|P.Pw=]W(\,! 0!(`BquUH90__ȍZI -L%:)d@,I4Py@CSb -Qzxa4IZ)Y (/%H@*HZ
-Z^vACZWnI?N2\|Ot,ρ^#ܵ,32/~+#7sat{)">I2ug8A_UEGz4L/=bڷatC9ۘM[tK.=4*kRco~Ь56gJ^5Z?s7}FӡGjK7k6K<qZQ;k}lR -R DW_KX9sÈP¸'gT}iKâ_:+oU٥** _>;.p1二=' -y!X~rJ!dwJf_?o߸wyƈ|QQ߹~KL+~朧xē1&YJ5vٸl2ÔnO&: -Zft/4*\q|~ZTݑ|CӧI^I6+]Qd>)q%hY\sz;*>X_?!@Pg9F' +xRiPGA1 QH
"1"QqY +n (x!B(^ H<HY*J4#$@h2`/?}kwpPe`愘jM`"qwd!Αs`J%TF=d +uPƤא )/xZ,@u8Olo\
6RTn[sz
$edBJPK
CHBE)Tz2%4Cm8@S)piP+|zF!C;$EZ @߰jM͇Ēf(oɐf%i= +J4vݘw~`iٙ{B^W4i]֙RW\jMthΙč0$,Ω~Z"1Ȼ;#V;bbǜe{0"TKS{x<LjH8m_XscwfrW6l \duRod־VWI +ݭپs.ŵˏsܸwiȒqq؎~CL+>Lw;~8!Z)8dvֱ{MvnL0Ӗ ǃ=n%'M<fmv>!S^I1;|dUsLKN_ɳ@vT2
xS_?!@Pg9ƀ endstream endobj 36 0 obj @@ -848,7 +844,7 @@ endobj /Ascent 850 /Descent -200 /FontBBox[-61 -278 840 871] -/FontName/XNWCOG+NimbusMonL-BoldObli +/FontName/OQNBWV+NimbusMonL-BoldObli /ItalicAngle -12 /StemV 103 /FontFile 35 0 R @@ -869,7 +865,7 @@ xweTm&N4=[ XN.';wwXۙo53l>OUuUwi )@NMKKO_. G1Ș@ -!kwJ虘P9 +!kwJ虘P9 δ&~ED0aAx -koΘٙ-x+`A'pyk> |Nt!ۅqYcF//nV @@ -908,7 +904,7 @@ en}'LǼ"Մo&_ψB&`JJuZs۽hUHr<Oq0os ĩ~l2[TvTeXVz9$5-9vpPw?J垹(r2YZB0L=_M(nWpJ1L$uմt'Խ!~ͧP %"c3yd¯Ҡ!oC\['cogJz6#C+Pب 6x8_tb/8Gx,]?3֠!su6`&TrgMǸq:$Zu&T)}~]Y,=53r~l'P)kK({?û'lXrJj֨?r92/;zPW/ZM8-ό:(4mG,Z[V)@}PeK(foq&,=xUarEkԝDJ'}Q3;۴.lHTGtMmM9Io;RPF4Y+u
dAs^;z
Xu6;ϚŃ&RW,SgVW:dD2m~-I9#ѩy7 d%u߫S/XԕE5
;dDR͝8)a -N +N endstream endobj 39 0 obj @@ -918,7 +914,7 @@ endobj /Ascent 850 /Descent -200 /FontBBox[-32 -250 1048 750] -/FontName/WQYJPP+CMMI10 +/FontName/RRCJKY+CMMI10 /ItalicAngle -14.04 /StemV 72 /FontFile 38 0 R @@ -934,36 +930,31 @@ endobj /Length 1823 >> stream -x}8ǩɜMs#ČcXRC4f<yk$jeJZKE"Wnꐲ^BQi 9C۵ױsu}ycb":a -z{{R -`A0ZD͓|I!f -$E"!1ăpr -Ya..YmQS2h#
ؒ4j+ -!D }a4TA\l56鲽K?yl83@@ -77bbLbz[-4GرYv٣qa~˝~f盞u$W5qtw8yEwݐ!Ӈ]tׯ\g{43*TecTw]C5},2FArA?f}ź3(^._ -܅qz[6<M'*IM-Op1_n&^~y^,kz麑opbHiOs:**>rеR!DTO9>mM|h|qI'Ạlt{~m
&7`v;FcAZ2~Gc__"K ]l"L& -ʩH=M$.~nRU+hnK6KFm6OYF#M:II̺/?ҏEWE˾"6 Ύ
Fu8K彀&#Av:Rp{^KT`R+G#O+WY9{45fަ)< \g鯫V^tHj:3oqtۘX_N5Z8+r -}LXn2G0V/4\Z{+6Sj*D͍HX^JU%v"qkQ*i;~}FSBw^1 -iaS4VyC4uqqJvXSˎhm&K1l-=!*D[8d}X(MY,^Vj)<6a&0ء58ӗ{~P%8uNn:Fc)!HqُtO7Tz隞]OcJh(x1AK"̕
(f3>neUf̼AO[V+xV53Aw&=>Y5D=Eə6^GGɓD3[G3k t+_nK٬e" 9yZ<SgT#ea*?OH -w<U{0ڹd%Sta0h0I$r=/ONkrfHv;7w/i})62i~7
,UrZL?]>Aoigf~
k4$yFx%2mҟL5&ha>W .łh0 -'x +x}8ǩ&,!f0%ƒҘy';/ɆuRRr:PmZBk}hZ{9\yޟ{?>LW 1L$Ӂ556vBl1,@\bvv!+k@m6T,c0/BL]VTT a^lqp|p`HK+[DAKbd9b`k偄 +lPS6?K +lH45fˑ"^Є0*I!6tι4 +ùǼ>OtG +7bJM]{e[-lGزtVɽqad~N˝~FuDΗڽ5qGiyEw]!]Fiޯ^gT&R>uwyGn̍kL4ۥr坃g~ucx7PR=~3/3 +l橛Y]k#+ȚU1üwMM<8h%u#脐1=Ͼ⠠(Uf]jJ[Z-~cS.25MrϿd''#JSn5\vd:iSs?RɿEVAxafd3IKr+t&3"Q`4e#ٖd^+S
Y+/ԫiY?nfUgVn:oQ<OLbԍn$..80;6QT-w(wA[H%{~Ӱ$KWw+GY9y85f֦)/\gᯭR^/tPj:3oqyw[Y]J;-r +}d4Pݝd&(Ppq>/ӼkOo饛47"ci:)Wڗ؊ĭE'
o=CtMYJ2FzX;|ڍd1auooϾ/c/vxRҊ"nԵț.,NXJ=1JVcԾ6j˦RKþ+wO(lZJES2r
J-MmvhF.T@O0vU/^>ޘCEHmӯo#M5茽"p#|?*xݘ+OPӳm3|S*p#{iF^o B.+?隙FNb/` s]`t#нq"i#F+_lI٬a, :Zj=SkPT +~2p|)1ܹD%SxS}~x
x$ԗ'#4z1AU';wVS;Ɨ>مe=Ynl\蓀?YZł*ح[&.蠵433Fro=h,#~uג鏧MjB]ǰU+JGIbA[lb endstream endobj -42 0 obj +46 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-251 -250 1009 969] -/FontName/MWYZOO+CMR10 +/FontName/ZZIIWZ+CMR10 /ItalicAngle 0 /StemV 69 -/FontFile 41 0 R +/FontFile 45 0 R /Flags 4 >> endobj -41 0 obj +45 0 obj << /Filter[/FlateDecode] /Length1 820 @@ -972,28 +963,25 @@ endobj /Length 3719 >> stream -xy8j31cٕ2-y0̢"{TlYK"K)E$f|:?:<s~>~=Ji`N.@Bʀ08\",EQ, -E(`JDcA/ -Q1WǩN֦MTntMָCw9j -(*~ʢDcwRWurr, -?{>h9h<;P;NKKx2j*Zg>P-h /UjayrἒUMh1'
ONոv;`m,&X+c<4YR~nܵ*g/l:Wp]F{8z')R.{½z|΅Nc-e R7zq\3!e#[o(a۷U/\+|hYS1NOm3]~:1[O#9\:Ӟ]*0A3چy6!&m(vsGNf+S}fZf{vqS2>ªt=rR"Ԭ~10F"
'`!,B*SƠ;;Glng8rb]׆څ|"4֍uD%ڀ".^.>IMkLOMDoeYY^m{,XWJ
~ٷV~4}UvD%0ioZ}ɛ떐}oD:,:=+mTL7JxiO:<0F+XJIaHFyk %1EDWw^GhMRCIIѺ<>#貀ǺR%0f0>^o-ۧW%?'@֙"6倸>ePE<=
V"?8Wr.~j}{:ҧ)--ud}kLw$&
֬L_UoKqE7)=cBqtbd> (O,~ jfyqvRʡ谣"\[TJaS 7|=#O_PPO|Sy$Nyy}(Wұg
-lAb21a_o%&PN.ܚ҅&w[vh5 -1f6.GgFW4j>OG<az<ݐmQoXt]20=&s -MG\yևWbX+Db;l(+
Ba(Ps-JC73`eD"d/kFÿ-'N&P|{o9ȼmlzv}JNwfHXވ=QِĴ1*zt$FdqFА"iwzprg?/6f$k[q88SJ4='̫3|;usS:oMQbڙUԹKnmCȵw'{.9m0qz}ּ뗣Aq,zHmX+A|rvI'kalȹ -_&诬x?0A#뷋gܽ:6_L)Ή!pX0FO0aR5ݶw.]Brn_!?+f\7-*v\(ZӘ{^*ݫhxF0Wh0k -8QV"]O -,Q>9f|F`6%D|5°7K6̵~;"ej@f;e9őS}J#>[o]kꍶT| -Sc/`3[}91trGafʤL -uTVo][֚j,{)ҿ~bo[(@K{O^ּ- -w$ݺiy|JE⁍j$Δ -j?)EZ檜ZjyCYW$MƳ*~P$6|lOTnc,# PQ*fp=殶RptܑΓϐ?(Ɓ(G!& +xy8j31cɒ+ed'[̃a͌]dȞ=-[R)!N E7~uu;y纯|z>- +52A=""!Tm `pDTT(X"AEU:&OUQAUQ>$ЖhA" +^[|#w$ +m @k
H<Qe@$
@H +,Vi$rǵ~2r6Hp@ʍiN^ +U2h#q/&MV[..m;&4Y ?ڊIlLY⟩zUJv>j< U\ݐTw.?9lWgϫyTU=Aԛ'.h{u%n0YB,o1`ѩ-ReE`\Ge<zoX;`5T-PRO6꽥yUu-)ֶ<72?7-.$h"9%vG{#KɄSȽ`[K +#+wOZe.Kh^1Cmwi8
qy͖vԀWX4WLłɬrojJ8kJIm:2YN3s+ʨz9yMy0|N饅[ :j#C-p3xWrZ@Wm=?rlKve}%G>0.NQbZBPU
Y?l0cZdneͮJ+UqNngqxiCszt}bdlxZwqsӂt˻쌰qV˫ɺLF݂|垩kn[MBg;Ǽ&g)梞Xt]Xa]6%DYi*D
{#D:G^npC!2-VYTH|Bm{ |X|: xce늗!iGjYy;YbTza,yjv"0fRU*k`)%~enr=y(m4h"}uVjet+Ej)۶ntJԬ_W"҇kgfu߷$d7>)qz%شPhF4XH5sjZg
x+hEQYM}Q#ȓ 0$FxҎÍ+5bg킚Ve^Ӳh
Mɍ'Lϕ1 +t]}y[u2BQj$g(-ڭBiL7ԲR +n}T@1\Qfe$l^8[Dv aOZ)oZaZPx{^>LgpwdZ +~fJ?W]JxJ<-г26sUCKs +|k8#|UaL(V;:vehSjo܂\ۿפ{A6BG.T{U4yƊ=W;W!&-6+ kc[an\~zBM쑍/j"܊h>9ƝMmUwRciɔc띗MF2ʟMVl!}j.?:HHWHE1u;:CAb1-/9"/?Q +"A # endstream endobj 1 0 obj << -/Creator( TeX output 2008.11.02:2000) +/Creator( TeX output 2009.04.30:0556) /Producer(dvipdfm 0.13.2d, Copyright \251 1998, by Mark A. Wicks) -/CreationDate(D:20081102200036+01'00') +/CreationDate(D:20090430055633+01'00') >> endobj 5 0 obj @@ -1008,14 +996,14 @@ endobj << /Type/Page /Resources 34 0 R -/Contents[29 0 R 4 0 R 44 0 R 31 0 R] +/Contents[29 0 R 4 0 R 41 0 R 31 0 R] /Parent 3 0 R >> endobj -46 0 obj +43 0 obj << /Type/Page -/Resources 47 0 R +/Resources 44 0 R /Contents[29 0 R 4 0 R 48 0 R 31 0 R] /Parent 3 0 R >> @@ -1024,7 +1012,7 @@ endobj << /Type/Pages /Count 3 -/Kids[5 0 R 33 0 R 46 0 R] +/Kids[5 0 R 33 0 R 43 0 R] /MediaBox[0 0 595 842] >> endobj @@ -1075,58 +1063,58 @@ endobj xref 0 53 0000000000 65535 f -0000127296 00000 n -0000128106 00000 n -0000127767 00000 n -0000127959 00000 n -0000127460 00000 n -0000011295 00000 n +0000128711 00000 n +0000129521 00000 n +0000129182 00000 n +0000129374 00000 n +0000128875 00000 n +0000011433 00000 n 0000000009 00000 n -0000019099 00000 n -0000018900 00000 n +0000019515 00000 n +0000019316 00000 n 0000001823 00000 n -0000039633 00000 n -0000039438 00000 n +0000040462 00000 n +0000040267 00000 n 0000002961 00000 n -0000041331 00000 n -0000041129 00000 n +0000042159 00000 n +0000041957 00000 n 0000003895 00000 n -0000057268 00000 n -0000057072 00000 n +0000058096 00000 n +0000057900 00000 n 0000005039 00000 n -0000075504 00000 n -0000075301 00000 n +0000076332 00000 n +0000076129 00000 n 0000006172 00000 n -0000088687 00000 n -0000088490 00000 n +0000089515 00000 n +0000089318 00000 n 0000007309 00000 n -0000107011 00000 n -0000106818 00000 n +0000108426 00000 n +0000108233 00000 n 0000008442 00000 n -0000127859 00000 n +0000129274 00000 n 0000009364 00000 n -0000127909 00000 n -0000011196 00000 n -0000127561 00000 n -0000017211 00000 n -0000108649 00000 n -0000108445 00000 n -0000011356 00000 n -0000121338 00000 n -0000121144 00000 n -0000012493 00000 n -0000123463 00000 n -0000123275 00000 n -0000013422 00000 n -0000014324 00000 n -0000017089 00000 n -0000127664 00000 n -0000018838 00000 n -0000017273 00000 n -0000018783 00000 n -0000128041 00000 n -0000128063 00000 n -0000128084 00000 n +0000129324 00000 n +0000011334 00000 n +0000128976 00000 n +0000016058 00000 n +0000110064 00000 n +0000109860 00000 n +0000011494 00000 n +0000122753 00000 n +0000122559 00000 n +0000012631 00000 n +0000013560 00000 n +0000015959 00000 n +0000129079 00000 n +0000019254 00000 n +0000124878 00000 n +0000124690 00000 n +0000016120 00000 n +0000017022 00000 n +0000019165 00000 n +0000129456 00000 n +0000129478 00000 n +0000129499 00000 n trailer << /Size 53 @@ -1134,5 +1122,5 @@ trailer /Info 1 0 R >> startxref -128201 +129616 %%EOF diff --git a/Master/texmf-dist/doc/support/texcount/QuickReference.tex b/Master/texmf-dist/doc/support/texcount/QuickReference.tex index 8bd0fb55c97..e6aeaf3eee8 100644 --- a/Master/texmf-dist/doc/support/texcount/QuickReference.tex +++ b/Master/texmf-dist/doc/support/texcount/QuickReference.tex @@ -7,10 +7,10 @@ \include{macros} -\title{\TeXcount{}\footnote{Copyright 2008 Einar Andreas Rdland, distributed +\title{\TeXcount{}\footnote{Copyright (2008-2009) of Einar Andreas Rdland, distributed under the \LaTeX{} Project Public Licence (LPPL).}~ Quick Reference Guide\\ -Version 2.1 +Version 2.2 } \begin{document} @@ -42,6 +42,10 @@ where \code{texcount} refers to the TeXcount Perl-script, and the options may be \option[-brief]Only prints a one line summary of the counts. +\option[-q, -quiet]Quiet mode, does not print error messages. Use is +discouraged, but it may be useful when piping the output into another +application. + \option[-total]Only give total sum, no per file sums. \option[-1]Same as specifying \code{-brief} and \code{-total}, and ensures there will only be one line of output. If used with \code{-sum}, the output will only be the total number. @@ -60,6 +64,14 @@ where \code{texcount} refers to the TeXcount Perl-script, and the options may be \option[-dir\alt{=\ldots}]Working directory, either taken from the first file given, or specified. +\option[-utf8, -unicode]Turn on Unicode (UTF-8) support. + +\option[-ch, -chinese, -zhongwen]Turn on Chinese mode in which Chinese +characters are counted. Switches on UTF-8 mode. + +\option[-jp, -japanese]Turn on Japanese mode in which Japanese +characters (kanji and kana) are counted. Switches on UTF-8 mode. + \option[-html]Output in HTML format. \option[-htmlcore]Only HTML body contents. diff --git a/Master/texmf-dist/doc/support/texcount/TeXcount.pdf b/Master/texmf-dist/doc/support/texcount/TeXcount.pdf Binary files differindex 72f71722a9c..d40319268d1 100644 --- a/Master/texmf-dist/doc/support/texcount/TeXcount.pdf +++ b/Master/texmf-dist/doc/support/texcount/TeXcount.pdf diff --git a/Master/texmf-dist/doc/support/texcount/TeXcount.tex b/Master/texmf-dist/doc/support/texcount/TeXcount.tex index 3ec27f73368..78296cc2847 100644 --- a/Master/texmf-dist/doc/support/texcount/TeXcount.tex +++ b/Master/texmf-dist/doc/support/texcount/TeXcount.tex @@ -9,11 +9,11 @@ %\parindent=0pt\parskip=8pt -\title{\TeXcount\footnote{Copyright 2008 Einar Andreas Rdland, distributed +\title{\TeXcount\footnote{Copyright (2008-2009) of Einar Andreas Rdland, distributed under the \LaTeX{} Project Public Licence (LPPL).}\\ \Large Perl script for counting words in \LaTeX{} documents\\ -Version 2.1} +Version 2.2} \author{Einar Andreas Rdland} \begin{document} @@ -100,6 +100,10 @@ where the options may be amongst the following: \option[-brief]Only prints a one line summary of the counts. +\option[-q, -quiet]Quiet mode, does not print error messages. Use is +discouraged, but it may be useful when piping the output into another +application. + \option[-total]Only give total sum, no per file sums. \option[-1]Same as specifying \code{-brief} and \code{-total}, and ensures there will only be one line of output. If used with \code{-sum}, the output will only be the total number. @@ -118,6 +122,14 @@ where the options may be amongst the following: \option[-dir\alt{=\ldots}]Working directory, either taken from the first file given, or specified. +\option[-utf8, -unicode]Turn on Unicode (UTF-8) support. + +\option[-ch, -chinese, -zhongwen]Turn on Chinese mode in which Chinese +characters are counted. Switches on UTF-8 mode. + +\option[-jp, -japanese]Turn on Japanese mode in which Japanese +characters (kanji and kana) are counted. Switches on UTF-8 mode. + \option[-html]Output in HTML format. \option[-htmlcore]Only HTML body contents. diff --git a/Master/texmf-dist/scripts/texcount/TeXcount.pl b/Master/texmf-dist/scripts/texcount/texcount.pl index 8b68e4984c0..96fac5cd220 100755 --- a/Master/texmf-dist/scripts/texcount/TeXcount.pl +++ b/Master/texmf-dist/scripts/texcount/texcount.pl @@ -2,12 +2,13 @@ use strict; use warnings; use Term::ANSIColor; +use Encode; use POSIX qw(locale_h); use locale; setlocale(LC_CTYPE,"no_NO"); -my $versionnumber="2.1"; -my $versiondate="2008 Nov 02"; +my $versionnumber="2.2"; +my $versiondate="2009 Apr 30"; ###### Set CMD specific settings and variables @@ -19,14 +20,18 @@ my $showsubcounts=0; my $htmlstyle=0; my $includeTeX=0; my $briefsum=0; -my $totalflag=0; my @sumweights; -my $globalworkdir=""; +my $utf8flag=0; # Global variables my $blankline=0; +my $errorcount=0; + +# CMD specific global variables +my $totalflag=0; my @filelist; my $workdir; +my $globalworkdir=""; ###### Set global settings and variables @@ -118,7 +123,7 @@ my %TeXgroup=('document'=>1,'letter'=>1,'titlepage'=>0, 'abstract'=>1,'quote'=>1,'quotation'=>1,'verse'=>1,'minipage'=>1,'verbatim'=>1, 'description'=>1,'enumerate'=>1,'itemize'=>1,'list'=>1, 'theorem'=>1,'lemma'=>1,'definition'=>1,'corollary'=>1,'example'=>1, - 'math'=>6,'displaymath'=>7,'equation'=>7,'eqnarray'=>7, + 'math'=>6,'displaymath'=>7,'equation'=>7,'eqnarray'=>7,'align'=>7, 'figure'=>-1,'float'=>-1,'picture'=>-1,'table'=>-1, 'tabbing'=>0,'tabular'=>0,'thebibliography'=>0,'lrbox'=>0); @@ -161,7 +166,7 @@ $STYLES[1]={%{$STYLES[0]}, 'grouping'=>'red','document'=>'red','mathgroup'=>'magenta', 'state'=>'cyan underline','sumcount'=>'yellow'}; $STYLES[2]={%{$STYLES[1]}, - 'command'=>'green','exclgroup'=>'yellow','exclmath'=>'yellow', + 'command'=>'green','exclcommand'=>'yellow','exclgroup'=>'yellow','exclmath'=>'yellow', 'ignore'=>'cyan'}; $STYLES[3]={%{$STYLES[2]}, 'tc'=>'bold yellow','comment'=>'yellow','option'=>'yellow', @@ -170,10 +175,15 @@ $STYLES[4]={%{$STYLES[3]}}; ### Word regexp pattern list # List of regexp patterns that should be analysed as words. +# Use @ to represent a letter, will be substituted with $LetterPattern. +my @WordPatterns=('(@+\.)+@+\.?','@+([\-\']@+)*'); my $specialchars='\\\\(ae|AE|o|O|aa|AA)'; my $modifiedchars='\\\\[\'\"\`\~\^\=](\w|\{\w\})'; -my @WordPatterns=('(\w+\.)+\w+\.?','\w+([\-\']\w+)*'); -my @WordPatternsRelaxed=('([\w\-\']|'.$modifiedchars.'|'.$specialchars.'(\{\})?|\{'.$specialchars.'\})+'); +my $LetterPattern='\w'; +my $LetterPatternRelaxed='([\w\-\']|'.$modifiedchars.'|'.$specialchars.'(\{\})?|\{'.$specialchars.'\}|\{\w\})'; +my %NamedWordPattern; +$NamedWordPattern{'chinese'}='\p{script=Han}'; +$NamedWordPattern{'japanese'}='(\p{script=Han}|\p{script=Hiragana}|\p{script=Katakana})'; ### Macro option regexp list # List of regexp patterns to be gobbled as macro option in and after @@ -183,6 +193,7 @@ my @MacroOptionPatternsRelaxed=('\[[^\[\]\n]*\]'); ###### Main script + ################################################### MAIN(@ARGV); @@ -200,13 +211,14 @@ sub MAIN { my @toplevelfiles=Parse_Arguments(@args); Apply_Options(); if (scalar(@toplevelfiles)==0) { - if ($showcodes>1) {print_help_style();} - else {print_error("No files specified.","p","error");} + conditional_print_help_style() + || print_error("No files specified.","p","error"); } else { conditional_print_help_style(); my $totalcount=parse_file_list(@toplevelfiles); conditional_print_total($totalcount); } + Report_ErrorCount(); Close_Output(); } @@ -265,9 +277,18 @@ sub parse_options_parsing { elsif ($arg eq '-noinc') {$includeTeX=0;} elsif ($arg eq '-dir') {$globalworkdir=undef;} elsif ($arg=~/^-dir=(.*)$/) {$globalworkdir=$1;} + elsif ($arg=~/^-(utf8|unicode)$/) {$utf8flag=1;} + elsif ($arg=~/^-(ch|chinese|zhongwen)$/) { + $utf8flag=1; + @WordPatterns=($NamedWordPattern{'chinese'},@WordPatterns); + } + elsif ($arg=~/^-(jp|japanese)$/) { + $utf8flag=1; + @WordPatterns=($NamedWordPattern{'japanese'},@WordPatterns); + } elsif ($arg eq '-relaxed') { @MacroOptionPatterns=@MacroOptionPatternsRelaxed; - @WordPatterns=@WordPatternsRelaxed; + $LetterPattern=$LetterPatternRelaxed; } else {return 0;} return 1; @@ -307,9 +328,9 @@ sub option_sum { sub parse_options_format { my $arg=shift @_; - if ($arg eq '-brief') {$briefsum=1; return 1;} - elsif ($arg eq '-total') {$totalflag=1; return 1;} - elsif ($arg eq '-1') {$briefsum=1;$totalflag=1;} + if ($arg eq '-brief') {$briefsum=1;} + elsif ($arg eq '-total') {$totalflag=1;} + elsif ($arg eq '-1') {$briefsum=1;$totalflag=1;$verbose=-1;} elsif ($arg eq "-html" ) {option_no_colours();$htmlstyle = 2;} elsif ($arg eq "-htmlcore" ) {option_no_colours();$htmlstyle = 1;} elsif ($arg=~/^\-(nocol|nc$)/) {option_no_colours();} @@ -329,7 +350,8 @@ sub parse_options_output { elsif ($arg eq '-vv' || $arg eq '-v2') {$verbose=2;} elsif ($arg eq '-vvv' || $arg eq '-v3' || $arg eq '-v') {$verbose=3;} elsif ($arg eq '-vvvv' || $arg eq '-v4') {$verbose=3; $showstates=1;} - elsif ($arg =~ /^\-showstates?$/ ){$showstates=1;} + elsif ($arg =~ /^\-showstates?$/ ) {$showstates=1;} + elsif ($arg =~ /^-(q|-?quiet)$/ ) {$verbose=-1;} else {return 0;} return 1; } @@ -361,7 +383,7 @@ sub parse_file { my $fpath=$f; $fpath=~s/^((.*[\\\/])?)[^\\\/]+$/$1/; if (!defined $tex) { - #print_error("File not found or not readable: ".$f."\n"); + print STDERR "File not found or not readable: ".$f."\n"; formatprint("File not found or not readable: ".$f."\n","p","error"); } else { parse($tex); @@ -377,22 +399,26 @@ sub parse_file { return $filetotalcount; } + ###### ###### Subroutines ###### -###### Option handling +###### CMD specific implementations -# Apply options to set values -sub Apply_Options { - %STYLE=%{$STYLES[$verbose]}; - if ($htmlstyle>1) {html_head();} + +sub add_file_to_list { + my $fname=shift @_; + push @filelist,$workdir.$fname; } -# Close the output, e.g. adding HTML tail -sub Close_Output { - if ($htmlstyle>1) { - html_tail(); +sub print_with_style { + my ($text,$style,$colour)=@_; + #if ($utf8flag || $htmlstyle) {utf8::encode($text);} + if ($htmlstyle) { + print "<span class='".$style."'>".$text."</span>"; + } else { + print Term::ANSIColor::colored($text,$colour); } } @@ -415,7 +441,22 @@ sub conditional_print_total { } } -###### TeX File handle +###### Option handling + + +# Apply options to set values +sub Apply_Options { + %STYLE=%{$STYLES[$verbose]}; + if ($utf8flag) {binmode STDOUT,':utf8';} + if ($htmlstyle>1) {html_head();} + foreach (@WordPatterns) { + s/\@/$LetterPattern/g; + } +} + + +###### TeX code handle + sub TeXfile { my $filename=shift @_; @@ -423,6 +464,30 @@ sub TeXfile { return TeXcode($file,$filename); } +sub read_file { + my $filename=shift @_; + if ($utf8flag) { + open(FH,"<:utf8",$filename) || return undef; + } else { + open(FH,"<".$filename) || return undef; + } + if ($verbose>0) { + formatprint("File: ".$filename."\n",'h2'); + $blankline=0; + } + my @text=<FH>; + close(FH); + my $latexcode=join('',@text); + if ($utf8flag) { + $latexcode =~ s/^\x{feff}//; + } + return $latexcode; +} + +###### Parsing routines + + +# Make TeXcode handle sub TeXcode { my ($texcode,$filename,$title)=@_; my %TeX=(); @@ -454,20 +519,7 @@ sub TeXcode { return \%TeX; } -sub read_file { - my $filename=shift @_; - open(FH,"<".$filename."") || return undef; - if ($verbose) { - formatprint("File: ".$filename."\n",'h2'); - $blankline=0; - } - my @text=<FH>; - close(FH); - return join('',@text); -} - -###### Parsing routines - +# Parse LaTeX document sub parse { my ($tex)=@_; if ($htmlstyle && $verbose) {print "<p class=parse>\n";} @@ -477,6 +529,7 @@ sub parse { if ($htmlstyle && $verbose) {print "</p>\n";} } +# Parse one block or unit sub parse_unit { # Status: # 0 = exclude from count @@ -542,52 +595,7 @@ sub parse_unit { set_style($tex,'ignore'); } elsif ($tex->{'type'}==3) { # macro call - if (my $label=$BreakPoints{$next}) { - if ($tex->{'line'}=~ /^[*]?(\s*\[.*?\])*\s*\{(.+?)\}/ ) { - $label=$label.': '.$2; - } - add_subcount($tex,$label); - } - set_style($tex,'command'); - if ($next eq '\begin' && $status!=-2) { - parse_begin_end($tex,$status); - } elsif (($status==-1) && ($substat=$TeXfloatinc{$next})) { - # text included from float - gobble_macro_parms($tex,$substat); - } elsif ($status==-9 && defined ($substat=$TeXpreamble{$next})) { - # parse preamble include macros - if (defined $TeXheader{$next}) {inc_count($tex,4);} - gobble_macro_parms($tex,$substat,1); - } elsif ($status<0) { - # ignore - gobble_option($tex); - } elsif ($next eq '\(') { - # math inline - parse_math($tex,$status,6,'\)'); - } elsif ($next eq '\[') { - # math display - parse_math($tex,$status,7,'\]'); - } elsif ($next eq '\def') { - # ignore \def... - $tex->{'line'} =~ s/^([^\{]*)\{/\{/; - flush_next($tex); - print_style($1.' ','ignore'); - parse_unit($tex,-2); - } elsif (defined (my $addsuffix=$TeXfileinclude{$next})) { - # include file: queue up for parsing - parse_include_file($tex,$status,$addsuffix); - } elsif (defined ($substat=$TeXmacro{$next})) { - # macro: exclude options - if (defined $TeXheader{$next}) {inc_count($tex,4);} - gobble_macro_parms($tex,$substat,$status); - } elsif (defined ($substat=$TeXmacroword{$next})) { - # count macro as word (or a given number of words) - inc_count($tex,$status,$substat); - set_style($tex,'word'.$status); - } elsif ($next =~ /^\\[^\w\_]/) { - } else { - gobble_option($tex); - } + parse_macro($tex,$next,$status,$substat); } elsif ($next eq '$') { # math inline parse_math($tex,$status,6,'$'); @@ -601,16 +609,56 @@ sub parse_unit { } } -sub gobble_option { - my $tex=shift @_; - flush_next($tex); - foreach my $pattern (@MacroOptionPatterns) { - if ($tex->{'line'}=~s/^($pattern)//) { - print_style($1,'option'); - return $1; +sub parse_macro { + my ($tex,$next,$status,$substat)=@_; + if (my $label=$BreakPoints{$next}) { + if ($tex->{'line'}=~ /^[*]?(\s*\[.*?\])*\s*\{(.+?)\}/ ) { + $label=$label.': '.$2; } + add_subcount($tex,$label); + } + set_style($tex,$status>0?'command':'exclcommand'); + if ($next eq '\begin' && $status!=-2) { + parse_begin_end($tex,$status); + } elsif (($status==-1) && ($substat=$TeXfloatinc{$next})) { + # text included from float + set_style($tex,'command'); + gobble_macro_parms($tex,$substat); + } elsif ($status==-9 && defined ($substat=$TeXpreamble{$next})) { + # parse preamble include macros + set_style($tex,'command'); + if (defined $TeXheader{$next}) {inc_count($tex,4);} + gobble_macro_parms($tex,$substat,1); + } elsif ($status<0) { + # ignore + gobble_option($tex); + } elsif ($next eq '\(') { + # math inline + parse_math($tex,$status,6,'\)'); + } elsif ($next eq '\[') { + # math display + parse_math($tex,$status,7,'\]'); + } elsif ($next eq '\def') { + # ignore \def... + $tex->{'line'} =~ s/^([^\{]*)\{/\{/; + flush_next($tex); + print_style($1.' ','ignore'); + parse_unit($tex,-2); + } elsif (defined (my $addsuffix=$TeXfileinclude{$next})) { + # include file: queue up for parsing + parse_include_file($tex,$status,$addsuffix); + } elsif (defined ($substat=$TeXmacro{$next})) { + # macro: exclude options + if (defined $TeXheader{$next}) {inc_count($tex,4);} + gobble_macro_parms($tex,$substat,$status); + } elsif (defined ($substat=$TeXmacroword{$next})) { + # count macro as word (or a given number of words) + inc_count($tex,$status,$substat); + set_style($tex,'word'.$status); + } elsif ($next =~ /^\\[^\w\_]/) { + } else { + gobble_option($tex); } - return undef; } sub parse_tc { @@ -635,7 +683,10 @@ sub parse_tc { elsif ($instr eq 'header') {$TeXheader{$macro}=$param;$TeXmacro{$macro}=$param;} elsif ($instr eq 'macroword') {$TeXmacroword{$macro}=$param;} elsif ($instr eq 'preambleinclude') {$TeXpreamble{$macro}=$param;} - elsif ($instr eq 'group') {$TeXmacro{'begin'.$macro}=$param;$TeXgroup{$macro}=$option;} + elsif ($instr eq 'group') { + $TeXmacro{'begin'.$macro}=$param; + $TeXgroup{$macro}=$option; + } elsif ($instr eq 'floatinclude') {$TeXfloatinc{$macro}=$param;} elsif ($instr eq 'fileinclude') {$TeXfileinclude{$macro}=$param;} elsif ($instr eq 'breakmacro') {$BreakPoints{$macro}=$param;} @@ -715,13 +766,24 @@ sub parse_include_file { my $fname=$1; if ($addsuffix==2) {$fname.='.tex';} elsif ($addsuffix==1 && ($fname=~/^[^\.]+$/)) {$fname.='.tex';} - #if ($includeTeX) {push @filelist,$tex->{'filepath'}.$fname;} - if ($includeTeX) {push @filelist,$workdir.$fname;} + if ($includeTeX) {add_file_to_list($fname);} } else { print_style($&,'ignored'); } } +sub gobble_option { + my $tex=shift @_; + flush_next($tex); + foreach my $pattern (@MacroOptionPatterns) { + if ($tex->{'line'}=~s/^($pattern)//) { + print_style($1,'option'); + return $1; + } + } + return undef; +} + sub gobble_options { while (gobble_option(@_)) {} } @@ -774,7 +836,7 @@ sub next_token { if ($type==0) { print_style($next,'comment'); } elsif ($type==9) { - if ($verbose) {line_return(1,$tex);} + if ($verbose>0) {line_return(1,$tex);} } else { return $next; } @@ -797,9 +859,10 @@ sub get_next_token { # 666: TeXcount instruction (%TC:instruction) my $tex=shift @_; my $next; - (defined ($next=get_token($tex,'\%+TC:[^\n]*',666))) && return $next; - (defined ($next=get_token($tex,'\%[^\n]*',0))) && return $next; - (defined ($next=get_token($tex,'\n',9))) && return $next; + (defined ($next=get_token($tex,'\%+TC:\s*endignore\b[^\r\n]*',666))) && return "%TC:endignore"; + (defined ($next=get_token($tex,'\%+TC:[^\r\n]*',666))) && return $next; + (defined ($next=get_token($tex,'\%[^\r\n]*',0))) && return $next; + (defined ($next=get_token($tex,'(\r|\n|\r\n)',9))) && return $next; (defined ($next=get_token($tex,'\\\\[\{\}]',2))) && return $next; foreach my $pattern (@WordPatterns) { (defined ($next=get_token($tex,$pattern,1))) && return $next; @@ -830,6 +893,7 @@ sub get_token { ###### Count handling routines + sub new_count { my ($title)=@_; my @cnt=(0,0,0,0,0,0,0,0); @@ -944,6 +1008,7 @@ sub add_subcount { ###### Printing routines + sub set_style { my ($tex,$style)=@_; if (!(($tex->{'style'}) && ($tex->{'style'} eq '-'))) {$tex->{'style'}=$style;} @@ -977,11 +1042,7 @@ sub print_style { my $colour; ($colour=$STYLE{$style}) || return; if (($colour) && !($colour eq '-')) { - if ($htmlstyle) { - print "<span class='".$style."'>".$text."</span>"; - } else { - print Term::ANSIColor::colored($text,$colour); - } + print_with_style($text,$style,$colour); if ($state) { print_style($state,'state'); } @@ -994,9 +1055,12 @@ sub print_style { sub print_error { my $text=shift @_; - line_return(1); - print_style("### ".$text." ###",'error'); - line_return(1); + $errorcount++; + if ($verbose>=0) { + line_return(1); + print_style("!!! ".$text." !!!",'error'); + line_return(1); + } } sub formatprint { @@ -1021,12 +1085,87 @@ sub flush_next { $tex->{'style'}='-'; } + +# Close the output, e.g. adding HTML tail +sub Close_Output { + if ($htmlstyle>1) { + html_tail(); + } +} + + +# Report if there were any errors occurring during parsing +sub Report_ErrorCount { + if ($errorcount==0) {return;} + if ($briefsum && $totalflag) {print " ";} + if ($htmlstyle) { + print_error("Errors:".$errorcount,"p","error"); + } else { + print "(errors:".$errorcount.")"; + } +} + + +sub print_help_style { + if ($verbose<=0) {return;} + formatprint("Format/colour codes of verbose output:","h2"); + print "\n\n"; + if ($htmlstyle) {print "<p class='stylehelp'>";} + help_style_line('Text which is counted',"word1","counted as text words"); + help_style_line('Header and title text',"word2","counted as header words"); + help_style_line('Caption text and footnotes',"word3","counted as caption words"); + help_style_line("Ignored text or code","ignore","excluded or ignored"); + help_style_line('\documentclass',"document","document start, beginning of preamble"); + help_style_line('\macro',"command","macro not counted, but parameters may be"); + help_style_line('\macro',"exclcommand","macro in excluded region"); + help_style_line("[Macro options]","option","not counted"); + help_style_line('\begin{group} \end{group}',"grouping","begin/end group"); + help_style_line('\begin{group} \end{group}',"exclgroup","begin/end group in excluded region"); + help_style_line('$ $',"mathgroup","counted as one equation"); + help_style_line('$ $',"exclmath","equation in excluded region"); + help_style_line('% Comments',"comment","not counted"); + help_style_line('%TC:TeXcount instructions',"tc","not counted"); + help_style_line("File to include","fileinclude","not counted but file may be counted later"); + if ($showstates) { + help_style_line('[state]',"state","internal TeXcount state"); + } + if (@sumweights) { + help_style_line('[sumcount]',"sumcount","cumulative sum count"); + } + help_style_line("ERROR","error","TeXcount error message"); + if ($htmlstyle) {print "</p>";} + print "\n\n"; +} + +sub help_style_line { + my ($text,$style,$comment)=@_; + if ($htmlstyle) { + $comment=" .... ".$comment; + } else { + $comment=" .... ".$comment; + } + if (print_style($text,$style)) { + print $comment; + linebreak(); + } +} + +# Print output style codes if conditions are met +sub conditional_print_help_style { + if ($showcodes) {print_help_style();} + return $showcodes; +} + ###### HTML routines + + sub html_head { + print "<html>\n<head>"; + if ($utf8flag) { + print "\n<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">"; + } print ' -<html> -<head> <style> <!-- body {width:auto;padding:5;margin:5;} @@ -1035,6 +1174,7 @@ body {width:auto;padding:5;margin:5;} .word2 {font-weight: 700;} .word3 {font-style: italic;} .command {color: #c00;} +.exclcommand {color: #f99;} .option {color: #cc0;} .grouping, .document {color: #900; font-weight:bold;} .mathgroup {color: #090;} @@ -1071,6 +1211,8 @@ sub html_tail { ###### Help routines + + sub print_version { print "TeXcount version ".$versionnumber.", ".$versiondate.'.'; } @@ -1091,6 +1233,7 @@ Options: -v4 Same as -v3 -showstate -showstate Show internal states (with verbose) -brief Only prints a brief, one line summary of counts + -q, -quiet Quiet mode, no error messages (use is discouraged!) -sum, -sum= Make sum of all word and equation counts. May also use -sum=#[,#] with up to 7 numbers to indicate how each of the counts (text words, header words, caption @@ -1114,6 +1257,18 @@ Options: -dir, -dir= Specify the working directory using -dir=path. Remember that the path must end with \ or /. If only -dir is used, the directory of the parent file is used. + -utf8, -unicode Turns on Unicode (UTF-8) for input and output. This + is automatic with -chinese, and is required to handle + e.g. Korean text. Note that the TeX file must be save + in UTF-8 format (not e.g. GB2312 or Big5), or the + result will be unpredictable. + -ch, -chinese, -zhongwen Turns on support for Chinese characters. + TeXcount will then count each Chinese character as a + word. Automatically turns on -utf8. + -jp, -japanese Turns on support for Japanese characters. TeXcount + will count each Japanese character (kanji, hiragana, + and katakana) as one word, i.e. not do any form of + word segmentation. Automatically turns on -utf8. -codes Display output style code overview and explanation. This is on by default. -nocodes Do not display output style code overview. @@ -1199,7 +1354,6 @@ options or the output will be riddled with colour codes. Instead, you can use -html to produce HTML code, write this to file and view with your favourite browser. '; - print_help_style(); print_reference(); } @@ -1235,52 +1389,3 @@ Rdland being the current maintainer. '; } -sub print_help_style { - if ($verbose<=0) {return;} - formatprint("Format/colour codes of verbose output:","h2"); - print "\n\n"; - if ($htmlstyle) {print "<p class='stylehelp'>";} - help_style_line('Text which is counted',"word1","counted as text words"); - help_style_line('Header and title text',"word2","counted as header words"); - help_style_line('Caption text and footnotes',"word3","counted as caption words"); - help_style_line("Ignored text or code","ignore","excluded or ignored"); - help_style_line('\documentclass',"document","document start, beginning of preamble"); - help_style_line('\macro',"command","macro not counted, but parameters may be"); - help_style_line("[Macro options]","option","not counted"); - help_style_line('\begin{group} \end{group}',"grouping","begin/end group"); - help_style_line('\begin{group} \end{group}',"exclgroup","begin/end group in excluded region"); - help_style_line('$ $',"mathgroup","counted as one equation"); - help_style_line('$ $',"exclmath","equation in excluded region"); - help_style_line('% Comments',"comment","not counted"); - help_style_line('%TC:TeXcount instructions',"tc","not counted"); - help_style_line("File to include","fileinclude","not counted but file may be counted later"); - if ($showstates) { - help_style_line('[state]',"state","internal TeXcount state"); - } - if (@sumweights) { - help_style_line('[sumcount]',"sumcount","cumulative sum count"); - } - help_style_line("ERROR","error","TeXcount error message"); - if ($htmlstyle) {print "</p>";} - print "\n\n"; -} - -sub help_style_line { - my ($text,$style,$comment)=@_; - if ($htmlstyle) { - $comment=" .... ".$comment; - } else { - $comment=" .... ".$comment; - } - if (print_style($text,$style)) { - print $comment; - linebreak(); - } -} - -# Print output style codes if conditions are met -sub conditional_print_help_style { - if ($showcodes) {print_help_style();} - return $showcodes; -} - |