TT_v224_html_docs/000700 000765 000765 00000000000 11756705152 013613 5ustar00abwabw000000 000000 TT_v224_html_docs/css/000700 000765 000765 00000000000 11756705152 014403 5ustar00abwabw000000 000000 TT_v224_html_docs/faq/000700 000765 000765 00000000000 11756705152 014362 5ustar00abwabw000000 000000 TT_v224_html_docs/images/000700 000765 000765 00000000000 11222361074 015045 5ustar00abwabw000000 000000 TT_v224_html_docs/index.html000700 000765 000765 00000037312 11756705103 015615 0ustar00abwabw000000 000000 Template::Toolkit

Introduction

Top

The Template Toolkit is a collection of Perl modules which implement a fast, flexible, powerful and extensible template processing system.

It is "input-agnostic" and can be used equally well for processing any kind of text documents: HTML, XML, CSS, Javascript, Perl code, plain text, and so on. However, it is most often used for generating static and dynamic web content, so that's what we'll focus on here.

Although the Template Toolkit is written in Perl, you don't need to be a Perl programmer to use it. It was designed to allow non-programmers to easily create and maintain template-based web sites without having to mess around writing Perl code or going crazy with cut-n-paste.

However, the Template Toolkit is also designed to be extremely flexible and extensible. If you are a Perl programmer, or know someone who is, then you can easily hook the Template Toolkit into your existing code, data, databases and web applications. Furthermore, you can easily extend the Template Toolkit through the use of its plugin mechanism and other developer APIs.

Whatever context you use it in, the primary purpose of the Template Toolkit is to allow you to create a clear separation between the presentation elements of your web site and everything else.

If you're generating static web pages, then you can use it to separate the commonly repeated user interface elements on each page (headers, menus, footers, etc.) from the core content. If you're generating dynamic web pages for the front end of a web application, then you'll also be using it to keep the back-end Perl code entirely separate from the front-end HTML templates. Either way, a clear separation of concerns is what allow you to concentrate on one thing at a time without the other things getting in your way. And that's what the Template Toolkit is all about.

Documentation

Top

The documentation for the Template Toolkit is organised into five sections.

The Template::Manual contains detailed information about using the Template Toolkit. It gives examples of its use and includes a full reference of the template language, configuration options, filters, plugins and other component parts.

The Template::Modules page lists the Perl modules that comprise the Template Toolkit. It gives a brief explanation of what each of them does, and provides a link to the complete documentation for each module for further information. If you're a Perl programmer looking to use the Template Toolkit from your Perl programs then this section is likely to be of interest.

Most, if not all of the information you need to call the Template Toolkit from Perl is in the documentation for the Template module. You only really need to start thinking about the other modules if you want to extend or modify the Template Toolkit in some way, or if you're interested in looking under the hood to see how it all works.

The documentation for each module is embedded as POD in each module, so you can always use perldoc from the command line to read a module's documentation. e.g.

$ perldoc Template
$ perldoc Template::Context
  ...etc...

It's worth noting that all the other documentation, including the user manual is available as POD. e.g.

$ perldoc Template::Manual
$ perldoc Template::Manual::Config
  ...etc...

The Template::Tools section contains the documentation for Template::Tools::tpage and Template::Tools::ttree. These are two command line programs that are distributed with the Template Toolkit. tpage is used to process a single template file, ttree for processing entire directories of template files.

The Template::Tutorial section contains two introductory tutorials on using the Template Toolkit. The first is Template::Tutorial::Web on generating web content. The second is Template::Tutorial::Datafile on using the Template Toolkit to generate other data formats including XML.

The final section of the manual is Template::FAQ which contains answers to some of the Frequently Asked Questions about the Template Toolkit.

You can read the documentation in HTML format either online at the Template Toolkit web site, http://template-toolkit.org/, or by downloading the HTML version of the documentation from http://template-toolkit.org/download/index.html#html_docs and unpacking it on your local machine.

Author

Top

The Template Toolkit was written by Andy Wardley (http://wardley.org/ mailto:abw@wardley.org) with assistance and contributions from a great number of people. Please see Template::Manual::Credits for a full list.

Copyright

Top

Copyright (C) 1996-2012 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/js/000700 000765 000765 00000000000 11756705152 014227 5ustar00abwabw000000 000000 TT_v224_html_docs/manual/000700 000765 000765 00000000000 11756705152 015070 5ustar00abwabw000000 000000 TT_v224_html_docs/misc/000700 000765 000765 00000000000 11756705152 014546 5ustar00abwabw000000 000000 TT_v224_html_docs/modules/000700 000765 000765 00000000000 11756705152 015263 5ustar00abwabw000000 000000 TT_v224_html_docs/old/000700 000765 000765 00000000000 11756705152 014371 5ustar00abwabw000000 000000 TT_v224_html_docs/test.html000700 000765 000765 00000043473 11756705113 015473 0ustar00abwabw000000 000000 Template Toolkit Documentation

BLAH

Inner stuff
Outer stuff

SECTION

Top Inner stuff
Outer stuff

Heading 1

Lorem ipsum modo mundi adolescens ne duo, viris laudem quaerendum has at. Graeco timeam et mea, ne pro porro alterum veritus, at soluta accusam gloriatur eos.

Docendi cotidieque per in, usu nulla doctus tractatos ex. Accusata comprehensam et duo, vel altera sententiae id. Eos alterum adolescens ne, te usu mundi noster volumus. Te quot discere mea.

Maiorum mentitum contentiones an eam, cum ad vivendo ponderum adolescens. Nostrud dissentias concludaturque eam ne. Ea illud choro consequuntur eum. Mea inani semper aliquam cu, ea sea labores phaedrum conclusionemque.

Heading 1

Heading 2

First Para

Second Para

Pre text

third para

Badger Quotes

"You can't go back. It exists in a different dimension and I left the keys at home."
"Yeah right, I bet you've love to go up, but you can't."
"No, you can't go to the next page. You're silly to even think that you could."
"Since when did going back become so important?"
"Help! I'm stuck on this web page and I can't get off. Please don't go up, help me!"
"You may think I look cute and cuddly, but I've got a fiery temper."
"Are you looking at my nuts? I spent ages foraging for them. Hands off!"
"If you are going up, be sure to wear some flowers in your hair..."
"Have you seen my skateboard? I left it around here somewhere..."
"Go back? Are you mad?"
"Hello, I'm a talking badger."
"My name is Meles Meles, but you can call me "Badger"."
"You can't go back. Would you like to come foraging for nuts and berries in the forest with me instead?"
"I'm sorry Dave, I can't do that."
"I'd love to help you go to the next page but I can't. I'm just a badger."
"You can't go back. It exists in a different dimension and I left the keys at home."
"Yeah right, I bet you've love to go up, but you can't."
"No, you can't go to the next page. You're silly to even think that you could."
"Since when did going back become so important?"
"Help! I'm stuck on this web page and I can't get off. Please don't go up, help me!"
"You may think I look cute and cuddly, but I've got a fiery temper."
"Are you looking at my nuts? I spent ages foraging for them. Hands off!"
"If you are going up, be sure to wear some flowers in your hair..."
"Have you seen my skateboard? I left it around here somewhere..."
"Go back? Are you mad?"
"Hello, I'm a talking badger."
"My name is Meles Meles, but you can call me "Badger"."
"You can't go back. Would you like to come foraging for nuts and berries in the forest with me instead?"
"I'm sorry Dave, I can't do that."
"I'd love to help you go to the next page but I can't. I'm just a badger."
"You can't go back. It exists in a different dimension and I left the keys at home."
"Yeah right, I bet you've love to go up, but you can't."
"No, you can't go to the next page. You're silly to even think that you could."
"Since when did going back become so important?"
"Help! I'm stuck on this web page and I can't get off. Please don't go up, help me!"
"You may think I look cute and cuddly, but I've got a fiery temper."
"Are you looking at my nuts? I spent ages foraging for them. Hands off!"
"If you are going up, be sure to wear some flowers in your hair..."
"Have you seen my skateboard? I left it around here somewhere..."
"Go back? Are you mad?"
"Hello, I'm a talking badger."
"My name is Meles Meles, but you can call me "Badger"."
"You can't go back. Would you like to come foraging for nuts and berries in the forest with me instead?"
"I'm sorry Dave, I can't do that."
"I'd love to help you go to the next page but I can't. I'm just a badger."
"You can't go back. It exists in a different dimension and I left the keys at home."
"Yeah right, I bet you've love to go up, but you can't."
"No, you can't go to the next page. You're silly to even think that you could."
"Since when did going back become so important?"
"Help! I'm stuck on this web page and I can't get off. Please don't go up, help me!"
"You may think I look cute and cuddly, but I've got a fiery temper."
"Are you looking at my nuts? I spent ages foraging for them. Hands off!"
"If you are going up, be sure to wear some flowers in your hair..."
"Have you seen my skateboard? I left it around here somewhere..."
"Go back? Are you mad?"
"Hello, I'm a talking badger."
"My name is Meles Meles, but you can call me "Badger"."
"You can't go back. Would you like to come foraging for nuts and berries in the forest with me instead?"
"I'm sorry Dave, I can't do that."
"I'd love to help you go to the next page but I can't. I'm just a badger."
"You can't go back. It exists in a different dimension and I left the keys at home."
"Yeah right, I bet you've love to go up, but you can't."
"No, you can't go to the next page. You're silly to even think that you could."
"Since when did going back become so important?"
"Help! I'm stuck on this web page and I can't get off. Please don't go up, help me!"
"You may think I look cute and cuddly, but I've got a fiery temper."
"Are you looking at my nuts? I spent ages foraging for them. Hands off!"
"If you are going up, be sure to wear some flowers in your hair..."
"Have you seen my skateboard? I left it around here somewhere..."
"Go back? Are you mad?"
"Hello, I'm a talking badger."
"My name is Meles Meles, but you can call me "Badger"."
"You can't go back. Would you like to come foraging for nuts and berries in the forest with me instead?"
"I'm sorry Dave, I can't do that."
"I'd love to help you go to the next page but I can't. I'm just a badger."
"You can't go back. It exists in a different dimension and I left the keys at home."
"Yeah right, I bet you've love to go up, but you can't."
"No, you can't go to the next page. You're silly to even think that you could."
"Since when did going back become so important?"
"Help! I'm stuck on this web page and I can't get off. Please don't go up, help me!"
"You may think I look cute and cuddly, but I've got a fiery temper."
"Are you looking at my nuts? I spent ages foraging for them. Hands off!"
"If you are going up, be sure to wear some flowers in your hair..."
"Have you seen my skateboard? I left it around here somewhere..."
"Go back? Are you mad?"
"Hello, I'm a talking badger."
"My name is Meles Meles, but you can call me "Badger"."
"You can't go back. Would you like to come foraging for nuts and berries in the forest with me instead?"
"I'm sorry Dave, I can't do that."
"I'd love to help you go to the next page but I can't. I'm just a badger."

This is some text. Hello World

Lorem ipsum modo mundi adolescens ne duo, viris laudem quaerendum has at. Graeco timeam et mea, ne pro porro alterum veritus, at soluta accusam gloriatur eos.

Docendi cotidieque per in, usu nulla doctus tractatos ex. Accusata comprehensam et duo, vel altera sententiae id. Eos alterum adolescens ne, te usu mundi noster volumus. Te quot discere mea.

Maiorum mentitum contentiones an eam, cum ad vivendo ponderum adolescens. Nostrud dissentias concludaturque eam ne. Ea illud choro consequuntur eum. Mea inani semper aliquam cu, ea sea labores phaedrum conclusionemque.


TT_v224_html_docs/tools/000700 000765 000765 00000000000 11756705152 014753 5ustar00abwabw000000 000000 TT_v224_html_docs/tutorial/000700 000765 000765 00000000000 11756705152 015456 5ustar00abwabw000000 000000 TT_v224_html_docs/tutorial/Datafile.html000700 000765 000765 00000076612 11756705114 020072 0ustar00abwabw000000 000000 Template::Tutorial::Datafile

DESCRIPTION

Top

Introducing the Template Toolkit

Top

There are a number of Perl modules that are universally recognised as The Right Thing To Use for certain tasks. If you accessed a database without using DBI, pulled data from the WWW without using one of the LWP modules or parsed XML without using XML::Parser or one of its subclasses then you'd run the risk of being shunned by polite Perl society.

I believe that the year 2000 saw the emergence of another 'must have' Perl module - the Template Toolkit. I don't think I'm alone in this belief as the Template Toolkit won the 'Best New Module' award at the Perl Conference last summer. Version 2.0 of the Template Toolkit (known as TT2 to its friends) was recently released to the CPAN.

TT2 was designed and written by Andy Wardley <abw@wardley.org>. It was born out of Andy's previous templating module, Text::Metatext, in best Fred Brooks 'plan to throw one away' manner; and aims to be the most useful (or, at least, the most used) Perl templating system.

TT2 provides a way to take a file of fixed boilerplate text (the template) and embed variable data within it. One obvious use of this is in the creation of dynamic web pages and this is where a lot of the attention that TT2 has received has been focussed. In this article, I hope to demonstrate that TT2 is just as useful in non-web applications.

Using the Template Toolkit

Top

Let's look at how we'd use TT2 to process a simple data file. TT2 is an object oriented Perl module. Having downloaded it from CPAN and installed it in the usual manner, using it in your program is as easy as putting the lines

use Template;
my $tt = Template->new;

in your code. The constructor function, new, takes a number of optional parameters which are documented in the copious manual pages that come with the module, but for the purposes of this article we'll keep things as simple as possible.

To process the template, you would call the process method like this

$tt->process('my_template', \%data)
    || die $tt->error;

We pass two parameters to process, the first is the name of the file containing the template to process (in this case, my_template) and the second is a reference to a hash which contains the data items that you want to use in the template. If processing the template gives any kind of error, the program will die with a (hopefully) useful error message.

So what kinds of things can go in %data? The answer is just about anything. Here's an example showing data about English Premier League football teams.

my @teams = ({ name   => 'Man Utd',
               played => 16,
               won    => 12,
               drawn  => 3,
               lost   => 1 },
             { name   => 'Bradford',
               played => 16,
               won    => 2,
               drawn  => 5,
               lost   => 9 });

my %data = ( name   => 'English Premier League',
             season => '2000/01',
             teams  => \@teams );

This creates three data items which can be accessed within the template, called name, season and teams. Notice that teams is a complex data structure.

Here is a template that we might use to process this data.

League Standings

League Name: [% name %]
Season     : [% season %]

Teams:
[% FOREACH team = teams -%]
[% team.name %] [% team.played -%] 
 [% team.won %] [% team.drawn %] [% team.lost %]
[% END %]

Running this template with this data gives us the following output

        League Standings

League Name: English Premier League
Season     : 2000/01

Teams:
Man Utd 16 12 3 1
Bradford 16 2 5 9

Hopefully the syntax of the template is simple enough to follow. There are a few points to note.

  • Template processing directives are written using a simple language which is not Perl.

  • The keys of the %data have become the names of the data variables within the template.

  • Template processing directives are surrounded by [% and %] sequences.

  • If these tags are replaced with [%- -%] then the preceding or following linefeed is suppressed.

  • In the FOREACH loop, each element of the teams list was assigned, in turn, to the temporary variable team.

  • Each item assigned to the team variable is a Perl hash. Individual values within the hash are accessed using a dot notation.

It's probably the first and last of these points which are the most important. The first point emphasises the separation of the data acquisition logic from the presentation logic. The person creating the presentation template doesn't need to know Perl, they only need to know the data items which will be passed into the template.

The last point demonstrates the way that TT2 protects the template designer from the implementation of the data structures. The data objects passed to the template processor can be scalars, arrays, hashes, objects or even subroutines. The template processor will just interpret your data correctly and Do The Right Thing to return the correct value to you. In this example each team was a hash, but in a larger system each team might be an object, in which case name, played, etc. would be accessor methods to the underlying object attributes. No changes would be required to the template as the template processor would realise that it needed to call methods rather than access hash values.

A more complex example

Top

Stats about the English Football League are usually presented in a slightly more complex format than the one we used above. A full set of stats will show the number of games that a team has won, lost or drawn, the number of goals scored for and against the team and the number of points that the team therefore has. Teams gain three points for a win and one point for a draw. When teams have the same number of points they are separated by the goal difference, that is the number of goals the team has scored minus the number of team scored against them. To complicate things even further, the games won, drawn and lost and the goals for and against are often split between home and away games.

Therefore if you have a data source which lists the team name togther with the games won, drawn and lost and the goals for and against split into home and away (a total of eleven data items) you can calculate all of the other items (goal difference, points awarded and even position in the league). Let's take such a file, but we'll only look at the top three teams. It will look something like this:

Man Utd,7,1,0,26,4,5,2,1,15,6
Arsenal,7,1,0,17,4,2,3,3,7,9
Leicester,4,3,1,10,8,4,2,2,7,4

A simple script to read this data into an array of hashes will look something like this (I've simplified the names of the data columns - w, d, and l are games won, drawn and lost and f and a are goals scored for and against; h and a at the front of a data item name indicates whether it's a home or away statistic):

my @cols = qw(name hw hd hl hf ha aw ad al af aa);

my @teams;
while (<>) {
    chomp;

    my %team;

    @team{@cols} = split /,/;

    push @teams, \%team;
}

We can then go thru the teams again and calculate all of the derived data items:

foreach (@teams) {
    $_->{w} = $_->{hw} + $_->{aw};
    $_->{d} = $_->{hd} + $_->{ad};
    $_->{l} = $_->{hl} + $_->{al};

    $_->{pl} = $_->{w} + $_->{d} + $_->{l};

    $_->{f} = $_->{hf} + $_->{af};
    $_->{a} = $_->{ha} + $_->{aa};

    $_->{gd} = $_->{f} - $_->{a};
    $_->{pt} = (3 * $_->{w}) + $_->{d};
}

And then produce a list sorted in descending order:

@teams = sort { 
$b->{pt} <=> $b->{pt} || $b->{gd} <=> $a->{gd} 
} @teams;

And finally add the league position data item:

$teams[$_]->{pos} = $_ + 1 
    foreach 0 .. $#teams;

Having pulled all of our data into an internal data structure we can start to produce output using out templates. A template to create a CSV file containing the data split between home and away stats would look like this:

[% FOREACH team = teams -%]
[% team.pos %],[% team.name %],[% team.pl %],[% team.hw %],
[%- team.hd %],[% team.hl %],[% team.hf %],[% team.ha %],
[%- team.aw %],[% team.ad %],[% team.al %],[% team.af %],
[%- team.aa %],[% team.gd %],[% team.pt %]
[%- END %]

And processing it like this:

$tt->process('split.tt', { teams => \@teams }, 'split.csv')
  || die $tt->error;

produces the following output:

1,Man Utd,16,7,1,0,26,4,5,2,1,15,6,31,39
2,Arsenal,16,7,1,0,17,4,2,3,3,7,9,11,31
3,Leicester,16,4,3,1,10,8,4,2,2,7,4,5,29

Notice that we've introduced the third parameter to process. If this parameter is missing then the TT2 sends its output to STDOUT. If this parameter is a scalar then it is taken as the name of a file to write the output to. This parameter can also be (amongst other things) a filehandle or a reference to an object w hich is assumed to implement a print method.

If we weren't interested in the split between home and away games, then we could use a simpler template like this:

[% FOREACH team = teams -%]
[% team.pos %],[% team.name %],[% team.pl %],[% team.w %],
[%- team.d %],[% team.l %],[% team.f %],[% team.a %],
[%- team.aa %],[% team.gd %],[% team.pt %]
[% END -%]

Which would produce output like this:

1,Man Utd,16,12,3,1,41,10,6,31,39
2,Arsenal,16,9,4,3,24,13,9,11,31
3,Leicester,16,8,5,3,17,12,4,5,29

Producing XML

Top

This is starting to show some of the power and flexibility of TT2, but you may be thinking that you could just as easily produce this output with a foreach loop and a couple of print statements in your code. This is, of course, true; but that's because I've chosen a deliberately simple example to explain the concepts. What if we wanted to produce an XML file containing the data? And what if (as I mentioned earlier) the league data was held in an object? The code would then look even easier as most of the code we've written earlier would be hidden away in FootballLeague.pm.

use FootballLeague;
use Template;

my $league = FootballLeague->new(name => 'English Premier');

my $tt = Template->new;

$tt->process('league_xml.tt', { league => $league })
    || die $tt->error;

And the template in league_xml.tt would look something like this:

<?xml version="1.0"?>
<!DOCTYPE LEAGUE SYSTEM "league.dtd">

<league name="[% league.name %]" season="[% league.season %]">
[% FOREACH team = league.teams -%]
  <team name="[% team.name %]"
        pos="[% team.pos %]"
        played="[% team.pl %]"
        goal_diff="[% team.gd %]"
        points="[% team.pt %]">
     <stats type="home">
        win="[% team.hw %]"
        draw="[%- team.hd %]"
        lose="[% team.hl %]"
        for="[% team.hf %]"
        against="[% team.ha %]" />
     <stats type="away">
        win="[% team.aw %]"
        draw="[%- team.ad %]"
        lose="[% team.al %]"
        for="[% team.af %]"
        against="[% team.aa %]" />
  </team>
[% END -%]
&/league>

Notice that as we've passed the whole object into process then we need to put an extra level of indirection on our template variables - everything is now a component of the league variable. Other than that, everything in the template is very similar to what we've used before. Presumably now team.name calls an accessor function rather than carrying out a hash lookup, but all of this is transparent to our template designer.

Multiple Formats

Top

As a final example, let's suppose that we need to create output football league tables in a number of formats. Perhaps we are passing this data on to other people and they can't all use the same format. Some of our users need CSV files and others need XML. Some require data split between home and away matches and other just want the totals. In total, then, we'll need four different templates, but the good news is that they can use the same data object. All the script needs to do is to establish which template is required and process it.

use FootballLeague;
use Template;

my ($name, $type, $stats) = @_;

my $league = FootballLeague->new(name => $name);

my $tt = Template->new;

$tt->process("league_${type}_$stats.tt", 
             { league => $league }
             "league_$stats.$type")
    || die $tt->error;

For example, you can call this script as

league.pl 'English Premier' xml split

This will process a template called league_xml_split.tt and put the results in a file called league_split.xml.

This starts to show the true strength of the Template Toolkit. If we later wanted to add another file format - perhaps we wanted to create a league table HTML page or even a LaTeX document - then we would just need to create the appropriate template and name it according to our existing naming convention. We would need to make no changes to the code.

I hope you can now see why the Template Toolkit is fast becoming an essential part of many people's Perl installation.

AUTHOR

Top

Dave Cross <dave@dave.org.uk>

VERSION

Top

Template Toolkit version 2.19, released on 27 April 2007.

COPYRIGHT

Top

Copyright (C) 2001 Dave Cross <dave@dave.org.uk>

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/tutorial/index.html000700 000765 000765 00000020125 11756705114 017454 0ustar00abwabw000000 000000 Template::Tutorial

Template Toolkit Tutorials

Top

Template::Tutorial::Web

Top

The Template::Tutorial::Web tutorial shows how you can use the Template Toolkit to generate static and dynamic web content.

Template::Tutorial::Datafile

Top

The Template::Tutorial::Datafile tutorial shows how you can use the Template Toolkit to generate other data formats like XML.


TT_v224_html_docs/tutorial/Web.html000700 000765 000765 00000144144 11756705114 017072 0ustar00abwabw000000 000000 Template::Tutorial::Web

Overview

Top

This tutorial document provides a introduction to the Template Toolkit and demonstrates some of the typical ways it may be used for generating web content. It covers the generation of static pages from templates using the tpage and ttree scripts and then goes on to show dynamic content generation using CGI scripts and Apache/mod_perl handlers.

Various features of the Template Toolkit are introduced and described briefly and explained by use of example. For further information, see Template, Template::Manual and the various sections within it. e.g

perldoc Template                    # Template.pm module usage
perldoc Template::Manual            # index to manual
perldoc Template::Manual::Config    # e.g. configuration options

The documentation is also available in HTML format to read online, or download from the Template Toolkit web site:

http://template-toolkit.org/docs/

Introduction

Top

The Template Toolkit is a set of Perl modules which collectively implement a template processing system.

A template is a text document with special markup tags embedded in it. By default, the Template Toolkit uses '[%' and '%]' to denote the start and end of a tag. Here's an example:

[% INCLUDE header %]

People of [% planet %], your attention please.

This is [% captain %] of the
Galactic Hyperspace Planning Council.

As you will no doubt be aware, the plans
for development of the outlying regions
of the Galaxy require the building of a
hyperspatial express route through your
star system, and regrettably your planet
is one of those scheduled for destruction.

The process will take slightly less than
[% time %].

Thank you.

[% INCLUDE footer %]

Tags can contain simple variables (like planet and captain) and more complex directives that start with an upper case keyword (like INCLUDE). A directive is an instruction that tells the template processor to perform some action, like processing another template (header and footer in this example) and inserting the output into the current template. In fact, the simple variables we mentioned are actually GET directives, but the GET keyword is optional.

People of [% planet %], your attention please.      # short form
People of [% GET planet %], your attention please.  # long form

Other directives include SET to set a variable value (the SET keyword is also optional), FOREACH to iterate through a list of values, and IF, UNLESS, ELSIF and ELSE to declare conditional blocks.

The Template Toolkit processes all text files equally, regardless of what kind of content they contain. So you can use TT to generate HTML, XML, CSS, Javascript, Perl, RTF, LaTeX, or any other text-based format. In this tutorial, however, we'll be concentrating on generating HTML for web pages.

Generating Static Web Content

Top

Here's an example of a template used to generate an HTML document.

[%  INCLUDE header
      title = 'This is an HTML example';

    pages = [
      { url   = 'http://foo.org'
        title = 'The Foo Organisation' 
      }
      { url   = 'http://bar.org'
        title = 'The Bar Organisation' 
      }
    ]
%]
   <h1>Some Interesting Links</h1>
   <ul>
[%  FOREACH page IN pages %]
     <li><a href="[% page.url %]">[% page.title %]</a>
[%  END %]
   </ul>

[% INCLUDE footer %]

This example shows how the INCLUDE directive is used to load and process separate 'header' and 'footer' template files, including the output in the current document. These files might look something like this:

header:

<html>
  <head>
    <title>[% title %]</title>
  </head>
  <body>

footer:

    <div class="copyright">
      &copy; Copyright 2007 Arthur Dent
    </div>
  </body>
</html>

The example also uses the FOREACH directive to iterate through the 'pages' list to build a table of links. In this example, we have defined this list within the template to contain a number of hash references, each containing a 'url' and 'title' member. The FOREACH directive iterates through the list, aliasing 'page' to each item (in this case, hash array references). The [% page.url %] and [% page.title %] directives then access the individual values in the hash ararys and insert them into the document.

Using tpage

Top

Having created a template file we can now process it to generate some real output. The quickest and easiest way to do this is to use the tpage script. This is provided as part of the Template Toolkit and should be installed in your usual Perl bin directory.

Assuming you saved your template file as example.html, you would run the command:

$ tpage example.html

This will process the template file, sending the output to STDOUT (i.e. whizzing past you on the screen). You may want to redirect the output to a file but be careful not to specify the same name as the template file, or you'll overwrite it. You may want to use one prefix for your templates (e.g. '.tt') and another (e.g. '.html') for the output files.

$ tpage example.tt > example.html

Or you can redirect the output to another directory. e.g.

$ tpage templates/example.tt > html/example.html

The output generated would look like this:

<html>
  <head>
    <title>This is an HTML example</title>
  </head>
  <body>
    <h1>Some Interesting Links</h1>
    <ul>
      <li><a href="http://foo.org">The Foo Organsiation</a>
      <li><a href="http://bar.org">The Bar Organsiation</a>
    </ul>
    <div class="copyright">
      &copy; Copyright 2007 Arthur Dent
    </div>
  </body>
</html>

The header and footer template files have been included (assuming you created them and they're in the current directory) and the link data has been built into an HTML list.

Using ttree

Top

The tpage script gives you a simple and easy way to process a single template without having to write any Perl code. The ttree:Template::Tools::ttree script, also distributed as part of the Template Toolkit, provides a more flexible way to process a number of template documents in one go.

The first time you run the script, it will ask you if it should create a configuration file (.ttreerc) in your home directory. Answer y to have it create the file.

The ttree:Template::Tools::ttree documentation describes how you can change the location of this file and also explains the syntax and meaning of the various options in the file. Comments are written to the sample configuration file which should also help.

In brief, the configuration file describes the directories in which template files are to be found (src), where the corresponding output should be written to (dest), and any other directories (lib) that may contain template files that you plan to INCLUDE into your source documents. You can also specify processing options (such as verbose and recurse) and provide regular expression to match files that you don't want to process (ignore, accept)> or should be copied instead of being processed as templates (copy).

An example .ttreerc file is shown here:

$HOME/.ttreerc:

verbose 
recurse

# this is where I keep other ttree config files
cfg = ~/.ttree

src  = ~/websrc/src
lib  = ~/websrc/lib
dest = ~/public_html/test

ignore = \b(CVS|RCS)\b
ignore = ^#

You can create many different configuration files and store them in the directory specified in the cfg option, shown above. You then add the -f filename option to ttree to have it read that file.

When you run the script, it compares all the files in the src directory (including those in sub-directories if the recurse option is set), with those in the dest directory. If the destination file doesn't exist or has an earlier modification time than the corresponding source file, then the source will be processed with the output written to the destination file. The -a option forces all files to be processed, regardless of modification times.

The script doesn't process any of the files in the lib directory, but it does add it to the INCLUDE_PATH for the template processor so that it can locate these files via an INCLUDE, PROCESS or WRAPPER directive. Thus, the lib directory is an excellent place to keep template elements such as header, footers, etc., that aren't complete documents in their own right.

You can also specify various Template Toolkit options from the configuration file. Consult the ttree documentation and help summary (ttree -h) for full details. e.g.

$HOME/.ttreerc:

pre_process = config
interpolate
post_chomp

The pre_process option allows you to specify a template file which should be processed before each file. Unsurprisingly, there's also a post_process option to add a template after each file. In the fragment above, we have specified that the config template should be used as a prefix template. We can create this file in the lib directory and use it to define some common variables, including those web page links we defined earlier and might want to re-use in other templates. We could also include an HTML header, title, or menu bar in this file which would then be prepended to each and every template file, but for now we'll keep all that in a separate header file.

$lib/config:

[% root     = '~/abw'
   home     = "$root/index.html"
   images   = "$root/images"
   email    = 'abw@wardley.org'
   graphics = 1
   webpages = [
     { url => 'http://foo.org', title => 'The Foo Organsiation' }
     { url => 'http://bar.org', title => 'The Bar Organsiation' }
   ]
%]

Assuming you've created or copied the header and footer files from the earlier example into your lib directory, you can now start to create web pages like the following in your src directory and process them with ttree.

$src/newpage.html:

[% INCLUDE header
   title = 'Another Template Toolkit Test Page'
%]

    <a href="[% home %]">Home</a>
    <a href="mailto:[% email %]">Email</a>

[% IF graphics %]
    <img src="[% images %]/logo.gif" align=right width=60 height=40>
[% END %]

[% INCLUDE footer %]

Here we've shown how pre-defined variables can be used as flags to enable certain feature (e.g. graphics) and to specify common items such as an email address and URL's for the home page, images directory and so on. This approach allows you to define these values once so that they're consistent across all pages and can easily be changed to new values.

When you run ttree, you should see output similar to the following (assuming you have the verbose flag set).

ttree 2.9 (Template Toolkit version 2.20)

     Source: /home/abw/websrc/src
Destination: /home/abw/public_html/test
   Include Path: [ /home/abw/websrc/lib ]
     Ignore: [ \b(CVS|RCS)\b, ^# ]
       Copy: [  ]
     Accept: [ * ]

+ newpage.html

The + in front of the newpage.html filename shows that the file was processed, with the output being written to the destination directory. If you run the same command again, you'll see the following line displayed instead showing a - and giving a reason why the file wasn't processed.

- newpage.html                     (not modified)

It has detected a newpage.html in the destination directory which is more recent than that in the source directory and so hasn't bothered to waste time re-processing it. To force all files to be processed, use the -a option. You can also specify one or more filenames as command line arguments to ttree:

tpage newpage.html

This is what the destination page looks like.

$dest/newpage.html:

<html>
  <head>
    <title>Another Template Toolkit Test Page</title>
  </head>
  <body>

    <a href="~/abw/index.html">Home</a>
    <a href="mailto:abw@wardley.org">Email me</a>
    <img src="~/abw/images/logo.gif" align=right width=60 height=40>

    <div class="copyright">
      &copy; Copyright 2007 Arthur Dent
    </div>
  </body>
</html>

You can add as many documents as you like to the src directory and ttree will apply the same process to them all. In this way, it is possible to build an entire tree of static content for a web site with a single command. The added benefit is that you can be assured of consistency in links, header style, or whatever else you choose to implement in terms of common templates elements or variables.

Dynamic Content Generation Via CGI Script

Top

The Template module provides a simple front-end to the Template Toolkit for use in CGI scripts and Apache/mod_perl handlers. Simply use the Template module, create an object instance with the new() method and then call the process() method on the object, passing the name of the template file as a parameter. The second parameter passed is a reference to a hash array of variables that we want made available to the template:

#!/usr/bin/perl
use strict;
use warnings;
use Template;

my $file = 'src/greeting.html';
my $vars = {
   message  => "Hello World\n"
};

my $template = Template->new();

$template->process($file, $vars)
    || die "Template process failed: ", $template->error(), "\n";

So that our scripts will work with the same template files as our earlier examples, we'll can add some configuration options to the constructor to tell it about our environment:

my $template->new({
    # where to find template files
    INCLUDE_PATH => ['/home/abw/websrc/src', '/home/abw/websrc/lib'],
    # pre-process lib/config to define any extra values
    PRE_PROCESS  => 'config',
});

Note that here we specify the config file as a PRE_PROCESS option. This means that the templates we process can use the same global variables defined earlier for our static pages. We don't have to replicate their definitions in this script. However, we can supply additional data and functionality specific to this script via the hash of variables that we pass to the process() method.

These entries in this hash may contain simple text or other values, references to lists, others hashes, sub-routines or objects. The Template Toolkit will automatically apply the correct procedure to access these different types when you use the variables in a template.

Here's a more detailed example to look over. Amongst the different template variables we define in $vars, we create a reference to a CGI object and a get_user_projects() sub-routine.

#!/usr/bin/perl
use strict;
use warnings;
use Template;
use CGI;

$| = 1;
print "Content-type: text/html\n\n";

my $file = 'userinfo.html';
my $vars = {
    'version'  => 3.14,
    'days'     => [ qw( mon tue wed thu fri sat sun ) ],
    'worklist' => \&get_user_projects,
    'cgi'      => CGI->new(),
    'me'       => {
        'id'     => 'abw',
        'name'   => 'Andy Wardley',
    },
};

sub get_user_projects {
    my $user = shift;
    my @projects = ...   # do something to retrieve data
    return \@projects;
}

my $template = Template->new({
    INCLUDE_PATH => '/home/abw/websrc/src:/home/abw/websrc/lib',
    PRE_PROCESS  => 'config',
});

$template->process($file, $vars)
    || die $template->error();

Here's a sample template file that we might create to build the output for this script.

$src/userinfo.html:

[% INCLUDE header
   title = 'Template Toolkit CGI Test'
%]

<a href="mailto:[% email %]">Email [% me.name %]</a>

<p>This is version [% version %]</p>

<h3>Projects</h3>
<ul>
[% FOREACH project IN worklist(me.id) %]
   <li> <a href="[% project.url %]">[% project.name %]</a>
[% END %]
</ul>

[% INCLUDE footer %]

This example shows how we've separated the Perl implementation (code) from the presentation (HTML). This not only makes them easier to maintain in isolation, but also allows the re-use of existing template elements such as headers and footers, etc. By using template to create the output of your CGI scripts, you can give them the same consistency as your static pages built via ttree or other means.

Furthermore, we can modify our script so that it processes any one of a number of different templates based on some condition. A CGI script to maintain a user database, for example, might process one template to provide an empty form for new users, the same form with some default values set for updating an existing user record, a third template for listing all users in the system, and so on. You can use any Perl functionality you care to write to implement the logic of your application and then choose one or other template to generate the desired output for the application state.

Dynamic Content Generation Via Apache/Mod_Perl Handler

Top

NOTE: the Apache::Template module is available from CPAN and provides a simple and easy to use Apache/mod_perl interface to the Template Toolkit. Although basic, it implements most, if not all of what is described below, and it avoids the need to write your own handler. However, in many cases, you'll want to write your own handler to customise processing for your own need, and this section will show you how to get started.

The Template module can be used from an Apache/mod_perl handler. Here's an example of a typical Apache httpd.conf file:

PerlModule CGI;
PerlModule Template
PerlModule MyOrg::Apache::User

PerlSetVar websrc_root   /home/abw/websrc

<Location /user/bin>
    SetHandler     perl-script
    PerlHandler    MyOrg::Apache::User
</Location>

This defines a location called /user/bin to which all requests will be forwarded to the handler() method of the MyOrg::Apache::User module. That module might look something like this:

package MyOrg::Apache::User;

use strict;
use vars qw( $VERSION );
use Apache::Constants qw( :common );
use Template qw( :template );
use CGI;

$VERSION = 1.59;

sub handler {
    my $r = shift;

    my $websrc = $r->dir_config('websrc_root')
        or return fail($r, SERVER_ERROR,
                       "'websrc_root' not specified");

    my $template = Template->new({ 
        INCLUDE_PATH  => "$websrc/src/user:$websrc/lib",
        PRE_PROCESS   => 'config',
        OUTPUT        => $r,     # direct output to Apache request
    });

    my $params = {
        uri     => $r->uri,
        cgi     => CGI->new,
    };

    # use the path_info to determine which template file to process
    my $file = $r->path_info;
    $file =~ s[^/][];

    $r->content_type('text/html');
    $r->send_http_header;

    $template->process($file, $params) 
        || return fail($r, SERVER_ERROR, $template->error());

    return OK;
}

sub fail {
    my ($r, $status, $message) = @_;
    $r->log_reason($message, $r->filename);
    return $status;
}

The handler accepts the request and uses it to determine the websrc_root value from the config file. This is then used to define an INCLUDE_PATH for a new Template object. The URI is extracted from the request and a CGI object is created. These are both defined as template variables.

The name of the template file itself is taken from the PATH_INFO element of the request. In this case, it would comprise the part of the URL coming after /user/bin, e.g for /user/bin/edit, the template file would be edit located in $websrc/src/user. The headers are sent and the template file is processed. All output is sent directly to the print() method of the Apache request object.

Using Plugins to Extend Functionality

Top

As we've already shown, it is possible to bind Perl data and functions to template variables when creating dynamic content via a CGI script or Apache/mod_perl process. The Template Toolkit also supports a plugin interface which allows you define such additional data and/or functionality in a separate module and then load and use it as required with the USE directive.

The main benefit to this approach is that you can load the extension into any template document, even those that are processed "statically" by tpage or ttree. You don't need to write a Perl wrapper to explicitly load the module and make it available via the stash.

Let's demonstrate this principle using the DBI plugin written by Simon Matthews (available from CPAN). You can create this template in your src directory and process it using ttree to see the results. Of course, this example relies on the existence of the appropriate SQL database but you should be able to adapt it to your own resources, or at least use it as a demonstrative example of what's possible.

[% INCLUDE header
     title = 'User Info'
%]

[% USE DBI('dbi:mSQL:mydbname') %]

<table border=0 width="100%">
  <tr>
    <th>User ID</th> 
    <th>Name</th>  
    <th>Email</th>
  </tr>
[% FOREACH user IN DBI.query('SELECT * FROM user ORDER BY id') %]
  <tr>
    <td>[% user.id %]</td> 
    <td>[% user.name %]</td> 
    <td>[% user.email %]</td>
  </tr>
[% END %]
</table>

[% INCLUDE footer %]

A plugin is simply a Perl module in a known location and conforming to a known standard such that the Template Toolkit can find and load it automatically. You can create your own plugin by inheriting from the Template::Plugin module.

Here's an example which defines some data items (foo and people) and also an object method (bar). We'll call the plugin FooBar for want of a better name and create it in the MyOrg::Template::Plugin::FooBar package. We've added a MyOrg to the regular Template::Plugin::* package to avoid any conflict with existing plugins.

package MyOrg::Template::Plugin::FooBar;
use base 'Template::Plugin'
our $VERSION = 1.23;

sub new {
    my ($class, $context, @params) = @_;

    bless {
        _CONTEXT => $context,
        foo      => 25,
        people   => [ 'tom', 'dick', 'harry' ],
    }, $class;
}

sub bar {
    my ($self, @params) = @_;
    # ...do something...    
    return $some_value;
}

The plugin constructor new() receives the class name as the first parameter, as is usual in Perl, followed by a reference to something called a Template::Context object. You don't need to worry too much about this at the moment, other than to know that it's the main processing object for the Template Toolkit. It provides access to the functionality of the processor and some plugins may need to communicate with it. We don't at this stage, but we'll save the reference anyway in the _CONTEXT member. The leading underscore is a convention which indicates that this item is private and the Template Toolkit won't attempt to access this member. The other members defined, foo and people are regular data items which will be made available to templates using this plugin. Following the context reference are passed any additional parameters specified with the USE directive, such as the data source parameter, dbi:mSQL:mydbname, that we used in the earlier DBI example.

If you don't or can't install it to the regular place for your Perl modules (perhaps because you don't have the required privileges) then you can set the PERL5LIB environment variable to specify another location. If you're using ttree then you can add the following line to your configuration file instead.

$HOME/.ttreerc:

perl5lib = /path/to/modules

One further configuration item must be added to inform the toolkit of the new package name we have adopted for our plugins:

$HOME/.ttreerc:

plugin_base = 'MyOrg::Template::Plugin'

If you're writing Perl code to control the Template modules directly, then this value can be passed as a configuration parameter when you create the module.

use Template;

my $template = Template->new({ 
    PLUGIN_BASE => 'MyOrg::Template::Plugin' 
});

Now we can create a template which uses this plugin:

[% INCLUDE header
   title = 'FooBar Plugin Test'
%]

[% USE FooBar %]

Some values available from this plugin:
  [% FooBar.foo %] [% FooBar.bar %]

The users defined in the 'people' list:
[% FOREACH uid = FooBar.people %]
  * [% uid %]
[% END %]

[% INCLUDE footer %]

The foo, bar, and people items of the FooBar plugin are automatically resolved to the appropriate data items or method calls on the underlying object.

Using this approach, it is possible to create application functionality in a single module which can then be loaded and used on demand in any template. The simple interface between template directives and plugin objects allows complex, dynamic content to be built from a few simple template documents without knowing anything about the underlying implementation.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/tools/index.html000700 000765 000765 00000021745 11756705114 016762 0ustar00abwabw000000 000000 Template::Tools

Template Tools

Top

The Template Toolkit includes the following command line tools for processing templates.

tpage

Top

The tpage script can be used to process a single template using the Template Toolkit.

$ tpage --define msg="Hello World" greeting.tt2

Use the -h option to get a summary of options:

$ tpage -h

See the Template::Tools::tpage documentation for further information and examples of use.

ttree

Top

The ttree script can be used to process an entire directory of templates.

$ ttree --src /path/to/templates --dest /path/to/output

Use the -h option to get a summary of options:

$ ttree -h

See the Template::Tools::ttree documentation for further information and examples of use.


TT_v224_html_docs/tools/tpage.html000700 000765 000765 00000026376 11756705114 016760 0ustar00abwabw000000 000000 Template::Tools::tpage

USAGE

Top
tpage [ --define var=value ] file(s)

DESCRIPTION

Top

The tpage script is a simple wrapper around the Template Toolkit processor. Files specified by name on the command line are processed in turn by the template processor and the resulting output is sent to STDOUT and can be redirected accordingly. e.g.

tpage myfile > myfile.out
tpage header myfile footer > myfile.html

If no file names are specified on the command line then tpage will read STDIN for input.

The --define option can be used to set the values of template variables. e.g.

tpage --define author="Andy Wardley" skeleton.pm > MyModule.pm

The .tpagerc Configuration File

Top

You can use a .tpagerc file in your home directory.

The purpose of this file is to set any global configuration options that you want applied every time tpage is run. For example, you can use the include_path to use template files from a generic template directory.

Run tpage -h for a summary of the options available.

See Template for general information about the Perl Template Toolkit and the template language and features.

AUTHOR

Top

Andy Wardley http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2008 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

TT_v224_html_docs/tools/ttree.html000700 000765 000765 00000071547 11756705114 017003 0ustar00abwabw000000 000000 Template::Tools::ttree

SYNOPSIS

Top
ttree [options] [files]

DESCRIPTION

Top

The ttree script is used to process entire directory trees containing template files. The resulting output from processing each file is then written to a corresponding file in a destination directory. The script compares the modification times of source and destination files (where they already exist) and processes only those files that have been modified. In other words, it is the equivalent of 'make' for the Template Toolkit.

It supports a number of options which can be used to configure behaviour, define locations and set Template Toolkit options. The script first reads the .ttreerc configuration file in the HOME directory, or an alternative file specified in the TTREERC environment variable. Then, it processes any command line arguments, including any additional configuration files specified via the -f (file) option.

The .ttreerc Configuration File

Top

When you run ttree for the first time it will ask you if you want it to create a .ttreerc file for you. This will be created in your home directory.

$ ttree
Do you want me to create a sample '.ttreerc' file for you?
(file: /home/abw/.ttreerc)   [y/n]: y
/home/abw/.ttreerc created.  Please edit accordingly and re-run ttree

The purpose of this file is to set any global configuration options that you want applied every time ttree is run. For example, you can use the ignore and copy option to provide regular expressions that specify which files should be ignored and which should be copied rather than being processed as templates. You may also want to set flags like verbose and recurse according to your preference.

A minimal .ttreerc:

# ignore these files
ignore = \b(CVS|RCS)\b
ignore = ^#
ignore = ~$

# copy these files
copy   = \.(gif|png|jpg|pdf)$ 

# recurse into directories
recurse

# provide info about what's going on
verbose

In most cases, you'll want to create a different ttree configuration file for each project you're working on. The cfg option allows you to specify a directory where ttree can find further configuration files.

cfg = /home/abw/.ttree

The -f command line option can be used to specify which configuration file should be used. You can specify a filename using an absolute or relative path:

$ ttree -f /home/abw/web/example/etc/ttree.cfg
$ ttree -f ./etc/ttree.cfg
$ ttree -f ../etc/ttree.cfg

If the configuration file does not begin with / or . or something that looks like a MS-DOS absolute path (e.g. C:\\etc\\ttree.cfg) then ttree will look for it in the directory specified by the cfg option.

$ ttree -f test1          # /home/abw/.ttree/test1

The cfg option can only be used in the .ttreerc file. All the other options can be used in the .ttreerc or any other ttree configuration file. They can all also be specified as command line options.

Remember that .ttreerc is always processed before any configuration file specified with the -f option. Certain options like lib can be used any number of times and accumulate their values.

For example, consider the following configuration files:

/home/abw/.ttreerc:

cfg = /home/abw/.ttree
lib = /usr/local/tt2/templates

/home/abw/.ttree/myconfig:

lib = /home/abw/web/example/templates/lib

When ttree is invoked as follows:

$ ttree -f myconfig

the lib option will be set to the following directories:

/usr/local/tt2/templates
/home/abw/web/example/templates/lib

Any templates located under /usr/local/tt2/templates will be used in preference to those located under /home/abw/web/example/templates/lib. This may be what you want, but then again, it might not. For this reason, it is good practice to keep the .ttreerc as simple as possible and use different configuration files for each ttree project.

Directory Options

Top

The src option is used to define the directory containing the source templates to be processed. It can be provided as a command line option or in a configuration file as shown here:

src = /home/abw/web/example/templates/src

Each template in this directory typically corresponds to a single web page or other document.

The dest option is used to specify the destination directory for the generated output.

dest = /home/abw/web/example/html

The lib option is used to define one or more directories containing additional library templates. These templates are not documents in their own right and typically comprise of smaller, modular components like headers, footers and menus that are incorporated into pages templates.

lib = /home/abw/web/example/templates/lib
lib = /usr/local/tt2/templates

The lib option can be used repeatedly to add further directories to the search path.

A list of templates can be passed to ttree as command line arguments.

$ ttree foo.html bar.html

It looks for these templates in the src directory and processes them through the Template Toolkit, using any additional template components from the lib directories. The generated output is then written to the corresponding file in the dest directory.

If ttree is invoked without explicitly specifying any templates to be processed then it will process every file in the src directory. If the -r (recurse) option is set then it will additionally iterate down through sub-directories and process and other template files it finds therein.

$ ttree -r

If a template has been processed previously, ttree will compare the modification times of the source and destination files. If the source template (or one it is dependant on) has not been modified more recently than the generated output file then ttree will not process it. The -a (all) option can be used to force ttree to process all files regardless of modification time.

$ tree -a

Any templates explicitly named as command line argument are always processed and the modification time checking is bypassed.

File Options

Top

The ignore, copy and accept options are used to specify Perl regexen to filter file names. Files that match any of the ignore options will not be processed. Remaining files that match any of the copy regexen will be copied to the destination directory. Remaining files that then match any of the accept criteria are then processed via the Template Toolkit. If no accept parameter is specified then all files will be accepted for processing if not already copied or ignored.

# ignore these files
ignore = \b(CVS|RCS)\b
ignore = ^#
ignore = ~$

# copy these files
copy   = \.(gif|png|jpg|pdf)$ 

# accept only .tt2 templates
accept = \.tt2$

The suffix option is used to define mappings between the file extensions for source templates and the generated output files. The following example specifies that source templates with a .tt2 suffix should be output as .html files:

suffix tt2=html

Or on the command line,

--suffix tt2=html

You can provide any number of different suffix mappings by repeating this option.

Template Dependencies

Top

The depend and depend_file options allow you to specify how any given template file depends on another file or group of files. The depend option is used to express a single dependency.

$ ttree --depend foo=bar,baz

This command line example shows the --depend option being used to specify that the foo file is dependant on the bar and baz templates. This option can be used many time on the command line:

$ ttree --depend foo=bar,baz --depend crash=bang,wallop

or in a configuration file:

depend foo=bar,baz
depend crash=bang,wallop

The file appearing on the left of the = is specified relative to the src or lib directories. The file(s) appearing on the right can be specified relative to any of these directories or as absolute file paths.

For example:

$ ttree --depend foo=bar,/tmp/baz

To define a dependency that applies to all files, use * on the left of the =.

$ ttree --depend *=header,footer

or in a configuration file:

depend *=header,footer

Any templates that are defined in the pre_process, post_process, process or wrapper options will automatically be added to the list of global dependencies that apply to all templates.

The depend_file option can be used to specify a file that contains dependency information.

$ ttree --depend_file=/home/abw/web/example/etc/ttree.dep

Here is an example of a dependency file:

# This is a comment. It is ignored.

index.html: header footer menubar 

header: titlebar hotlinks

menubar: menuitem

# spanning multiple lines with the backslash
another.html: header footer menubar \
sidebar searchform

Lines beginning with the # character are comments and are ignored. Blank lines are also ignored. All other lines should provide a filename followed by a colon and then a list of dependant files separated by whitespace, commas or both. Whitespace around the colon is also optional. Lines ending in the \ character are continued onto the following line.

Files that contain spaces can be quoted. That is only necessary for files after the colon (':'). The file before the colon may be quoted if it contains a colon.

As with the command line options, the * character can be used as a wildcard to specify a dependency for all templates.

* : config,header

Template Toolkit Options

Top

ttree also provides access to the usual range of Template Toolkit options. For example, the --pre_chomp and --post_chomp ttree options correspond to the PRE_CHOMP and POST_CHOMP options.

Run ttree -h for a summary of the options available.

AUTHORS

Top

Andy Wardley <abw@wardley.org>

http://www.wardley.org

With contributions from Dylan William Hardison (support for dependencies), Bryce Harrington (absolute and relative options), Mark Anderson (suffix and debug options), Harald Joerg and Leon Brocard who gets everywhere, it seems.

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/old/css/000700 000765 000765 00000000000 11756705152 015161 5ustar00abwabw000000 000000 TT_v224_html_docs/old/index.html000700 000765 000765 00000035527 10627516020 016373 0ustar00abwabw000000 000000 Template::Toolkit

Introduction

Top

The Template Toolkit is a collection of Perl modules which implement a fast, flexible, powerful and extensible template processing system.

It is "input-agnostic" and can be used equally well for processing any kind of text documents: HTML, XML, CSS, Javascript, Perl code, plain text, and so on. However, it is most often used for generating static and dynamic web content, so that's what we'll focus on here.

Although the Template Toolkit is written in Perl, you don't need to be a Perl programmer to use it. It was designed to allow non-programmers to easily create and maintain template-based web sites without having to mess around writing Perl code or going crazy with cut-n-paste.

However, the Template Toolkit is also designed to be extremely flexible and extensible. If you are a Perl programmer, or know someone who is, then you can easily hook the Template Toolkit into your existing code, data, databases and web applications. Furthermore, you can easily extend the Template Toolkit through the use of its plugin mechanism and other developer APIs.

Whatever context you use it in, the primary purpose of the Template Toolkit is to allow you to create a clear separation between the presentation elements of your web site and everything else.

If you're generating static web pages, then you can use it to separate the commonly repeated user interface elements on each page (headers, menus, footers, etc.) from the core content. If you're generating dynamic web pages for the front end of a web application, then you'll also be using it to keep the back-end Perl code entirely separate from the front-end HTML templates. Either way, a clear separation of concerns is what allow you to concentrate on one thing at a time without the other things getting in your way. And that's what the Template Toolkit is all about.

Documentation

Top

The documentation for the Template Toolkit is organised into four sections.

The Template::Manual contains detailed information about using the Template Toolkit. It gives examples of its use and includes a full reference of the template language, configuration options, filters, plugins and other component parts.

The Template::Modules page lists the Perl modules that comprise the Template Toolkit. It gives a brief explanation of what each of them does, and provides a link to the complete documentation for each module for further information. If you're a Perl programmer looking to use the Template Toolkit from your Perl programs then this section is likely to be of interest.

Most, if not all of the information you need to call the Template Toolkit from Perl is in the documentation for the Template module. You only really need to start thinking about the other modules if you want to extend or modify the Template Toolkit in some way, or if you're interested in looking under the hood to see how it all works.

The documentation for each module is embedded as POD in each module, so you can always use perldoc from the command line to read a module's documentation. e.g.

$ perldoc Template
$ perldoc Template::Context
  ...etc...

It's worth noting that all the other documentation, including the user manual is available as POD. e.g.

$ perldoc Template::Manual
$ perldoc Template::Manual::Config
  ...etc...

The Template::Tools section contains the documentation for Template::Tools::tpage and Template::Tools::ttree. These are two command line programs that are distributed with the Template Toolkit. tpage is used to process a single template file, ttree for processing entire directories of template files.

The Template::Tutorial section contains two introductory tutorials on using the Template Toolkit. The first is Template::Tutorial::Web on generating web content. The second is Template::Tutorial::Datafile on using the Template Toolkit to generate other data formats including XML.

All of the documentation is also provided in HTML format in the docs sub-directory of the Template Toolkit distribution. You can also read it online at the Template Toolkit web site: http://template-toolkit.org/

Author

Top

The Template Toolkit was written by Andy Wardley <abw@wardley.org> with assistance and contributions from a great number of people. Please see Template::Manual::Credits for a full list.

Copyright

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/index.html last modified 10:57:36 31-May-2007
TT_v224_html_docs/old/js/000700 000765 000765 00000000000 11756705152 015005 5ustar00abwabw000000 000000 TT_v224_html_docs/old/manual/000700 000765 000765 00000000000 11756705152 015646 5ustar00abwabw000000 000000 TT_v224_html_docs/old/misc/000700 000765 000765 00000000000 11756705152 015324 5ustar00abwabw000000 000000 TT_v224_html_docs/old/modules/000700 000765 000765 00000000000 11756705152 016041 5ustar00abwabw000000 000000 TT_v224_html_docs/old/test.html000700 000765 000765 00000034664 10627515600 016247 0ustar00abwabw000000 000000 Template Toolkit Documentation

Contents

Top

Badger Quotes

"I'd love to help you go back but I can't. I'm just a badger."
"You can't go up. It exists in a different dimension and I left the keys at home."
"Yeah right, I bet you've love to go to the next page, but you can't."
"No, you can't go back. You're silly to even think that you could."
"Since when did going up become so important?"
"Help! I'm stuck on this web page and I can't get off. Please don't go to the next page, help me!"
"You may think I look cute and cuddly, but I've got a fiery temper."
"Are you looking at my nuts? I spent ages foraging for them. Hands off!"
"If you are going to the next page, be sure to wear some flowers in your hair..."
"Have you seen my skateboard? I left it around here somewhere..."
"Go up? Are you mad?"
"Hello, I'm a talking badger."
"My name is Meles Meles, but you can call me "Badger"."
"You can't go up. Would you like to come foraging for nuts and berries in the forest with me instead?"
"I'm sorry Dave, I can't do that."
"I'd love to help you go back but I can't. I'm just a badger."
"You can't go up. It exists in a different dimension and I left the keys at home."
"Yeah right, I bet you've love to go to the next page, but you can't."
"No, you can't go back. You're silly to even think that you could."
"Since when did going up become so important?"
"Help! I'm stuck on this web page and I can't get off. Please don't go to the next page, help me!"
"You may think I look cute and cuddly, but I've got a fiery temper."
"Are you looking at my nuts? I spent ages foraging for them. Hands off!"
"If you are going to the next page, be sure to wear some flowers in your hair..."
"Have you seen my skateboard? I left it around here somewhere..."
"Go up? Are you mad?"
"Hello, I'm a talking badger."
"My name is Meles Meles, but you can call me "Badger"."
"You can't go up. Would you like to come foraging for nuts and berries in the forest with me instead?"
"I'm sorry Dave, I can't do that."
"I'd love to help you go back but I can't. I'm just a badger."
"You can't go up. It exists in a different dimension and I left the keys at home."
"Yeah right, I bet you've love to go to the next page, but you can't."
"No, you can't go back. You're silly to even think that you could."
"Since when did going up become so important?"
"Help! I'm stuck on this web page and I can't get off. Please don't go to the next page, help me!"
"You may think I look cute and cuddly, but I've got a fiery temper."
"Are you looking at my nuts? I spent ages foraging for them. Hands off!"
"If you are going to the next page, be sure to wear some flowers in your hair..."
"Have you seen my skateboard? I left it around here somewhere..."
"Go up? Are you mad?"
"Hello, I'm a talking badger."
"My name is Meles Meles, but you can call me "Badger"."
"You can't go up. Would you like to come foraging for nuts and berries in the forest with me instead?"
"I'm sorry Dave, I can't do that."
"I'd love to help you go back but I can't. I'm just a badger."
"You can't go up. It exists in a different dimension and I left the keys at home."
"Yeah right, I bet you've love to go to the next page, but you can't."
"No, you can't go back. You're silly to even think that you could."
"Since when did going up become so important?"
"Help! I'm stuck on this web page and I can't get off. Please don't go to the next page, help me!"
"You may think I look cute and cuddly, but I've got a fiery temper."
"Are you looking at my nuts? I spent ages foraging for them. Hands off!"
"If you are going to the next page, be sure to wear some flowers in your hair..."
"Have you seen my skateboard? I left it around here somewhere..."
"Go up? Are you mad?"
"Hello, I'm a talking badger."
"My name is Meles Meles, but you can call me "Badger"."
"You can't go up. Would you like to come foraging for nuts and berries in the forest with me instead?"
"I'm sorry Dave, I can't do that."
"I'd love to help you go back but I can't. I'm just a badger."
"You can't go up. It exists in a different dimension and I left the keys at home."
"Yeah right, I bet you've love to go to the next page, but you can't."
"No, you can't go back. You're silly to even think that you could."
"Since when did going up become so important?"
"Help! I'm stuck on this web page and I can't get off. Please don't go to the next page, help me!"
"You may think I look cute and cuddly, but I've got a fiery temper."
"Are you looking at my nuts? I spent ages foraging for them. Hands off!"
"If you are going to the next page, be sure to wear some flowers in your hair..."
"Have you seen my skateboard? I left it around here somewhere..."
"Go up? Are you mad?"
"Hello, I'm a talking badger."
"My name is Meles Meles, but you can call me "Badger"."
"You can't go up. Would you like to come foraging for nuts and berries in the forest with me instead?"
"I'm sorry Dave, I can't do that."
"I'd love to help you go back but I can't. I'm just a badger."
"You can't go up. It exists in a different dimension and I left the keys at home."
"Yeah right, I bet you've love to go to the next page, but you can't."
"No, you can't go back. You're silly to even think that you could."
"Since when did going up become so important?"
"Help! I'm stuck on this web page and I can't get off. Please don't go to the next page, help me!"
"You may think I look cute and cuddly, but I've got a fiery temper."
"Are you looking at my nuts? I spent ages foraging for them. Hands off!"
"If you are going to the next page, be sure to wear some flowers in your hair..."
"Have you seen my skateboard? I left it around here somewhere..."
"Go up? Are you mad?"
"Hello, I'm a talking badger."
"My name is Meles Meles, but you can call me "Badger"."
"You can't go up. Would you like to come foraging for nuts and berries in the forest with me instead?"
"I'm sorry Dave, I can't do that."

This is some text. Hello World

Lorem ipsum modo mundi adolescens ne duo, viris laudem quaerendum has at. Graeco timeam et mea, ne pro porro alterum veritus, at soluta accusam gloriatur eos.

Docendi cotidieque per in, usu nulla doctus tractatos ex. Accusata comprehensam et duo, vel altera sententiae id. Eos alterum adolescens ne, te usu mundi noster volumus. Te quot discere mea.

Maiorum mentitum contentiones an eam, cum ad vivendo ponderum adolescens. Nostrud dissentias concludaturque eam ne. Ea illud choro consequuntur eum. Mea inani semper aliquam cu, ea sea labores phaedrum conclusionemque.


/test.html last modified 10:55:12 31-May-2007
TT_v224_html_docs/old/tools/000700 000765 000765 00000000000 11756705152 015531 5ustar00abwabw000000 000000 TT_v224_html_docs/old/tutorial/000700 000765 000765 00000000000 11756705152 016234 5ustar00abwabw000000 000000 TT_v224_html_docs/old/tutorial/Datafile.html000700 000765 000765 00000074470 10627515602 020645 0ustar00abwabw000000 000000 Template::Tutorial::Datafile

DESCRIPTION

Top

Introducing the Template Toolkit

Top

There are a number of Perl modules that are universally recognised as The Right Thing To Use for certain tasks. If you accessed a database without using DBI, pulled data from the WWW without using one of the LWP modules or parsed XML without using XML::Parser or one of its subclasses then you'd run the risk of being shunned by polite Perl society.

I believe that the year 2000 saw the emergence of another 'must have' Perl module - the Template Toolkit. I don't think I'm alone in this belief as the Template Toolkit won the 'Best New Module' award at the Perl Conference last summer. Version 2.0 of the Template Toolkit (known as TT2 to its friends) was recently released to the CPAN.

TT2 was designed and written by Andy Wardley <abw@wardley.org>. It was born out of Andy's previous templating module, Text::Metatext, in best Fred Brooks 'plan to throw one away' manner; and aims to be the most useful (or, at least, the most used) Perl templating system.

TT2 provides a way to take a file of fixed boilerplate text (the template) and embed variable data within it. One obvious use of this is in the creation of dynamic web pages and this is where a lot of the attention that TT2 has received has been focussed. In this article, I hope to demonstrate that TT2 is just as useful in non-web applications.

Using the Template Toolkit

Top

Let's look at how we'd use TT2 to process a simple data file. TT2 is an object oriented Perl module. Having downloaded it from CPAN and installed it in the usual manner, using it in your program is as easy as putting the lines

use Template;
my $tt = Template->new;

in your code. The constructor function, new, takes a number of optional parameters which are documented in the copious manual pages that come with the module, but for the purposes of this article we'll keep things as simple as possible.

To process the template, you would call the process method like this

$tt->process('my_template', \%data)
    || die $tt->error;

We pass two parameters to process, the first is the name of the file containing the template to process (in this case, my_template) and the second is a reference to a hash which contains the data items that you want to use in the template. If processing the template gives any kind of error, the program will die with a (hopefully) useful error message.

So what kinds of things can go in %data? The answer is just about anything. Here's an example showing data about English Premier League football teams.

my @teams = ({ name   => 'Man Utd',
               played => 16,
               won    => 12,
               drawn  => 3,
               lost   => 1 },
             { name   => 'Bradford',
               played => 16,
               won    => 2,
               drawn  => 5,
               lost   => 9 });
my %data = ( name   => 'English Premier League',
             season => '2000/01',
             teams  => \@teams );

This creates three data items which can be accessed within the template, called name, season and teams. Notice that teams is a complex data structure.

Here is a template that we might use to process this data.

League Standings
League Name: [% name %]
Season     : [% season %]
Teams:
[% FOREACH team = teams -%]
[% team.name %] [% team.played -%] 
 [% team.won %] [% team.drawn %] [% team.lost %]
[% END %]

Running this template with this data gives us the following output

League Standings
League Name: English Premier League
Season     : 2000/01
Teams:
Man Utd 16 12 3 1
Bradford 16 2 5 9

Hopefully the syntax of the template is simple enough to follow. There are a few points to note.

  • Template processing directives are written using a simple language which is not Perl.

  • The keys of the %data have become the names of the data variables within the template.

  • Template processing directives are surrounded by [% and %] sequences.

  • If these tags are replaced with [%- -%] then the preceding or following linefeed is suppressed.

  • In the FOREACH loop, each element of the teams list was assigned, in turn, to the temporary variable team.

  • Each item assigned to the team variable is a Perl hash. Individual values within the hash are accessed using a dot notation.

It's probably the first and last of these points which are the most important. The first point emphasises the separation of the data acquisition logic from the presentation logic. The person creating the presentation template doesn't need to know Perl, they only need to know the data items which will be passed into the template.

The last point demonstrates the way that TT2 protects the template designer from the implementation of the data structures. The data objects passed to the template processor can be scalars, arrays, hashes, objects or even subroutines. The template processor will just interpret your data correctly and Do The Right Thing to return the correct value to you. In this example each team was a hash, but in a larger system each team might be an object, in which case name, played, etc. would be accessor methods to the underlying object attributes. No changes would be required to the template as the template processor would realise that it needed to call methods rather than access hash values.

A more complex example

Top

Stats about the English Football League are usually presented in a slightly more complex format than the one we used above. A full set of stats will show the number of games that a team has won, lost or drawn, the number of goals scored for and against the team and the number of points that the team therefore has. Teams gain three points for a win and one point for a draw. When teams have the same number of points they are separated by the goal difference, that is the number of goals the team has scored minus the number of team scored against them. To complicate things even further, the games won, drawn and lost and the goals for and against are often split between home and away games.

Therefore if you have a data source which lists the team name togther with the games won, drawn and lost and the goals for and against split into home and away (a total of eleven data items) you can calculate all of the other items (goal difference, points awarded and even position in the league). Let's take such a file, but we'll only look at the top three teams. It will look something like this:

Man Utd,7,1,0,26,4,5,2,1,15,6
Arsenal,7,1,0,17,4,2,3,3,7,9
Leicester,4,3,1,10,8,4,2,2,7,4

A simple script to read this data into an array of hashes will look something like this (I've simplified the names of the data columns - w, d, and l are games won, drawn and lost and f and a are goals scored for and against; h and a at the front of a data item name indicates whether it's a home or away statistic):

my @cols = qw(name hw hd hl hf ha aw ad al af aa);
my @teams;
while (<>) {
    chomp;
my %team;
@team{@cols} = split /,/;
    push @teams, \%team;
}

We can then go thru the teams again and calculate all of the derived data items:

foreach (@teams) {
    $_->{w} = $_->{hw} + $_->{aw};
    $_->{d} = $_->{hd} + $_->{ad};
    $_->{l} = $_->{hl} + $_->{al};
$_->{pl} = $_->{w} + $_->{d} + $_->{l};
$_->{f} = $_->{hf} + $_->{af};
$_->{a} = $_->{ha} + $_->{aa};
    $_->{gd} = $_->{f} - $_->{a};
    $_->{pt} = (3 * $_->{w}) + $_->{d};
}

And then produce a list sorted in descending order:

@teams = sort { 
$b->{pt} <=> $b->{pt} || $b->{gd} <=> $a->{gd} 
} @teams;

And finally add the league position data item:

$teams[$_]->{pos} = $_ + 1 
    foreach 0 .. $#teams;

Having pulled all of our data into an internal data structure we can start to produce output using out templates. A template to create a CSV file containing the data split between home and away stats would look like this:

[% FOREACH team = teams -%]
[% team.pos %],[% team.name %],[% team.pl %],[% team.hw %],
[%- team.hd %],[% team.hl %],[% team.hf %],[% team.ha %],
[%- team.aw %],[% team.ad %],[% team.al %],[% team.af %],
[%- team.aa %],[% team.gd %],[% team.pt %]
[%- END %]

And processing it like this:

$tt->process('split.tt', { teams => \@teams }, 'split.csv')
  || die $tt->error;

produces the following output:

1,Man Utd,16,7,1,0,26,4,5,2,1,15,6,31,39
2,Arsenal,16,7,1,0,17,4,2,3,3,7,9,11,31
3,Leicester,16,4,3,1,10,8,4,2,2,7,4,5,29

Notice that we've introduced the third parameter to process. If this parameter is missing then the TT2 sends its output to STDOUT. If this parameter is a scalar then it is taken as the name of a file to write the output to. This parameter can also be (amongst other things) a filehandle or a reference to an object w hich is assumed to implement a print method.

If we weren't interested in the split between home and away games, then we could use a simpler template like this:

[% FOREACH team = teams -%]
[% team.pos %],[% team.name %],[% team.pl %],[% team.w %],
[%- team.d %],[% team.l %],[% team.f %],[% team.a %],
[%- team.aa %],[% team.gd %],[% team.pt %]
[% END -%]

Which would produce output like this:

1,Man Utd,16,12,3,1,41,10,6,31,39
2,Arsenal,16,9,4,3,24,13,9,11,31
3,Leicester,16,8,5,3,17,12,4,5,29

Producing XML

Top

This is starting to show some of the power and flexibility of TT2, but you may be thinking that you could just as easily produce this output with a foreach loop and a couple of print statements in your code. This is, of course, true; but that's because I've chosen a deliberately simple example to explain the concepts. What if we wanted to produce an XML file containing the data? And what if (as I mentioned earlier) the league data was held in an object? The code would then look even easier as most of the code we've written earlier would be hidden away in FootballLeague.pm.

use FootballLeague;
use Template;
my $league = FootballLeague->new(name => 'English Premier');
my $tt = Template->new;
$tt->process('league_xml.tt', { league => $league })
    || die $tt->error;

And the template in league_xml.tt would look something like this:

<?xml version="1.0"?>
<!DOCTYPE LEAGUE SYSTEM "league.dtd">
<league name="[% league.name %]" season="[% league.season %]">
[% FOREACH team = league.teams -%]
  <team name="[% team.name %]"
        pos="[% team.pos %]"
        played="[% team.pl %]"
        goal_diff="[% team.gd %]"
        points="[% team.pt %]">
     <stats type="home">
        win="[% team.hw %]"
        draw="[%- team.hd %]"
        lose="[% team.hl %]"
        for="[% team.hf %]"
        against="[% team.ha %]" />
     <stats type="away">
        win="[% team.aw %]"
        draw="[%- team.ad %]"
        lose="[% team.al %]"
        for="[% team.af %]"
        against="[% team.aa %]" />
  </team>
[% END -%]
&/league>

Notice that as we've passed the whole object into process then we need to put an extra level of indirection on our template variables - everything is now a component of the league variable. Other than that, everything in the template is very similar to what we've used before. Presumably now team.name calls an accessor function rather than carrying out a hash lookup, but all of this is transparent to our template designer.

Multiple Formats

Top

As a final example, let's suppose that we need to create output football league tables in a number of formats. Perhaps we are passing this data on to other people and they can't all use the same format. Some of our users need CSV files and others need XML. Some require data split between home and away matches and other just want the totals. In total, then, we'll need four different templates, but the good news is that they can use the same data object. All the script needs to do is to establish which template is required and process it.

use FootballLeague;
use Template;
my ($name, $type, $stats) = @_;
my $league = FootballLeague->new(name => $name);
my $tt = Template->new;
$tt->process("league_${type}_$stats.tt", 
             { league => $league }
             "league_$stats.$type")
    || die $tt->error;

For example, you can call this script as

league.pl 'English Premier' xml split

This will process a template called league_xml_split.tt and put the results in a file called league_split.xml.

This starts to show the true strength of the Template Toolkit. If we later wanted to add another file format - perhaps we wanted to create a league table HTML page or even a LaTeX document - then we would just need to create the appropriate template and name it according to our existing naming convention. We would need to make no changes to the code.

I hope you can now see why the Template Toolkit is fast becoming an essential part of many people's Perl installation.

AUTHOR

Top

Dave Cross <dave@dave.org.uk>

VERSION

Top

Template Toolkit version 2.19, released on 27 April 2007.

COPYRIGHT

Top

Copyright (C) 2001 Dave Cross <dave@dave.org.uk>

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/tutorial/Datafile.html last modified 10:55:14 31-May-2007
TT_v224_html_docs/old/tutorial/index.html000700 000765 000765 00000017215 10627515602 020235 0ustar00abwabw000000 000000 Template::Tutorial

Template Toolkit Tutorials

Top

Template::Tutorial::Web

Top

The Template::Tutorial::Web tutorial shows how you can use the Template Toolkit to generate static and dynamic web content.

Template::Tutorial::Datafile

Top

The Template::Tutorial::Datafile tutorial shows how you can use the Template Toolkit to generate other data formats like XML.


/tutorial/index.html last modified 10:55:14 31-May-2007
TT_v224_html_docs/old/tutorial/Web.html000700 000765 000765 00000141613 10627515603 017644 0ustar00abwabw000000 000000 Template::Tutorial::Web

Overview

Top

This tutorial document provides a introduction to the Template Toolkit and demonstrates some of the typical ways it may be used for generating web content. It covers the generation of static pages from templates using the Template::Tools::tpage and Template::Tools::ttree scripts and then goes on to show dynamic content generation using CGI scripts and Apache/mod_perl handlers.

Various features of the Template Toolkit are introduced and described briefly and explained by use of example. For further information, see Template, Template::Manual and the various sections within it. e.g

perldoc Template                    # Template.pm module usage
perldoc Template::Manual            # index to manual
perldoc Template::Manual::Config    # e.g. configuration options

The documentation is now also distributed in HTML format in the docs sub-directory of the Template Toolkit distribution.

You can also read it online at the Template Toolkit web site:

http://template-toolkit.org/docs/tutorial/Web.html

Introduction

Top

The Template Toolkit is a set of Perl modules which collectively implement a template processing system.

A template is a text document with special markup tags embedded in it. By default, the Template Toolkit uses '[%' and '%]' to denote the start and end of a tag. Here's an example:

[% INCLUDE header %]

People of [% planet %], your attention please.

This is [% captain %] of the
Galactic Hyperspace Planning Council.

As you will no doubt be aware, the plans
for development of the outlying regions
of the Galaxy require the building of a
hyperspatial express route through your
star system, and regrettably your planet
is one of those scheduled for destruction.

The process will take slightly less than
[% time %].

Thank you.

[% INCLUDE footer %]

Tags can contain simple variables (like planet and captain) and more complex directives that start with an upper case keyword (like INCLUDE). A directive is an instruction that tells the template processor to perform some action, like processing another template (header and footer in this example) and inserting the output into the current template. In fact, the simple variables we mentioned are actually GET directives, but the GET keyword is optional.

People of [% planet %], your attention please.      # short form
People of [% GET planet %], your attention please.  # long form

Other directives include SET to set a variable value (the SET keyword is also optional), FOREACH to iterate through a list of values, and IF, UNLESS, ELSIF and ELSE to declare conditional blocks.

The Template Toolkit processes all text files equally, regardless of what kind of content they contain. So you can use TT to generate HTML, XML, CSS, Javascript, Perl, RTF, LaTeX, or any other text-based format. In this tutorial, however, we'll be concentrating on generating HTML for web pages.

Generating Static Web Content

Top

Here's an example of a template used to generate an HTML document.

[%  INCLUDE header
      title = 'This is an HTML example';

    pages = [
      { url   = 'http://foo.org'
        title = 'The Foo Organisation' 
      }
      { url   = 'http://bar.org'
        title = 'The Bar Organisation' 
      }
    ]
%]
   <h1>Some Interesting Links</h1>
   <ul>
[%  FOREACH page IN pages %]
     <li><a href="[% page.url %]">[% page.title %]</a>
[%  END %]
   </ul>

[% INCLUDE footer %]

This example shows how the INCLUDE directive is used to load and process separate 'header' and 'footer' template files, including the output in the current document. These files might look something like this:

header:

<html>
  <head>
    <title>[% title %]</title>
  </head>
  <body>

footer:

    <div class="copyright">
      &copy; Copyright 2007 Arthur Dent
    </div>
  </body>
</html>

The example also uses the FOREACH directive to iterate through the 'pages' list to build a table of links. In this example, we have defined this list within the template to contain a number of hash references, each containing a 'url' and 'title' member. The FOREACH directive iterates through the list, aliasing 'page' to each item (in this case, hash array references). The [% page.url %] and [% page.title %] directives then access the individual values in the hash ararys and insert them into the document.

Using tpage

Top

Having created a template file we can now process it to generate some real output. The quickest and easiest way to do this is to use the Template::Tools::tpage script. This is provided as part of the Template Toolkit and should be installed in your usual Perl bin directory.

Assuming you saved your template file as example.html, you would run the command:

$ tpage example.html

This will process the template file, sending the output to STDOUT (i.e. whizzing past you on the screen). You may want to redirect the output to a file but be careful not to specify the same name as the template file, or you'll overwrite it. You may want to use one prefix for your templates (e.g. '.tt') and another (e.g. '.html') for the output files.

$ tpage example.tt > example.html

Or you can redirect the output to another directory. e.g.

$ tpage templates/example.tt > html/example.html

The output generated would look like this:

<html>
  <head>
    <title>This is an HTML example</title>
  </head>
  <body>
    <h1>Some Interesting Links</h1>
    <ul>
      <li><a href="http://foo.org">The Foo Organsiation</a>
      <li><a href="http://bar.org">The Bar Organsiation</a>
    </ul>
    <div class="copyright">
      &copy; Copyright 2007 Arthur Dent
    </div>
  </body>
</html>

The header and footer template files have been included (assuming you created them and they're in the current directory) and the link data has been built into an HTML list.

Using ttree

Top

The Template::Tools::tpage script gives you a simple and easy way to process a single template without having to write any Perl code. The Template::Tools::ttree script, also distributed as part of the Template Toolkit, provides a more flexible way to process a number of template documents in one go.

The first time you run the script, it will ask you if it should create a configuration file (.ttreerc) in your home directory. Answer y to have it create the file.

The Template::Tools::ttree documentation describes how you can change the location of this file and also explains the syntax and meaning of the various options in the file. Comments are written to the sample configuration file which should also help.

In brief, the configuration file describes the directories in which template files are to be found (src), where the corresponding output should be written to (dest), and any other directories (lib) that may contain template files that you plan to INCLUDE into your source documents. You can also specify processing options (such as verbose and recurse) and provide regular expression to match files that you don't want to process (ignore, accept)> or should be copied instead of being processed as templates (copy).

An example .ttreerc file is shown here:

$HOME/.ttreerc:

verbose 
recurse

# this is where I keep other ttree config files
cfg = ~/.ttree

src  = ~/websrc/src
lib  = ~/websrc/lib
dest = ~/public_html/test

ignore = \b(CVS|RCS)\b
ignore = ^#

You can create many different configuration files and store them in the directory specified in the cfg option, shown above. You then add the -f filename option to ttree to have it read that file.

When you run the script, it compares all the files in the src directory (including those in sub-directories if the recurse option is set), with those in the dest directory. If the destination file doesn't exist or has an earlier modification time than the corresponding source file, then the source will be processed with the output written to the destination file. The -a option forces all files to be processed, regardless of modification times.

The script doesn't process any of the files in the lib directory, but it does add it to the INCLUDE_PATH for the template processor so that it can locate these files via an INCLUDE, PROCESS or WRAPPER directive. Thus, the lib directory is an excellent place to keep template elements such as header, footers, etc., that aren't complete documents in their own right.

You can also specify various Template Toolkit options from the configuration file. Consult the Template::Tools::ttree documentation and help summary (ttree -h) for full details. e.g.

$HOME/.ttreerc:

pre_process = config
interpolate
post_chomp

The pre_process option allows you to specify a template file which should be processed before each file. Unsurprisingly, there's also a post_process option to add a template after each file. In the fragment above, we have specified that the config template should be used as a prefix template. We can create this file in the lib directory and use it to define some common variables, including those web page links we defined earlier and might want to re-use in other templates. We could also include an HTML header, title, or menu bar in this file which would then be prepended to each and every template file, but for now we'll keep all that in a separate header file.

$lib/config:

[% root     = '~/abw'
   home     = "$root/index.html"
   images   = "$root/images"
   email    = 'abw@wardley.org'
   graphics = 1
   webpages = [
     { url => 'http://foo.org', title => 'The Foo Organsiation' }
     { url => 'http://bar.org', title => 'The Bar Organsiation' }
   ]
%]

Assuming you've created or copied the header and footer files from the earlier example into your lib directory, you can now start to create web pages like the following in your src directory and process them with ttree.

$src/newpage.html:

[% INCLUDE header
   title = 'Another Template Toolkit Test Page'
%]

    <a href="[% home %]">Home</a>
    <a href="mailto:[% email %]">Email</a>

[% IF graphics %]
    <img src="[% images %]/logo.gif" align=right width=60 height=40>
[% END %]

[% INCLUDE footer %]

Here we've shown how pre-defined variables can be used as flags to enable certain feature (e.g. graphics) and to specify common items such as an email address and URL's for the home page, images directory and so on. This approach allows you to define these values once so that they're consistent across all pages and can easily be changed to new values.

When you run ttree, you should see output similar to the following (assuming you have the verbose flag set).

ttree 2.9 (Template Toolkit version 2.20)

     Source: /home/abw/websrc/src
Destination: /home/abw/public_html/test
   Include Path: [ /home/abw/websrc/lib ]
     Ignore: [ \b(CVS|RCS)\b, ^# ]
       Copy: [  ]
     Accept: [ * ]

+ newpage.html

The + in front of the newpage.html filename shows that the file was processed, with the output being written to the destination directory. If you run the same command again, you'll see the following line displayed instead showing a - and giving a reason why the file wasn't processed.

- newpage.html                     (not modified)

It has detected a newpage.html in the destination directory which is more recent than that in the source directory and so hasn't bothered to waste time re-processing it. To force all files to be processed, use the -a option. You can also specify one or more filenames as command line arguments to ttree:

tpage newpage.html

This is what the destination page looks like.

$dest/newpage.html:

<html>
  <head>
    <title>Another Template Toolkit Test Page</title>
  </head>
  <body>

    <a href="~/abw/index.html">Home</a>
    <a href="mailto:abw@wardley.org">Email me</a>
    <img src="~/abw/images/logo.gif" align=right width=60 height=40>

    <div class="copyright">
      &copy; Copyright 2007 Arthur Dent
    </div>
  </body>
</html>

You can add as many documents as you like to the src directory and ttree will apply the same process to them all. In this way, it is possible to build an entire tree of static content for a web site with a single command. The added benefit is that you can be assured of consistency in links, header style, or whatever else you choose to implement in terms of common templates elements or variables.

Dynamic Content Generation Via CGI Script

Top

The Template module provides a simple front-end to the Template Toolkit for use in CGI scripts and Apache/mod_perl handlers. Simply use the Template module, create an object instance with the new() method and then call the process() method on the object, passing the name of the template file as a parameter. The second parameter passed is a reference to a hash array of variables that we want made available to the template:

#!/usr/bin/perl
use strict;
use warnings;
use Template;

my $file = 'src/greeting.html';
my $vars = {
   message  => "Hello World\n"
};

my $template = Template->new();

$template->process($file, $vars)
    || die "Template process failed: ", $template->error(), "\n";

So that our scripts will work with the same template files as our earlier examples, we'll can add some configuration options to the constructor to tell it about our environment:

my $template->new({
    # where to find template files
    INCLUDE_PATH => ['/home/abw/websrc/src', '/home/abw/websrc/lib'],
    # pre-process lib/config to define any extra values
    PRE_PROCESS  => 'config',
});

Note that here we specify the config file as a PRE_PROCESS option. This means that the templates we process can use the same global variables defined earlier for our static pages. We don't have to replicate their definitions in this script. However, we can supply additional data and functionality specific to this script via the hash of variables that we pass to the process() method.

These entries in this hash may contain simple text or other values, references to lists, others hashes, sub-routines or objects. The Template Toolkit will automatically apply the correct procedure to access these different types when you use the variables in a template.

Here's a more detailed example to look over. Amongst the different template variables we define in $vars, we create a reference to a CGI object and a get_user_projects() sub-routine.

#!/usr/bin/perl
use strict;
use warnings;
use Template;
use CGI;

$| = 1;
print "Content-type: text/html\n\n";

my $file = 'userinfo.html';
my $vars = {
    'version'  => 3.14,
    'days'     => [ qw( mon tue wed thu fri sat sun ) ],
    'worklist' => \&get_user_projects,
    'cgi'      => CGI->new(),
    'me'       => {
        'id'     => 'abw',
        'name'   => 'Andy Wardley',
    },
};

sub get_user_projects {
    my $user = shift;
    my @projects = ...   # do something to retrieve data
    return \@projects;
}

my $template = Template->new({
    INCLUDE_PATH => '/home/abw/websrc/src:/home/abw/websrc/lib',
    PRE_PROCESS  => 'config',
});

$template->process($file, $vars)
    || die $template->error();

Here's a sample template file that we might create to build the output for this script.

$src/userinfo.html:

[% INCLUDE header
   title = 'Template Toolkit CGI Test'
%]

<a href="mailto:[% email %]">Email [% me.name %]</a>

<p>This is version [% version %]</p>

<h3>Projects</h3>
<ul>
[% FOREACH project IN worklist(me.id) %]
   <li> <a href="[% project.url %]">[% project.name %]</a>
[% END %]
</ul>

[% INCLUDE footer %]

This example shows how we've separated the Perl implementation (code) from the presentation (HTML). This not only makes them easier to maintain in isolation, but also allows the re-use of existing template elements such as headers and footers, etc. By using template to create the output of your CGI scripts, you can give them the same consistency as your static pages built via Template::Tools::ttree or other means.

Furthermore, we can modify our script so that it processes any one of a number of different templates based on some condition. A CGI script to maintain a user database, for example, might process one template to provide an empty form for new users, the same form with some default values set for updating an existing user record, a third template for listing all users in the system, and so on. You can use any Perl functionality you care to write to implement the logic of your application and then choose one or other template to generate the desired output for the application state.

Dynamic Content Generation Via Apache/Mod_Perl Handler

Top

NOTE: the Apache::Template module is available from CPAN and provides a simple and easy to use Apache/mod_perl interface to the Template Toolkit. Although basic, it implements most, if not all of what is described below, and it avoids the need to write your own handler. However, in many cases, you'll want to write your own handler to customise processing for your own need, and this section will show you how to get started.

The Template module can be used from an Apache/mod_perl handler. Here's an example of a typical Apache httpd.conf file:

PerlModule CGI;
PerlModule Template
PerlModule MyOrg::Apache::User

PerlSetVar websrc_root   /home/abw/websrc

<Location /user/bin>
    SetHandler     perl-script
    PerlHandler    MyOrg::Apache::User
</Location>

This defines a location called /user/bin to which all requests will be forwarded to the handler() method of the MyOrg::Apache::User module. That module might look something like this:

package MyOrg::Apache::User;

use strict;
use vars qw( $VERSION );
use Apache::Constants qw( :common );
use Template qw( :template );
use CGI;

$VERSION = 1.59;

sub handler {
    my $r = shift;

    my $websrc = $r->dir_config('websrc_root')
        or return fail($r, SERVER_ERROR,
                       "'websrc_root' not specified");

    my $template = Template->new({ 
        INCLUDE_PATH  => "$websrc/src/user:$websrc/lib",
        PRE_PROCESS   => 'config',
        OUTPUT        => $r,     # direct output to Apache request
    });

    my $params = {
        uri     => $r->uri,
        cgi     => CGI->new,
    };

    # use the path_info to determine which template file to process
    my $file = $r->path_info;
    $file =~ s[^/][];

    $r->content_type('text/html');
    $r->send_http_header;

    $template->process($file, $params) 
        || return fail($r, SERVER_ERROR, $template->error());

    return OK;
}

sub fail {
    my ($r, $status, $message) = @_;
    $r->log_reason($message, $r->filename);
    return $status;
}

The handler accepts the request and uses it to determine the websrc_root value from the config file. This is then used to define an INCLUDE_PATH for a new Template object. The URI is extracted from the request and a CGI object is created. These are both defined as template variables.

The name of the template file itself is taken from the PATH_INFO element of the request. In this case, it would comprise the part of the URL coming after /user/bin, e.g for /user/bin/edit, the template file would be edit located in $websrc/src/user. The headers are sent and the template file is processed. All output is sent directly to the print() method of the Apache request object.

Using Plugins to Extend Functionality

Top

As we've already shown, it is possible to bind Perl data and functions to template variables when creating dynamic content via a CGI script or Apache/mod_perl process. The Template Toolkit also supports a plugin interface which allows you define such additional data and/or functionality in a separate module and then load and use it as required with the USE directive.

The main benefit to this approach is that you can load the extension into any template document, even those that are processed "statically" by tpage or ttree. You don't need to write a Perl wrapper to explicitly load the module and make it available via the stash.

Let's demonstrate this principle using the DBI plugin written by Simon Matthews (available from CPAN). You can create this template in your src directory and process it using ttree to see the results. Of course, this example relies on the existence of the appropriate SQL database but you should be able to adapt it to your own resources, or at least use it as a demonstrative example of what's possible.

[% INCLUDE header
     title = 'User Info'
%]

[% USE DBI('dbi:mSQL:mydbname') %]

<table border=0 width="100%">
  <tr>
    <th>User ID</th> 
    <th>Name</th>  
    <th>Email</th>
  </tr>
[% FOREACH user IN DBI.query('SELECT * FROM user ORDER BY id') %]
  <tr>
    <td>[% user.id %]</td> 
    <td>[% user.name %]</td> 
    <td>[% user.email %]</td>
  </tr>
[% END %]
</table>

[% INCLUDE footer %]

A plugin is simply a Perl module in a known location and conforming to a known standard such that the Template Toolkit can find and load it automatically. You can create your own plugin by inheriting from the Template::Plugin module.

Here's an example which defines some data items (foo and people) and also an object method (bar). We'll call the plugin FooBar for want of a better name and create it in the MyOrg::Template::Plugin::FooBar package. We've added a MyOrg to the regular Template::Plugin::* package to avoid any conflict with existing plugins.

package MyOrg::Template::Plugin::FooBar;
use base 'Template::Plugin'
our $VERSION = 1.23;

sub new {
    my ($class, $context, @params) = @_;

    bless {
        _CONTEXT => $context,
        foo      => 25,
        people   => [ 'tom', 'dick', 'harry' ],
    }, $class;
}

sub bar {
    my ($self, @params) = @_;
    # ...do something...    
    return $some_value;
}

The plugin constructor new() receives the class name as the first parameter, as is usual in Perl, followed by a reference to something called a Template::Context object. You don't need to worry too much about this at the moment, other than to know that it's the main processing object for the Template Toolkit. It provides access to the functionality of the processor and some plugins may need to communicate with it. We don't at this stage, but we'll save the reference anyway in the _CONTEXT member. The leading underscore is a convention which indicates that this item is private and the Template Toolkit won't attempt to access this member. The other members defined, foo and people are regular data items which will be made available to templates using this plugin. Following the context reference are passed any additional parameters specified with the USE directive, such as the data source parameter, dbi:mSQL:mydbname, that we used in the earlier DBI example.

If you don't or can't install it to the regular place for your Perl modules (perhaps because you don't have the required privileges) then you can set the PERL5LIB environment variable to specify another location. If you're using ttree then you can add the following line to your configuration file instead.

$HOME/.ttreerc:

perl5lib = /path/to/modules

One further configuration item must be added to inform the toolkit of the new package name we have adopted for our plugins:

$HOME/.ttreerc:

plugin_base = 'MyOrg::Template::Plugin'

If you're writing Perl code to control the Template modules directly, then this value can be passed as a configuration parameter when you create the module.

use Template;

my $template = Template->new({ 
    PLUGIN_BASE => 'MyOrg::Template::Plugin' 
});

Now we can create a template which uses this plugin:

[% INCLUDE header
   title = 'FooBar Plugin Test'
%]

[% USE FooBar %]

Some values available from this plugin:
  [% FooBar.foo %] [% FooBar.bar %]

The users defined in the 'people' list:
[% FOREACH uid = FooBar.people %]
  * [% uid %]
[% END %]

[% INCLUDE footer %]

The foo, bar, and people items of the FooBar plugin are automatically resolved to the appropriate data items or method calls on the underlying object.

Using this approach, it is possible to create application functionality in a single module which can then be loaded and used on demand in any template. The simple interface between template directives and plugin objects allows complex, dynamic content to be built from a few simple template documents without knowing anything about the underlying implementation.

AUTHOR

Top

Andy Wardley <abw@wardley.org>

http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/tutorial/Web.html last modified 10:55:15 31-May-2007
TT_v224_html_docs/old/tools/index.html000700 000765 000765 00000021217 10627515600 017525 0ustar00abwabw000000 000000 Template::Tools

Template Tools

Top

The Template Toolkit includes the following command line tools for processing templates.

tpage

Top

The Template::Tools::tpage script can be used to process a single template using the Template Toolkit.

$ tpage --define msg="Hello World" greeting.tt2

Use the -h option to get a summary of options:

$ tpage -h

See the Template::Tools::tpage documentation for further information and examples of use.

ttree

Top

The Template::Tools::ttree script can be used to process an entire directory of templates.

$ ttree --src /path/to/templates --dest /path/to/output

Use the -h option to get a summary of options:

$ ttree -h

See the Template::Tools::ttree documentation for further information and examples of use.


/tools/index.html last modified 10:55:12 31-May-2007
TT_v224_html_docs/old/tools/tpage.html000700 000765 000765 00000023351 10627515601 017520 0ustar00abwabw000000 000000 Template::Tools::tpage

USAGE

Top
tpage [ --define var=value ] file(s)

DESCRIPTION

Top

The tpage script is a simple wrapper around the Template Toolkit processor. Files specified by name on the command line are processed in turn by the template processor and the resulting output is sent to STDOUT and can be redirected accordingly. e.g.

tpage myfile > myfile.out
tpage header myfile footer > myfile.html

If no file names are specified on the command line then tpage will read STDIN for input.

The --define option can be used to set the values of template variables. e.g.

tpage --define author="Andy Wardley" skeleton.pm > MyModule.pm

See Template for general information about the Perl Template Toolkit and the template language and features.

AUTHOR

Top

Andy Wardley <abw@wardley.org>

http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/tools/tpage.html last modified 10:55:13 31-May-2007
TT_v224_html_docs/old/tools/ttree.html000700 000765 000765 00000071225 10627515601 017546 0ustar00abwabw000000 000000 Template::Tools::ttree

SYNOPSIS

Top
ttree [options] [files]

DESCRIPTION

Top

The ttree script is used to process entire directory trees containing template files. The resulting output from processing each file is then written to a corresponding file in a destination directory. The script compares the modification times of source and destination files (where they already exist) and processes only those files that have been modified. In other words, it is the equivalent of 'make' for the Template Toolkit.

It supports a number of options which can be used to configure behaviour, define locations and set Template Toolkit options. The script first reads the .ttreerc configuration file in the HOME directory, or an alternative file specified in the TTREERC environment variable. Then, it processes any command line arguments, including any additional configuration files specified via the -f (file) option.

The .ttreerc Configuration File

Top

When you run ttree for the first time it will ask you if you want it to create a .ttreerc file for you. This will be created in your home directory.

$ ttree
Do you want me to create a sample '.ttreerc' file for you?
(file: /home/abw/.ttreerc)   [y/n]: y
/home/abw/.ttreerc created.  Please edit accordingly and re-run ttree

The purpose of this file is to set any global configuration options that you want applied every time ttree is run. For example, you can use the ignore and copy option to provide regular expressions that specify which files should be ignored and which should be copied rather than being processed as templates. You may also want to set flags like verbose and recurse according to your preference.

A minimal .ttreerc:

# ignore these files
ignore = \b(CVS|RCS)\b
ignore = ^#
ignore = ~$
# copy these files
copy   = \.(gif|png|jpg|pdf)$ 
# recurse into directories
recurse
# provide info about what's going on
verbose

In most cases, you'll want to create a different ttree configuration file for each project you're working on. The cfg option allows you to specify a directory where ttree can find further configuration files.

cfg = /home/abw/.ttree

The -f command line option can be used to specify which configuration file should be used. You can specify a filename using an absolute or relative path:

$ ttree -f /home/abw/web/example/etc/ttree.cfg
$ ttree -f ./etc/ttree.cfg
$ ttree -f ../etc/ttree.cfg

If the configuration file does not begin with / or . or something that looks like a MS-DOS absolute path (e.g. C:\\etc\\ttree.cfg) then ttree will look for it in the directory specified by the cfg option.

$ ttree -f test1          # /home/abw/.ttree/test1

The cfg option can only be used in the .ttreerc file. All the other options can be used in the .ttreerc or any other ttree configuration file. They can all also be specified as command line options.

Remember that .ttreerc is always processed before any configuration file specified with the -f option. Certain options like lib can be used any number of times and accumulate their values.

For example, consider the following configuration files:

/home/abw/.ttreerc:

cfg = /home/abw/.ttree
lib = /usr/local/tt2/templates

/home/abw/.ttree/myconfig:

lib = /home/abw/web/example/templates/lib

When ttree is invoked as follows:

$ ttree -f myconfig

the lib option will be set to the following directories:

/usr/local/tt2/templates
/home/abw/web/example/templates/lib

Any templates located under /usr/local/tt2/templates will be used in preference to those located under /home/abw/web/example/templates/lib. This may be what you want, but then again, it might not. For this reason, it is good practice to keep the .ttreerc as simple as possible and use different configuration files for each ttree project.

Directory Options

Top

The src option is used to define the directory containing the source templates to be processed. It can be provided as a command line option or in a configuration file as shown here:

src = /home/abw/web/example/templates/src

Each template in this directory typically corresponds to a single web page or other document.

The dest option is used to specify the destination directory for the generated output.

dest = /home/abw/web/example/html

The lib option is used to define one or more directories containing additional library templates. These templates are not documents in their own right and typically comprise of smaller, modular components like headers, footers and menus that are incorporated into pages templates.

lib = /home/abw/web/example/templates/lib
lib = /usr/local/tt2/templates

The lib option can be used repeatedly to add further directories to the search path.

A list of templates can be passed to ttree as command line arguments.

$ ttree foo.html bar.html

It looks for these templates in the src directory and processes them through the Template Toolkit, using any additional template components from the lib directories. The generated output is then written to the corresponding file in the dest directory.

If ttree is invoked without explicitly specifying any templates to be processed then it will process every file in the src directory. If the -r (recurse) option is set then it will additionally iterate down through sub-directories and process and other template files it finds therein.

$ ttree -r

If a template has been processed previously, ttree will compare the modification times of the source and destination files. If the source template (or one it is dependant on) has not been modified more recently than the generated output file then ttree will not process it. The -a (all) option can be used to force ttree to process all files regardless of modification time.

$ tree -a

Any templates explicitly named as command line argument are always processed and the modification time checking is bypassed.

File Options

Top

The ignore, copy and accept options are used to specify Perl regexen to filter file names. Files that match any of the ignore options will not be processed. Remaining files that match any of the copy regexen will be copied to the destination directory. Remaining files that then match any of the accept criteria are then processed via the Template Toolkit. If no accept parameter is specified then all files will be accepted for processing if not already copied or ignored.

# ignore these files
ignore = \b(CVS|RCS)\b
ignore = ^#
ignore = ~$
# copy these files
copy   = \.(gif|png|jpg|pdf)$ 
# accept only .tt2 templates
accept = \.tt2$

The suffix option is used to define mappings between the file extensions for source templates and the generated output files. The following example specifies that source templates with a .tt2 suffix should be output as .html files:

suffix tt2=html

Or on the command line,

--suffix tt2=html

You can provide any number of different suffix mappings by repeating this option.

Template Dependencies

Top

The depend and depend_file options allow you to specify how any given template file depends on another file or group of files. The depend option is used to express a single dependency.

$ ttree --depend foo=bar,baz

This command line example shows the --depend option being used to specify that the foo file is dependant on the bar and baz templates. This option can be used many time on the command line:

$ ttree --depend foo=bar,baz --depend crash=bang,wallop

or in a configuration file:

depend foo=bar,baz
depend crash=bang,wallop

The file appearing on the left of the = is specified relative to the src or lib directories. The file(s) appearing on the right can be specified relative to any of these directories or as absolute file paths.

For example:

$ ttree --depend foo=bar,/tmp/baz

To define a dependency that applies to all files, use * on the left of the =.

$ ttree --depend *=header,footer

or in a configuration file:

depend *=header,footer

Any templates that are defined in the pre_process, post_process, process or wrapper options will automatically be added to the list of global dependencies that apply to all templates.

The depend_file option can be used to specify a file that contains dependency information.

$ ttree --depend_file=/home/abw/web/example/etc/ttree.dep

Here is an example of a dependency file:

# This is a comment. It is ignored.

index.html: header footer menubar 

header: titlebar hotlinks

menubar: menuitem

# spanning multiple lines with the backslash
another.html: header footer menubar \
sidebar searchform

Lines beginning with the # character are comments and are ignored. Blank lines are also ignored. All other lines should provide a filename followed by a colon and then a list of dependant files separated by whitespace, commas or both. Whitespace around the colon is also optional. Lines ending in the \ character are continued onto the following line.

Files that contain spaces can be quoted. That is only necessary for files after the colon (':'). The file before the colon may be quoted if it contains a colon.

As with the command line options, the * character can be used as a wildcard to specify a dependency for all templates.

* : config,header

Template Toolkit Options

Top

ttree also provides access to the usual range of Template Toolkit options. For example, the --pre_chomp and --post_chomp ttree options correspond to the PRE_CHOMP and POST_CHOMP options.

Run ttree -h for a summary of the options available.

AUTHORS

Top

Andy Wardley <abw@wardley.org>

http://www.wardley.org

With contributions from Dylan William Hardison (support for dependencies), Bryce Harrington (absolute and relative options), Mark Anderson (suffix and debug options), Harald Joerg and Leon Brocard who gets everywhere, it seems.

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/tools/ttree.html last modified 10:55:13 31-May-2007
TT_v224_html_docs/old/modules/index.html000700 000765 000765 00000060230 10627516030 020031 0ustar00abwabw000000 000000 Template::Modules

Template Toolkit Modules

Top

This documentation provides an overview of the different modules that comprise the Template Toolkit.

Template

Top

The Template module is the front-end to the Template Toolkit for Perl programmers.

use Template;
my $tt = Template->new();
$tt->process('hello.html', message => 'Hello World');

Template::Base

Top

The Template::Base module implements a base class from which the other Template Toolkit modules are derived. It implements common functionality for creating objects, error reporting, debugging, and so on.

Template::Config

Top

The Template::Config module defines the configuration of the Template Toolkit for your system. It is an example of a factory module which is responsible for instantiating the various other modules used in the Template Toolkit.

For example, the Template::Config module defines the $STASH package variable which indicates which version of the Template::Stash you are using by default. If you elected to use the faster Template::Stash::XS stash when you installed the Template Toolkit, then this will be set as:

$STASH = 'Template::Stash::XS';

Otherwise you'll get the regular Template::Stash stash:

$STASH = 'Template::Stash';

This approach means that other parts of the Template Toolkit don't have to worry about which stash you're using. They just ask the Template::Config module to create a stash of the right kind.

Template::Constants

Top

The Template::Constants defines a number of constants that are used by the Template Toolkit.

For example, the :chomp tagset defines the CHOMP_??? constants that can be used with the PRE_CHOMP and POST_CHOMP configuration options.

use Template::Constants ':chomp';
my $tt = Template->new({
    PRE_CHOMP => CHOMP_COLLAPSE,
});

Template::Context

Top

The Template::Context module defines a runtime context in which templates are processed. A context keeps track of all the templates, variables, plugins, and other resources that are available (either directly or through delegate objects) and provides methods to fetch, store, and perform various operations on them.

Template::Document

Top

The Template::Document module implements a compiled template document object. This is generated by the Template::Parser.

Template::Exception

Top

The Template::Exception module implements an exception object which is used for runtime error reporting.

Template::Filters

Top

The Template::Filters module implements a filter provider. It includes the core collection of filters that can be used via the FILTER directive.

Template::Iterator

Top

The Template::Iterator module implements a data iterator which steps through each item in a list in turn. It is used by the FOREACH directive. Within a FOREACH block, the loop variable always references the current iterator object.

[%  FOREACH item IN list;
      IF loop.first;
         # first item in loop
      ELSIF loop.last;
         # last item in loop
      ELSE;
         # any other item in loop
      END;
    END
%]

Template::Namespace::Constants

Top

The Template::Namespace::Constants module is used internally to represent constants. These can be resolved immediately at the point that a template is compiled.

Template::Parser

Top

The Template::Parser module is used to parse a source template and turn it into Perl code which can be executed.

Template::Plugin

Top

The Template::Plugin module is a base class for Template Toolkit plugins that can be loaded on demand from within a template using the USE directive.

Template::Plugins

Top

The Template::Plugins module is the plugins provider. It loads and prepares plugins as and when they are requested from within a template.

Template::Provider

Top

The Template::Provider module is responsible for loading, compiling and caching templates.

Template::Service

Top

The Template::Service module implements a service layer that sits just behind the Template module, and just in front of a Template::Context. It handles each request to process a template (forwarded from the Template module). It adds any headers and/or footers (specified via the PRE_PROCESS and POST_PROCESS options), applies any wrapper (the WRAPPER option) and catches any errors returned (the ERRORS option).

Template::Stash

Top

The Template::Stash module is used to fetch and store template variables. It implements all of the magic associated with the dot operator.

Template::Stash::XS

Top

The Template::Stash::XS module is a high-speed implementation of Template::Stash written in C.

Template::Test

Top

The Template::Test module is used to automate the Template Toolkit test scripts.


/modules/index.html last modified 10:57:44 31-May-2007
TT_v224_html_docs/old/modules/Template/000700 000765 000765 00000000000 11756705152 017614 5ustar00abwabw000000 000000 TT_v224_html_docs/old/modules/Template.html000700 000765 000765 00000174312 10627515600 020506 0ustar00abwabw000000 000000 Template

SYNOPSIS

Top
use Template;

# some useful options (see below for full list)
my $config = {
    INCLUDE_PATH => '/search/path',  # or list ref
    INTERPOLATE  => 1,               # expand "$var" in plain text
    POST_CHOMP   => 1,               # cleanup whitespace 
    PRE_PROCESS  => 'header',        # prefix each template
    EVAL_PERL    => 1,               # evaluate Perl code blocks
};

# create Template object
my $template = Template->new($config);

# define template variables for replacement
my $vars = {
    var1  => $value,
    var2  => \%hash,
    var3  => \@list,
    var4  => \&code,
    var5  => $object,
};

# specify input filename, or file handle, text reference, etc.
my $input = 'myfile.html';

# process input template, substituting variables
$template->process($input, $vars)
    || die $template->error();

DESCRIPTION

Top

This documentation describes the Template module which is the direct Perl interface into the Template Toolkit. It covers the use of the module and gives a brief summary of configuration options and template directives. Please see Template::Manual for the complete reference manual which goes into much greater depth about the features and use of the Template Toolkit. The Template::Tutorial is also available as an introductory guide to using the Template Toolkit.

METHODS

Top

new(\%config)

Top

The new() constructor method (implemented by the Template::Base#new() base class) instantiates a new Template object. A reference to a hash array of configuration items may be passed as a parameter.

my $tt = Template->new({
    INCLUDE_PATH => '/usr/local/templates',
    EVAL_PERL    => 1,
}) || die $Template::ERROR, "\n";

A reference to a new Template object is returned, or undef on error. In the latter case, the error message can be retrieved by calling error() as a class method or by examining the $Template::ERROR package variable directly.

my $tt = Template->new(\%config)
    || die Template->error(), "\n";
my $tt = Template->new(\%config)
    || die $Template::ERROR, "\n";

For convenience, configuration items may also be specified as a list of items instead of a hash array reference. These are automatically folded into a hash array by the constructor.

my $tt = Template->new(INCLUDE_PATH => '/tmp', POST_CHOMP => 1)
    || die $Template::ERROR, "\n";

process($template, \%vars, $output, %options)

Top

The process() method is called to process a template. The first parameter indicates the input template as one of: a filename relative to INCLUDE_PATH, if defined; a reference to a text string containing the template text; or a file handle reference (e.g. IO::Handle or sub-class) or GLOB (e.g. \*STDIN), from which the template can be read. A reference to a hash array may be passed as the second parameter, containing definitions of template variables.

# filename
$tt->process('welcome.tt2')
    || die $tt->error(), "\n";
# text reference
$text = "[% INCLUDE header %]\nHello world!\n[% INCLUDE footer %]";
$tt->process(\$text)
    || die $tt->error(), "\n";
# file handle (GLOB)
$tt->process(\*DATA)
    || die $tt->error(), "\n";

__END__
[% INCLUDE header %]
This is a template defined in the __END__ section which is 
accessible via the DATA "file handle".
[% INCLUDE footer %]

By default, the processed template output is printed to STDOUT. The process() method then returns 1 to indicate success. A third parameter may be passed to the process() method to specify a different output location. This value may be one of: a plain string indicating a filename which will be opened (relative to OUTPUT_PATH, if defined) and the output written to; a file GLOB opened ready for output; a reference to a scalar (e.g. a text string) to which output/error is appended; a reference to a subroutine which is called, passing the output as a parameter; or any object reference which implements a print() method (e.g. IO::Handle, Apache::Request, etc.) which will be called, passing the generated output as a parameter.

Examples:

# output filename
$tt->process('welcome.tt2', $vars, 'welcome.html')
    || die $tt->error(), "\n";
# reference to output subroutine
sub myout {
    my $output = shift;
    ...
}
$tt->process('welcome.tt2', $vars, \&myout)
    || die $tt->error(), "\n";
# reference to output text string
my $output = '';
$tt->process('welcome.tt2', $vars, \$output)
    || die $tt->error(), "\n";

print "output: $output\n";

In an Apache/mod_perl handler:

sub handler {
    my $req = shift;

    # ...your code here...

    # direct output to Apache::Request via $req->print($output)
    $tt->process($file, $vars, $req) || do {
        $req->log_reason($tt->error());
        return SERVER_ERROR;
    };
    return OK;
}

After the optional third output argument can come an optional reference to a hash or a list of (name, value) pairs providing further options for the output. The only option currently supported is binmode which, when set to any true value will ensure that files created (but not any existing file handles passed) will be set to binary mode.

# either: hash reference of options
$tt->process($infile, $vars, $outfile, { binmode => 1 })
    || die $tt->error(), "\n";

# or: list of name, value pairs
$tt->process($infile, $vars, $outfile, binmode => 1)
    || die $tt->error(), "\n";

Alternately, the binmode argument can specify a particular IO layer such as :utf8.

$tt->process($infile, $vars, $outfile, binmode => ':utf8')
    || die $tt->error(), "\n";

The OUTPUT configuration item can be used to specify a default output location other than \*STDOUT. The OUTPUT_PATH specifies a directory which should be prefixed to all output locations specified as filenames.

my $tt = Template->new({
    OUTPUT      => sub { ... },       # default
    OUTPUT_PATH => '/tmp',
...
}) || die Template->error(), "\n";

# use default OUTPUT (sub is called)
$tt->process('welcome.tt2', $vars)
    || die $tt->error(), "\n";

# write file to '/tmp/welcome.html'
$tt->process('welcome.tt2', $vars, 'welcome.html')
    || die $tt->error(), "\n";

The process() method returns 1 on success or undef on error. The error message generated in the latter case can be retrieved by calling the error() method. See also CONFIGURATION SUMMARY which describes how error handling may be further customised.

error()

Top

When called as a class method, it returns the value of the $ERROR package variable. Thus, the following are equivalent.

my $tt = Template->new()
    || die Template->error(), "\n";
my $tt = Template->new()
    || die $Template::ERROR, "\n";

When called as an object method, it returns the value of the internal _ERROR variable, as set by an error condition in a previous call to process().

$tt->process('welcome.tt2')
    || die $tt->error(), "\n";

Errors are represented in the Template Toolkit by objects of the Template::Exception class. If the process() method returns a false value then the error() method can be called to return an object of this class. The Template::Exception#type() and Template::Exception#info() methods can called on the object to retrieve the error type and information string, respectively. The Template::Exception#as_string() method can be called to return a string of the form $type - $info. This method is also overloaded onto the stringification operator allowing the object reference itself to be printed to return the formatted error string.

$tt->process('somefile') || do {
    my $error = $tt->error();
    print "error type: ", $error->type(), "\n";
    print "error info: ", $error->info(), "\n";
    print $error, "\n";
};

service()

Top

The Template module delegates most of the effort of processing templates to an underlying Template::Service object. This method returns a reference to that object.

context()

Top

The Template::Service module uses a core Template::Context object for runtime processing of templates. This method returns a reference to that object and is equivalent to $template->service->context().

CONFIGURATION SUMMARY

Top

The following list gives a short summary of each Template Toolkit configuration option. See Template::Manual::Config for full details.

Template Style and Parsing Options

Top

START_TAG, END_TAG

Define tokens that indicate start and end of directives (default: '[%' and '%]').

TAG_STYLE

Set START_TAG and END_TAG according to a pre-defined style (default: 'template', as above).

PRE_CHOMP, POST_CHOMP

Removes whitespace before/after directives (default: 0/0).

TRIM

Remove leading and trailing whitespace from template output (default: 0).

INTERPOLATE

Interpolate variables embedded like $this or ${this} (default: 0).

ANYCASE

Allow directive keywords in lower case (default: 0 - UPPER only).

Template Files and Blocks

Top

INCLUDE_PATH

One or more directories to search for templates.

DELIMITER

Delimiter for separating paths in INCLUDE_PATH (default: ':').

ABSOLUTE

Allow absolute file names, e.g. /foo/bar.html (default: 0).

RELATIVE

Allow relative filenames, e.g. ../foo/bar.html (default: 0).

DEFAULT

Default template to use when another not found.

BLOCKS

Hash array pre-defining template blocks.

AUTO_RESET

Enabled by default causing BLOCK definitions to be reset each time a template is processed. Disable to allow BLOCK definitions to persist.

RECURSION

Flag to permit recursion into templates (default: 0).

Template Variables

Top

VARIABLES

Hash array of variables and values to pre-define in the stash.

Runtime Processing Options

Top

EVAL_PERL

Flag to indicate if PERL/RAWPERL blocks should be processed (default: 0).

PRE_PROCESS, POST_PROCESS

Name of template(s) to process before/after main template.

PROCESS

Name of template(s) to process instead of main template.

ERROR

Name of error template or reference to hash array mapping error types to templates.

OUTPUT

Default output location or handler.

OUTPUT_PATH

Directory into which output files can be written.

DEBUG

Enable debugging messages.

Caching and Compiling Options

Top

CACHE_SIZE

Maximum number of compiled templates to cache in memory (default: undef - cache all)

COMPILE_EXT

Filename extension for compiled template files (default: undef - don't compile).

COMPILE_DIR

Root of directory in which compiled template files should be written (default: undef - don't compile).

Plugins and Filters

Top

PLUGINS

Reference to a hash array mapping plugin names to Perl packages.

PLUGIN_BASE

One or more base classes under which plugins may be found.

LOAD_PERL

Flag to indicate regular Perl modules should be loaded if a named plugin can't be found (default: 0).

FILTERS

Hash array mapping filter names to filter subroutines or factories.

Customisation and Extension

Top

LOAD_TEMPLATES

List of template providers.

LOAD_PLUGINS

List of plugin providers.

LOAD_FILTERS

List of filter providers.

TOLERANT

Set providers to tolerate errors as declinations (default: 0).

SERVICE

Reference to a custom service object (default: Template::Service).

CONTEXT

Reference to a custom context object (default: Template::Context).

STASH

Reference to a custom stash object (default: Template::Stash).

PARSER

Reference to a custom parser object (default: Template::Parser).

GRAMMAR

Reference to a custom grammar object (default: Template::Grammar).

DIRECTIVE SUMMARY

Top

The following list gives a short summary of each Template Toolkit directive. See Template::Manual::Directives for full details.

GET

Top

Evaluate and print a variable or value.

[%   GET variable %]    # 'GET' keyword is optional
[%       variable %]
[%       hash.key %]
[%         list.n %]
[%     code(args) %]
[% obj.meth(args) %]
[%  "value: $var" %]

CALL

Top

As per GET but without printing result (e.g. call code)

[%  CALL variable %]

SET

Top

Assign a values to variables.

[% SET variable = value %]    # 'SET' also optional
[%     variable = other_variable
       variable = 'literal text @ $100'
       variable = "interpolated text: $var"
       list     = [ val, val, val, val, ... ]
       list     = [ val..val ]
       hash     = { var => val, var => val, ... }
%]

DEFAULT

Top

Like SET, but variables are only set if currently unset (i.e. have no true value).

[% DEFAULT variable = value %]

INSERT

Top

Insert a file without any processing performed on the contents.

[% INSERT legalese.txt %]

PROCESS

Top

Process another template file or block and insert the generated output. Any template BLOCKs or variables defined or updated in the PROCESSed template will thereafter be defined in the calling template.

[% PROCESS template %]
[% PROCESS template  var = val, ... %]

INCLUDE

Top

Similar to PROCESS, but using a local copy of the current variables. Any template BLOCKs or variables defined in the INCLUDEd template remain local to it.

[% INCLUDE template %]
[% INCLUDE template  var = val, ... %]

WRAPPER

Top

The content between the WRAPPER and correspondng END directives is first evaluated, with the output generated being stored in the content variable. The named template is then process as per INCLUDE.

[% WRAPPER layout %]
   Some template markup [% blah %]...
[% END %]

A simple layout template might look something like this:

Your header here...
[% content %]
Your footer here...

BLOCK

Top

Define a named template block for INCLUDE, PROCESS and WRAPPER to use.

[% BLOCK hello %]
   Hello World
[% END %]

[% INCLUDE hello %]

FOREACH

Top

Repeat the enclosed FOREACH ... END block for each value in the list.

[% FOREACH variable IN [ val, val, val ] %]    # either
[% FOREACH variable IN list %]                 # or
   The variable is set to [% variable %]
[% END %]

WHILE

Top

The block enclosed between WHILE and END block is processed while the specified condition is true.

[% WHILE condition %]
   content
[% END %]

IF / UNLESS / ELSIF / ELSE

Top

The enclosed block is processed if the condition is true / false.

[% IF condition %]
   content
[% ELSIF condition %]
 content
[% ELSE %]
 content
[% END %]
[% UNLESS condition %]
   content
[% # ELSIF/ELSE as per IF, above %]
   content
[% END %]

SWITCH / CASE

Top

Multi-way switch/case statement.

[% SWITCH variable %]
[%   CASE val1 %]
       content
[%   CASE [ val2, val3 ] %]
       content
[%   CASE %]         # or [% CASE DEFAULT %]
       content
[% END %]

MACRO

Top

Define a named macro.

[% MACRO name <directive> %]
[% MACRO name(arg1, arg2) <directive> %]
...
[% name %]
[% name(val1, val2) %]

FILTER

Top

Process enclosed FILTER ... END block then pipe through a filter.

[% FILTER name %]                       # either
[% FILTER name( params ) %]             # or
[% FILTER alias = name( params ) %]     # or
   content
[% END %]

USE

Top

Load a plugin module (see Template::<Manual::Plugins), or any regular Perl module when the LOAD_PERL option is set.

[% USE name %]                      # either
[% USE name( params ) %]            # or
[% USE var = name( params ) %]      # or
...
[% name.method %]
[% var.method %]

PERL / RAWPERL

Top

Evaluate enclosed blocks as Perl code (requires the EVAL_PERL option to be set).

[% PERL %]
 # perl code goes here
 $stash->set('foo', 10);
 print "set 'foo' to ", $stash->get('foo'), "\n";
 print $context->include('footer', { var => $val });
[% END %]
[% RAWPERL %]
   # raw perl code goes here, no magic but fast.
   $output .= 'some output';
[% END %]

TRY / THROW / CATCH / FINAL

Top

Exception handling.

[% TRY %]
 content
   [% THROW type info %]
[% CATCH type %]
 catch content
   [% error.type %] [% error.info %]
[% CATCH %] # or [% CATCH DEFAULT %]
 content
[% FINAL %]
   this block is always processed
[% END %]

NEXT

Top

Jump straight to the next item in a FOREACH or WHILE loop.

[% NEXT %]

LAST

Top

Break out of FOREACH or WHILE loop.

[% LAST %]

RETURN

Top

Stop processing current template and return to including templates.

[% RETURN %]

STOP

Top

Stop processing all templates and return to caller.

[% STOP %]

TAGS

Top

Define new tag style or characters (default: [% %]).

[% TAGS html %]
[% TAGS <!-- --> %]

COMMENTS

Top

Ignored and deleted.

[% # this is a comment to the end of line
   foo = 'bar'
%]
[%# placing the '#' immediately inside the directive
    tag comments out the entire directive
%]

AUTHOR

Top

Andy Wardley <abw@wardley.org>

http://wardley.org/

VERSION

Top

Template Toolkit version 2.20, released May 2007.

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template.html last modified 10:55:12 31-May-2007
TT_v224_html_docs/old/modules/Template/Base.html000700 000765 000765 00000041605 10627516030 021354 0ustar00abwabw000000 000000 Template::Base

SYNOPSIS

Top
package My::Module;
use base qw( Template::Base );

sub _init {
    my ($self, $config) = @_;
    $self->{ doodah } = $config->{ doodah }
        || return $self->error("No 'doodah' specified");
    return $self;
}

package main;

my $object = My::Module->new({ doodah => 'foobar' })
    || die My::Module->error();

DESCRIPTION

Top

Base class module which implements a constructor and error reporting functionality for various Template Toolkit modules.

PUBLIC METHODS

Top

new(\%config)

Top

Constructor method which accepts a reference to a hash array or a list of name => value parameters which are folded into a hash. The _init() method is then called, passing the configuration hash and should return true/false to indicate success or failure. A new object reference is returned, or undef on error. Any error message raised can be examined via the error() class method or directly via the $ERROR package variable in the derived class.

my $module = My::Module->new({ ... })
    || die My::Module->error(), "\n";
my $module = My::Module->new({ ... })
    || die "constructor error: $My::Module::ERROR\n";

error($msg, ...)

Top

May be called as an object method to get/set the internal _ERROR member or as a class method to get/set the $ERROR variable in the derived class's package.

my $module = My::Module->new({ ... })
    || die My::Module->error(), "\n";
$module->do_something() 
    || die $module->error(), "\n";

When called with parameters (multiple params are concatenated), this method will set the relevant variable and return undef. This is most often used within object methods to report errors to the caller.

package My::Module;

sub foobar {
    my $self = shift;

    # some other code...

    return $self->error('some kind of error...')
        if $some_condition;
}

debug($msg, ...)

Top

Generates a debugging message by concatenating all arguments passed into a string and printing it to STDERR. A prefix is added to indicate the module of the caller.

package My::Module;

sub foobar {
    my $self = shift;

    $self->debug('called foobar()');

    # some other code...
}

When the foobar() method is called, the following message is sent to STDERR:

[My::Module] called foobar()

Objects can set an internal DEBUG value which the debug() method will examine. If this value sets the relevant bits to indicate DEBUG_CALLER then the file and line number of the caller will be appened to the message.

use Template::Constants qw( :debug );

my $module = My::Module->new({
    DEBUG => DEBUG_SERVICE | DEBUG_CONTEXT | DEBUG_CALLER,
});

$module->foobar();

This generates an error message such as:

[My::Module] called foobar() at My/Module.pm line 6

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

/modules/Template/Base.html last modified 10:57:44 31-May-2007
TT_v224_html_docs/old/modules/Template/Config.html000700 000765 000765 00000053661 10627516031 021715 0ustar00abwabw000000 000000 Template::Config

SYNOPSIS

Top
use Template::Config;

DESCRIPTION

Top

This module implements various methods for loading and instantiating other modules that comprise the Template Toolkit. It provides a consistent way to create toolkit components and allows custom modules to be used in place of the regular ones.

Package variables such as $STASH, $SERVICE, $CONTEXT, etc., contain the default module/package name for each component (Template::Stash, Template::Service and Template::Context, respectively) and are used by the various factory methods (stash(), service() and context()) to load the appropriate module. Changing these package variables will cause subsequent calls to the relevant factory method to load and instantiate an object from the new class.

PUBLIC METHODS

Top

load($module)

Top

Load a module using Perl's require(). Any occurences of '::' in the module name are be converted to '/', and '.pm' is appended. Returns 1 on success or undef on error. Use $class->error() to examine the error string.

preload()

Top

This method preloads all the other Template::* modules that are likely to be used. It is called automatically by the Template module when running under mod_perl ($ENV{MOD_PERL} is set).

parser(\%config)

Top

Instantiate a new parser object of the class whose name is denoted by the package variable $PARSER (default: Template::Parser). Returns a reference to a newly instantiated parser object or undef on error.

provider(\%config)

Top

Instantiate a new template provider object (default: Template::Provider). Returns an object reference or undef on error, as above.

plugins(\%config)

Top

Instantiate a new plugins provider object (default: Template::Plugins). Returns an object reference or undef on error, as above.

filters(\%config)

Top

Instantiate a new filter provider object (default: Template::Filters). Returns an object reference or undef on error, as above.

stash(\%vars)

Top

Instantiate a new stash object (Template::Stash or Template::Stash::XS depending on the default set at installation time) using the contents of the optional hash array passed by parameter as initial variable definitions. Returns an object reference or undef on error, as above.

context(\%config)

Top

Instantiate a new template context object (default: Template::Context). Returns an object reference or undef on error, as above.

service(\%config)

Top

Instantiate a new template service object (default: Template::Service). Returns an object reference or undef on error, as above.

instdir($dir)

Top

Returns the root directory of the Template Toolkit installation under which optional components are installed. Any relative directory specified as an argument will be appended to the returned directory.

# e.g. returns '/usr/local/tt2'
my $ttroot = Template::Config->instdir()
    || die "$Template::Config::ERROR\n";
# e.g. returns '/usr/local/tt2/templates'
my $template = Template::Config->instdir('templates')
    || die "$Template::Config::ERROR\n";

Returns undef and sets $Template::Config::ERROR appropriately if the optional components of the Template Toolkit have not been installed.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

/modules/Template/Config.html last modified 10:57:45 31-May-2007
TT_v224_html_docs/old/modules/Template/Constants.html000700 000765 000765 00000036027 10627516031 022461 0ustar00abwabw000000 000000 Template::Constants

SYNOPSIS

Top
use Template::Constants qw( :status :error :all );

DESCRIPTION

Top

The Template::Constants modules defines, and optionally exports into the caller's namespace, a number of constants used by the Template package.

Constants may be used by specifying the Template::Constants package explicitly:

use Template::Constants;
print Template::Constants::STATUS_DECLINED;

Constants may be imported into the caller's namespace by naming them as options to the use Template::Constants statement:

use Template::Constants qw( STATUS_DECLINED );
print STATUS_DECLINED;

Alternatively, one of the following tagset identifiers may be specified to import sets of constants: ':status', ':error', ':all'.

use Template::Constants qw( :status );
print STATUS_DECLINED;

Consult the documentation for the Exporter module for more information on exporting variables.

EXPORTABLE TAG SETS

Top

The following tag sets and associated constants are defined:

:status
    STATUS_OK             # no problem, continue
    STATUS_RETURN         # ended current block then continue (ok)
    STATUS_STOP           # controlled stop (ok) 
    STATUS_DONE           # iterator is all done (ok)
    STATUS_DECLINED       # provider declined to service request (ok)
    STATUS_ERROR          # general error condition (not ok)
:error
    ERROR_RETURN          # return a status code (e.g. 'stop')
    ERROR_FILE            # file error: I/O, parse, recursion
    ERROR_UNDEF           # undefined variable value used
    ERROR_PERL            # error in [% PERL %] block
    ERROR_FILTER          # filter error
    ERROR_PLUGIN          # plugin error
:chomp                  # for PRE_CHOMP and POST_CHOMP
    CHOMP_NONE            # do not remove whitespace
    CHOMP_ONE             # remove whitespace to newline
    CHOMP_ALL             # old name for CHOMP_ONE (deprecated)
    CHOMP_COLLAPSE        # collapse whitespace to a single space
    CHOMP_GREEDY          # remove all whitespace including newlines
:debug
    DEBUG_OFF             # do nothing
    DEBUG_ON              # basic debugging flag
    DEBUG_UNDEF           # throw undef on undefined variables
    DEBUG_VARS            # general variable debugging
    DEBUG_DIRS            # directive debugging
    DEBUG_STASH           # general stash debugging
    DEBUG_CONTEXT         # context debugging
    DEBUG_PARSER          # parser debugging
    DEBUG_PROVIDER        # provider debugging
    DEBUG_PLUGINS         # plugins debugging
    DEBUG_FILTERS         # filters debugging
    DEBUG_SERVICE         # context debugging
    DEBUG_ALL             # everything
    DEBUG_CALLER          # add caller file/line info
    DEBUG_FLAGS           # bitmap used internally
:all
    All the above constants.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

Template, Exporter


/modules/Template/Constants.html last modified 10:57:45 31-May-2007
TT_v224_html_docs/old/modules/Template/Context.html000700 000765 000765 00000133145 10627516032 022131 0ustar00abwabw000000 000000 Template::Context

SYNOPSIS

Top
use Template::Context;

# constructor
$context = Template::Context->new(\%config)
    || die $Template::Context::ERROR;

# fetch (load and compile) a template
$template = $context->template($template_name);

# fetch (load and instantiate) a plugin object
$plugin = $context->plugin($name, \@args);

# fetch (return or create) a filter subroutine
$filter = $context->filter($name, \@args, $alias);

# process/include a template, errors are thrown via die()
$output = $context->process($template, \%vars);
$output = $context->include($template, \%vars);

# raise an exception via die()
$context->throw($error_type, $error_message, \$output_buffer);

# catch an exception, clean it up and fix output buffer
$exception = $context->catch($exception, \$output_buffer);

# save/restore the stash to effect variable localisation
$new_stash = $context->localise(\%vars);
$old_stash = $context->delocalise();

# add new BLOCK or FILTER definitions
$context->define_block($name, $block);
$context->define_filter($name, \&filtersub, $is_dynamic);

# reset context, clearing any imported BLOCK definitions
$context->reset();

# methods for accessing internal items
$stash     = $context->stash();
$tflag     = $context->trim();
$epflag    = $context->eval_perl();
$providers = $context->templates();
$providers = $context->plugins();
$providers = $context->filters();
...

DESCRIPTION

Top

The Template::Context module defines an object class for representing a runtime context in which templates are processed. It provides an interface to the fundamental operations of the Template Toolkit processing engine through which compiled templates (i.e. Perl code constructed from the template source) can process templates, load plugins and filters, raise exceptions and so on.

A default Template::Context object is created by the Template module. Any Template::Context options may be passed to the Template new() constructor method and will be forwarded to the Template::Context constructor.

use Template;

my $template = Template->new({
    TRIM      => 1,
    EVAL_PERL => 1,
    BLOCKS    => {
        header => 'This is the header',
        footer => 'This is the footer',
    },
});

Similarly, the Template::Context constructor will forward all configuration parameters onto other default objects (e.g. Template::Provider, Template::Plugins, Template::Filters, etc.) that it may need to instantiate.

$context = Template::Context->new({
    INCLUDE_PATH => '/home/abw/templates', # provider option
    TAG_STYLE    => 'html',                # parser option
});

A Template::Context object (or subclass) can be explicitly instantiated and passed to the Template new() constructor method as the CONTEXT configuration item.

use Template;
use Template::Context;

my $context  = Template::Context->new({ TRIM => 1 });
my $template = Template->new({ CONTEXT => $context });

The Template module uses the Template::Config context() factory method to create a default context object when required. The $Template::Config::CONTEXT package variable may be set to specify an alternate context module. This will be loaded automatically and its new() constructor method called by the context() factory method when a default context object is required.

use Template;

$Template::Config::CONTEXT = 'MyOrg::Template::Context';

my $template = Template->new({
    EVAL_PERL   => 1,
    EXTRA_MAGIC => 'red hot',  # your extra config items
    ...
});

METHODS

Top

new(\%params)

Top

The new() constructor method is called to instantiate a Template::Context object. Configuration parameters may be specified as a HASH reference or as a list of name => value pairs.

my $context = Template::Context->new({
    INCLUDE_PATH => 'header',
    POST_PROCESS => 'footer',
});

my $context = Template::Context->new( EVAL_PERL => 1 );

The new() method returns a Template::Context object or undef on error. In the latter case, a relevant error message can be retrieved by the error() class method or directly from the $Template::Context::ERROR package variable.

my $context = Template::Context->new(\%config)
    || die Template::Context->error();

my $context = Template::Context->new(\%config)
    || die $Template::Context::ERROR;

The following configuration items may be specified. Please see Template::Manual::Config for further details.

VARIABLES

The VARIABLES option can be used to specify a hash array of template variables.

my $context = Template::Context->new({
    VARIABLES => {
        title   => 'A Demo Page',
        author  => 'Joe Random Hacker',
        version => 3.14,
    },
};

BLOCKS

The BLOCKS option can be used to pre-define a default set of template blocks.

my $context = Template::Context->new({
    BLOCKS => {
        header  => 'The Header.  [% title %]',
        footer  => sub { return $some_output_text },
        another => Template::Document->new({ ... }),
    },
}); 

TRIM

The TRIM option can be set to have any leading and trailing whitespace automatically removed from the output of all template files and BLOCKs.

example:

[% BLOCK foo %]

Line 1 of foo

[% END %]

before 
[% INCLUDE foo %]
after

output:

before
Line 1 of foo
after

EVAL_PERL

The EVAL_PERL is used to indicate if PERL and/or RAWPERL blocks should be evaluated. It is disabled by default.

RECURSION

The RECURSION can be set to allow templates to recursively process themselves, either directly (e.g. template foo calls INCLUDE foo) or indirectly (e.g. foo calls INCLUDE bar which calls INCLUDE foo).

LOAD_TEMPLATES

The LOAD_TEMPLATES option can be used to provide a reference to a list of Template::Provider objects or sub-classes thereof which will take responsibility for loading and compiling templates.

my $context = Template::Context->new({
    LOAD_TEMPLATES => [
        MyOrg::Template::Provider->new({ ... }),
        Template::Provider->new({ ... }),
    ],
});

LOAD_PLUGINS

The LOAD_PLUGINS options can be used to specify a list of provider objects responsible for loading and instantiating template plugin objects.

my $context = Template::Context->new({
    LOAD_PLUGINS => [
        MyOrg::Template::Plugins->new({ ... }),
        Template::Plugins->new({ ... }),
    ],
});

LOAD_FILTERS

The LOAD_FILTERS option can be used to specify a list of provider objects for returning and/or creating filter subroutines.

my $context = Template::Context->new({
    LOAD_FILTERS => [
        MyTemplate::Filters->new(),
        Template::Filters->new(),
    ],
});

STASH

The STASH option can be used to specify a Template::Stash object or sub-class which will take responsibility for managing template variables.

my $stash = MyOrg::Template::Stash->new({ ... });
my $context = Template::Context->new({
    STASH => $stash,
});

DEBUG

The DEBUG option can be used to enable various debugging features of the Template::Context module.

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_CONTEXT | DEBUG_DIRS,
});

template($name)

Top

Returns a compiled template by querying each of the LOAD_TEMPLATES providers (instances of Template::Provider, or sub-class) in turn.

$template = $context->template('header');

On error, a Template::Exception object of type 'file' is thrown via die(). This can be caught by enclosing the call to template() in an eval block and examining $@.

eval { $template = $context->template('header') };
if ($@) {
    print "failed to fetch template: $@\n";
}

plugin($name, \@args)

Top

Instantiates a plugin object by querying each of the LOAD_PLUGINS providers. The default LOAD_PLUGINS provider is a Template::Plugins object which attempts to load plugin modules, according the various configuration items such as PLUGIN_BASE, LOAD_PERL, etc., and then instantiate an object via new(). A reference to a list of constructor arguments may be passed as the second parameter. These are forwarded to the plugin constructor.

Returns a reference to a plugin (which is generally an object, but doesn't have to be). Errors are thrown as Template::Exception objects with the type set to 'plugin'.

$plugin = $context->plugin('DBI', 'dbi:msql:mydbname');

filter($name, \@args, $alias)

Top

Instantiates a filter subroutine by querying the LOAD_FILTERS providers. The default LOAD_FILTERS provider is a Template::Filters object.

Additional arguments may be passed by list reference along with an optional alias under which the filter will be cached for subsequent use. The filter is cached under its own $name if $alias is undefined. Subsequent calls to filter($name) will return the cached entry, if defined. Specifying arguments bypasses the caching mechanism and always creates a new filter. Errors are thrown as Template::Exception objects with the type set to 'filter'.

# static filter (no args)
$filter = $context->filter('html');

# dynamic filter (args) aliased to 'padright'
$filter = $context->filter('format', '%60s', 'padright');

# retrieve previous filter via 'padright' alias
$filter = $context->filter('padright');

process($template, \%vars)

Top

Processes a template named or referenced by the first parameter and returns the output generated. An optional reference to a hash array may be passed as the second parameter, containing variable definitions which will be set before the template is processed. The template is processed in the current context, with no localisation of variables performed. Errors are thrown as Template::Exception objects via die().

$output = $context->process('header', { title => 'Hello World' });

include($template, \%vars)

Top

Similar to process(), but using localised variables. Changes made to any variables will only persist until the include() method completes.

$output = $context->include('header', { title => 'Hello World' });

throw($error_type, $error_message, \$output)

Top

Raises an exception in the form of a Template::Exception object by calling die(). This method may be passed a reference to an existing Template::Exception object; a single value containing an error message which is used to instantiate a Template::Exception of type 'undef'; or a pair of values representing the exception type and info from which a Template::Exception object is instantiated. e.g.

$context->throw($exception);
$context->throw("I'm sorry Dave, I can't do that");
$context->throw('denied', "I'm sorry Dave, I can't do that");

The optional third parameter may be a reference to the current output buffer. This is then stored in the exception object when created, allowing the catcher to examine and use the output up to the point at which the exception was raised.

$output .= 'blah blah blah';
$output .= 'more rhubarb';
$context->throw('yack', 'Too much yacking', \$output);

catch($exception, \$output)

Top

Catches an exception thrown, either as a reference to a Template::Exception object or some other value. In the latter case, the error string is promoted to a Template::Exception object of 'undef' type. This method also accepts a reference to the current output buffer which is passed to the Template::Exception constructor, or is appended to the output buffer stored in an existing Template::Exception object, if unique (i.e. not the same reference). By this process, the correct state of the output buffer can be reconstructed for simple or nested throws.

define_block($name, $block)

Top

Adds a new block definition to the internal BLOCKS cache. The first argument should contain the name of the block and the second a reference to a Template::Document object or template sub-routine, or template text which is automatically compiled into a template sub-routine.

Returns a true value (the sub-routine or Template::Document reference) on success or undef on failure. The relevant error message can be retrieved by calling the error() method.

define_filter($name, \&filter, $is_dynamic)

Top

Adds a new filter definition by calling the store() method on each of the LOAD_FILTERS providers until accepted (in the usual case, this is accepted straight away by the one and only Template::Filters provider). The first argument should contain the name of the filter and the second a reference to a filter subroutine. The optional third argument can be set to any true value to indicate that the subroutine is a dynamic filter factory.

Returns a true value or throws a 'filter' exception on error.

localise(\%vars)

Top

Clones the stash to create a context with localised variables. Returns a reference to the newly cloned stash object which is also stored internally.

$stash = $context->localise();

delocalise()

Top

Restore the stash to its state prior to localisation.

$stash = $context->delocalise();

visit(\%blocks)

Top

This method is called by Template::Document objects immediately before they process their content. It is called to register any local BLOCK definitions with the context object so that they may be subsequently delivered on request.

leave()

Top

Compliment to the visit() method. Called by Template::Document objects immediately after they process their content.

reset()

Top

Clears the local BLOCKS cache of any BLOCK definitions. Any initial set of BLOCKS specified as a configuration item to the constructor will be reinstated.

AUTOLOAD

Top

An AUTOLOAD method provides access to context configuration items.

$stash     = $context->stash();
$tflag     = $context->trim();
$epflag    = $context->eval_perl();
...

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Context.html last modified 10:57:46 31-May-2007
TT_v224_html_docs/old/modules/Template/Directive.html000700 000765 000765 00000026653 10627516032 022430 0ustar00abwabw000000 000000 Template::Directive

SYNOPSIS

Top
# no user serviceable parts inside

DESCRIPTION

Top

The Template::Directive module defines a number of methods that generate Perl code for the runtime representation of the various Template Toolkit directives.

It is used internally by the Template::Parser module.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Directive.html last modified 10:57:46 31-May-2007
TT_v224_html_docs/old/modules/Template/Document.html000700 000765 000765 00000057176 10627516033 022275 0ustar00abwabw000000 000000 Template::Document

SYNOPSIS

Top
use Template::Document;

$doc = Template::Document->new({
    BLOCK => sub { # some perl code; return $some_text },
    DEFBLOCKS => {
        header => sub { # more perl code; return $some_text },
        footer => sub { # blah blah blah; return $some_text },
    },
    METADATA => {
        author  => 'Andy Wardley',
        version => 3.14,
    }
}) || die $Template::Document::ERROR;

print $doc->process($context);

DESCRIPTION

Top

This module defines an object class whose instances represent compiled template documents. The Template::Parser module creates a Template::Document instance to encapsulate a template as it is compiled into Perl code.

The constructor method, new(), expects a reference to a hash array containing the BLOCK, DEFBLOCKS and METADATA items.

The BLOCK item should contain a reference to a Perl subroutine or a textual representation of Perl code, as generated by the Template::Parser module. This is then evaluated into a subroutine reference using eval().

The DEFLOCKS item should reference a hash array containing further named BLOCKs which may be defined in the template. The keys represent BLOCK names and the values should be subroutine references or text strings of Perl code as per the main BLOCK item.

The METADATA item should reference a hash array of metadata items relevant to the document.

The process() method can then be called on the instantiated Template::Document object, passing a reference to a Template::Context object as the first parameter. This will install any locally defined blocks (DEFBLOCKS) in the BLOCKS cache in the context (via a call to visit()) so that they may be subsequently resolved by the context. The main BLOCK subroutine is then executed, passing the context reference on as a parameter. The text returned from the template subroutine is then returned by the process() method, after calling the context leave() method to permit cleanup and de-registration of named BLOCKS previously installed.

An AUTOLOAD method provides access to the METADATA items for the document. The Template::Service module installs a reference to the main Template::Document object in the stash as the template variable. This allows metadata items to be accessed from within templates, including PRE_PROCESS templates.

header:

<html>
<head>
<title>[% template.title %]
</head>
...

Template::Document objects are usually created by the Template::Parser but can be manually instantiated or sub-classed to provide custom template components.

METHODS

Top

new(\%config)

Top

Constructor method which accept a reference to a hash array containing the structure as shown in this example:

$doc = Template::Document->new({
    BLOCK => sub { # some perl code; return $some_text },
    DEFBLOCKS => {
        header => sub { # more perl code; return $some_text },
        footer => sub { # blah blah blah; return $some_text },
    },
    METADATA => {
        author  => 'Andy Wardley',
        version => 3.14,
    }
}) || die $Template::Document::ERROR;

BLOCK and DEFBLOCKS items may be expressed as references to Perl subroutines or as text strings containing Perl subroutine definitions, as is generated by the Template::Parser module. These are evaluated into subroutine references using eval().

Returns a new Template::Document object or undef on error. The error() class method can be called, or the $ERROR package variable inspected to retrieve the relevant error message.

process($context)

Top

Main processing routine for the compiled template document. A reference to a Template::Context object should be passed as the first parameter. The method installs any locally defined blocks via a call to the context visit() method, processes its own template, (passing the context reference as a parameter) and then calls leave() in the context to allow cleanup.

print $doc->process($context);

Returns a text string representing the generated output for the template. Errors are thrown via die().

block()

Top

Returns a reference to the main BLOCK subroutine.

blocks()

Top

Returns a reference to the hash array of named DEFBLOCKS subroutines.

AUTOLOAD

Top

An autoload method returns METADATA items.

print $doc->author();

PACKAGE SUB-ROUTINES

Top

write_perl_file(\%config)

Top

This package subroutine is provided to effect persistence of compiled templates. If the COMPILE_EXT option (to indicate a file extension for saving compiled templates) then the Template::Parser module calls this subroutine before calling the new() constructor. At this stage, the parser has a representation of the template as text strings containing Perl code. We can write that to a file, enclosed in a small wrapper which will allow us to susequently require() the file and have Perl parse and compile it into a Template::Document. Thus we have persistence of compiled templates.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Document.html last modified 10:57:47 31-May-2007
TT_v224_html_docs/old/modules/Template/Exception.html000700 000765 000765 00000036425 10627516033 022447 0ustar00abwabw000000 000000 Template::Exception

SYNOPSIS

Top
use Template::Exception;

my $exception = Template::Exception->new($type, $info);
$type = $exception->type;
$info = $exception->info;
($type, $info) = $exception->type_info;

print $exception->as_string();

$handler = $exception->select_handler(\@candidates);

DESCRIPTION

Top

The Template::Exception module defines an object class for representing exceptions within the template processing life cycle. Exceptions can be raised by modules within the Template Toolkit, or can be generated and returned by user code bound to template variables.

Exceptions can be raised in a template using the THROW directive,

[% THROW user.login 'no user id: please login' %]

or by calling the throw() method on the current Template::Context object,

$context->throw('user.passwd', 'Incorrect Password');
$context->throw('Incorrect Password');    # type 'undef'

or from Perl code by calling die() with a Template::Exception object,

die (Template::Exception->new('user.denied', 'Invalid User ID'));

or by simply calling die() with an error string. This is automagically caught and converted to an exception of 'undef' type (that's the literal string 'undef' rather than Perl's undefined value) which can then be handled in the usual way.

die "I'm sorry Dave, I can't do that";

Each exception is defined by its type and a information component (e.g. error message). The type can be any identifying string and may contain dotted components (e.g. 'foo', 'foo.bar', 'foo.bar.baz'). Exception types are considered to be hierarchical such that 'foo.bar' would be a specific type of the more general 'foo' type.

METHODS

Top

type()

Top

Returns the exception type.

info()

Top

Returns the exception information.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Exception.html last modified 10:57:47 31-May-2007
TT_v224_html_docs/old/modules/Template/Filters.html000700 000765 000765 00000050752 10627516013 022116 0ustar00abwabw000000 000000 Template::Filters

SYNOPSIS

Top
use Template::Filters;

$filters = Template::Filters->new(\%config);

($filter, $error) = $filters->fetch($name, \@args, $context);

if ($filter) {
    print &$filter("some text");
}
else {
    print "Could not fetch $name filter: $error\n";
}

DESCRIPTION

Top

The Template::Filters module implements a provider for creating subroutines that implement the standard filters. Additional custom filters may be provided via the FILTERS configuration option.

METHODS

Top

new(\%params)

Top

Constructor method which instantiates and returns a reference to a Template::Filters object. A reference to a hash array of configuration items may be passed as a parameter. These are described below.

my $filters = Template::Filters->new({
    FILTERS => { ... },
});

my $template = Template->new({
    LOAD_FILTERS => [ $filters ],
});

A default Template::Filters module is created by the Template module if the LOAD_FILTERS option isn't specified. All configuration parameters are forwarded to the constructor.

$template = Template->new({
    FILTERS => { ... },
});

fetch($name, \@args, $context)

Top

Called to request that a filter of a given name be provided. The name of the filter should be specified as the first parameter. This should be one of the standard filters or one specified in the FILTERS configuration hash. The second argument should be a reference to an array containing configuration parameters for the filter. This may be specified as 0, or undef where no parameters are provided. The third argument should be a reference to the current Template::Context object.

The method returns a reference to a filter sub-routine on success. It may also return (undef, STATUS_DECLINE) to decline the request, to allow delegation onto other filter providers in the LOAD_FILTERS chain of responsibility. On error, ($error, STATUS_ERROR) is returned where $error is an error message or Template::Exception object indicating the error that occurred.

When the TOLERANT option is set, errors are automatically downgraded to a STATUS_DECLINE response.

CONFIGURATION OPTIONS

Top

The following list summarises the configuration options that can be provided to the Template::Filters new() constructor. Please see Template::Manual::Config for further information about each option.

FILTERS

Top

The FILTERS option can be used to specify custom filters which can then be used with the FILTER directive like any other. These are added to the standard filters which are available by default.

$filters = Template::Filters->new({
    FILTERS => {
        'sfilt1' =>   \&static_filter,
        'dfilt1' => [ \&dyanamic_filter_factory, 1 ],
    },
});

TOLERANT

Top

The TOLERANT flag can be set to indicate that the Template::Filters module should ignore any errors and instead return STATUS_DECLINED.

DEBUG

Top

The DEBUG option can be used to enable debugging messages for the Template::Filters module by setting it to include the DEBUG_FILTERS value.

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_FILTERS | DEBUG_PLUGINS,
});

STANDARD FILTERS

Top

Please see Template::Manual::Filters for a list of the filters provided with the Template Toolkit, complete with examples of use.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Filters.html last modified 10:57:31 31-May-2007
TT_v224_html_docs/old/modules/Template/Grammar.html000700 000765 000765 00000027304 10627515556 022104 0ustar00abwabw000000 000000 Template::Grammar

SYNOPSIS

Top
# no user serviceable parts inside

DESCRIPTION

Top

This module defines the state and rule tables that the Template::Parser module uses to parse templates. It is generated from a YACC-like grammar using the Parse::Yapp module. The parser sub-directory of the Template Toolkit source distribution contains the grammar and other files required to generate this module.

But you don't need to worry about any of that unless you're planning to modify the Template Toolkit language.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Grammar.html last modified 10:54:54 31-May-2007
TT_v224_html_docs/old/modules/Template/index.html000700 000765 000765 00000025455 10627516140 021620 0ustar00abwabw000000 000000 Template::* Modules

Section Index

Top

This section contains the documentation for the Template::* modules.


/modules/Template/index.html last modified 10:58:56 31-May-2007
TT_v224_html_docs/old/modules/Template/Iterator.html000700 000765 000765 00000061344 10627515557 022312 0ustar00abwabw000000 000000 Template::Iterator

SYNOPSIS

Top
my $iter = Template::Iterator->new(\@data, \%options);

DESCRIPTION

Top

The Template::Iterator module defines a generic data iterator for use by the FOREACH directive.

It may be used as the base class for custom iterators.

PUBLIC METHODS

Top

new($data)

Top

Constructor method. A reference to a list of values is passed as the first parameter. Subsequent calls to get_first() and get_next() calls will return each element from the list.

my $iter = Template::Iterator->new([ 'foo', 'bar', 'baz' ]);

The constructor will also accept a reference to a hash array and will expand it into a list in which each entry is a hash array containing a 'key' and 'value' item, sorted according to the hash keys.

my $iter = Template::Iterator->new({ 
    foo => 'Foo Item',
    bar => 'Bar Item',
});

This is equivalent to:

my $iter = Template::Iterator->new([
    { key => 'bar', value => 'Bar Item' },
    { key => 'foo', value => 'Foo Item' },
]);

When passed a single item which is not an array reference, the constructor will automatically create a list containing that single item.

my $iter = Template::Iterator->new('foo');

This is equivalent to:

my $iter = Template::Iterator->new([ 'foo' ]);

Note that a single item which is an object based on a blessed ARRAY references will NOT be treated as an array and will be folded into a list containing that one object reference.

my $list = bless [ 'foo', 'bar' ], 'MyListClass';
my $iter = Template::Iterator->new($list);

equivalent to:

my $iter = Template::Iterator->new([ $list ]);

If the object provides an as_list() method then the Template::Iterator constructor will call that method to return the list of data. For example:

package MyListObject;

sub new {
    my $class = shift;
    bless [ @_ ], $class;
}
package main;

my $list = MyListObject->new('foo', 'bar');
my $iter = Template::Iterator->new($list);

This is then functionally equivalent to:

my $iter = Template::Iterator->new([ $list ]);

The iterator will return only one item, a reference to the MyListObject object, $list.

By adding an as_list() method to the MyListObject class, we can force the Template::Iterator constructor to treat the object as a list and use the data contained within.

package MyListObject;

...

sub as_list {
    my $self = shift;
    return $self;
}

package main;

my $list = MyListObject->new('foo', 'bar');
my $iter = Template::Iterator->new($list);

The iterator will now return the two items, 'foo' and 'bar', which the MyObjectList encapsulates.

get_first()

Top

Returns a ($value, $error) pair for the first item in the iterator set. The $error returned may be zero or undefined to indicate a valid datum was successfully returned. Returns an error of STATUS_DONE if the list is empty.

get_next()

Top

Returns a ($value, $error) pair for the next item in the iterator set. Returns an error of STATUS_DONE if all items in the list have been visited.

get_all()

Top

Returns a (\@values, $error) pair for all remaining items in the iterator set. Returns an error of STATUS_DONE if all items in the list have been visited.

size()

Top

Returns the size of the data set or undef if unknown.

max()

Top

Returns the maximum index number (i.e. the index of the last element) which is equivalent to size() - 1.

index()

Top

Returns the current index number which is in the range 0 to max().

count()

Top

Returns the current iteration count in the range 1 to size(). This is equivalent to index() + 1.

first()

Top

Returns a boolean value to indicate if the iterator is currently on the first iteration of the set.

last()

Top

Returns a boolean value to indicate if the iterator is currently on the last iteration of the set.

prev()

Top

Returns the previous item in the data set, or undef if the iterator is on the first item.

next()

Top

Returns the next item in the data set or undef if the iterator is on the last item.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

/modules/Template/Iterator.html last modified 10:54:55 31-May-2007
TT_v224_html_docs/old/modules/Template/Map.html000700 000765 000765 00000014742 10626336415 021227 0ustar00abwabw000000 000000 Template::Map

Contents

Top

TT_v224_html_docs/old/modules/Template/Namespace/000700 000765 000765 00000000000 11756705152 021510 5ustar00abwabw000000 000000 TT_v224_html_docs/old/modules/Template/Parser.html000700 000765 000765 00000057544 10627515560 021756 0ustar00abwabw000000 000000 Template::Parser

SYNOPSIS

Top
use Template::Parser;

$parser   = Template::Parser->new(\%config);
$template = $parser->parse($text)
    || die $parser->error(), "\n";

DESCRIPTION

Top

The Template::Parser module implements a LALR(1) parser and associated methods for parsing template documents into Perl code.

PUBLIC METHODS

Top

new(\%params)

Top

The new() constructor creates and returns a reference to a new Template::Parser object.

A reference to a hash may be supplied as a parameter to provide configuration values. See CONFIGURATION OPTIONS below for a summary of these options and Template::Manual::Config for full details.

my $parser = Template::Parser->new({
    START_TAG => quotemeta('<+'),
    END_TAG   => quotemeta('+>'),
});

parse($text)

Top

The parse() method parses the text passed in the first parameter and returns a reference to a hash array of data defining the compiled representation of the template text, suitable for passing to the Template::Document new() constructor method. On error, undef is returned.

$data = $parser->parse($text)
    || die $parser->error();

The $data hash reference returned contains a BLOCK item containing the compiled Perl code for the template, a DEFBLOCKS item containing a reference to a hash array of sub-template BLOCKs defined within in the template, and a METADATA item containing a reference to a hash array of metadata values defined in META tags.

CONFIGURATION OPTIONS

Top

The Template::Parser module accepts the following configuration options. Please see Template::Manual::Config for futher details on each option.

START_TAG, END_TAG

Top

The START_TAG and END_TAG options are used to specify character sequences or regular expressions that mark the start and end of a template directive.

my $parser = Template::Parser->new({ 
    START_TAG => quotemeta('<+'),
    END_TAG   => quotemeta('+>'),
});

TAG_STYLE

Top

The TAG_STYLE option can be used to set both START_TAG and END_TAG according to pre-defined tag styles.

my $parser = Template::Parser->new({ 
    TAG_STYLE => 'star',     # [* ... *]
});

PRE_CHOMP, POST_CHOMP

Top

The PRE_CHOMP and POST_CHOMP can be set to remove any whitespace before or after a directive tag, respectively.

my $parser = Template::Parser-E<gt>new({
    PRE_CHOMP  => 1,
    POST_CHOMP => 1,
});

INTERPOLATE

Top

The INTERPOLATE flag can be set to allow variables to be embedded in plain text blocks.

my $parser = Template::Parser->new({ 
    INTERPOLATE => 1,
});

Variables should be prefixed by a $ to identify them, using curly braces to explicitly scope the variable name where necessary.

Hello ${name},

The day today is ${day.today}.

ANYCASE

Top

The ANYCASE option can be set to allow directive keywords to be specified in any case.

# with ANYCASE set to 1
[% INCLUDE foobar %]    # OK
[% include foobar %]    # OK
[% include = 10   %]    # ERROR, 'include' is a reserved word

GRAMMAR

Top

The GRAMMAR configuration item can be used to specify an alternate grammar for the parser. This allows a modified or entirely new template language to be constructed and used by the Template Toolkit.

use MyOrg::Template::Grammar;

my $parser = Template::Parser->new({ 
    GRAMMAR = MyOrg::Template::Grammar->new();
});

By default, an instance of the default Template::Grammar will be created and used automatically if a GRAMMAR item isn't specified.

DEBUG

Top

The DEBUG option can be used to enable various debugging features of the Template::Parser module.

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_PARSER | DEBUG_DIRS,
});

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

The main parsing loop of the Template::Parser module was derived from a standalone parser generated by version 0.16 of the Parse::Yapp module. The following copyright notice appears in the Parse::Yapp documentation.

The Parse::Yapp module and its related modules and shell
scripts are copyright (c) 1998 Francois Desarmenien,
France. All rights reserved.

You may use and distribute them under the terms of either
the GNU General Public License or the Artistic License, as
specified in the Perl README file.

/modules/Template/Parser.html last modified 10:54:56 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/000700 000765 000765 00000000000 11756705152 021052 5ustar00abwabw000000 000000 TT_v224_html_docs/old/modules/Template/Plugin.html000700 000765 000765 00000052407 10627515572 021754 0ustar00abwabw000000 000000 Template::Plugin

SYNOPSIS

Top
package MyOrg::Template::Plugin::MyPlugin;
use base qw( Template::Plugin );
use Template::Plugin;
use MyModule;

sub new {
    my $class   = shift;
    my $context = shift;
    bless {
        ...
    }, $class;
}

DESCRIPTION

Top

A "plugin" for the Template Toolkit is simply a Perl module which exists in a known package location (e.g. Template::Plugin::*) and conforms to a regular standard, allowing it to be loaded and used automatically.

The Template::Plugin module defines a base class from which other plugin modules can be derived. A plugin does not have to be derived from Template::Plugin but should at least conform to its object-oriented interface.

It is recommended that you create plugins in your own package namespace to avoid conflict with toolkit plugins. e.g.

package MyOrg::Template::Plugin::FooBar;

Use the PLUGIN_BASE option to specify the namespace that you use. e.g.

use Template;
my $template = Template->new({ 
    PLUGIN_BASE => 'MyOrg::Template::Plugin',
});

METHODS

Top

The following methods form the basic interface between the Template Toolkit and plugin modules.

load($context)

Top

This method is called by the Template Toolkit when the plugin module is first loaded. It is called as a package method and thus implicitly receives the package name as the first parameter. A reference to the Template::Context object loading the plugin is also passed. The default behaviour for the load() method is to simply return the class name. The calling context then uses this class name to call the new() package method.

package MyPlugin;

sub load {               # called as MyPlugin->load($context)
    my ($class, $context) = @_;
    return $class;       # returns 'MyPlugin'
}

new($context, @params)

Top

This method is called to instantiate a new plugin object for the USE directive. It is called as a package method against the class name returned by load(). A reference to the Template::Context object creating the plugin is passed, along with any additional parameters specified in the USE directive.

sub new {                # called as MyPlugin->new($context)
    my ($class, $context, @params) = @_;
    bless {
        _CONTEXT => $context,
    }, $class;           # returns blessed MyPlugin object
}

error($error)

Top

This method, inherited from the Template::Base module, is used for reporting and returning errors. It can be called as a package method to set/return the $ERROR package variable, or as an object method to set/return the object _ERROR member. When called with an argument, it sets the relevant variable and returns undef. When called without an argument, it returns the value of the variable.

package MyPlugin;
use base 'Template::Plugin';

sub new {
    my ($class, $context, $dsn) = @_;

    return $class->error('No data source specified')
        unless $dsn;

    bless {
        _DSN => $dsn,
    }, $class;
}
package main;

my $something = MyPlugin->new()
    || die MyPlugin->error(), "\n";

$something->do_something()
    || die $something->error(), "\n";

DEEPER MAGIC

Top

The Template::Context object that handles the loading and use of plugins calls the new() and error() methods against the package name returned by the load() method. In pseudo-code terms looks something like this:

$class  = MyPlugin->load($context);       # returns 'MyPlugin'

$object = $class->new($context, @params)  # MyPlugin->new(...)
    || die $class->error();               # MyPlugin->error()

The load() method may alterately return a blessed reference to an object instance. In this case, new() and error() are then called as object methods against that prototype instance.

package YourPlugin;

sub load {
    my ($class, $context) = @_;
    bless {
        _CONTEXT => $context,
    }, $class;
}

sub new {
    my ($self, $context, @params) = @_;
    return $self;
}

In this example, we have implemented a 'Singleton' plugin. One object gets created when load() is called and this simply returns itself for each call to new().

Another implementation might require individual objects to be created for every call to new(), but with each object sharing a reference to some other object to maintain cached data, database handles, etc. This pseudo-code example demonstrates the principle.

package MyServer;

sub load {
    my ($class, $context) = @_;
    bless {
        _CONTEXT => $context,
        _CACHE   => { },
    }, $class;
}

sub new {
    my ($self, $context, @params) = @_;
    MyClient->new($self, @params);
}

sub add_to_cache   { ... }

sub get_from_cache { ... }
package MyClient;

sub new {
    my ($class, $server, $blah) = @_;
    bless {
        _SERVER => $server,
        _BLAH   => $blah,
    }, $class;
}

sub get {
    my $self = shift;
    $self->{ _SERVER }->get_from_cache(@_);
}

sub put {
    my $self = shift;
    $self->{ _SERVER }->add_to_cache(@_);
}

When the plugin is loaded, a MyServer instance is created. The new() method is called against this object which instantiates and returns a MyClient object, primed to communicate with the creating MyServer.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin.html last modified 10:55:06 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugins.html000700 000765 000765 00000055370 10627515572 022141 0ustar00abwabw000000 000000 Template::Plugins

SYNOPSIS

Top
use Template::Plugins;

$plugin_provider = Template::Plugins->new(\%options);

($plugin, $error) = $plugin_provider->fetch($name, @args);

DESCRIPTION

Top

The Template::Plugins module defines a provider class which can be used to load and instantiate Template Toolkit plugin modules.

METHODS

Top

new(\%params)

Top

Constructor method which instantiates and returns a reference to a Template::Plugins object. A reference to a hash array of configuration items may be passed as a parameter. These are described below.

Note that the Template front-end module creates a Template::Plugins provider, passing all configuration items. Thus, the examples shown below in the form:

$plugprov = Template::Plugins->new({
    PLUGIN_BASE => 'MyTemplate::Plugin',
    LOAD_PERL   => 1,
    ...
});

can also be used via the Template module as:

$ttengine = Template->new({
    PLUGIN_BASE => 'MyTemplate::Plugin',
    LOAD_PERL   => 1,
    ...
});

as well as the more explicit form of:

$plugprov = Template::Plugins->new({
    PLUGIN_BASE => 'MyTemplate::Plugin',
    LOAD_PERL   => 1,
    ...
});

$ttengine = Template->new({
    LOAD_PLUGINS => [ $plugprov ],
});

fetch($name, @args)

Top

Called to request that a plugin of a given name be provided. The relevant module is first loaded (if necessary) and the load() class method called to return the factory class name (usually the same package name) or a factory object (a prototype). The new() method is then called as a class or object method against the factory, passing all remaining parameters.

Returns a reference to a new plugin object or ($error, STATUS_ERROR) on error. May also return (undef, STATUS_DECLINED) to decline to serve the request. If TOLERANT is set then all errors will be returned as declines.

CONFIGURATION OPTIONS

Top

The following list summarises the configuration options that can be provided to the Template::Plugins new() constructor. Please consult Template::Manual::Config for further details and examples of each configuration option in use.

PLUGINS

Top

The PLUGINS option can be used to provide a reference to a hash array that maps plugin names to Perl module names.

my $plugins = Template::Plugins->new({
    PLUGINS => {
        cgi => 'MyOrg::Template::Plugin::CGI',
        foo => 'MyOrg::Template::Plugin::Foo',
        bar => 'MyOrg::Template::Plugin::Bar',
    },  
}); 

PLUGIN_BASE

Top

If a plugin is not defined in the PLUGINS hash then the PLUGIN_BASE is used to attempt to construct a correct Perl module name which can be successfully loaded.

# single value PLUGIN_BASE
my $plugins = Template::Plugins->new({
    PLUGIN_BASE => 'MyOrg::Template::Plugin',
});
# multiple value PLUGIN_BASE
my $plugins = Template::Plugins->new({
    PLUGIN_BASE => [   'MyOrg::Template::Plugin',
                       'YourOrg::Template::Plugin'  ],
});

=head2 LOAD_PERL

The LOAD_PERL option can be set to allow you to load regular Perl modules (i.e. those that don't reside in the Template::Plugin or another user-defined namespace) as plugins.

If a plugin cannot be loaded using the PLUGINS or PLUGIN_BASE approaches then, if the LOAD_PERL is set, the provider will make a final attempt to load the module without prepending any prefix to the module path.

Unlike regular plugins, modules loaded using LOAD_PERL do not receive a Template::Context reference as the first argument to the new() constructor method.

TOLERANT

Top

The TOLERANT flag can be set to indicate that the Template::Plugins module should ignore any errors encountered while loading a plugin and instead return STATUS_DECLINED.

DEBUG

Top

The DEBUG option can be used to enable debugging messages for the Template::Plugins module by setting it to include the DEBUG_PLUGINS value.

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_FILTERS | DEBUG_PLUGINS,
});

TEMPLATE TOOLKIT PLUGINS

Top

Please see Template::Manual::Plugins For a complete list of all the plugin modules distributed with the Template Toolkit.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugins.html last modified 10:55:06 31-May-2007
TT_v224_html_docs/old/modules/Template/Provider.html000700 000765 000765 00000106127 10627515573 022310 0ustar00abwabw000000 000000 Template::Provider

SYNOPSIS

Top
$provider = Template::Provider->new(\%options);

($template, $error) = $provider->fetch($name);

DESCRIPTION

Top

The Template::Provider is used to load, parse, compile and cache template documents. This object may be sub-classed to provide more specific facilities for loading, or otherwise providing access to templates.

The Template::Context objects maintain a list of Template::Provider objects which are polled in turn (via fetch()) to return a requested template. Each may return a compiled template, raise an error, or decline to serve the request, giving subsequent providers a chance to do so.

The Template::Provider can also be subclassed to provide templates from a different source, e.g. a database. See SUBCLASSING below.

This documentation needs work.

PUBLIC METHODS

Top

new(\%options)

Top

Constructor method which instantiates and returns a new Template::Provider object. A reference to a hash array of configuration options may be passed.

See CONFIGURATION OPTIONS below for a summary of configuration options and Template::Manual::Config for full details.

fetch($name)

Top

Returns a compiled template for the name specified. If the template cannot be found then (undef, STATUS_DECLINED) is returned. If an error occurs (e.g. read error, parse error) then ($error, STATUS_ERROR) is returned, where $error is the error message generated. If the TOLERANT option is set the the method returns (undef, STATUS_DECLINED) instead of returning an error.

store($name, $template)

Top

Stores the compiled template, $template, in the cache under the name, $name. Susbequent calls to fetch($name) will return this template in preference to any disk-based file.

include_path(\@newpath)

Top

Accessor method for the INCLUDE_PATH setting. If called with an argument, this method will replace the existing INCLUDE_PATH with the new value.

paths()

Top

This method generates a copy of the INCLUDE_PATH list. Any elements in the list which are dynamic generators (e.g. references to subroutines or objects implementing a paths() method) will be called and the list of directories returned merged into the output list.

It is possible to provide a generator which returns itself, thus sending this method into an infinite loop. To detect and prevent this from happening, the $MAX_DIRS package variable, set to 64 by default, limits the maximum number of paths that can be added to, or generated for the output list. If this number is exceeded then the method will immediately return an error reporting as much.

CONFIGURATION OPTIONS

Top

The following list summarises the configuration options that can be provided to the Template::Provider new() constructor. Please consult Template::Manual::Config for further details and examples of each configuration option in use.

INCLUDE_PATH

Top

The INCLUDE_PATH option is used to specify one or more directories in which template files are located.

# single path
my $provider = Template::Provider->new({
    INCLUDE_PATH => '/usr/local/templates',
});
# multiple paths
my $provider = Template::Provider->new({
    INCLUDE_PATH => [ '/usr/local/templates', 
                      '/tmp/my/templates' ],
});

ABSOLUTE

Top

The ABSOLUTE flag is used to indicate if templates specified with absolute filenames (e.g. '/foo/bar') should be processed. It is disabled by default and any attempt to load a template by such a name will cause a 'file' exception to be raised.

my $provider = Template::Provider->new({
    ABSOLUTE => 1,
});

RELATIVE

Top

The RELATIVE flag is used to indicate if templates specified with filenames relative to the current directory (e.g. ./foo/bar or ../../some/where/else) should be loaded. It is also disabled by default, and will raise a file error if such template names are encountered.

my $provider = Template::Provider->new({
    RELATIVE => 1,
});

DEFAULT

Top

The DEFAULT option can be used to specify a default template which should be used whenever a specified template can't be found in the INCLUDE_PATH.

my $provider = Template::Provider->new({
    DEFAULT => 'notfound.html',
});

If a non-existant template is requested through the Template process() method, or by an INCLUDE, PROCESS or WRAPPER directive, then the DEFAULT template will instead be processed, if defined. Note that the DEFAULT template is not used when templates are specified with absolute or relative filenames, or as a reference to a input file handle or text string.

CACHE_SIZE

Top

The CACHE_SIZE option can be used to limit the number of compiled templates that the module should cache. By default, the CACHE_SIZE is undefined and all compiled templates are cached.

my $provider = Template::Provider->new({
    CACHE_SIZE => 64,   # only cache 64 compiled templates
});

STAT_TTL

Top

The STAT_TTL value can be set to control how long the Template::Provider will keep a template cached in memory before checking to see if the source template has changed.

my $provider = Template::Provider->new({
    STAT_TTL => 60,  # one minute
});

COMPILE_EXT

Top

The COMPILE_EXT option can be provided to specify a filename extension for compiled template files. It is undefined by default and no attempt will be made to read or write any compiled template files.

my $provider = Template::Provider->new({
    COMPILE_EXT => '.ttc',
});

COMPILE_DIR

Top

The COMPILE_DIR option is used to specify an alternate directory root under which compiled template files should be saved.

my $provider = Template::Provider->new({
    COMPILE_DIR => '/tmp/ttc',
});

TOLERANT

Top

The TOLERANT flag can be set to indicate that the Template::Provider module should ignore any errors encountered while loading a template and instead return STATUS_DECLINED.

PARSER

Top

The PARSER option can be used to define a parser module other than the default of Template::Parser.

my $provider = Template::Provider->new({
    PARSER => MyOrg::Template::Parser->new({ ... }),
});

DEBUG

Top

The DEBUG option can be used to enable debugging messages from the Template::Provider module by setting it to include the DEBUG_PROVIDER value.

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_PROVIDER,
});

SUBCLASSING

Top

The Template::Provider module can be subclassed to provide templates from a different source (e.g. a database). In most cases you'll just need to provide custom implementations of the _template_modified() and _template_content() methods. If your provider requires and custom initialisation then you'll also need to implement a new _init() method.

Caching in memory and on disk will still be applied (if enabled) when overriding these methods.

_template_modified($path)

Top

Returns a timestamp of the $path passed in by calling stat(). This can be overridden, for example, to return a last modified value from a database. The value returned should be a timestamp value (as returned by time(), although a sequence number should work as well.

_template_content($path)

Top

This method returns the content of the template for all INCLUDE, PROCESS, and INSERT directives.

When called in scalar context, the method returns the content of the template located at $path, or undef if $path is not found.

When called in list context it returns ($content, $error, $mtime), where $content is the template content, $error is an error string (e.g. "$path: File not found"), and $mtime is the template modification time.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Provider.html last modified 10:55:07 31-May-2007
TT_v224_html_docs/old/modules/Template/Service.html000700 000765 000765 00000074155 10627515573 022123 0ustar00abwabw000000 000000 Template::Service

SYNOPSIS

Top
use Template::Service;

my $service = Template::Service->new({
    PRE_PROCESS  => [ 'config', 'header' ],
    POST_PROCESS => 'footer',
    ERROR        => {
        user     => 'user/index.html', 
        dbi      => 'error/database',
        default  => 'error/default',
    },
});

my $output = $service->process($template_name, \%replace)
    || die $service->error(), "\n";

DESCRIPTION

Top

The Template::Service module implements an object class for providing a consistent template processing service.

Standard header (PRE_PROCESS) and footer (POST_PROCESS) templates may be specified which are prepended and appended to all templates processed by the service (but not any other templates or blocks INCLUDEd or PROCESSed from within). An ERROR hash may be specified which redirects the service to an alternate template file in the case of uncaught exceptions being thrown. This allows errors to be automatically handled by the service and a guaranteed valid response to be generated regardless of any processing problems encountered.

A default Template::Service object is created by the Template module. Any Template::Service options may be passed to the Template new() constructor method and will be forwarded to the Template::Service constructor.

use Template;

my $template = Template->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
});

Similarly, the Template::Service constructor will forward all configuration parameters onto other default objects (e.g. Template::Context) that it may need to instantiate.

A Template::Service object (or subclass) can be explicitly instantiated and passed to the Template new() constructor method as the SERVICE item.

use Template;
use Template::Service;

my $service = Template::Service->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
});

my $template = Template->new({
    SERVICE => $service,
});

The Template::Service module can be sub-classed to create custom service handlers.

use Template;
use MyOrg::Template::Service;

my $service = MyOrg::Template::Service->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
    COOL_OPTION  => 'enabled in spades',
});

my $template = Template->new({
    SERVICE => $service,
});

The Template module uses the Template::Config service() factory method to create a default service object when required. The $Template::Config::SERVICE package variable may be set to specify an alternate service module. This will be loaded automatically and its new() constructor method called by the service() factory method when a default service object is required. Thus the previous example could be written as:

use Template;

$Template::Config::SERVICE = 'MyOrg::Template::Service';

my $template = Template->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
    COOL_OPTION  => 'enabled in spades',
});

METHODS

Top

new(\%config)

Top

The new() constructor method is called to instantiate a Template::Service object. Configuration parameters may be specified as a HASH reference or as a list of name => value pairs.

my $service1 = Template::Service->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
});

my $service2 = Template::Service->new( ERROR => 'error.html' );

The new() method returns a Template::Service object or undef on error. In the latter case, a relevant error message can be retrieved by the error() class method or directly from the $Template::Service::ERROR package variable.

my $service = Template::Service->new(\%config)
    || die Template::Service->error();

my $service = Template::Service->new(\%config)
    || die $Template::Service::ERROR;

process($input, \%replace)

Top

The process() method is called to process a template specified as the first parameter, $input. This may be a file name, file handle (e.g. GLOB or IO::Handle) or a reference to a text string containing the template text. An additional hash reference may be passed containing template variable definitions.

The method processes the template, adding any PRE_PROCESS or POST_PROCESS templates defined, and returns the output text. An uncaught exception thrown by the template will be handled by a relevant ERROR handler if defined. Errors that occur in the PRE_PROCESS or POST_PROCESS templates, or those that occur in the main input template and aren't handled, cause the method to return undef to indicate failure. The appropriate error message can be retrieved via the error() method.

$service->process('myfile.html', { title => 'My Test File' })
    || die $service->error();

context()

Top

Returns a reference to the internal context object which is, by default, an instance of the Template::Context class.

CONFIGURATION OPTIONS

Top

The following list summarises the configuration options that can be provided to the Template::Service new() constructor. Please consult Template::Manual::Config for further details and examples of each configuration option in use.

PRE_PROCESS, POST_PROCESS

Top

The PRE_PROCESS and POST_PROCESS options may be set to contain the name(s) of template files which should be processed immediately before and/or after each template. These do not get added to templates processed into a document via directives such as INCLUDE PROCESS, WRAPPER, etc.

my $service = Template::Service->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
};

Multiple templates may be specified as a reference to a list. Each is processed in the order defined.

my $service = Template::Service->new({
    PRE_PROCESS  => [ 'config', 'header' ],
    POST_PROCESS => 'footer',
};

PROCESS

Top

The PROCESS option may be set to contain the name(s) of template files which should be processed instead of the main template passed to the Template::Service process() method. This can be used to apply consistent wrappers around all templates, similar to the use of PRE_PROCESS and POST_PROCESS templates.

my $service = Template::Service->new({
    PROCESS  => 'content',
};

# processes 'content' instead of 'foo.html'
$service->process('foo.html');

A reference to the original template is available in the template variable. Metadata items can be inspected and the template can be processed by specifying it as a variable reference (i.e. prefixed by '$') to an INCLUDE, PROCESS or WRAPPER directive.

Example PROCESS template:

<html>
  <head>
    <title>[% template.title %]</title>
  </head>
  <body>
  [% PROCESS $template %]
  </body>
</html>

ERROR

Top

The ERROR (or ERRORS if you prefer) configuration item can be used to name a single template or specify a hash array mapping exception types to templates which should be used for error handling. If an uncaught exception is raised from within a template then the appropriate error template will instead be processed.

If specified as a single value then that template will be processed for all uncaught exceptions.

my $service = Template::Service->new({
    ERROR => 'error.html'
});

If the ERROR/ERRORS item is a hash reference the keys are assumed to be exception types and the relevant template for a given exception will be selected. A default template may be provided for the general case.

my $service = Template::Service->new({
    ERRORS => {
        user     => 'user/index.html',
        dbi      => 'error/database',
        default  => 'error/default',
    },
});

AUTO_RESET

Top

The AUTO_RESET option is set by default and causes the local BLOCKS cache for the Template::Context object to be reset on each call to the Template process() method. This ensures that any BLOCKs defined within a template will only persist until that template is finished processing.

DEBUG

Top

The DEBUG option can be used to enable debugging messages from the Template::Service module by setting it to include the DEBUG_SERVICE value.

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_SERVICE,
});

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Service.html last modified 10:55:07 31-May-2007
TT_v224_html_docs/old/modules/Template/Stash/000700 000765 000765 00000000000 11756705152 020676 5ustar00abwabw000000 000000 TT_v224_html_docs/old/modules/Template/Stash.html000700 000765 000765 00000050777 10627515576 021614 0ustar00abwabw000000 000000 Template::Stash

SYNOPSIS

Top
use Template::Stash;

my $stash = Template::Stash->new(\%vars);

# get variable values
$value = $stash->get($variable);
$value = $stash->get(\@compound);

# set variable value
$stash->set($variable, $value);
$stash->set(\@compound, $value);

# default variable value
$stash->set($variable, $value, 1);
$stash->set(\@compound, $value, 1);

# set variable values en masse
$stash->update(\%new_vars)

# methods for (de-)localising variables
$stash = $stash->clone(\%new_vars);
$stash = $stash->declone();

DESCRIPTION

Top

The Template::Stash module defines an object class which is used to store variable values for the runtime use of the template processor. Variable values are stored internally in a hash reference (which itself is blessed to create the object) and are accessible via the get() and set() methods.

Variables may reference hash arrays, lists, subroutines and objects as well as simple values. The stash automatically performs the right magic when dealing with variables, calling code or object methods, indexing into lists, hashes, etc.

The stash has clone() and declone() methods which are used by the template processor to make temporary copies of the stash for localising changes made to variables.

PUBLIC METHODS

Top

new(\%params)

Top

The new() constructor method creates and returns a reference to a new Template::Stash object.

my $stash = Template::Stash->new();

A hash reference may be passed to provide variables and values which should be used to initialise the stash.

my $stash = Template::Stash->new({ var1 => 'value1', 
                                   var2 => 'value2' });

get($variable)

Top

The get() method retrieves the variable named by the first parameter.

$value = $stash->get('var1');

Dotted compound variables can be retrieved by specifying the variable elements by reference to a list. Each node in the variable occupies two entries in the list. The first gives the name of the variable element, the second is a reference to a list of arguments for that element, or 0 if none.

[% foo.bar(10).baz(20) %]

$stash->get([ 'foo', 0, 'bar', [ 10 ], 'baz', [ 20 ] ]);

set($variable, $value, $default)

Top

The set() method sets the variable name in the first parameter to the value specified in the second.

$stash->set('var1', 'value1');

If the third parameter evaluates to a true value, the variable is set only if it did not have a true value before.

$stash->set('var2', 'default_value', 1);

Dotted compound variables may be specified as per get() above.

[% foo.bar = 30 %]

$stash->set([ 'foo', 0, 'bar', 0 ], 30);

The magical variable 'IMPORT' can be specified whose corresponding value should be a hash reference. The contents of the hash array are copied (i.e. imported) into the current namespace.

# foo.bar = baz, foo.wiz = waz
$stash->set('foo', { 'bar' => 'baz', 'wiz' => 'waz' });

# import 'foo' into main namespace: bar = baz, wiz = waz
$stash->set('IMPORT', $stash->get('foo'));

clone(\%params)

Top

The clone() method creates and returns a new Template::Stash object which represents a localised copy of the parent stash. Variables can be freely updated in the cloned stash and when declone() is called, the original stash is returned with all its members intact and in the same state as they were before clone() was called.

For convenience, a hash of parameters may be passed into clone() which is used to update any simple variable (i.e. those that don't contain any namespace elements like foo and bar but not foo.bar) variables while cloning the stash. For adding and updating complex variables, the set() method should be used after calling clone(). This will correctly resolve and/or create any necessary namespace hashes.

A cloned stash maintains a reference to the stash that it was copied from in its _PARENT member.

declone()

Top

The declone() method returns the _PARENT reference and can be used to restore the state of a stash as described above.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Stash.html last modified 10:55:10 31-May-2007
TT_v224_html_docs/old/modules/Template/Test.html000700 000765 000765 00000074163 10627515576 021444 0ustar00abwabw000000 000000 Template::Test

SYNOPSIS

Top
use Template::Test;

$Template::Test::DEBUG = 0;   # set this true to see each test running
$Template::Test::EXTRA = 2;   # 2 extra tests follow test_expect()...

# ok() can be called any number of times before test_expect
ok( $true_or_false )

# test_expect() splits $input into individual tests, processes each 
# and compares generated output against expected output
test_expect($input, $template, \%replace );

# $input is text or filehandle (e.g. DATA section after __END__)
test_expect( $text );
test_expect( \*DATA );

# $template is a Template object or configuration hash
my $template_cfg = { ... };
test_expect( $input, $template_cfg );
my $template_obj = Template->new($template_cfg);
test_expect( $input, $template_obj );

# $replace is a hash reference of template variables
my $replace = {
    a => 'alpha',
    b => 'bravo'
};
test_expect( $input, $template, $replace );

# ok() called after test_expect should be declared in $EXTRA (2)
ok( $true_or_false )   
ok( $true_or_false )   

DESCRIPTION

Top

The Template::Test module defines the test_expect() and other related subroutines which can be used to automate test scripts for the Template Toolkit. See the numerous tests in the t sub-directory of the distribution for examples of use.

PACKAGE SUBROUTINES

Top

text_expect()

Top

The test_expect() subroutine splits an input document into a number of separate tests, processes each one using the Template Toolkit and then compares the generated output against an expected output, also specified in the input document. It generates the familiar ok/not ok output compatible with Test::Harness.

The test input should be specified as a text string or a reference to a filehandle (e.g. GLOB or IO::Handle) from which it can be read. In particular, this allows the test input to be placed after the __END__ marker and read via the DATA filehandle.

use Template::Test;

test_expect(\*DATA);

__END__
# this is the first test (this is a comment)
-- test --
blah blah blah [% foo %]
-- expect --
blah blah blah value_of_foo

# here's the second test (no surprise, so is this)
-- test --
more blah blah [% bar %]
-- expect --
more blah blah value_of_bar

Blank lines between test sections are generally ignored. Any line starting with # is treated as a comment and is ignored.

The second and third parameters to test_expect() are optional. The second may be either a reference to a Template object which should be used to process the template fragments, or a reference to a hash array containing configuration values which should be used to instantiate a new Template object.

# pass reference to config hash
my $config = {
    INCLUDE_PATH => '/here/there:/every/where',
    POST_CHOMP   => 1,
};
test_expect(\*DATA, $config);

# or create Template object explicitly
my $template = Template->new($config);
test_expect(\*DATA, $template);

The third parameter may be used to reference a hash array of template variable which should be defined when processing the tests. This is passed to the Template process() method.

my $replace = {
    a => 'alpha',
    b => 'bravo',
};

test_expect(\*DATA, $config, $replace);

The second parameter may be left undefined to specify a default Template configuration.

test_expect(\*DATA, undef, $replace);

For testing the output of different Template configurations, a reference to a list of named Template objects also may be passed as the second parameter.

my $tt1 = Template->new({ ... });
my $tt2 = Template->new({ ... });
my @tts = [ one => $tt1, two => $tt1 ];

The first object in the list is used by default. Other objects may be switched in with a '-- use $name --' marker. This should immediately follow a '-- test --' line. That object will then be used for the rest of the test, or until a different object is selected.

-- test --
-- use one --
[% blah %]
-- expect --
blah, blah

-- test --
still using one...
-- expect --
...

-- test --
-- use two --
[% blah %]
-- expect --
blah, blah, more blah

The test_expect() sub counts the number of tests, and then calls ntests() to generate the familiar "1..$ntests\n" test harness line. Each test defined generates two test numbers. The first indicates that the input was processed without error, and the second that the output matches that expected.

Additional test may be run before test_expect() by calling ok(). These test results are cached until ntests() is called and the final number of tests can be calculated. Then, the "1..$ntests" line is output, along with "ok $n" / "not ok $n" lines for each of the cached test result. Subsequent calls to ok() then generate an output line immediately.

my $something = SomeObject->new();
ok( $something );

my $other = AnotherThing->new();
ok( $other );

test_expect(\*DATA);

If any tests are to follow after test_expect() is called then these should be pre-declared by setting the $EXTRA package variable. This value (default: 0) is added to the grand total calculated by ntests(). The results of the additional tests are also registered by calling ok().

$Template::Test::EXTRA = 2;

# can call ok() any number of times before test_expect()
ok( $did_that_work );             
ok( $make_sure );
ok( $dead_certain ); 

# <some> number of tests...
test_expect(\*DATA, $config, $replace);

# here's those $EXTRA tests
ok( defined $some_result && ref $some_result eq 'ARRAY' );
ok( $some_result->[0] eq 'some expected value' );

If you don't want to call test_expect() at all then you can call ntests($n) to declare the number of tests and generate the test header line. After that, simply call ok() for each test passing a true or false values to indicate that the test passed or failed.

ntests(2);
ok(1);
ok(0);

If you're really lazy, you can just call ok() and not bother declaring the number of tests at all. All tests results will be cached until the end of the script and then printed in one go before the program exits.

ok( $x );
ok( $y );

You can identify only a specific part of the input file for testing using the '-- start --' and '-- stop --' markers. Anything before the first '-- start --' is ignored, along with anything after the next '-- stop --' marker.

-- test --
this is test 1 (not performed)
-- expect --
this is test 1 (not performed)

-- start --

-- test --
this is test 2
-- expect --
this is test 2

-- stop --

...

ntests()

Top

Subroutine used to specify how many tests you're expecting to run.

ok($test)

Top

Generates an "ok $n" or "not ok $n" message if $test is true or false.

not_ok($test)

Top

The logical inverse of ok(). Prints an "ok $n" message is $test is false and vice-versa.

callsign()

Top

For historical reasons and general utility, the module also defines a callsign() subroutine which returns a hash mapping the letters a to z to their phonetic alphabet equivalent (e.g. radio callsigns). This is used by many of the test scripts as a known source of variable values.

test_expect(\*DATA, $config, callsign());

banner()

Top

This subroutine prints a simple banner including any text passed as parameters. The $DEBUG variable must be set for it to generate any output.

banner('Testing something-or-other');

example output:

#------------------------------------------------------------
# Testing something-or-other (27 tests completed)
#------------------------------------------------------------

PACKAGE VARIABLES

Top

$DEBUG

Top

The $DEBUG package variable can be set to enable debugging mode.

$PRESERVE

Top

The $PRESERVE package variable can be set to stop the test_expect() from converting newlines in the output and expected output into the literal strings '\n'.

HISTORY

Top

This module started its butt-ugly life as the t/texpect.pl script. It was cleaned up to became the Template::Test module some time around version 0.29. It underwent further cosmetic surgery for version 2.00 but still retains some remarkable rear-end resemblances.

Since then the Test::More and related modules have appeared on CPAN making this module mostly, but not entirely, redundant.

BUGS / KNOWN "FEATURES"

Top

Imports all methods by default. This is generally a Bad Thing, but this module is only used in test scripts (i.e. at build time) so a) we don't really care and b) it saves typing.

The line splitter may be a bit dumb, especially if it sees lines like -- this -- that aren't supposed to be special markers. So don't do that.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

/modules/Template/Test.html last modified 10:55:10 31-May-2007
TT_v224_html_docs/old/modules/Template/View.html000700 000765 000765 00000055161 10627515577 021435 0ustar00abwabw000000 000000 Template::View

SYNOPSIS

Top
# define a view
[% VIEW view
        # some standard args
        prefix        => 'my_', 
        suffix        => '.tt2',
        notfound      => 'no_such_file'
        ...
        # any other data
        title         => 'My View title'
        other_item    => 'Joe Random Data'
        ...
%]
   # add new data definitions, via 'my' self reference
   [% my.author = "$abw.name <$abw.email>" %]
   [% my.copy   = "&copy; Copyright 2000 $my.author" %]
# define a local block
[% BLOCK header %]
This is the header block, title: [% title or my.title %]
[% END %]
[% END %]
# access data items for view
[% view.title %]
[% view.other_item %]
# access blocks directly ('include_naked' option, set by default)
[% view.header %]
[% view.header(title => 'New Title') %]
# non-local templates have prefix/suffix attached
[% view.footer %]           # => [% INCLUDE my_footer.tt2 %]
# more verbose form of block access
[% view.include( 'header', title => 'The Header Title' ) %]
[% view.include_header( title => 'The Header Title' ) %]
# very short form of above ('include_naked' option, set by default)
[% view.header( title => 'The Header Title' ) %]
# non-local templates have prefix/suffix attached
[% view.footer %]           # => [% INCLUDE my_footer.tt2 %]
# fallback on the 'notfound' template ('my_no_such_file.tt2')
# if template not found 
[% view.include('missing') %]
[% view.include_missing %]
[% view.missing %]
# print() includes a template relevant to argument type
[% view.print("some text") %]     # type=TEXT, template='text'
[% BLOCK my_text.tt2 %]           # 'text' with prefix/suffix
   Text: [% item %]
[% END %]
# now print() a hash ref, mapped to 'hash' template
[% view.print(some_hash_ref) %]   # type=HASH, template='hash'
[% BLOCK my_hash.tt2 %]           # 'hash' with prefix/suffix
   hash keys: [% item.keys.sort.join(', ')
[% END %]
# now print() a list ref, mapped to 'list' template
[% view.print(my_list_ref) %]     # type=ARRAY, template='list'
[% BLOCK my_list.tt2 %]           # 'list' with prefix/suffix
   list: [% item.join(', ') %]
[% END %]
# print() maps 'My::Object' to 'My_Object'
[% view.print(myobj) %]
[% BLOCK my_My_Object.tt2 %]
   [% item.this %], [% item.that %]
[% END %]
# update mapping table
[% view.map.ARRAY = 'my_list_template' %]
[% view.map.TEXT  = 'my_text_block'    %]
# change prefix, suffix, item name, etc.
[% view.prefix = 'your_' %]
[% view.default = 'anyobj' %]
...

DESCRIPTION

Top

TODO

METHODS

Top

new($context, \%config)

Top

Creates a new Template::View presenting a custom view of the specified $context object.

A reference to a hash array of configuration options may be passed as the second argument.

  • prefix

    Prefix added to all template names.

    [% USE view(prefix => 'my_') %]
    [% view.view('foo', a => 20) %]     # => my_foo
  • suffix

    Suffix added to all template names.

    [% USE view(suffix => '.tt2') %]
    [% view.view('foo', a => 20) %]     # => foo.tt2
  • map

    Hash array mapping reference types to template names. The print() method uses this to determine which template to use to present any particular item. The TEXT, HASH and ARRAY items default to 'test', 'hash' and 'list' appropriately.

    [% USE view(map => { ARRAY   => 'my_list', 
                         HASH    => 'your_hash',
                         My::Foo => 'my_foo', } ) %]
    [% view.print(some_text) %]         # => text
    [% view.print(a_list) %]            # => my_list
    [% view.print(a_hash) %]            # => your_hash
    [% view.print(a_foo) %]             # => my_foo
    [% BLOCK text %]
       Text: [% item %]
    [% END %]
    [% BLOCK my_list %]
       list: [% item.join(', ') %]
    [% END %]
    [% BLOCK your_hash %]
       hash keys: [% item.keys.sort.join(', ')
    [% END %]
    [% BLOCK my_foo %] 
       Foo: [% item.this %], [% item.that %]
    [% END %]
  • method

    Name of a method which objects passed to print() may provide for presenting themselves to the view. If a specific map entry can't be found for an object reference and it supports the method (default: 'present') then the method will be called, passing the view as an argument. The object can then make callbacks against the view to present itself.

    package Foo;
    sub present {
        my ($self, $view) = @_;
        return "a regular view of a Foo\n";
    }
    sub debug {
        my ($self, $view) = @_;
        return "a debug view of a Foo\n";
    }

    In a template:

    [% USE view %]
    [% view.print(my_foo_object) %]     # a regular view of a Foo
    [% USE view(method => 'debug') %]
    [% view.print(my_foo_object) %]     # a debug view of a Foo
  • default

    Default template to use if no specific map entry is found for an item.

    [% USE view(default => 'my_object') %]
    [% view.print(objref) %]            # => my_object

    If no map entry or default is provided then the view will attempt to construct a template name from the object class, substituting any sequence of non-word characters to single underscores, e.g.

    # 'fubar' is an object of class Foo::Bar
    [% view.print(fubar) %]             # => Foo_Bar

    Any current prefix and suffix will be added to both the default template name and any name constructed from the object class.

  • notfound

    Fallback template to use if any other isn't found.

  • item

    Name of the template variable to which the print() method assigns the current item. Defaults to 'item'.

    [% USE view %]
    [% BLOCK list %] 
       [% item.join(', ') %] 
    [% END %]
    [% view.print(a_list) %]
    [% USE view(item => 'thing') %]
    [% BLOCK list %] 
       [% thing.join(', ') %] 
    [% END %]
    [% view.print(a_list) %]
  • view_prefix

    Prefix of methods which should be mapped to view() by AUTOLOAD. Defaults to 'view_'.

    [% USE view %]
    [% view.view_header() %]                    # => view('header')
    [% USE view(view_prefix => 'show_me_the_' %]
    [% view.show_me_the_header() %]             # => view('header')
  • view_naked

    Flag to indcate if any attempt should be made to map method names to template names where they don't match the view_prefix. Defaults to 0.

    [% USE view(view_naked => 1) %]
    [% view.header() %]                 # => view('header')

print( $obj1, $obj2, ... \%config)

Top

TODO

view( $template, \%vars, \%config );

Top

TODO

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 2000-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/View.html last modified 10:55:10 31-May-2007
TT_v224_html_docs/old/modules/Template/VMethods.html000700 000765 000765 00000025567 10627515577 022263 0ustar00abwabw000000 000000 Template::VMethods

DESCRIPTION

Top

The Template::VMethods module implements the virtual methods that can be applied to variables.

Please see Template::Manual::VMethods for further information.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/VMethods.html last modified 10:55:11 31-May-2007
TT_v224_html_docs/old/modules/Template/Stash/Context.html000700 000765 000765 00000036627 10627515574 023234 0ustar00abwabw000000 000000 Template::Stash::Context

SYNOPSIS

Top
use Template;
use Template::Stash::Context;
my $stash = Template::Stash::Context->new(\%vars);
my $tt2   = Template->new({ STASH => $stash });

DESCRIPTION

Top

This is an alternate stash object which includes a patch from Craig Barratt to implement various new virtual methods to allow dotted template variable to denote if object methods and subroutines should be called in scalar or list context. It adds a little overhead to each stash call and I'm a little wary of applying that to the core default stash without investigating the effects first. So for now, it's implemented as a separate stash module which will allow us to test it out, benchmark it and switch it in or out as we require.

This is what Craig has to say about it:

Here's a better set of features for the core. Attached is a new version of Stash.pm (based on TT2.02) that:

* supports the special op "scalar" that forces scalar context on function calls, eg:

cgi.param("foo").scalar

calls cgi.param("foo") in scalar context (unlike my wimpy scalar op from last night). Array context is the default.

With non-function operands, scalar behaves like the perl version (eg: no-op for scalar, size for arrays, etc).

* supports the special op "ref" that behaves like the perl ref. If applied to a function the function is not called. Eg:

cgi.param("foo").ref

does *not* call cgi.param and evaluates to "CODE". Similarly, HASH.ref, ARRAY.ref return what you expect.

* adds a new scalar and list op called "array" that is a no-op for arrays and promotes scalars to one-element arrays.

* allows scalar ops to be applied to arrays and hashes in place, eg: ARRAY.repeat(3) repeats each element in place.

* allows list ops to be applied to scalars by promoting the scalars to one-element arrays (like an implicit "array"). So you can do things like SCALAR.size, SCALAR.join and get a useful result.

This also means you can now use x.0 to safely get the first element whether x is an array or scalar.

The new Stash.pm passes the TT2.02 test suite. But I haven't tested the new features very much. One nagging implementation problem is that the "scalar" and "ref" ops have higher precedence than user variable names.

AUTHOR

Top

Andy Wardley <abw@wardley.org>

http://wardley.org/

VERSION

Top

1.63, distributed as part of the Template Toolkit version 2.19, released on 27 April 2007.

COPYRIGHT

Top
Copyright (C) 1996-2007 Andy Wardley.  All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

/modules/Template/Stash/Context.html last modified 10:55:08 31-May-2007
TT_v224_html_docs/old/modules/Template/Stash/index.html000700 000765 000765 00000021342 10627515574 022703 0ustar00abwabw000000 000000 Template::Stash::* Modules

Section Index

Top

This section contains the documentation for the Template::Stash modules.


/modules/Template/Stash/index.html last modified 10:55:08 31-May-2007
TT_v224_html_docs/old/modules/Template/Stash/XS.html000700 000765 000765 00000036074 10627515575 022137 0ustar00abwabw000000 000000 Template::Stash::XS

SYNOPSIS

Top
use Template;
use Template::Stash::XS;
my $stash = Template::Stash::XS->new(\%vars);
my $tt2   = Template->new({ STASH => $stash });

DESCRIPTION

Top

The Template:Stash::XS module is an implementation of the Template::Stash written in C. The "XS" in the name refers to Perl's XS extension system for interfacing Perl to C code. It works just like the regular Perl implementation of Template::Stash but runs about twice as fast.

The easiest way to use the XS stash is to configure the Template Toolkit to use it by default. You can do this at installation time (when you run perl Makefile.PL) by answering 'y' to the questions:

Do you want to build the XS Stash module?      y
Do you want to use the XS Stash by default?    y

See the INSTALL file distributed with the Template Toolkit for further details on installation.

If you don't elect to use the XS stash by default then you should use the STASH configuration item when you create a new Template object. This should reference an XS stash object that you have created manually.

use Template;
use Template::Stash::XS;
my $stash = Template::Stash::XS->new(\%vars);
my $tt2   = Template->new({ STASH => $stash });

Alternately, you can set the $Template::Config::STASH package variable like so:

use Template;
use Template::Config;
$Template::Config::STASH = 'Template::Stash::XS';
my $tt2 = Template->new();

The XS stash will then be automatically used.

If you want to use the XS stash by default and don't want to re-install the Template Toolkit, then you can manually modify the Template/Config.pm module near line 42 to read:

$STASH = 'Template::Stash::XS';

BUGS

Top

Please report bugs to the Template Toolkit mailing list templates@template-toolkit.org

AUTHORS

Top

Andy Wardley <abw@tt2.org>

Doug Steinwand <dsteinwand@citysearch.com>

VERSION

Top

Template Toolkit version 2.19, released on 27 April 2007.

COPYRIGHT

Top
Copyright (C) 1996-2007 Andy Wardley.  All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

/modules/Template/Stash/XS.html last modified 10:55:09 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/Autoformat.html000700 000765 000765 00000045121 10627515560 024065 0ustar00abwabw000000 000000 Template::Plugin::Autoformat

SYNOPSIS

Top
[% USE autoformat(options) %]

[% autoformat(text, more_text, ..., options) %]

[% FILTER autoformat(options) %]
   a block of text
[% END %]

EXAMPLES

Top
# define some text for the examples
[% text = BLOCK %]
   Be not afeard.  The isle is full of noises, sounds and sweet 
   airs that give delight but hurt not.
[% END %]
# pass options to constructor...
[% USE autoformat(case => 'upper') %]
[% autoformat(text) %]

# and/or pass options to the autoformat subroutine itself
[% USE autoformat %]
[% autoformat(text, case => 'upper') %]

# using the autoformat filter
[% USE autoformat(left => 10, right => 30) %]
[% FILTER autoformat %]
   Be not afeard.  The isle is full of noises, sounds and sweet 
   airs that give delight but hurt not.
[% END %]
# another filter example with configuration options
[% USE autoformat %]
[% FILTER autoformat(left => 20) %]
   Be not afeard.  The isle is full of noises, sounds and sweet 
   airs that give delight but hurt not.
[% END %]
# another FILTER example, defining a 'poetry' filter alias
[% USE autoformat %]
[% text FILTER poetry = autoformat(left => 20, right => 40) %]

# reuse the 'poetry' filter alias
[% text FILTER poetry %]
# shorthand form ('|' is an alias for 'FILTER')
[% text | autoformat %]
# using forms
[% USE autoformat(form => '>>>>.<<<', numeric => 'AllPlaces') %]
[% autoformat(10, 20.32, 11.35) %]

DESCRIPTION

Top

The autoformat plugin is an interface to Damian Conway's Text::Autoformat Perl module which provides advanced text wrapping and formatting.

Configuration options may be passed to the plugin constructor via the USE directive.

[% USE autoformat(right => 30) %]

The autoformat subroutine can then be called, passing in text items which will be wrapped and formatted according to the current configuration.

[% autoformat('The cat sat on the mat') %]

Additional configuration items can be passed to the autoformat subroutine and will be merged with any existing configuration specified via the constructor.

[% autoformat(text, left => 20) %]

Configuration options are passed directly to the Text::Autoformat plugin. At the time of writing, the basic configuration items are:

left        left margin (default: 1)
right       right margin (default 72)
justify     justification as one of 'left', 'right', 'full'
            or 'centre' (default: left)
case        case conversion as one of 'lower', 'upper',
            'sentence', 'title', or 'highlight' (default: none)
squeeze     squeeze whitespace (default: enabled)

The plugin also accepts a form item which can be used to define a format string. When a form is defined, the plugin will call the underlying form() subroutine in preference to autoformat().

[% USE autoformat(form => '>>>>.<<') %]
[% autoformat(123.45, 666, 3.14) %]

Additional configuration items relevant to forms can also be specified.

[% USE autoformat(form => '>>>>.<<', numeric => 'AllPlaces') %]
[% autoformat(123.45, 666, 3.14) %]

These can also be passed directly to the autoformat subroutine.

[% USE autoformat %]
[% autoformat( 123.45, 666, 3.14,
               form    => '>>>>.<<', 
               numeric => 'AllPlaces' )
%]

See Text::Autoformat for further details.

AUTHORS

Top

Robert McArthur wrote the original plugin code, with some modifications and additions from Andy Wardley.

Damian Conway wrote the Text::Autoformat module which does all the clever stuff.

COPYRIGHT

Top

Copyright (C) 2000-2007 Robert McArthur & Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/Autoformat.html last modified 10:54:56 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/CGI.html000700 000765 000765 00000040546 10627515561 022355 0ustar00abwabw000000 000000 Template::Plugin::CGI

SYNOPSIS

Top
[% USE CGI %]
[% CGI.param('parameter') %]

[% USE things = CGI %]
[% things.param('name') %]

# see CGI docs for other methods provided by the CGI object

DESCRIPTION

Top

This is a very simple Template Toolkit Plugin interface to the CGI module. A CGI object will be instantiated via the following directive:

[% USE CGI %]

CGI methods may then be called as follows:

[% CGI.header %]
[% CGI.param('parameter') %]

An alias can be used to provide an alternate name by which the object should be identified.

[% USE mycgi = CGI %]
[% mycgi.start_form %]
[% mycgi.popup_menu({ Name   => 'Color'
                      Values => [ 'Green' 'Black' 'Brown' ] }) %]

Parenthesised parameters to the USE directive will be passed to the plugin constructor:

[% USE cgiprm = CGI('uid=abw&name=Andy+Wardley') %]
[% cgiprm.param('uid') %]

METHODS

Top

In addition to all the methods supported by the CGI module, this plugin defines the following.

params()

Top

This method returns a reference to a hash of all the CGI parameters. Any parameters that have multiple values will be returned as lists.

[% USE CGI('user=abw&item=foo&item=bar') %]
[% CGI.params.user %]            # abw
[% CGI.params.item.join(', ') %] # foo, bar

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/CGI.html last modified 10:54:57 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/Datafile.html000700 000765 000765 00000040467 10627515561 023466 0ustar00abwabw000000 000000 Template::Plugin::Datafile

SYNOPSIS

Top
[% USE mydata = datafile('/path/to/datafile') %]
[% USE mydata = datafile('/path/to/datafile', delim = '|') %]

[% FOREACH record = mydata %]
   [% record.this %]  [% record.that %]
[% END %]

DESCRIPTION

Top

This plugin provides a simple facility to construct a list of hash references, each of which represents a data record of known structure, from a data file.

[% USE datafile(filename) %]

A absolute filename must be specified (for this initial implementation at least - in a future version it might also use the INCLUDE_PATH). An optional delim parameter may also be provided to specify an alternate delimiter character.

[% USE userlist = datafile('/path/to/file/users')     %]
[% USE things   = datafile('items', delim = '|') %]

The format of the file is intentionally simple. The first line defines the field names, delimited by colons with optional surrounding whitespace. Subsequent lines then defines records containing data items, also delimited by colons. e.g.

id : name : email : tel
abw : Andy Wardley : abw@tt2.org : 555-1234
sam : Simon Matthews : sam@tt2.org : 555-9876

Each line is read, split into composite fields, and then used to initialise a hash array containing the field names as relevant keys. The plugin returns a blessed list reference containing the hash references in the order as defined in the file.

[% FOREACH user = userlist %]
   [% user.id %]: [% user.name %]
[% END %]

The first line of the file must contain the field definitions. After the first line, blank lines will be ignored, along with comment line which start with a '#'.

BUGS

Top

Should handle file names relative to INCLUDE_PATH. Doesn't permit use of ':' in a field. Some escaping mechanism is required.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/Datafile.html last modified 10:54:57 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/Date.html000700 000765 000765 00000046623 10627515562 022633 0ustar00abwabw000000 000000 Template::Plugin::Date

SYNOPSIS

Top
[% USE date %]

# use current time and default format
[% date.format %]

# specify time as seconds since epoch or 'h:m:s d-m-y' string
[% date.format(960973980) %]
[% date.format('4:20:36 21/12/2000') %]

# specify format
[% date.format(mytime, '%H:%M:%S') %]

# specify locale
[% date.format(date.now, '%a %d %b %y', 'en_GB') %]

# named parameters 
[% date.format(mytime, format = '%H:%M:%S') %]
[% date.format(locale = 'en_GB') %]
[% date.format(time   = date.now, 
               format = '%H:%M:%S', 
               locale = 'en_GB) %]

# specify default format to plugin
[% USE date(format = '%H:%M:%S', locale = 'de_DE') %]

[% date.format %]
...

DESCRIPTION

Top

The Date plugin provides an easy way to generate formatted time and date strings by delegating to the POSIX strftime() routine.

The plugin can be loaded via the familiar USE directive.

[% USE date %]

This creates a plugin object with the default name of 'date'. An alternate name can be specified as such:

[% USE myname = date %]

The plugin provides the format() method which accepts a time value, a format string and a locale name. All of these parameters are optional with the current system time, default format ('%H:%M:%S %d-%b-%Y') and current locale being used respectively, if undefined. Default values for the time, format and/or locale may be specified as named parameters in the USE directive.

[% USE date(format = '%a %d-%b-%Y', locale = 'fr_FR') %]

When called without any parameters, the format() method returns a string representing the current system time, formatted by strftime() according to the default format and for the default locale (which may not be the current one, if locale is set in the USE directive).

[% date.format %]

The plugin allows a time/date to be specified as seconds since the epoch, as is returned by time().

File last modified: [% date.format(filemod_time) %]

The time/date can also be specified as a string of the form 'h:m:s d/m/y'. Any of the characters : / - or space may be used to delimit fields.

[% USE day = date(format => '%A', locale => 'en_GB') %]
[% day.format('4:20:00 9-13-2000') %]  

Output:

Tuesday

A format string can also be passed to the format() method, and a locale specification may follow that.

[% date.format(filemod, '%d-%b-%Y') %]
[% date.format(filemod, '%d-%b-%Y', 'en_GB') %]

A fourth parameter allows you to force output in GMT, in the case of seconds-since-the-epoch input:

[% date.format(filemod, '%d-%b-%Y', 'en_GB', 1) %]

Note that in this case, if the local time is not GMT, then also specifying '%Z' (time zone) in the format parameter will lead to an extremely misleading result.

Any or all of these parameters may be named. Positional parameters should always be in the order ($time, $format, $locale).

[% date.format(format => '%H:%M:%S') %]
[% date.format(time => filemod, format => '%H:%M:%S') %]
[% date.format(mytime, format => '%H:%M:%S') %]
[% date.format(mytime, format => '%H:%M:%S', locale => 'fr_FR') %]
[% date.format(mytime, format => '%H:%M:%S', gmt => 1) %]
...etc...

The now() method returns the current system time in seconds since the epoch.

[% date.format(date.now, '%A') %]

The calc() method can be used to create an interface to the Date::Calc module (if installed on your system).

[% calc = date.calc %]
[% calc.Monday_of_Week(22, 2001).join('/') %]

The manip() method can be used to create an interface to the Date::Manip module (if installed on your system).

[% manip = date.manip %]
[% manip.UnixDate("Noon Yesterday","%Y %b %d %H:%M") %]

AUTHORS

Top

Thierry-Michel Barral wrote the original plugin.

Andy Wardley provided some minor fixups/enhancements, a test script and documentation.

Mark D. Mills cloned Date::Manip from the Date::Calc sub-plugin.

COPYRIGHT

Top

Copyright (C) 2000-2007 Thierry-Michel Barral, Andy Wardley.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/Date.html last modified 10:54:58 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/Directory.html000700 000765 000765 00000054153 10627515562 023717 0ustar00abwabw000000 000000 Template::Plugin::Directory

SYNOPSIS

Top
[% USE dir = Directory(dirpath) %]

# files returns list of regular files
[% FOREACH file = dir.files %]
   [% file.name %] [% file.path %] ...
[% END %]

# dirs returns list of sub-directories
[% FOREACH subdir = dir.dirs %]
   [% subdir.name %] [% subdir.path %] ...
[% END %]

# list returns both interleaved in order
[% FOREACH item = dir.list %]
   [% IF item.isdir %]
      Directory: [% item.name %]
   [% ELSE 
      File: [% item.name %]
   [% END %]
[% END %]

# define a VIEW to display dirs/files
[% VIEW myview %]
   [% BLOCK file %]
   File: [% item.name %]
   [% END %]

   [% BLOCK directory %]
   Directory: [% item.name %] 
   [% item.content(myview) | indent -%]
   [% END %]
[% END %]

# display directory content using view
[% myview.print(dir) %]

DESCRIPTION

Top

This Template Toolkit plugin provides a simple interface to directory listings. It is derived from the Template::Plugin::File module and uses Template::Plugin::File object instances to represent files within a directory. Sub-directories within a directory are represented by further Template::Plugin::Directory instances.

The constructor expects a directory name as an argument.

[% USE dir = Directory('/tmp') %]

It then provides access to the files and sub-directories contained within the directory.

# regular files (not directories)
[% FOREACH file IN dir.files %]
   [% file.name %]
[% END %]
# directories only
[% FOREACH file IN dir.dirs %]
   [% file.name %]
[% END %]
# files and/or directories
[% FOREACH file IN dir.list %]
   [% file.name %] ([% file.isdir ? 'directory' : 'file' %])
[% END %]

The plugin constructor will throw a Directory error if the specified path does not exist, is not a directory or fails to stat() (see Template::Plugin::File). Otherwise, it will scan the directory and create lists named 'files' containing files, 'dirs' containing directories and 'list' containing both files and directories combined. The nostat option can be set to disable all file/directory checks and directory scanning.

Each file in the directory will be represented by a Template::Plugin::File object instance, and each directory by another Template::Plugin::Directory. If the recurse flag is set, then those directories will contain further nested entries, and so on. With the recurse flag unset, as it is by default, then each is just a place marker for the directory and does not contain any further content unless its scan() method is explicitly called. The isdir flag can be tested against files and/or directories, returning true if the item is a directory or false if it is a regular file.

[% FOREACH file = dir.list %]
   [% IF file.isdir %]
      * Directory: [% file.name %]
   [% ELSE %]
      * File: [% file.name %]
   [% END %]
[% END %]

This example shows how you might walk down a directory tree, displaying content as you go. With the recurse flag disabled, as is the default, we need to explicitly call the scan() method on each directory, to force it to lookup files and further sub-directories contained within.

[% USE dir = Directory(dirpath) %]
* [% dir.path %]
[% INCLUDE showdir %]

[% BLOCK showdir -%]
  [% FOREACH file = dir.list -%]
    [% IF file.isdir -%]
    * [% file.name %]
      [% file.scan -%]
      [% INCLUDE showdir dir=file FILTER indent(4) -%]
    [% ELSE -%]
    - [% f.name %]
    [% END -%]
  [% END -%]
 [% END %]

This example is adapted (with some re-formatting for clarity) from a test in t/directry.t which produces the following output:

* test/dir
    - file1
    - file2
    * sub_one
        - bar
        - foo
    * sub_two
        - waz.html
        - wiz.html
    - xyzfile

The recurse flag can be set (disabled by default) to cause the constructor to automatically recurse down into all sub-directories, creating a new Template::Plugin::Directory object for each one and filling it with any further content. In this case there is no need to explicitly call the scan() method.

[% USE dir = Directory(dirpath, recurse=1) %]
   ...

    [% IF file.isdir -%]
    * [% file.name %]
      [% INCLUDE showdir dir=file FILTER indent(4) -%]
    [% ELSE -%]
       ...

The directory plugin also provides support for views. A view can be defined as a VIEW ... END block and should contain BLOCK definitions for files ('file') and directories ('directory').

[% VIEW myview %]
[% BLOCK file %]
   - [% item.name %]
[% END %]

[% BLOCK directory %]
   * [% item.name %]
     [% item.content(myview) FILTER indent %]
[% END %]
[% END %]

The view print() method can then be called, passing the Directory object as an argument.

[% USE dir = Directory(dirpath, recurse=1) %]
[% myview.print(dir) %]

When a directory is presented to a view, either as [% myview.print(dir) %] or [% dir.present(view) %], then the directory BLOCK within the myview VIEW is processed. The item variable will be set to alias the Directory object.

[% BLOCK directory %]
   * [% item.name %]
     [% item.content(myview) FILTER indent %]
[% END %]

In this example, the directory name is first printed and the content(view) method is then called to present each item within the directory to the view. Further directories will be mapped to the directory block, and files will be mapped to the file block.

With the recurse option disabled, as it is by default, the directory block should explicitly call a scan() on each directory.

[% VIEW myview %]
[% BLOCK file %]
   - [% item.name %]
[% END %]

[% BLOCK directory %]
   * [% item.name %]
     [% item.scan %]
     [% item.content(myview) FILTER indent %]
[% END %]
[% END %]

[% USE dir = Directory(dirpath) %]
[% myview.print(dir) %]

AUTHORS

Top

Michael Stevens wrote the original Directory plugin on which this is based. Andy Wardley split it into separate File and Directory plugins, added some extra code and documentation for VIEW support, and made a few other minor tweaks.

COPYRIGHT

Top

Copyright (C) 2000-2007 Michael Stevens, Andy Wardley.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/Directory.html last modified 10:54:58 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/Dumper.html000700 000765 000765 00000042120 10627515563 023177 0ustar00abwabw000000 000000 Template::Plugin::Dumper

SYNOPSIS

Top
[% USE Dumper %]

[% Dumper.dump(variable) %]
[% Dumper.dump_html(variable) %]

DESCRIPTION

Top

This is a very simple Template Toolkit Plugin Interface to the Data::Dumper module. A Dumper object will be instantiated via the following directive:

[% USE Dumper %]

As a standard plugin, you can also specify its name in lower case:

[% USE dumper %]

The Data::Dumper Pad, Indent and Varname options are supported as constructor arguments to affect the output generated. See Data::Dumper for further details.

[% USE dumper(Indent=0, Pad="<br>") %]

These options can also be specified in lower case.

[% USE dumper(indent=0, pad="<br>") %]

METHODS

Top

There are two methods supported by the Dumper object. Each will output into the template the contents of the variables passed to the object method.

dump()

Top

Generates a raw text dump of the data structure(s) passed

[% USE Dumper %]
[% Dumper.dump(myvar) %]
[% Dumper.dump(myvar, yourvar) %]

dump_html()

Top

Generates a dump of the data structures, as per dump(), but with the characters <, > and & converted to their equivalent HTML entities and newlines converted to <br>.

[% USE Dumper %]
[% Dumper.dump_html(myvar) %]

AUTHOR

Top

Simon Matthews <sam@tt2.org>

COPYRIGHT

Top

Copyright (C) 2000 Simon Matthews. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/Dumper.html last modified 10:54:59 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/File.html000700 000765 000765 00000067362 10627515563 022641 0ustar00abwabw000000 000000 Template::Plugin::File

SYNOPSIS

Top
[% USE File(filepath) %]
[% File.path %]         # full path
[% File.name %]         # filename
[% File.dir %]          # directory

DESCRIPTION

Top

This plugin provides an abstraction of a file. It can be used to fetch details about files from the file system, or to represent abstract files (e.g. when creating an index page) that may or may not exist on a file system.

A file name or path should be specified as a constructor argument. e.g.

[% USE File('foo.html') %]
[% USE File('foo/bar/baz.html') %]
[% USE File('/foo/bar/baz.html') %]

The file should exist on the current file system (unless nostat option set, see below) as an absolute file when specified with as leading '/' as per '/foo/bar/baz.html', or otherwise as one relative to the current working directory. The constructor performs a stat() on the file and makes the 13 elements returned available as the plugin items:

dev ino mode nlink uid gid rdev size 
atime mtime ctime blksize blocks

e.g.

[% USE File('/foo/bar/baz.html') %]

[% File.mtime %]
[% File.mode %]
...

In addition, the user and group items are set to contain the user and group names as returned by calls to getpwuid() and getgrgid() for the file uid and gid elements, respectively. On Win32 platforms on which getpwuid() and getgrid() are not available, these values are undefined.

[% USE File('/tmp/foo.html') %]
[% File.uid %]      # e.g. 500
[% File.user %]     # e.g. abw

This user/group lookup can be disabled by setting the noid option.

[% USE File('/tmp/foo.html', noid=1) %]
[% File.uid %]      # e.g. 500
[% File.user %]     # nothing

The isdir flag will be set if the file is a directory.

[% USE File('/tmp') %]
[% File.isdir %]    # 1

If the stat() on the file fails (e.g. file doesn't exists, bad permission, etc) then the constructor will throw a File exception. This can be caught within a TRY...CATCH block.

[% TRY %]
   [% USE File('/tmp/myfile') %]
   File exists!
[% CATCH File %]
   File error: [% error.info %]
[% END %]

Note the capitalisation of the exception type, 'File', to indicate an error thrown by the File plugin, to distinguish it from a regular file exception thrown by the Template Toolkit.

Note that the File plugin can also be referenced by the lower case name 'file'. However, exceptions are always thrown of the File type, regardless of the capitalisation of the plugin named used.

[% USE file('foo.html') %]
[% file.mtime %]

As with any other Template Toolkit plugin, an alternate name can be specified for the object created.

[% USE foo = file('foo.html') %]
[% foo.mtime %]

The nostat option can be specified to prevent the plugin constructor from performing a stat() on the file specified. In this case, the file does not have to exist in the file system, no attempt will be made to verify that it does, and no error will be thrown if it doesn't. The entries for the items usually returned by stat() will be set empty.

[% USE file('/some/where/over/the/rainbow.html', nostat=1) 
[% file.mtime %]     # nothing

METHODS

Top

All File plugins, regardless of the nostat option, have set a number of items relating to the original path specified.

path

Top

The full, original file path specified to the constructor.

[% USE file('/foo/bar.html') %]
[% file.path %]     # /foo/bar.html

name

Top

The name of the file without any leading directories.

[% USE file('/foo/bar.html') %]
[% file.name %]     # bar.html

dir

Top

The directory element of the path with the filename removed.

[% USE file('/foo/bar.html') %]
[% file.name %]     # /foo

ext

Top

The file extension, if any, appearing at the end of the path following a '.' (not included in the extension).

[% USE file('/foo/bar.html') %]
[% file.ext %]      # html

home

Top

This contains a string of the form '../..' to represent the upward path from a file to its root directory.

[% USE file('bar.html') %]
[% file.home %]     # nothing

[% USE file('foo/bar.html') %]
[% file.home %]     # ..

[% USE file('foo/bar/baz.html') %]
[% file.home %]     # ../..

root

Top

The root item can be specified as a constructor argument, indicating a root directory in which the named file resides. This is otherwise set empty.

[% USE file('foo/bar.html', root='/tmp') %]
[% file.root %]     # /tmp

abs

Top

This returns the absolute file path by constructing a path from the root and path options.

[% USE file('foo/bar.html', root='/tmp') %]
[% file.path %]     # foo/bar.html
[% file.root %]     # /tmp
[% file.abs %]      # /tmp/foo/bar.html

rel(path)

Top

This returns a relative path from the current file to another path specified as an argument. It is constructed by appending the path to the 'home' item.

[% USE file('foo/bar/baz.html') %]
[% file.rel('wiz/waz.html') %]      # ../../wiz/waz.html

EXAMPLES

Top
[% USE file('/foo/bar/baz.html') %]

[% file.path  %]      # /foo/bar/baz.html
[% file.dir   %]      # /foo/bar
[% file.name  %]      # baz.html
[% file.home  %]      # ../..
[% file.root  %]      # ''
[% file.abs   %]      # /foo/bar/baz.html
[% file.ext   %]      # html
[% file.mtime %]      # 987654321
[% file.atime %]      # 987654321
[% file.uid   %]      # 500
[% file.user  %]      # abw
[% USE file('foo.html') %]

[% file.path %]           # foo.html
[% file.dir  %]       # ''
[% file.name %]           # foo.html
[% file.root %]       # ''
[% file.home %]       # ''
[% file.abs  %]       # foo.html
[% USE file('foo/bar/baz.html') %]

[% file.path %]           # foo/bar/baz.html
[% file.dir  %]       # foo/bar
[% file.name %]           # baz.html
[% file.root %]       # ''
[% file.home %]       # ../..
[% file.abs  %]       # foo/bar/baz.html
[% USE file('foo/bar/baz.html', root='/tmp') %]

[% file.path %]           # foo/bar/baz.html
[% file.dir  %]       # foo/bar
[% file.name %]           # baz.html
[% file.root %]       # /tmp
[% file.home %]       # ../..
[% file.abs  %]       # /tmp/foo/bar/baz.html
# calculate other file paths relative to this file and its root
[% USE file('foo/bar/baz.html', root => '/tmp/tt2') %]

[% file.path('baz/qux.html') %]         # ../../baz/qux.html
[% file.dir('wiz/woz.html')  %]     # ../../wiz/woz.html

AUTHORS

Top

Michael Stevens wrote the original Directory plugin on which this is based. Andy Wardley split it into separate File and Directory plugins, added some extra code and documentation for VIEW support, and made a few other minor tweaks.

COPYRIGHT

Top

Copyright 2000-2007 Michael Stevens, Andy Wardley.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/File.html last modified 10:54:59 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/Filter.html000700 000765 000765 00000057227 10627515564 023207 0ustar00abwabw000000 000000 Template::Plugin::Filter

SYNOPSIS

Top
package MyOrg::Template::Plugin::MyFilter;

use Template::Plugin::Filter;
use base qw( Template::Plugin::Filter );

sub filter {
    my ($self, $text) = @_;

    # ...mungify $text...

    return $text;
}
# now load it...
[% USE MyFilter %]

# ...and use the returned object as a filter
[% FILTER $MyFilter %]
  ...
[% END %]

DESCRIPTION

Top

This module implements a base class for plugin filters. It hides the underlying complexity involved in creating and using filters that get defined and made available by loading a plugin.

To use the module, simply create your own plugin module that is inherited from the Template::Plugin::Filter class.

package MyOrg::Template::Plugin::MyFilter;

use Template::Plugin::Filter;
use base qw( Template::Plugin::Filter );

Then simply define your filter() method. When called, you get passed a reference to your plugin object ($self) and the text to be filtered.

sub filter {
    my ($self, $text) = @_;

    # ...mungify $text...

    return $text;
}

To use your custom plugin, you have to make sure that the Template Toolkit knows about your plugin namespace.

my $tt2 = Template->new({
    PLUGIN_BASE => 'MyOrg::Template::Plugin',
});

Or for individual plugins you can do it like this:

my $tt2 = Template->new({
    PLUGINS => {
        MyFilter => 'MyOrg::Template::Plugin::MyFilter',
    },
});

Then you USE your plugin in the normal way.

[% USE MyFilter %]

The object returned is stored in the variable of the same name, 'MyFilter'. When you come to use it as a FILTER, you should add a dollar prefix. This indicates that you want to use the filter stored in the variable 'MyFilter' rather than the filter named 'MyFilter', which is an entirely different thing (see later for information on defining filters by name).

[% FILTER $MyFilter %]
   ...text to be filtered...
[% END %]

You can, of course, assign it to a different variable.

[% USE blat = MyFilter %]

[% FILTER $blat %]
   ...text to be filtered...
[% END %]

Any configuration parameters passed to the plugin constructor from the USE directive are stored internally in the object for inspection by the filter() method (or indeed any other method). Positional arguments are stored as a reference to a list in the _ARGS item while named configuration parameters are stored as a reference to a hash array in the _CONFIG item.

For example, loading a plugin as shown here:

[% USE blat = MyFilter 'foo' 'bar' baz = 'blam' %]

would allow the filter() method to do something like this:

sub filter {
    my ($self, $text) = @_;

    my $args = $self->{ _ARGS   };  # [ 'foo', 'bar' ]
    my $conf = $self->{ _CONFIG };  # { baz => 'blam' }

    # ...munge $text...

    return $text;
}

By default, plugins derived from this module will create static filters. A static filter is created once when the plugin gets loaded via the USE directive and re-used for all subsequent FILTER operations. That means that any argument specified with the FILTER directive are ignored.

Dynamic filters, on the other hand, are re-created each time they are used by a FILTER directive. This allows them to act on any parameters passed from the FILTER directive and modify their behaviour accordingly.

There are two ways to create a dynamic filter. The first is to define a $DYNAMIC class variable set to a true value.

package MyOrg::Template::Plugin::MyFilter;
use base 'Template::Plugin::Filter';
our $DYNAMIC = 1;

The other way is to set the internal _DYNAMIC value within the init() method which gets called by the new() constructor.

sub init {
    my $self = shift;
    $self->{ _DYNAMIC } = 1;
    return $self;
}

When this is set to a true value, the plugin will automatically create a dynamic filter. The outcome is that the filter() method will now also get passed a reference to an array of postional arguments and a reference to a hash array of named parameters.

So, using a plugin filter like this:

[% FILTER $blat 'foo' 'bar' baz = 'blam' %]

would allow the filter() method to work like this:

sub filter {
    my ($self, $text, $args, $conf) = @_;

    # $args = [ 'foo', 'bar' ]
    # $conf = { baz => 'blam' }
}

In this case can pass parameters to both the USE and FILTER directives, so your filter() method should probably take that into account.

[% USE MyFilter 'foo' wiz => 'waz' %]

[% FILTER $MyFilter 'bar' biz => 'baz' %]
   ...
[% END %]

You can use the merge_args() and merge_config() methods to do a quick and easy job of merging the local (e.g. FILTER) parameters with the internal (e.g. USE) values and returning new sets of conglomerated data.

sub filter {
    my ($self, $text, $args, $conf) = @_;

    $args = $self->merge_args($args); 
    $conf = $self->merge_config($conf);

    # $args = [ 'foo', 'bar' ]      
    # $conf = { wiz => 'waz', biz => 'baz' }        
    ...
}

You can also have your plugin install itself as a named filter by calling the install_filter() method from the init() method. You should provide a name for the filter, something that you might like to make a configuration option.

sub init {
    my $self = shift;
    my $name = $self->{ _CONFIG }->{ name } || 'myfilter';
    $self->install_filter($name);
    return $self;
}

This allows the plugin filter to be used as follows:

[% USE MyFilter %]

[% FILTER myfilter %] 
   ... 
[% END %]

or

[% USE MyFilter name = 'swipe' %]

[% FILTER swipe %] 
   ... 
[% END %]

Alternately, you can allow a filter name to be specified as the first positional argument.

sub init {
    my $self = shift;
    my $name = $self->{ _ARGS }->[0] || 'myfilter';
    $self->install_filter($name);
    return $self;
}
[% USE MyFilter 'swipe' %]

[% FILTER swipe %]
   ...
[% END %]

EXAMPLE

Top

Here's a complete example of a plugin filter module.

package My::Template::Plugin::Change;
use Template::Plugin::Filter;
use base qw( Template::Plugin::Filter );

sub init {
    my $self = shift;

    $self->{ _DYNAMIC } = 1;

    # first arg can specify filter name
    $self->install_filter($self->{ _ARGS }->[0] || 'change');

    return $self;
}

sub filter {
    my ($self, $text, $args, $config) = @_;

    $config = $self->merge_config($config);
    my $regex = join('|', keys %$config);

    $text =~ s/($regex)/$config->{ $1 }/ge;

    return $text;
}

1;

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/Filter.html last modified 10:55:00 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/Format.html000700 000765 000765 00000033246 10627515564 023205 0ustar00abwabw000000 000000 Template::Plugin::Format

SYNOPSIS

Top
[% USE format %]
[% commented = format('# %s') %]
[% commented('The cat sat on the mat') %]

[% USE bold = format('<b>%s</b>') %]
[% bold('Hello') %]

DESCRIPTION

Top

The format plugin constructs sub-routines which format text according to a printf()-like format string.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/Format.html last modified 10:55:00 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/HTML.html000700 000765 000765 00000044315 10627515564 022520 0ustar00abwabw000000 000000 Template::Plugin::HTML

SYNOPSIS

Top
[% USE HTML %]

[% HTML.escape("if (a < b && c > d) ..." %]

[% HTML.element(table => { border => 1, cellpadding => 2 }) %]

[% HTML.attributes(border => 1, cellpadding => 2) %]

DESCRIPTION

Top

The HTML plugin is a very basic plugin, implementing a few useful methods for generating HTML.

METHODS

Top

escape(text)

Top

Returns the source text with any HTML reserved characters such as <, >, etc., correctly esacped to their entity equivalents.

attributes(hash)

Top

Returns the elements of the hash array passed by reference correctly formatted (e.g. values quoted and correctly escaped) as attributes for an HTML element.

element(type, attributes)

Top

Generates an HTML element of the specified type and with the attributes provided as an optional hash array reference as the second argument or as named arguments.

[% HTML.element(table => { border => 1, cellpadding => 2 }) %]
[% HTML.element('table', border=1, cellpadding=2) %]
[% HTML.element(table => attribs) %]

DEBUGGING

Top

The HTML plugin accepts a sorted option as a constructor argument which, when set to any true value, causes the attributes generated by the attributes() method (either directly or via element()) to be returned in sorted order. Order of attributes isn't important in HTML, but this is provided mainly for the purposes of debugging where it is useful to have attributes generated in a deterministic order rather than whatever order the hash happened to feel like returning the keys in.

[% USE HTML(sorted=1) %]
[% HTML.element( foo => { charlie => 1, bravo => 2, alpha => 3 } ) %]

generates:

<foo alpha="3" bravo="2" charlie="1">

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/HTML.html last modified 10:55:00 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/Image.html000700 000765 000765 00000072744 10627515565 023006 0ustar00abwabw000000 000000 Template::Plugin::Image

SYNOPSIS

Top
[% USE Image(filename) %]
[% Image.width %]
[% Image.height %]
[% Image.size.join(', ') %]
[% Image.attr %]
[% Image.tag %]

DESCRIPTION

Top

This plugin provides an interface to the Image::Info or Image::Size modules for determining the size of image files.

You can specify the plugin name as either 'Image' or 'image'. The plugin object created will then have the same name. The file name of the image should be specified as a positional or named argument.

[% # all these are valid, take your pick %]
[% USE Image('foo.gif') %]
[% USE image('bar.gif') %]
[% USE Image 'ping.gif' %]
[% USE image(name='baz.gif') %]
[% USE Image name='pong.gif' %]

A root parameter can be used to specify the location of the image file:

[% USE Image(root='/path/to/root', name='images/home.png') %]
# image path: /path/to/root/images/home.png
# img src: images/home.png

In cases where the image path and image url do not match up, specify the file name directly:

[% USE Image(file='/path/to/home.png', name='/images/home.png') %]

The alt parameter can be used to specify an alternate name for the image, for use in constructing an XHTML element (see the tag() method below).

[% USE Image('home.png', alt="Home") %]

You can also provide an alternate name for an Image plugin object.

[% USE img1 = image 'foo.gif' %]
[% USE img2 = image 'bar.gif' %]

The name method returns the image file name.

[% img1.name %]     # foo.gif

The width and height methods return the width and height of the image, respectively. The size method returns a reference to a 2 element list containing the width and height.

[% USE image 'foo.gif' %]
width: [% image.width %]
height: [% image.height %]
size: [% image.size.join(', ') %]

The modtime method returns the modification time of the file in question, suitable for use with the Date plugin, for example:

[% USE image 'foo.gif' %]
[% USE date %]
[% date.format(image.modtime, "%B, %e %Y") %]

The attr method returns the height and width as HTML/XML attributes.

[% USE image 'foo.gif' %]
[% image.attr %]

Typical output:

width="60" height="20"

The tag method returns a complete XHTML tag referencing the image.

[% USE image 'foo.gif' %]
[% image.tag %]

Typical output:

<img src="foo.gif" width="60" height="20" alt="" />

You can provide any additional attributes that should be added to the XHTML tag.

[% USE image 'foo.gif' %]
[% image.tag(class="logo" alt="Logo") %]

Typical output:

<img src="foo.gif" width="60" height="20" alt="Logo" class="logo" />

Note that the alt attribute is mandatory in a strict XHTML img element (even if it's empty) so it is always added even if you don't explicitly provide a value for it. You can do so as an argument to the tag method, as shown in the previous example, or as an argument

[% USE image('foo.gif', alt='Logo') %]

CATCHING ERRORS

Top

If the image file cannot be found then the above methods will throw an Image error. You can enclose calls to these methods in a TRY...CATCH block to catch any potential errors.

[% TRY;
     image.width;
   CATCH;
     error;      # print error
   END
%]

USING Image::Info

Top

At run time, the plugin tries to load Image::Info in preference to Image::Size. If Image::Info is found, then some additional methods are available, in addition to size, width, height, attr, and tag. These additional methods are named after the elements that Image::Info retrieves from the image itself. The types of methods available depend on the type of image (see Image::Info for more details). These additional methods will always include the following:

file_media_type

Top

This is the MIME type that is appropriate for the given file format. The corresponding value is a string like: "image/png" or "image/jpeg".

file_ext

Top

The is the suggested file name extention for a file of the given file format. The value is a 3 letter, lowercase string like "png", "jpg".

color_type

Top

The value is a short string describing what kind of values the pixels encode. The value can be one of the following:

Gray
GrayA
RGB
RGBA
CMYK
YCbCr
CIELab

These names can also be prefixed by "Indexed-" if the image is composed of indexes into a palette. Of these, only "Indexed-RGB" is likely to occur.

(It is similar to the TIFF field PhotometricInterpretation, but this name was found to be too long, so we used the PNG inpired term instead.)

resolution

Top

The value of this field normally gives the physical size of the image on screen or paper. When the unit specifier is missing then this field denotes the squareness of pixels in the image.

The syntax of this field is:

<res> <unit>
<xres> "/" <yres> <unit>
<xres> "/" <yres>

The <res>, <xres> and <yres> fields are numbers. The <unit> is a string like dpi, dpm or dpcm (denoting "dots per inch/cm/meter).

SamplesPerPixel

Top

This says how many channels there are in the image. For some image formats this number might be higher than the number implied from the color_type.

BitsPerSample

Top

This says how many bits are used to encode each of samples. The value is a reference to an array containing numbers. The number of elements in the array should be the same as SamplesPerPixel.

Comment

Top

Textual comments found in the file. The value is a reference to an array if there are multiple comments found.

Interlace

Top

If the image is interlaced, then this returns the interlace type.

Compression

Top

This returns the name of the compression algorithm is used.

Gamma

Top

A number indicating the gamma curve of the image (e.g. 2.2)

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/Image.html last modified 10:55:01 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/index.html000700 000765 000765 00000032453 10627515565 023064 0ustar00abwabw000000 000000 Template::Plugin::* Modules

Section Index

Top

This section contains the documentation for the Template::Plugin::* modules.


/modules/Template/Plugin/index.html last modified 10:55:01 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/Iterator.html000700 000765 000765 00000034051 10627515566 023543 0ustar00abwabw000000 000000 Template::Plugin::Iterator

SYNOPSIS

Top
[% USE iterator(list, args) %]

[% FOREACH item = iterator %]
   [% '<ul>' IF iterator.first %]
   <li>[% item %]
   [% '</ul>' IF iterator.last %]
[% END %]

DESCRIPTION

Top

The iterator plugin provides a way to create a Template::Iterator object to iterate over a data set. An iterator is implicitly automatically by the FOREACH directive. This plugin allows the iterator to be explicitly created with a given name.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/Iterator.html last modified 10:55:02 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/List.html000700 000765 000765 00000017626 10626336425 022670 0ustar00abwabw000000 000000 Template Toolkit Documentation

Contents

Top

TT_v224_html_docs/old/modules/Template/Plugin/Math.html000700 000765 000765 00000045224 10627515566 022647 0ustar00abwabw000000 000000 Template::Plugin::Math

SYNOPSIS

Top
[% USE Math %]
[% Math.sqrt(9) %]

DESCRIPTION

Top

The Math plugin provides numerous mathematical functions for use within templates.

METHODS

Top

Template::Plugin::Math makes available the following functions from the Perl core:

  • abs
  • atan2
  • cos
  • exp
  • hex
  • int
  • log
  • oct
  • rand
  • sin
  • sqrt
  • srand

In addition, if the Math::Trig module can be loaded, the following functions are also available:

  • pi
  • tan
  • csc
  • cosec
  • sec
  • cot
  • cotan
  • asin
  • acos
  • atan
  • acsc
  • acosec
  • asec
  • acot
  • acotan
  • sinh
  • cosh
  • tanh
  • csch
  • cosech
  • sech
  • coth
  • cotanh
  • asinh
  • acosh
  • atanh
  • acsch
  • acosech
  • asech
  • acoth
  • acotanh
  • rad2deg
  • rad2grad
  • deg2rad
  • deg2grad
  • grad2rad
  • grad2deg

If the Math::TrulyRandom module is available, and you've got the time to wait, the truly_random_number method is available:

[% Math.truly_random_number %]

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/Math.html last modified 10:55:02 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/Pod.html000700 000765 000765 00000033354 10627515567 022502 0ustar00abwabw000000 000000 Template::Plugin::Pod

SYNOPSIS

Top
[% USE Pod(podfile) %]

[% FOREACH head1 = Pod.head1;
     FOREACH head2 = head1/head2;
       ...
     END;
   END
%]

DESCRIPTION

Top

This plugin is an interface to the Pod::POM module.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/Pod.html last modified 10:55:03 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/Procedural.html000700 000765 000765 00000035471 10627515567 024062 0ustar00abwabw000000 000000 Template::Plugin::Procedural

SYNOPSIS

Top
package Template::Plugin::LWPSimple;
use base qw(Template::Plugin::Procedural);
use LWP::Simple;  # exports 'get'
1;
[% USE LWPSimple %]
[% LWPSimple.get("http://www.tt2.org/") %]

DESCRIPTION

Top

Template::Plugin::Procedural is a base class for Template Toolkit plugins that causes defined subroutines to be called directly rather than as a method. Essentially this means that subroutines will not receive the class name or object as its first argument.

This is most useful when creating plugins for modules that normally work by exporting subroutines that do not expect such additional arguments.

Despite the fact that subroutines will not be called in an OO manner, inheritance still function as normal. A class that uses Template::Plugin::Procedural can be subclassed and both subroutines defined in the subclass and subroutines defined in the original class will be available to the Template Toolkit and will be called without the class/object argument.

AUTHOR

Top

Mark Fowler <mark@twoshortplanks.com> http://www.twoshortplanks.com

COPYRIGHT

Top

Copyright (C) 2002 Mark Fowler <mark@twoshortplanks.com>

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/Procedural.html last modified 10:55:03 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/String.html000700 000765 000765 00000125543 10627515570 023222 0ustar00abwabw000000 000000 Template::Plugin::String

SYNOPSIS

Top
# create String objects via USE directive
[% USE String %]
[% USE String 'initial text' %]
[% USE String text => 'initial text' %]
# or from an existing String via new()
[% newstring = String.new %]
[% newstring = String.new('newstring text') %]
[% newstring = String.new( text => 'newstring text' ) %]
# or from an existing String via copy()
[% newstring = String.copy %]
# append text to string
[% String.append('text to append') %]
# format left, right or center/centre padded
[% String.left(20) %]
[% String.right(20) %]
[% String.center(20) %]   # American spelling
[% String.centre(20) %]   # European spelling
# and various other methods...

DESCRIPTION

Top

This module implements a String class for doing stringy things to text in an object-oriented way.

You can create a String object via the USE directive, adding any initial text value as an argument or as the named parameter text.

[% USE String %]
[% USE String 'initial text' %]
[% USE String text='initial text' %]

The object created will be referenced as String by default, but you can provide a different variable name for the object to be assigned to:

[% USE greeting = String 'Hello World' %]

Once you've got a String object, you can use it as a prototype to create other String objects with the new() method.

[% USE String %]
[% greeting = String.new('Hello World') %]

The new() method also accepts an initial text string as an argument or the named parameter text.

[% greeting = String.new( text => 'Hello World' ) %]

You can also call copy() to create a new String as a copy of the original.

[% greet2 = greeting.copy %]

The String object has a text() method to return the content of the string.

[% greeting.text %]

However, it is sufficient to simply print the string and let the overloaded stringification operator call the text() method automatically for you.

[% greeting %]

Thus, you can treat String objects pretty much like any regular piece of text, interpolating it into other strings, for example:

[% msg = "It printed '$greeting' and then dumped core\n" %]

You also have the benefit of numerous other methods for manipulating the string.

[% msg.append("PS  Don't eat the yellow snow") %]

Note that all methods operate on and mutate the contents of the string itself. If you want to operate on a copy of the string then simply take a copy first:

[% msg.copy.append("PS  Don't eat the yellow snow") %]

These methods return a reference to the String object itself. This allows you to chain multiple methods together.

[% msg.copy.append('foo').right(72) %]

It also means that in the above examples, the String is returned which causes the text() method to be called, which results in the new value of the string being printed. To suppress printing of the string, you can use the CALL directive.

[% foo = String.new('foo') %]

[% foo.append('bar') %]         # prints "foobar"

[% CALL foo.append('bar') %]    # nothing

CONSTRUCTOR METHODS

Top

These methods are used to create new String objects.

new()

Top

Creates a new string using an initial value passed as a positional argument or the named parameter text.

[% USE String %]
[% msg = String.new('Hello World') %]
[% msg = String.new( text => 'Hello World' ) %]

copy()

Top

Creates a new String object which contains a copy of the original string.

[% msg2 = msg.copy %]

INSPECTOR METHODS

Top

These methods are used to examine the string.

text()

Top

Returns the internal text value of the string. The stringification operator is overloaded to call this method. Thus the following are equivalent:

[% msg.text %]
[% msg %]

length()

Top

Returns the length of the string.

[% USE String("foo") %]
[% String.length %]   # => 3
Top

Searches the string for the regular expression specified in $pattern returning true if found or false otherwise.

[% item = String.new('foo bar baz wiz waz woz') %]
[% item.search('wiz') ? 'WIZZY! :-)' : 'not wizzy :-(' %]

split($pattern, $limit)

Top

Splits the string based on the delimiter $pattern and optional $limit. Delegates to Perl's internal split() so the parameters are exactly the same.

[% FOREACH item.split %]
     ...
[% END %]
[% FOREACH item.split('baz|waz') %]
     ...
[% END %]

MUTATOR METHODS

Top

These methods modify the internal value of the string. For example:

[% USE str=String('foobar') %]
[% str.append('.html') %]   # str => 'foobar.html'

The value of str is now 'foobar.html'. If you don't want to modify the string then simply take a copy first.

[% str.copy.append('.html') %]

These methods all return a reference to the String object itself. This has two important benefits. The first is that when used as above, the String object 'str' returned by the append() method will be stringified with a call to its text() method. This will return the newly modified string content. In other words, a directive like:

[% str.append('.html') %]

will update the string and also print the new value. If you just want to update the string but not print the new value then use CALL.

[% CALL str.append('.html') %]

The other benefit of these methods returning a reference to the String is that you can chain as many different method calls together as you like. For example:

[% String.append('.html').trim.format(href) %]

Here are the methods:

push($suffix, ...) / append($suffix, ...)

Top

Appends all arguments to the end of the string. The append() method is provided as an alias for push().

[% msg.push('foo', 'bar') %]
[% msg.append('foo', 'bar') %]

pop($suffix)

Top

Removes the suffix passed as an argument from the end of the String.

[% USE String 'foo bar' %]
[% String.pop(' bar')   %]   # => 'foo'

unshift($prefix, ...) / prepend($prefix, ...)

Top

Prepends all arguments to the beginning of the string. The prepend() method is provided as an alias for unshift().

[% msg.unshift('foo ', 'bar ') %]
[% msg.prepend('foo ', 'bar ') %]

shift($prefix)

Top

Removes the prefix passed as an argument from the start of the String.

[% USE String 'foo bar' %]
[% String.shift('foo ') %]   # => 'bar'

left($pad)

Top

If the length of the string is less than $pad then the string is left formatted and padded with spaces to $pad length.

[% msg.left(20) %]

right($pad)

Top

As per left() but right padding the String to a length of $pad.

[% msg.right(20) %]

center($pad) / centre($pad)

Top

As per left() and right() but formatting the String to be centered within a space padded string of length $pad. The centre() method is provided as an alias for center().

[% msg.center(20) %]    # American spelling
[% msg.centre(20) %]    # European spelling

format($format)

Top

Apply a format in the style of sprintf() to the string.

[% USE String("world") %]
[% String.format("Hello %s\n") %]  # => "Hello World\n"

upper()

Top

Converts the string to upper case.

[% USE String("foo") %]
[% String.upper %]  # => 'FOO'

lower()

Top

Converts the string to lower case

[% USE String("FOO") %]
[% String.lower %]  # => 'foo'

capital()

Top

Converts the first character of the string to upper case.

[% USE String("foo") %]
[% String.capital %]  # => 'Foo'

The remainder of the string is left untouched. To force the string to be all lower case with only the first letter capitalised, you can do something like this:

[% USE String("FOO") %]
[% String.lower.capital %]  # => 'Foo'

chop()

Top

Removes the last character from the string.

[% USE String("foop") %]
[% String.chop %]   # => 'foo'

chomp()

Top

Removes the trailing newline from the string.

[% USE String("foo\n") %]
[% String.chomp %]  # => 'foo'

trim()

Top

Removes all leading and trailing whitespace from the string

[% USE String("   foo   \n\n ") %]
[% String.trim %]   # => 'foo'

collapse()

Top

Removes all leading and trailing whitespace and collapses any sequences of multiple whitespace to a single space.

[% USE String(" \n\r  \t  foo   \n \n bar  \n") %]
[% String.collapse %]   # => "foo bar"

truncate($length, $suffix)

Top

Truncates the string to $length characters.

[% USE String('long string') %]
[% String.truncate(4) %]  # => 'long'

If $suffix is specified then it will be appended to the truncated string. In this case, the string will be further shortened by the length of the suffix to ensure that the newly constructed string complete with suffix is exactly $length characters long.

[% USE msg = String('Hello World') %]
[% msg.truncate(8, '...') %]   # => 'Hello...'

replace($search, $replace)

Top

Replaces all occurences of $search in the string with $replace.

[% USE String('foo bar foo baz') %]
[% String.replace('foo', 'wiz')  %]  # => 'wiz bar wiz baz'

remove($search)

Top

Remove all occurences of $search in the string.

[% USE String('foo bar foo baz') %]
[% String.remove('foo ')  %]  # => 'bar baz'

repeat($count)

Top

Repeats the string $count times.

[% USE String('foo ') %]
[% String.repeat(3)  %]  # => 'foo foo foo '

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/String.html last modified 10:55:04 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/Table.html000700 000765 000765 00000052606 10627515570 023002 0ustar00abwabw000000 000000 Template::Plugin::Table

SYNOPSIS

Top
[% USE table(list, rows=n, cols=n, overlap=n, pad=0) %]

[% FOREACH item IN table.row(n) %]
   [% item %]
[% END %]

[% FOREACH item IN table.col(n) %]
   [% item %]
[% END %]

[% FOREACH row IN table.rows %]
   [% FOREACH item IN row %]
      [% item %]
   [% END %]
[% END %]

[% FOREACH col IN table.cols %]
   [% col.first %] - [% col.last %] ([% col.size %] entries)
[% END %]

DESCRIPTION

Top

The Table plugin allows you to format a list of data items into a virtual table. When you create a Table plugin via the USE directive, simply pass a list reference as the first parameter and then specify a fixed number of rows or columns.

[% USE Table(list, rows=5) %]
[% USE table(list, cols=5) %]

The Table plugin name can also be specified in lower case as shown in the second example above. You can also specify an alternative variable name for the plugin as per regular Template Toolkit syntax.

[% USE mydata = table(list, rows=5) %]

The plugin then presents a table based view on the data set. The data isn't actually reorganised in any way but is available via the row(), col(), rows() and cols() as if formatted into a simple two dimensional table of n rows x n columns.

So if we had a sample alphabet list contained the letters 'a' to 'z', the above USE directives would create plugins that represented the following views of the alphabet.

[% USE table(alphabet, ... %]

rows=5                  cols=5
a  f  k  p  u  z        a  g  m  s  y
b  g  l  q  v           b  h  n  t  z
c  h  m  r  w           c  i  o  u
d  i  n  s  x           d  j  p  v
e  j  o  t  y           e  k  q  w
                        f  l  r  x

We can request a particular row or column using the row() and col() methods.

[% USE table(alphabet, rows=5) %]
[% FOREACH item = table.row(0) %]
   # [% item %] set to each of [ a f k p u z ] in turn
[% END %]

[% FOREACH item = table.col(2) %]
   # [% item %] set to each of [ m n o p q r ] in turn
[% END %]

Data in rows is returned from left to right, columns from top to bottom. The first row/column is 0. By default, rows or columns that contain empty values will be padded with the undefined value to fill it to the same size as all other rows or columns.

For example, the last row (row 4) in the first example would contain the values [ e j o t y undef ]. The Template Toolkit will safely accept these undefined values and print a empty string. You can also use the IF directive to test if the value is set.

 [% FOREACH item = table.row(4) %]
[% IF item %]
   Item: [% item %]
[% END %]
 [% END %]

You can explicitly disable the pad option when creating the plugin to returned shortened rows/columns where the data is empty.

 [% USE table(alphabet, cols=5, pad=0) %]
 [% FOREACH item = table.col(4) %]
# [% item %] set to each of 'y z'
 [% END %]

The rows() method returns all rows/columns in the table as a reference to a list of rows (themselves list references). The row() methods when called without any arguments calls rows() to return all rows in the table.

Ditto for cols() and col().

[% USE table(alphabet, cols=5) %]
[% FOREACH row = table.rows %]
   [% FOREACH item = row %]
      [% item %]
   [% END %]
[% END %]

The Template Toolkit provides the first, last and size virtual methods that can be called on list references to return the first/last entry or the number of entries in a list. The following example shows how we might use this to provide an alphabetical index split into 3 even parts.

[% USE table(alphabet, cols=3, pad=0) %]
[% FOREACH group = table.col %]
   [ [% group.first %] - [% group.last %] ([% group.size %] letters) ]
[% END %]

This produces the following output:

[ a - i (9 letters) ]
[ j - r (9 letters) ]
[ s - z (8 letters) ]

We can also use the general purpose join virtual method which joins the items of the list using the connecting string specified.

[% USE table(alphabet, cols=5) %]
[% FOREACH row = table.rows %]
   [% row.join(' - ') %]
[% END %]

Data in the table is ordered downwards rather than across but can easily be transformed on output. For example, to format our data in 5 columns with data ordered across rather than down, we specify rows=5 to order the data as such:

a  f  .  .
b  g  .
c  h
d  i
e  j

and then iterate down through each column (a-e, f-j, etc.) printing the data across.

a  b  c  d  e
f  g  h  i  j
.  .
.

Example code to do so would be much like the following:

[% USE table(alphabet, rows=3) %]
[% FOREACH cols = table.cols %]
  [% FOREACH item = cols %]
    [% item %]
  [% END %]
[% END %]

Output:

a  b  c
d  e  f
g  h  i
j  .  .
.

In addition to a list reference, the Table plugin constructor may be passed a reference to a Template::Iterator object or subclass thereof. The Template::Iterator get_all() method is first called on the iterator to return all remaining items. These are then available via the usual Table interface.

[% USE DBI(dsn,user,pass) -%]

# query() returns an iterator
[% results = DBI.query('SELECT * FROM alphabet ORDER BY letter') %]
# pass into Table plugin
[% USE table(results, rows=8 overlap=1 pad=0) -%]

[% FOREACH row = table.cols -%]
   [% row.first.letter %] - [% row.last.letter %]:
      [% row.join(', ') %]
[% END %]

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/Table.html last modified 10:55:04 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/URL.html000700 000765 000765 00000043301 10627515571 022406 0ustar00abwabw000000 000000 Template::Plugin::URL

SYNOPSIS

Top
[% USE url('/cgi-bin/foo.pl') %]

[% url(debug = 1, id = 123) %]
   # ==> /cgi/bin/foo.pl?debug=1&amp;id=123
[% USE mycgi = url('/cgi-bin/bar.pl', mode='browse', debug=1) %]

[% mycgi %]
   # ==> /cgi/bin/bar.pl?mode=browse&amp;debug=1

[% mycgi(mode='submit') %]
   # ==> /cgi/bin/bar.pl?mode=submit&amp;debug=1

[% mycgi(debug='d2 p0', id='D4-2k[4]') %]
   # ==> /cgi-bin/bar.pl?mode=browse&amp;debug=d2%20p0&amp;id=D4-2k%5B4%5D

DESCRIPTION

Top

The URL plugin can be used to construct complex URLs from a base stem and a hash array of additional query parameters.

The constructor should be passed a base URL and optionally, a hash array reference of default parameters and values. Used from with a template, it would look something like the following:

[% USE url('http://www.somewhere.com/cgi-bin/foo.pl') %]
[% USE url('/cgi-bin/bar.pl', mode='browse') %]
[% USE url('/cgi-bin/baz.pl', mode='browse', debug=1) %]

When the plugin is then called without any arguments, the default base and parameters are returned as a formatted query string.

[% url %]

For the above three examples, these will produce the following outputs:

http://www.somewhere.com/cgi-bin/foo.pl
/cgi-bin/bar.pl?mode=browse
/cgi-bin/baz.pl?mode=browse&amp;debug=1

Note that additional parameters are separated by '&amp;' rather than simply '&'. This is the correct behaviour for HTML pages but is, unfortunately, incorrect when creating URLs that do not need to be encoded safely for HTML. This is likely to be corrected in a future version of the plugin (most probably with TT3). In the mean time, you can set $Template::Plugin::URL::JOINT to & to get the correct behaviour.

Additional parameters may be also be specified to the URL:

[% url(mode='submit', id='wiz') %]

Which, for the same three examples, produces:

http://www.somewhere.com/cgi-bin/foo.pl?mode=submit&amp;id=wiz
/cgi-bin/bar.pl?mode=browse&amp;id=wiz
/cgi-bin/baz.pl?mode=browse&amp;debug=1&amp;id=wiz

A new base URL may also be specified as the first option:

[% url('/cgi-bin/waz.pl', test=1) %]

producing

/cgi-bin/waz.pl?test=1
/cgi-bin/waz.pl?mode=browse&amp;test=1
/cgi-bin/waz.pl?mode=browse&amp;debug=1&amp;test=1

The ordering of the parameters is non-deterministic due to fact that Perl's hashes themselves are unordered. This isn't a problem as the ordering of CGI parameters is insignificant (to the best of my knowledge). All values will be properly escaped thanks to some code borrowed from Lincoln Stein's CGI module. e.g.

[% USE url('/cgi-bin/woz.pl') %]
[% url(name="Elrich von Benjy d'Weiro") %]

Here the spaces and "'" character are escaped in the output:

/cgi-bin/woz.pl?name=Elrich%20von%20Benjy%20d%27Weiro

An alternate name may be provided for the plugin at construction time as per regular Template Toolkit syntax.

[% USE mycgi = url('cgi-bin/min.pl') %]
[% mycgi(debug=1) %]

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/URL.html last modified 10:55:05 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/View.html000700 000765 000765 00000034671 10627515571 022670 0ustar00abwabw000000 000000 Template::Plugin::View

SYNOPSIS

Top
[% USE view(
        prefix = 'splash/'          # template prefix/suffix
        suffix = '.tt2'             
        bgcol  = '#ffffff'          # and any other variables you 
        style  = 'Fancy HTML'       # care to define as view metadata,
        items  = [ foo, bar.baz ]   # including complex data and
        foo    = bar ? baz : x.y.z  # expressions
%]

[% view.title %]                    # access view metadata

[% view.header(title = 'Foo!') %]   # view "methods" process blocks or
[% view.footer %]                   # templates with prefix/suffix added

DESCRIPTION

Top

This plugin module creates Template::View objects. Views are an experimental feature and are subject to change in the near future. In the mean time, please consult Template::View for further info.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/View.html last modified 10:55:05 31-May-2007
TT_v224_html_docs/old/modules/Template/Plugin/Wrap.html000700 000765 000765 00000037407 10627515571 022667 0ustar00abwabw000000 000000 Template::Plugin::Wrap

SYNOPSIS

Top
[% USE wrap %]

# call wrap subroutine
[% wrap(mytext, width, initial_tab,  subsequent_tab) %]

# or use wrap FILTER
[% mytext FILTER wrap(width, initital_tab, subsequent_tab) %]

DESCRIPTION

Top

This plugin provides an interface to the Text::Wrap module which provides simple paragraph formatting.

It defines a wrap subroutine which can be called, passing the input text and further optional parameters to specify the page width (default: 72), and tab characters for the first and subsequent lines (no defaults).

[% USE wrap %]

[% text = BLOCK %]
First, attach the transmutex multiplier to the cross-wired 
quantum homogeniser.
[% END %]

[% wrap(text, 40, '* ', '  ') %]

Output:

* First, attach the transmutex
  multiplier to the cross-wired quantum
  homogeniser.

It also registers a wrap filter which accepts the same three optional arguments but takes the input text directly via the filter input.

Example 1:

[% FILTER bullet = wrap(40, '* ', '  ') -%]
First, attach the transmutex multiplier to the cross-wired quantum
homogeniser.
[%- END %]

Output:

* First, attach the transmutex
  multiplier to the cross-wired quantum
  homogeniser.

Example 2:

[% FILTER bullet -%]
Then remodulate the shield to match the harmonic frequency, taking 
care to correct the phase difference.
[% END %]

Output:

* Then remodulate the shield to match
  the harmonic frequency, taking 
  care to correct the phase difference.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

The Text::Wrap module was written by David Muir Sharnoff with help from Tim Pierce and many others.

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Plugin/Wrap.html last modified 10:55:05 31-May-2007
TT_v224_html_docs/old/modules/Template/Namespace/Constants.html000700 000765 000765 00000034171 10627515557 024367 0ustar00abwabw000000 000000 Template::Namespace::Constants

SYNOPSIS

Top
# easy way to define constants
use Template;

my $tt = Template->new({
    CONSTANTS => {
        pi => 3.14,
        e  => 2.718,
    },
});
# nitty-gritty, hands-dirty way
use Template::Namespace::Constants;

my $tt = Template->new({
    NAMESPACE => {
        constants => Template::Namespace::Constants->new({
            pi => 3.14,
            e  => 2.718,
        },
    },
});

DESCRIPTION

Top

The Template::Namespace::Constants module implements a namespace handler which is plugged into the Template::Directive compiler module. This then performs compile time constant folding of variables in a particular namespace.

METHODS

Top

new(\%constants)

Top

The new() constructor method creates and returns a reference to a new Template::Namespace::Constants object. This creates an internal stash to store the constant variable definitions passed as arguments.

my $handler = Template::Namespace::Constants->new({
    pi => 3.14,
    e  => 2.718,
});

ident(\@ident)

Top

Method called to resolve a variable identifier into a compiled form. In this case, the method fetches the corresponding constant value from its internal stash and returns it.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/modules/Template/Namespace/Constants.html last modified 10:54:55 31-May-2007
TT_v224_html_docs/old/modules/Template/Namespace/index.html000700 000765 000765 00000021056 10627515557 023520 0ustar00abwabw000000 000000 Template::Namespace::* Modules

Section Index

Top

This section contains the documentation for the Template::Namespace::* modules.


/modules/Template/Namespace/index.html last modified 10:54:55 31-May-2007
TT_v224_html_docs/old/misc/FAQ.html000700 000765 000765 00000070033 10627516030 016616 0ustar00abwabw000000 000000 Template::FAQ

DESCRIPTION

Top

Template Toolkit Language

Top

Why doesn't [% a = b IF c %] work as expected?

Top

Because the parser interprets it as

[% a = (b IF c) %]

Do this instead:

[% SET a = b IF c %]

If I'm using TT to write out a TT template, is there a good way to escape [% and %]?

Top

You can do this: [% stag = "[\%" etag = "%\]" %] and then: [% stag; 'hello'; etag %]

Or something like:

[% TAGS [- -] %]
[- INCLUDE foo -]   # is a directive
[% INCLUDE foo %]   # not a directive, just plain text, passed through

How do I iterate over a hash?

Top

This is covered in the Template::Manual::VMethods section of the manual page. A list of all the keys that are in the hash can be obtained with the 'keys' virtual method. You can then iterate over that list and by looking up each key in turn get the value.

[% FOREACH key = product.keys %]
   [% key %] => [% product.$key %]
[% END %]

Plugins

Top

How do I get the Table plugin to order data across rather than down?

Top

Order the data into rows:

 Steve     Karen     Jeff
 Brooklyn  Nantucket Fairfax
 NY        MA        VA

[% USE table(data, rows=3) %]

Then ask for each column

[% FOREACH column = table.cols %]

And then print each item in the column going across the output rows

[% FOREACH item = column %]
<td>[% item %]</td>
[% END %]

Accessing Cookies

Top

Jeff Boes <jboes@nexcerpt.com> asks:

Does anyone have a quick-n-dirty approach to accessing 
cookies from templates? 

Jonas Liljegren answers:

[% USE CGI %]

<p>The value is [% CGI.cookie('cookie_name') | html %]

Extending the Template Toolkit

Top

Can I serve templates from a database?

Top

Short answer: yes, Chris Nandor has done this for Slash. You need to subclass Template::Provider. See the mailing list archives for further info.

Can I fetch templates via http?

Top

To do the job properly, you should sublcass Template::Provider to Template::Provider::HTTP and use a PREFIX_MAP option to bind the 'http' template prefix to that particular provider (you may want to go digging around in the Changes file around version 2.01 for more info on PREFIX_MAP - it may not be properly documented anywhere else...yet!). e.g. (untested due to lack of existing HTTP Provider - patches welcome!).

use Template::Provider::HTTP;
my $file = Template::Provider( INCLUDE_PATH => [...] );
my $http = Template::Provider::HTTP->new(...);
my $tt2  = Template->new({
LOAD_TEMPLATES => [ $file, $http ],
PREFIX_MAP => {
    file    => '0',    # file:foo.html
    http    => '1',    # http:foo.html
    default => '0',    # foo.html => file:foo.html
}
});

Now a template specified as:

[% INCLUDE foo %]

will be served by the 'file' provider (the default). Otherwise you can explicitly add a prefix:

[% INCLUDE file:foo.html %]
[% INCLUDE http:foo.html %]
[% INCLUDE http://www.xyz.com/tt2/header.tt2 %]

This same principal can be used to create a DBI template provider. e.g.

[% INCLUDE dbi:foo.html %]

But similarly, alas, we don't yet have a DBI provider as part of the Template Toolkit. There has been some talk on the mailing list about efforts to develop DBI and/or HTTP providers but as yet no-one has stepped forward to take up the challenge...

In the mean time, Craig's post from the mailing list has some useful pointers on how to acheive this using existing modules:

To: Adam Theo <adamtheo@theoretic.com> 
From: Craig Barratt <craig@arraycomm.com>
Date: Fri, 18 May 2001 17:06:59 -0700

> i was wondering if there is anyway to fetch a file using http:// or
> ftp:// and include that?

Here's one way.  Set the LOAD_PERL option:

    use Template;

    my $template = Template->new({  
        LOAD_PERL => 1
    });  
    $template->process("example.tt", { stdout => *STDOUT })
                     || die $template->error();

and then use LWP::UserAgent and HTTP::Request:

    [% 
        USE ua = LWP.UserAgent; 
        ua.proxy("http", "http://your_proxy/");
        USE req = HTTP.Request("GET", "http://www.cpan.org");
        ua.request(req).content;
    -%]

For FTP use Net::FTP:

    [%   
        USE ftp = Net.FTP("ftp.cpan.org");
        x = ftp.login("anonymous", "me@here.there");
        x = ftp.cwd("/");
        x = ftp.get("welcome.msg", stdout);
        x = ftp.quit;
    -%]

Normally ftp.get would write the file into the current directory.
Instead we pass stdout as a second argument so that it is written
to stdout.  We set stdout to STDOUT in the variables we pass to
process. 

Craig

Miscellaneous

Top

How can I find out the name of the main template being processed?

Top

The template variable contains a reference to the Template::Document object for the main template you're processing (i.e. the one provided as the first argument to the Template process() method). The name method returns its name.

[% template.name %]     # e.g. index.html

How can I find out the name of the current template being processed?

Top

The template variable always references the main template being processed. So even if you call [% INCLUDE header %], and that calls [% INCLUDE menu %], the template variable will be unchanged.

index.html:

[% template.name  %]     # index.html
[% INCLUDE header %]

header:

[% template.name  %]     # index.html
[% INCLUDE menu   %]

menu:

[% template.name  %]     # index.html

In constrast, the component variable always references the current template being processed.

index.html

[% component.name %]     # index.html
[% INCLUDE header %]

header:

[% component.name %]     # header
[% INCLUDE menu   %]

menu:

[% component.name  %]     # menu

How do I print the modification time of the template or component?

Top

The template and component variables reference the main template and the current template being processed (see previous questions). The modtime method returns the modification time of the corresponding template file as a number of seconds since the Unix epoch (00:00:00 GMT 1st January 1970).

This number doesn't mean much to anyone (except perhaps serious Unix geeks) so you'll probably want to use the Date plugin to format it for human consumption.

[% USE Date %]
[% template.name %] last modified [% Date.format(template.modtime) %]

How can I configure variables on a per-request basis?

Top

One easy way to acheive this is to define a single PRE_PROCESS template which loads in other configuration files based on variables defined or other conditions.

For example, my setup usually looks something like this:

PRE_PROCESS => 'config/main'

config/main:

[%  DEFAULT  style   = 'text'
             section =  template.section or 'home';
    PROCESS  config/site
          +  config/urls
          +  config/macros
          + "config/style/$style"
          + "config/section/$section"
          + ...
%]

This allows me to set a single 'style' variable to control which config file gets pre-processed to set my various style options (colours, img paths, etc). For example:

config/style/basic:

[%  style = {
    name = style    # save existing 'style' var as 'style.name'
# define various other style variables....
    col = {
    back => '#ffffff'
    text => '#000000'
    # ...etc...
}
logo = {
    # ...etc...
}
    # ...etc...
}
%]

Each source template can declare which section it's in via a META directive:

[% META
 title   = 'General Information'
 section = 'info'
%]
...

This controls which section configuration file gets loaded to set various other variables for defining the section title, menu, etc.

config/section/info:

[%  section = {
        name   = section  # save 'section' var as 'section.name'
        title  = 'Information'
        menu   = [ ... ]
        # ...etc...
    }
%]

This illustrates the basic principal but you can extend it to perform pretty much any kind of per-document initialisation that you require.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/misc/FAQ.html last modified 10:57:44 31-May-2007
TT_v224_html_docs/old/misc/Library/000700 000765 000765 00000000000 11756705152 016730 5ustar00abwabw000000 000000 TT_v224_html_docs/old/misc/Toolkit.html000700 000765 000765 00000011073 10615612406 017634 0ustar00abwabw000000 000000 Template Toolkit Documentation

Template::Toolkit

Template processing system

SYNOPSIS

$ perldoc Template              # docs for the Template Perl module
$ perldoc Template::Manual      # Template Toolkit manual

DESCRIPTION

The Template Toolkit is a collection of Perl modules which implement a fast, flexible, powerful and extensible template processing system.

It was originally designed and remains primarily useful for generating dynamic web content. Howver it can be used equally well for processing any other kind of text based documents including HTML, XML, POD, PostScript, LaTeX and plain old text.

The Template::Manual documentation contains further information about the Template Toolkit and a full reference of all the features, directives, configuration options and so on.

$ perldoc Template::Manual

The Template module is the front-end to the Template Toolkit for Perl programmers. The documentation for that module relates specifically to using the module from Perl programs.

$ perldoc Template

Please note that there is no Template::Toolkit Perl module, just this documentation pointing people to the right place.

You're welcome to refer to TT as "Template Toolkit" or "Template::Toolkit" if you prefer. The official line is that we talk about the "Template Toolkit" software and the "Template" Perl module. But we're not the kind of officials who would get all official on you.

You don't need to be a Perl programmer to use the Template Toolkit. The tpage and ttree scripts allow you to process templates from the command line. See the documentation for those scripts for further information.

$ perldoc tpage
$ perldoc ttree

Finally, don't forget to check out the Template Toolkit web site.

http://template-toolkit.org/

Yes, we know it doesn't look very pretty and should use CSS instead of tables for layout. We'll have a shiny new web site when TT3 is released. In case you're wondering, that'll be on Tuesday some time shortly after lunch...

AUTHOR

Andy Wardley <abw@wardley.org>

http://wardley.org/|http://wardley.org/

VERSION

2.75, distributed as part of the Template Toolkit version 2.18, released on 09 February 2007.

COPYRIGHT

Copyright (C) 1996-2007 Andy Wardley.  All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

TT_v224_html_docs/old/misc/Library/HTML.html000700 000765 000765 00000043554 10626336405 020374 0ustar00abwabw000000 000000 Template::Library::HTML

DESCRIPTION

Top

NOTE: This documentation is incomplete and may be incorrect in places.

The 'html' template library is distributed as part of the Template Toolkit. It can be found in the 'templates' sub-directory of the installation directory.

use Template;
my $tt2 = Template->new({
INCLUDE_PATH => '/usr/local/tt2/templates',
});

For a portable way to determine the installation 'templates' directory, you can use the Template::Config->instdir() class method.

use Template;
my $tt2 = Template->new({
INCLUDE_PATH => Template::Config->instdir('templates'),
});

You should now be able to access the html library as, for example:

[% INCLUDE html/header %]

Note that some of the more basic elements don't give you much more than the raw HTML tags. In many cases you might be well advised to stick to regular HTML rather than complicating matters by the use of template elements.

e.g.

<table>
  . . .
</table>

vs

[% WRAPPER html/table %]
   . . .
[% END %]

However, the use of template elements to generate the underlying HTML does have some important benefits, particularly as the constructs start to get more complicated and more magical.

See the example in the 'examples' sub-directory of the distribution directory for further examples and enlightenment on using this library.

Headers, Footers and Pages

Top
  • header

    The 'header' element generates the regular header required as the pre-amble for an HTML document. That is, everything from the initial <html> to the opening <body>.

    [% INCLUDE html/header
         title = 'This is a Test'
     bgcol = '#ffffff'
    %]

    Additional header items can be provided by explicitly setting the 'headers' variable, e.g.

    [% headers = BLOCK %]
    <META name="description" content="Template Toolkit">
    <META name="REVISIT-AFTER" content="14 days">    
    <META name="keywords" content="Templates, Web, ...etc...">
    [% END %]
    [% INCLUDE html/header
     title = 'This is a Test'
     bgcol = '#ffffff'
    %]
  • footer

    The 'footer' element generates the terminating </body> and </html> element to balance the header.

    [% PROCESS html/header %]
    ...page content here...
    [% PROCESS html/footer %]
  • page

    The 'page' element combines the 'html/header' and 'html/footer' elements.

    [% WRAPPER html/page %]
    ...page content here...
    [% END %]

    Page content should be defined in the 'content' variable (e.g. via WRAPPER). Additional HTML headers should be defined in the 'headers' variable.

    [% WRAPPER html/page
        headers = '<META name="keywords" content="foo, bar, ...">'
    %]
    ...page content here...
    [% END %]

Tables, Bars and Boxes

Top
  • table

    A basic element for creating HTML tables.

    [% WRAPPER html/table pad=10 space=4 col='#404040' %]
       <tr>
    <td>Hello</td> <td>World</td>
       </tr>
    [% END %]

    The following variables may be defined:

    • border

      Set the border width (default: 0)

    • col

      Set the background colour (default: none).

    • width

      Set a fixed table width.

    • pad

      Set the cellpadding.

    • space

      Set the cellspacing.

    • content

      Content for the box. Supplied automatically if used via WRAPPER.

  • row

    A basic element for creating HTML table rows.

    [% WRAPPER html/table %]
       [% WRAPPER html/row %]
    <td>Hello</td> <td>World</td>
       [% END %]
    [% END %]

    The following variables may be defined:

    • col

      Set the background colour (default: none).

    • valign

      Set the vertical alignment.

    • rowspan

      Specify the number of rows to span.

    • content

      Content for the box. Supplied automatically if used via WRAPPER.

  • cell

    A basic element for creating HTML table cells.

    [% WRAPPER html/table %]
       [% WRAPPER html/row %]
      [% INCLUDE html/cell 
        FOREACH content = ['Hello', 'World'] %]
       [% END %]
    [% END %]

    The following variables may be defined:

    • col

      Set the background colour (default: none).

    • align

      Set the horizontal alignment.

    • colspan

      Specify the number of columns to span.

    • content

      Content for the cell. Supplied automatically if used via WRAPPER.

  • bar

    The bar element is a wrapping of html/table + html/row.

    [% WRAPPER html/bar %]
       <td>Foo</td>  <td>Bar</td>
    [% END %]
  • box

    The box element is a wrapping of html/table + html/row + html/cell

    [% WRAPPER html/box %]
       Hello World!
    [% END %]

AUTHOR

Top

Andy Wardley <abw@wardley.org>

http://wardley.org/|http://wardley.org/

VERSION

Top

2.68, distributed as part of the Template Toolkit version 2.19, released on 27 April 2007.

COPYRIGHT

Top
Copyright (C) 1996-2007 Andy Wardley.  All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/old/misc/Library/PostScript.html000700 000765 000765 00000015207 10626336406 021735 0ustar00abwabw000000 000000 Template::Library::PostScript

DESCRIPTION

Top

The PostScript library contains a number of templates for generating PostScript pages. It's very new, very incomplete, very ad-hoc and isn't yet documented.

AUTHOR

Top

Andy Wardley <abw@wardley.org>

http://wardley.org/|http://wardley.org/

VERSION

Top

2.68, distributed as part of the Template Toolkit version 2.19, released on 27 April 2007.

COPYRIGHT

Top
Copyright (C) 1996-2007 Andy Wardley.  All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/old/misc/Library/Splash.html000700 000765 000765 00000147064 10626336406 021064 0ustar00abwabw000000 000000 Template::Library::Splash

DESCRIPTION

Top

NOTE: This documentation is incomplete, incorrect and outdated. The Splash! library is still evolving and subject to change. See the examples for a much more recent and accurate demonstration of use.

Introduction

Top

The 'Splash' template library is distributed as part of the Template Toolkit. It can be found in the 'templates' sub-directory of the installation directory.

/your/tt2/installation
|
+-- docs
|      ...
|  
+-- images
|      ...
|
+-- examples
|      ...
|
+-- templates
    |
    +-- html
    |      ...
    +-- pod
    |      ...
    +-- splash     <<<< YOU ARE HERE
           ...

To use the Splash library, you first need to tell the Template Toolkit where to find the template files.

use Template;
my $tt2 = Template->new({
INCLUDE_PATH => '/usr/local/tt2/templates',
});

For a portable way to determine the installation 'templates' directory, you can use the Template::Config->instdir() class method.

use Template;
my $tt2 = Template->new({
INCLUDE_PATH => Template::Config->instdir('templates'),
});

Note that you should set the INCLUDE_PATH to the 'templates' directory as shown here and don't be tempted to set the INCLUDE_PATH to 'templates/splash'. Many of the Splash! components use elements in the 'html' directory and contain directives of the form:

[% INCLUDE html/something %].

Configuration

Top

The 'splash/config' template defines a 'splash' hash array which contains numerous configuration items for the Splash library. You must PROCESS this template to ensure that the hash definition is imported into your calling template. An INCLUDE is not sufficient as it localises variables and prevents the 'splash' hash array from existing outside the splash/config template.

[% PROCESS splash/config %]

Alternately, you can define the splash/config template as a PRE_PROCESS item when you create the Template processor.

use Template;
my $tt2 = Template->new({
INCLUDE_PATH => Template::Config->instdir('templates'),
PRE_PROCESS  => 'splash/config',
});

You can modify the default configuration by creating your own PRE_PROCESS config file which loads the 'splash/config' and then tweaks the settings to your own preferences.

my $tt2 = Template->new({
INCLUDE_PATH => [ '/home/abw/tt2/templates',
              Template::Config->instdir('templates') ],
    PRE_PROCESS => 'config'
});

/home/abw/tt2/templates/config:

[% # load the 'splash' configuration
   PROCESS splash/config;

   # tweak values to personal preferences
   splash.images       = '/~abw/tt2/images/splash'
   splash.select.col   = 'leaf'
   splash.unselect.col = 'bud'
%]

The splash/config file includes some instructional comments on things you might like to tweak.

Colours

Top

The Splash! library uses the colours defined in the html/rgb template. The 'rgb' hash defined therein is imported as the 'splash.rgb' hash.

[% INCLUDE splash/box col='grey75' %]

See the examples for further enlightenment on using colour.

Style

Top

There are two very primitive "styles" implemented called "select" and "unselect". These are used to indicate which item on a menu is selected, for example. Each style defines characteristics like background colour, font face, size and colour, text alignment, and so on.

The styles are implemented as hashes within the 'splash' hash. Many of the components respond to a 'style' variable being set and you can pass a direct reference to splash.select or splash.unselect (or your own styles). e.g.

[% INCLUDE splash/button 
   content = "Unselected"
       style   = splash.unselect
%]
[% INCLUDE splash/button 
       content ="Selected"
       style   = splash.select
%]

Alternately, you can use the 'select' variable to indicate either of the inbuilt styles: splash.select or splash.unselect.

[% INCLUDE splash/button 
       content = "Unselected"
       select  = 0
%]
[% INCLUDE splash/button
       content = "Selected"
       select  = 1
%]

COMPONENT TEMPLATES

Top

This section describes some of the component templates in the Splash! library. This documentation is incomplete and may also be inaccurate in places. The examples in the 'examples' directory are likely to be a much better reference.

splash/text

Top

Simple template to format text according to a selected/unselected style, adding links, etc.

[% INCLUDE splash/text
       content = 'Template Toolkit'
       link    = 'http://www.template-toolkit.org'
       select  = 0
       bold    = 1
%]

Configuration items:

  • content

    Text content.

  • link

    URL which can be defined to make the text a link.

  • style

    Reference to a style hash.

  • select

    Flag to default the style to splash.select (select == true value) or splash.unselect (select == false value).

The following items default to the relevant style values:

  • col (style.col.text)
  • font (style.font.face)
  • bold (style.font.bold)
  • size (style.font.size)

splash/table

Top

A thin wrapper around html/table, allowing a colour to be specified by name.

[% WRAPPER splash/table
       col   = 'aqua'
   pad   = 4
       width = '100%'
%]
<tr>
  <td>Foo</td>
  <td>Bar</td>
</tr>
[% END %]

Configuration items:

  • content

    Table content.

  • col

    Background colour.

  • border

    Border width (default: 0)

  • width

    Width in absolute pixels (e.g. '100') or as a percentage (e.g. '50%').

  • pad

    Cell padding.

  • space

    Cell padding.

splash/row

Top

Creates a row for an HTML table.

[% WRAPPER splash/table %]
[% WRAPPER splash/row col='marine' %]
<td>Foo</td><td>Bar</td>
[% END %]
[% WRAPPER splash/row col='aqua' %]
<td>Foo</td><td>Bar</td>
[% END %]
[% END %]

Configuration items:

  • content

    Row content.

  • col

    Background colour.

  • valign

    Vertical alignment

  • rowspan

    Number of rows to span.

splash/cell

Top

Creates a cell for an HTML table.

[% WRAPPER splash/table + splash/row + splash/cell col='grey75' %]
Hello World
[% END %]

Configuration items:

  • content

    Cell content.

  • col

    Background colour.

  • align

    Horizontal alignment

  • colspan

    Number of columns to span.

splash/box

Top

A box created from a union of splash/table, splash/row and splash/cell. The following is equivalent to the previous example.

[% WRAPPER splash/box col='grey75' %]
Hello World
[% END %]

Configuration items are as per the individual templates.

splash/button

Top

Creates a small button with rounded corners.

[% INCLUDE splash/button
       content = 'Template Toolkit'
       select  = 1
       width   = '50%'
%]

Configuration items:

  • content

    Button content.

  • style

    Reference to a style hash.

  • select

    Flag to default the style to splash.select (select == true value) or splash.unselect (select == false value).

  • width

    Width in absolute pixels (e.g. '100') or as a percentage (e.g. '50%').

The following items default to the relevant style values:

  • col (style.col.text)
  • textcol (style.col.text)
  • font (style.font.face)
  • size (style.font.size)
  • bold (style.font.bold)
  • width (style.button.width)
  • align (style.button.align)

splash/bar

Top

Creates a bar with rounded corners at either the top or bottom, and square corners on the other. Default has rounded at the top, set 'invert' to select bottom.

[% INCLUDE splash/bar
       content = 'Hello World',
       select  = 1
%]    

Configuration items:

  • content

    Bar content.

  • style

    Reference to a style hash.

  • select

    Flag to default the style to splash.select (select == true value) or splash.unselect (select == false value).

  • width

    Width in absolute pixels (e.g. '100') or as a percentage (e.g. '50%').

  • invert

    Flag to invert bar to hang down instead of sitting upright.

The following items default to the relevant style values:

  • col (style.col.text)
  • textcol (style.col.text)
  • font (style.font.face)
  • size (style.font.size)
  • bold (style.font.bold)
  • width (style.button.width)
  • align (style.button.align)

splash/hair

Top

Generates a frame enclosing the content within crosshair corners.

[% INCLUDE splash/hair
       content = 'Template Toolkit'
%]

Configuration items:

  • content

    Hair content.

  • style

    Reference to a style hash.

The following items default to the relevant style values:

  • col (style.col.text)
  • bgcol (style.col.back)
  • align (style.button.align)

splash/menu

Top

Creates a menu as a series of splash/button elements.

[% buttons = [ 
  { text => 'One', link => 'one.html' }
      { text => 'Two', link => 'two.html' }
   ]
%]
[% INCLUDE splash/menu
       select = 2        # Two
%]

Configuration items:

  • buttons

    A reference to a list of hash arrays containing 'text' and 'link' items.

  • select (n or 0)

    Indicates which button should be selected. First item is 1. 0 indicates no button selected.

  • width

    Width in absolute pixels (e.g. '100') or as a percentage (e.g. '50%').

  • align

    Horizontal alignment

splash/menubar

Top

As above, but incorporated into a wider bar.

[% WRAPPER splash/menubar %]
   Section Title
[% END %]

Configuration items:

  • buttons

    A reference to a list of hash arrays containing 'text' and 'link' items.

  • select (n or 0)

    Indicates which button should be selected. First item is 1. 0 indicates no button selected.

  • width

    Width in absolute pixels (e.g. '100') or as a percentage (e.g. '50%').

  • align

    Horizontal alignment

splash/panel

Top

A table with a coloured edge.

[% WRAPPER splash/panel edge='black' fill='grey75' border=2 %]
   <tr>
     <td>Hello World</td>
   </tr>
[% END %]

Configuration items:

  • content

    Panel content.

  • style

    Reference to a style hash.

  • select

    Flag to default the style to splash.select (select == true value) or splash.unselect (select == false value).

  • width

    Width in absolute pixels (e.g. '100') or as a percentage (e.g. '50%').

  • align

    Horizontal alignment

  • border

    Border width (default: 0)

The following items default to the relevant style values:

  • edge (style.col.edge)
  • fill (style.col.fill)
  • pad (style.pad)

splash/pane

Top

A union of splash/row + splash/cell.

[% WRAPPER splash/panel select=1 %]
   [% WRAPPER splash/pane col='grey75' %]
      Hello World
   [% END %]
   [% WRAPPER splash/pane col='grey50' %]
      Hello Again
   [% END %]
[% END %]

splash/tab

Top

A simple button looking like a page tab.

[% INCLUDE splash/tab
       content = 'Option 1'
       col = 'aqua'
%]

Configuration items:

  • content

    Tab content.

  • style

    Reference to a style hash.

  • select

    Flag to default the style to splash.select (select == true value) or splash.unselect (select == false value).

  • width

    Width in absolute pixels (e.g. '100') or as a percentage (e.g. '50%').

  • align

    Horizontal alignment

The following items default to the relevant style values:

  • col (style.col.text)
  • textcol (style.col.text)
  • font (style.font.face)
  • size (style.font.size)
  • bold (style.font.bold)
  • tabalign (style.tab.align)

splash/tabset

Top

A set of splash/tab components, similar to a menu.

Configuration items:

  • tabs

    List of hash references containing text/link entries, as per menu buttons.

  • select

    Flag to default the style to splash.select (select == true value) or splash.unselect (select == false value).

  • invert

    Flag to invert tab to hang down instead of sitting upright.

splash/tabbox

Top

Add a splash/tab to the top of a splash/box.

Configuration items:

  • title
    title.
  • content
    content.
  • width

    Width in absolute pixels (e.g. '100') or as a percentage (e.g. '50%').

  • tabwidth

    Width of tabs.

  • select

    Flag to default the style to splash.select (select == true value) or splash.unselect (select == false value).

  • border

    Border width (default: 0)

The following items default to the relevant style values:

  • col (style.col.text)
  • fill (style.col.fill)
  • tabalign (style.tab.align)
  • tablocate (style.tab.locate)

splash/tabsbox

Top

Add a splash/tabset to the top of a splash/box.

Configuration items:

  • tabs

    List of hash references containing text/link entries, as per menu buttons.

  • select

    Flag to default the style to splash.select (select == true value) or splash.unselect (select == false value).

  • content
    content.
  • width

    Width in absolute pixels (e.g. '100') or as a percentage (e.g. '50%').

  • border

    Border width (default: 0)

  • invert

    Flag to invert to hang down instead of sitting upright.

The following items default to the relevant style values:

  • col (style.col.text)
  • fill (style.col.fill)
  • tabalign (style.tab.align)
  • tablocate (style.tab.locate)

splash/tabspanel

Top

As per splash/tabsbox, but attached to a splash/panel instead of a splash/box.

EXAMPLES

Top

See the examples in the 'examples' sub-directory of the installation for comprehensive examples showing use of the Splash! library.

AUTHOR

Top

Andy Wardley <abw@wardley.org>

http://wardley.org/|http://wardley.org/

VERSION

Top

2.68, distributed as part of the Template Toolkit version 2.19, released on 27 April 2007.

COPYRIGHT

Top
Copyright (C) 1996-2007 Andy Wardley.  All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/old/manual/Config.html000700 000765 000765 00000411732 10627516022 017744 0ustar00abwabw000000 000000 Template::Manual::Config

Template Style and Parsing Options

Top

START_TAG, END_TAG

Top

The START_TAG and END_TAG options are used to specify character sequences or regular expressions that mark the start and end of a template directive. The default values for START_TAG and END_TAG are '[%' and '%]' respectively, giving us the familiar directive style:

[% example %]

Any Perl regex characters can be used and therefore should be escaped (or use the Perl quotemeta function) if they are intended to represent literal characters.

my $template = Template->new({ 
    START_TAG => quotemeta('<+'),
    END_TAG   => quotemeta('+>'),
});

Example:

<+ INCLUDE foobar +>

The TAGS directive can also be used to set the START_TAG and END_TAG values on a per-template file basis.

[% TAGS <+ +> %]

TAG_STYLE

Top

The TAG_STYLE option can be used to set both START_TAG and END_TAG according to pre-defined tag styles.

my $template = Template->new({ 
    TAG_STYLE => 'star',
});

Available styles are:

template    [% ... %]               (default)
template1   [% ... %] or %% ... %%  (TT version 1)
metatext    %% ... %%               (Text::MetaText)
star        [* ... *]               (TT alternate)
php         <? ... ?>               (PHP)
asp         <% ... %>               (ASP)
mason       <% ...  >               (HTML::Mason)
html        <!-- ... -->            (HTML comments)

Any values specified for START_TAG and/or END_TAG will override those defined by a TAG_STYLE.

The TAGS directive may also be used to set a TAG_STYLE

[% TAGS html %]
<!-- INCLUDE header -->

PRE_CHOMP, POST_CHOMP

Top

Anything outside a directive tag is considered plain text and is generally passed through unaltered (but see the INTERPOLATE option). This includes all whitespace and newlines characters surrounding directive tags. Directives that don't generate any output will leave gaps in the output document.

Example:

Foo
[% a = 10 %]
Bar

Output:

Foo

Bar

The PRE_CHOMP and POST_CHOMP options can help to clean up some of this extraneous whitespace. Both are disabled by default.

my $template = Template-E<gt>new({
    PRE_CHOMP  =E<gt> 1,
    POST_CHOMP =E<gt> 1,
});

With PRE_CHOMP set to 1, the newline and whitespace preceding a directive at the start of a line will be deleted. This has the effect of concatenating a line that starts with a directive onto the end of the previous line.

    Foo <----------.
                   |
,---(PRE_CHOMP)----'
|
`-- [% a = 10 %] --.
                   |
,---(POST_CHOMP)---'
|
`-> Bar

With POST_CHOMP set to 1, any whitespace after a directive up to and including the newline will be deleted. This has the effect of joining a line that ends with a directive onto the start of the next line.

If PRE_CHOMP or POST_CHOMP is set to 2, all whitespace including any number of newline will be removed and replaced with a single space. This is useful for HTML, where (usually) a contiguous block of whitespace is rendered the same as a single space.

With PRE_CHOMP or POST_CHOMP set to 3, all adjacent whitespace (including newlines) will be removed entirely.

These values are defined as CHOMP_NONE, CHOMP_ONE, CHOMP_COLLAPSE and CHOMP_GREEDY constants in the Template::Constants module. CHOMP_ALL is also defined as an alias for CHOMP_ONE to provide backwards compatability with earlier version of the Template Toolkit.

Additionally the chomp tag modifiers listed below may also be used for the PRE_CHOMP and POST_CHOMP configuration.

my $template = Template->new({
   PRE_CHOMP  => '~',
   POST_CHOMP => '-',
});

PRE_CHOMP and POST_CHOMP can be activated for individual directives by placing a '-' immediately at the start and/or end of the directive.

[% FOREACH user IN userlist %]
   [%- user -%]
[% END %]

This has the same effect as CHOMP_ONE in removing all whitespace before or after the directive up to and including the newline. The template will be processed as if written:

[% FOREACH user IN userlist %][% user %][% END %]

To remove all whitespace including any number of newlines, use the '~' character instead.

[% FOREACH user IN userlist %]

   [%~ user ~%]

[% END %]

To collapse all whitespace to a single space, use the '=' character.

[% FOREACH user IN userlist %]

   [%= user =%]

[% END %]

Here the template is processed as if written:

[% FOREACH user IN userlist %] [% user %] [% END %]

If you have PRE_CHOMP or POST_CHOMP set as configuration options then you can use '+' to disable any chomping options (i.e. leave the whitespace intact) on a per-directive basis.

[% FOREACH user = userlist %]
User: [% user +%]
[% END %]

With POST_CHOMP set to CHOMP_ONE, the above example would be parsed as if written:

[% FOREACH user = userlist %]User: [% user %]
[% END %]

For reference, the PRE_CHOMP and POST_CHOMP configuration options may be set to any of the following:

Constant      Value   Tag Modifier
----------------------------------
CHOMP_NONE      0          +
CHOMP_ONE       1          -
CHOMP_COLLAPSE  2          =
CHOMP_GREEDY    3          ~

TRIM

Top

The TRIM option can be set to have any leading and trailing whitespace automatically removed from the output of all template files and BLOCKs.

By example, the following BLOCK definition

[% BLOCK foo %]
Line 1 of foo
[% END %]

will be processed is as "\nLine 1 of foo\n". When INCLUDEd, the surrounding newlines will also be introduced.

before 
[% INCLUDE foo %]
after

Generated output:

before

Line 1 of foo

after

With the TRIM option set to any true value, the leading and trailing newlines (which count as whitespace) will be removed from the output of the BLOCK.

before
Line 1 of foo
after

The TRIM option is disabled (0) by default.

INTERPOLATE

Top

The INTERPOLATE flag, when set to any true value will cause variable references in plain text (i.e. not surrounded by START_TAG and END_TAG) to be recognised and interpolated accordingly.

my $template = Template->new({ 
    INTERPOLATE => 1,
});

Variables should be prefixed by a '$' to identify them. Curly braces can be used in the familiar Perl/shell style to explicitly scope the variable name where required.

# INTERPOLATE => 0
<a href="http://[% server %]/[% help %]">
<img src="[% images %]/help.gif"></a>
[% myorg.name %]
# INTERPOLATE => 1
<a href="http://$server/$help">
<img src="$images/help.gif"></a>
$myorg.name

# explicit scoping with {  }
<img src="$images/${icon.next}.gif">

Note that a limitation in Perl's regex engine restricts the maximum length of an interpolated template to around 32 kilobytes or possibly less. Files that exceed this limit in size will typically cause Perl to dump core with a segmentation fault. If you routinely process templates of this size then you should disable INTERPOLATE or split the templates in several smaller files or blocks which can then be joined backed together via PROCESS or INCLUDE.

ANYCASE

Top

By default, directive keywords should be expressed in UPPER CASE. The ANYCASE option can be set to allow directive keywords to be specified in any case.

# ANYCASE => 0 (default)
[% INCLUDE foobar %]        # OK
[% include foobar %]        # ERROR
[% include = 10   %]        # OK, 'include' is a variable
# ANYCASE => 1
[% INCLUDE foobar %]        # OK
[% include foobar %]        # OK
[% include = 10   %]        # ERROR, 'include' is reserved word

One side-effect of enabling ANYCASE is that you cannot use a variable of the same name as a reserved word, regardless of case. The reserved words are currently:

GET CALL SET DEFAULT INSERT INCLUDE PROCESS WRAPPER 
IF UNLESS ELSE ELSIF FOR FOREACH WHILE SWITCH CASE
USE PLUGIN FILTER MACRO PERL RAWPERL BLOCK META
TRY THROW CATCH FINAL NEXT LAST BREAK RETURN STOP 
CLEAR TO STEP AND OR NOT MOD DIV END

The only lower case reserved words that cannot be used for variables, regardless of the ANYCASE option, are the operators:

and or not mod div

Template Files and Blocks

Top

INCLUDE_PATH

Top

The INCLUDE_PATH is used to specify one or more directories in which template files are located. When a template is requested that isn't defined locally as a BLOCK, each of the INCLUDE_PATH directories is searched in turn to locate the template file. Multiple directories can be specified as a reference to a list or as a single string where each directory is delimited by ':'.

my $template = Template->new({
    INCLUDE_PATH => '/usr/local/templates',
});

my $template = Template->new({
    INCLUDE_PATH => '/usr/local/templates:/tmp/my/templates',
});

my $template = Template->new({
    INCLUDE_PATH => [ '/usr/local/templates', 
                      '/tmp/my/templates' ],
});

On Win32 systems, a little extra magic is invoked, ignoring delimiters that have ':' followed by a '/' or '\'. This avoids confusion when using directory names like 'C:\Blah Blah'.

When specified as a list, the INCLUDE_PATH path can contain elements which dynamically generate a list of INCLUDE_PATH directories. These generator elements can be specified as a reference to a subroutine or an object which implements a paths() method.

my $template = Template->new({
    INCLUDE_PATH => [ '/usr/local/templates', 
                      \&incpath_generator, 
                      My::IncPath::Generator->new( ... ) ],
});

Each time a template is requested and the INCLUDE_PATH examined, the subroutine or object method will be called. A reference to a list of directories should be returned. Generator subroutines should report errors using die(). Generator objects should return undef and make an error available via its error() method.

For example:

sub incpath_generator {
    # ...some code...

    if ($all_is_well) {
        return \@list_of_directories;
    }
    else {
        die "cannot generate INCLUDE_PATH...\n";
    }
}

or:

package My::IncPath::Generator;

# Template::Base (or Class::Base) provides error() method
use Template::Base;
use base qw( Template::Base );

sub paths {
    my $self = shift;

    # ...some code...

    if ($all_is_well) {
        return \@list_of_directories;
    }
    else {
        return $self->error("cannot generate INCLUDE_PATH...\n");
    }
}

1;

DELIMITER

Top

Used to provide an alternative delimiter character sequence for separating paths specified in the INCLUDE_PATH. The default value for DELIMITER is ':'.

my $template = Template->new({
    DELIMITER    => '; ',
    INCLUDE_PATH => 'C:/HERE/NOW; D:/THERE/THEN',
});

On Win32 systems, the default delimiter is a little more intelligent, splitting paths only on ':' characters that aren't followed by a '/'. This means that the following should work as planned, splitting the INCLUDE_PATH into 2 separate directories, C:/foo and C:/bar.

# on Win32 only
my $template = Template->new({
    INCLUDE_PATH => 'C:/Foo:C:/Bar'
});

However, if you're using Win32 then it's recommended that you explicitly set the DELIMITER character to something else (e.g. ';') rather than rely on this subtle magic.

ABSOLUTE

Top

The ABSOLUTE flag is used to indicate if templates specified with absolute filenames (e.g. '/foo/bar') should be processed. It is disabled by default and any attempt to load a template by such a name will cause a 'file' exception to be raised.

my $template = Template->new({
    ABSOLUTE => 1,
});

# this is why it's disabled by default
[% INSERT /etc/passwd %]

On Win32 systems, the regular expression for matching absolute pathnames is tweaked slightly to also detect filenames that start with a driver letter and colon, such as:

C:/Foo/Bar

RELATIVE

Top

The RELATIVE flag is used to indicate if templates specified with filenames relative to the current directory (e.g. './foo/bar' or '../../some/where/else') should be loaded. It is also disabled by default, and will raise a 'file' error if such template names are encountered.

my $template = Template->new({
    RELATIVE => 1,
});

[% INCLUDE ../logs/error.log %]

DEFAULT

Top

The DEFAULT option can be used to specify a default template which should be used whenever a specified template can't be found in the INCLUDE_PATH.

my $template = Template->new({
    DEFAULT => 'notfound.html',
});

If a non-existant template is requested through the Template Template#process() method, or by an INCLUDE, PROCESS or WRAPPER directive, then the DEFAULT template will instead be processed, if defined. Note that the DEFAULT template is not used when templates are specified with absolute or relative filenames, or as a reference to a input file handle or text string.

BLOCKS

Top

The BLOCKS option can be used to pre-define a default set of template blocks. These should be specified as a reference to a hash array mapping template names to template text, subroutines or Template::Document objects.

my $template = Template->new({
    BLOCKS => {
        header  => 'The Header.  [% title %]',
        footer  => sub { return $some_output_text },
        another => Template::Document->new({ ... }),
    },
}); 

AUTO_RESET

Top

The AUTO_RESET option is set by default and causes the local BLOCKS cache for the Template::Context object to be reset on each call to the Template Template#process() method. This ensures that any BLOCKs defined within a template will only persist until that template is finished processing. This prevents BLOCKs defined in one processing request from interfering with other independent requests subsequently processed by the same context object.

The BLOCKS item may be used to specify a default set of block definitions for the Template::Context object. Subsequent BLOCK definitions in templates will over-ride these but they will be reinstated on each reset if AUTO_RESET is enabled (default), or if the Template::Context Template::Context#reset() method is called.

RECURSION

Top

The template processor will raise a file exception if it detects direct or indirect recursion into a template. Setting this option to any true value will allow templates to include each other recursively.

Template Variables

Top

VARIABLES

Top

The VARIABLES option (or PRE_DEFINE - they're equivalent) can be used to specify a hash array of template variables that should be used to pre-initialise the stash when it is created. These items are ignored if the STASH item is defined.

my $template = Template->new({
    VARIABLES => {
        title   => 'A Demo Page',
        author  => 'Joe Random Hacker',
        version => 3.14,
    },
};

or

my $template = Template->new({
    PRE_DEFINE => {
        title   => 'A Demo Page',
        author  => 'Joe Random Hacker',
        version => 3.14,
    },
};

CONSTANTS

Top

The CONSTANTS option can be used to specify a hash array of template variables that are compile-time constants. These variables are resolved once when the template is compiled, and thus don't require further resolution at runtime. This results in significantly faster processing of the compiled templates and can be used for variables that don't change from one request to the next.

my $template = Template->new({
    CONSTANTS => {
        title   => 'A Demo Page',
        author  => 'Joe Random Hacker',
        version => 3.14,
    },
};

CONSTANT_NAMESPACE

Top

Constant variables are accessed via the constants namespace by default.

[% constants.title %]

The CONSTANTS_NAMESPACE option can be set to specify an alternate namespace.

my $template = Template->new({
    CONSTANTS => {
        title   => 'A Demo Page',
        # ...etc...
    },
    CONSTANTS_NAMESPACE => 'const',
};

In this case the constants would then be accessed as:

[% const.title %]

NAMESPACE

Top

The constant folding mechanism described above is an example of a namespace handler. Namespace handlers can be defined to provide alternate parsing mechanisms for variables in different namespaces.

Under the hood, the Template module converts a constructor configuration such as:

my $template = Template->new({
    CONSTANTS => {
        title   => 'A Demo Page',
        # ...etc...
    },
    CONSTANTS_NAMESPACE => 'const',
};

into one like:

my $template = Template->new({
    NAMESPACE => {
        const => Template:::Namespace::Constants->new({
            title   => 'A Demo Page',
            # ...etc...
        }),
    },
};

You can use this mechanism to define multiple constant namespaces, or to install custom handlers of your own.

my $template = Template->new({
    NAMESPACE => {
        site => Template:::Namespace::Constants->new({
            title   => "Wardley's Widgets",
            version => 2.718,
        }),
        author => Template:::Namespace::Constants->new({
            name  => 'Andy Wardley',
            email => 'abw@andywardley.com',
        }),
        voodoo => My::Namespace::Handler->new( ... ),
    },
};

Now you have two constant namespaces, for example:

[% site.title %]
[% author.name %]

as well as your own custom namespace handler installed for the 'voodoo' namespace.

[% voodoo.magic %]

See Template::Namespace::Constants for an example of what a namespace handler looks like on the inside.

Template Processing Options

Top

The following options are used to specify any additional templates that should be processed before, after, around or instead of the template passed as the first argument to the Template Template#process() method. These options can be perform various useful tasks such as adding standard headers or footers to all pages, wrapping page output in other templates, pre-defining variables or performing initialisation or cleanup tasks, automatically generating page summary information, navigation elements, and so on.

The task of processing the template is delegated internally to the Template::Service module which, unsurprisingly, also has a Template::Service#process() method. Any templates defined by the PRE_PROCESS option are processed first and any output generated is added to the output buffer. Then the main template is processed, or if one or more PROCESS templates are defined then they are instead processed in turn. In this case, one of the PROCESS templates is responsible for processing the main template, by a directive such as:

[% PROCESS $template %]

The output of processing the main template or the PROCESS template(s) is then wrapped in any WRAPPER templates, if defined. WRAPPER templates don't need to worry about explicitly processing the template because it will have been done for them already. Instead WRAPPER templates access the content they are wrapping via the content variable.

wrapper before
[% content %]
wrapper after

This output generated from processing the main template, and/or any PROCESS or WRAPPER templates is added to the output buffer. Finally, any POST_PROCESS templates are processed and their output is also added to the output buffer which is then returned.

If the main template throws an exception during processing then any relevant template(s) defined via the ERROR option will be processed instead. If defined and successfully processed, the output from the error template will be added to the output buffer in place of the template that generated the error and processing will continue, applying any WRAPPER and POST_PROCESS templates. If no relevant ERROR option is defined, or if the error occurs in one of the PRE_PROCESS, WRAPPER or POST_PROCESS templates, then the process will terminate immediately and the error will be returned.

PRE_PROCESS, POST_PROCESS

Top

These values may be set to contain the name(s) of template files (relative to INCLUDE_PATH) which should be processed immediately before and/or after each template. These do not get added to templates processed into a document via directives such as INCLUDE, PROCESS, WRAPPER etc.

my $template = Template->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
};

Multiple templates may be specified as a reference to a list. Each is processed in the order defined.

my $template = Template->new({
    PRE_PROCESS  => [ 'config', 'header' ],
    POST_PROCESS => 'footer',
};

Alternately, multiple template may be specified as a single string, delimited by ':'. This delimiter string can be changed via the DELIMITER option.

my $template = Template->new({
    PRE_PROCESS  => 'config:header',
    POST_PROCESS => 'footer',
};

The PRE_PROCESS and POST_PROCESS templates are evaluated in the same variable context as the main document and may define or update variables for subsequent use.

config:

[% # set some site-wide variables
   bgcolor = '#ffffff'
   version = 2.718
%]

header:

[% DEFAULT title = 'My Funky Web Site' %]
<html>
  <head>
    <title>[% title %]</title>
  </head>
  <body bgcolor="[% bgcolor %]">

footer:

    <hr>
    Version [% version %]
  </body>
</html>

The Template::Document object representing the main template being processed is available within PRE_PROCESS and POST_PROCESS templates as the template variable. Metadata items defined via the META directive may be accessed accordingly.

$template->process('mydoc.html', $vars);

mydoc.html:

[% META title = 'My Document Title' %]
blah blah blah
...

header:

<html>
  <head>
    <title>[% template.title %]</title>
  </head>
  <body bgcolor="[% bgcolor %]">

PROCESS

Top

The PROCESS option may be set to contain the name(s) of template files (relative to INCLUDE_PATH) which should be processed instead of the main template passed to the Template Template#process() method. This can be used to apply consistent wrappers around all templates, similar to the use of PRE_PROCESS and POST_PROCESS templates.

my $template = Template->new({
    PROCESS  => 'content',
};

# processes 'content' instead of 'foo.html'
$template->process('foo.html');

A reference to the original template is available in the template variable. Metadata items can be inspected and the template can be processed by specifying it as a variable reference (i.e. prefixed by $) to an INCLUDE, PROCESS or WRAPPER directive.

content:

<html>
  <head>
    <title>[% template.title %]</title>
  </head>
  <body>
<!-- begin content -->
[% PROCESS $template %]
<!-- end content -->
    <hr>
    &copy; Copyright [% template.copyright %]
  </body>
</html>

foo.html:

[% META 
   title     = 'The Foo Page'
   author    = 'Fred Foo'
   copyright = '2000 Fred Foo'
%]
<h1>[% template.title %]</h1>
Welcome to the Foo Page, blah blah blah

output:

<html>
  <head>
    <title>The Foo Page</title>
  </head>
  <body>
<!-- begin content -->
<h1>The Foo Page</h1>
Welcome to the Foo Page, blah blah blah
<!-- end content -->
    <hr>
    &copy; Copyright 2000 Fred Foo
  </body>
</html>

WRAPPER

Top

The WRAPPER option can be used to specify one or more templates which should be used to wrap around the output of the main page template. The main template is processed first (or any PROCESS template(s)) and the output generated is then passed as the content variable to the WRAPPER template(s) as they are processed.

my $template = Template->new({
    WRAPPER => 'wrapper',
};

# process 'foo' then wrap in 'wrapper'
$template->process('foo', { message => 'Hello World!' });

wrapper:

<wrapper>
[% content %]
</wrapper>

foo:

This is the foo file!
Message: [% message %]

The output generated from this example is:

<wrapper>
This is the foo file!
Message: Hello World!
</wrapper>

You can specify more than one WRAPPER template by setting the value to be a reference to a list of templates. The WRAPPER templates will be processed in reverse order with the output of each being passed to the next (or previous, depending on how you look at it) as the 'content' variable. It sounds complicated, but the end result is that it just "Does The Right Thing" to make wrapper templates nest in the order you specify.

my $template = Template->new({
    WRAPPER => [ 'outer', 'inner' ],
};

# process 'foo' then wrap in 'inner', then in 'outer'
$template->process('foo', { message => 'Hello World!' });

outer:

<outer>
[% content %]
</outer>

inner:

<inner>
[% content %]
</inner>

The output generated is then:

<outer>
<inner>
This is the foo file!
Message: Hello World!
</inner>
</outer>

One side-effect of the "inside-out" processing of the WRAPPER configuration item (and also the WRAPPER directive) is that any variables set in the template being wrapped will be visible to the template doing the wrapping, but not the other way around.

You can use this to good effect in allowing page templates to set pre-defined values which are then used in the wrapper templates. For example, our main page template 'foo' might look like this:

foo:

[% page = {
       title    = 'Foo Page'
       subtitle = 'Everything There is to Know About Foo'
       author   = 'Frank Oliver Octagon'
   }
%]

<p>
Welcome to the page that tells you everything about foo
blah blah blah...
</p>

The foo template is processed before the wrapper template meaning that the page data structure will be defined for use in the wrapper template.

wrapper:

<html>
  <head>
    <title>[% page.title %]</title>
  </head>
  <body>
    <h1>[% page.title %]</h1>
    <h2>[% page.subtitle %]</h1>
    <h3>by [% page.author %]</h3>
    [% content %]
  </body>
</html>

It achieves the same effect as defining META items which are then accessed via the template variable (which you are still free to use within WRAPPER templates), but gives you more flexibility in the type and complexity of data that you can define.

ERROR

Top

The ERROR (or ERRORS if you prefer) configuration item can be used to name a single template or specify a hash array mapping exception types to templates which should be used for error handling. If an uncaught exception is raised from within a template then the appropriate error template will instead be processed.

If specified as a single value then that template will be processed for all uncaught exceptions.

my $template = Template->new({
    ERROR => 'error.html'
});

If the ERROR item is a hash reference the keys are assumed to be exception types and the relevant template for a given exception will be selected. A default template may be provided for the general case. Note that ERROR can be pluralised to ERRORS if you find it more appropriate in this case.

my $template = Template->new({
    ERRORS => {
        user     => 'user/index.html',
        dbi      => 'error/database',
        default  => 'error/default',
    },
});

In this example, any user exceptions thrown will cause the user/index.html template to be processed, dbi errors are handled by error/database and all others by the error/default template. Any PRE_PROCESS and/or POST_PROCESS templates will also be applied to these error templates.

Note that exception types are hierarchical and a foo handler will catch all foo.* errors (e.g. foo.bar, foo.bar.baz) if a more specific handler isn't defined. Be sure to quote any exception types that contain periods to prevent Perl concatenating them into a single string (i.e. user.passwd is parsed as 'user'.'passwd').

my $template = Template->new({
    ERROR => {
        'user.login'  => 'user/login.html',
        'user.passwd' => 'user/badpasswd.html',
        'user'        => 'user/index.html',
        'default'     => 'error/default',
    },
});

In this example, any template processed by the $template object, or other templates or code called from within, can raise a user.login exception and have the service redirect to the user/login.html template. Similarly, a user.passwd exception has a specific handling template, user/badpasswd.html, while all other user or user.* exceptions cause a redirection to the user/index.html page. All other exception types are handled by error/default.

Exceptions can be raised in a template using the THROW directive,

[% THROW user.login 'no user id: please login' %]

or by calling the Template::Context#throw() method on the current Template::Context object,

$context->throw('user.passwd', 'Incorrect Password');
$context->throw('Incorrect Password');    # type 'undef'

or from Perl code by calling die() with a Template::Exception object,

die (Template::Exception->new('user.denied', 'Invalid User ID'));

or by simply calling die() with an error string. This is automagically caught and converted to an exception of 'undef' type which can then be handled in the usual way.

die "I'm sorry Dave, I can't do that";

Note that the 'undef' we're talking about here is a literal string rather than Perl's undef used to represent undefined values.

Template Runtime Options

Top

EVAL_PERL

Top

This flag is used to indicate if PERL and/or RAWPERL blocks should be evaluated. It is disabled by default and any PERL or RAWPERL blocks encountered will raise exceptions of type 'perl' with the message 'EVAL_PERL not set'. Note however that any RAWPERL blocks should always contain valid Perl code, regardless of the EVAL_PERL flag. The parser will fail to compile templates that contain invalid Perl code in RAWPERL blocks and will throw a 'file' exception.

When using compiled templates (see Caching_and_Compiling_Options), the EVAL_PERL has an affect when the template is compiled, and again when the templates is subsequently processed, possibly in a different context to the one that compiled it.

If the EVAL_PERL is set when a template is compiled, then all PERL and RAWPERL blocks will be included in the compiled template. If the EVAL_PERL option isn't set, then Perl code will be generated which always throws a 'perl' exception with the message 'EVAL_PERL not set' whenever the compiled template code is run.

Thus, you must have EVAL_PERL set if you want your compiled templates to include PERL and RAWPERL blocks.

At some point in the future, using a different invocation of the Template Toolkit, you may come to process such a pre-compiled template. Assuming the EVAL_PERL option was set at the time the template was compiled, then the output of any RAWPERL blocks will be included in the compiled template and will get executed when the template is processed. This will happen regardless of the runtime EVAL_PERL status.

Regular PERL blocks are a little more cautious, however. If the EVAL_PERL flag isn't set for the current context, that is, the one which is trying to process it, then it will throw the familiar 'perl' exception with the message, 'EVAL_PERL not set'.

Thus you can compile templates to include PERL blocks, but optionally disable them when you process them later. Note however that it is possible for a PERL block to contain a Perl "BEGIN { # some code }" block which will always get run regardless of the runtime EVAL_PERL status. Thus, if you set EVAL_PERL when compiling templates, it is assumed that you trust the templates to Do The Right Thing. Otherwise you must accept the fact that there's no bulletproof way to prevent any included code from trampling around in the living room of the runtime environment, making a real nuisance of itself if it really wants to. If you don't like the idea of such uninvited guests causing a bother, then you can accept the default and keep EVAL_PERL disabled.

OUTPUT

Top

Default output location or handler. This may be specified as one of: a file name (relative to OUTPUT_PATH, if defined, or the current working directory if not specified absolutely); a file handle (e.g. GLOB or IO::Handle) opened for writing; a reference to a text string to which the output is appended (the string isn't cleared); a reference to a subroutine which is called, passing the output text as an argument; as a reference to an array, onto which the content will be push()ed; or as a reference to any object that supports the print() method. This latter option includes the Apache::Request object which is passed as the argument to Apache/mod_perl handlers.

example 1 (file name):

my $template = Template->new({
    OUTPUT => "/tmp/foo",
});

example 2 (text string):

my $output   = '';
my $template = Template->new({
    OUTPUT => \$output,
});

example 3 (file handle):

open (TOUT, "> $file") || die "$file: $!\n";
my $template = Template->new({
    OUTPUT => \*TOUT,
});

example 4 (subroutine):

sub output { my $out = shift; print "OUTPUT: $out" }
my $template = Template->new({
    OUTPUT => \&output,
});

example 5 (array reference):

my $template = Template->new({
    OUTPUT => \@output,
})

example 6 (Apache/mod_perl handler):

sub handler {
    my $r = shift;
    my $t = Template->new({
        OUTPUT => $r,
    });
    ...
}

The default OUTPUT location be overridden by passing a third parameter to the Template Template#process() method. This can be specified as any of the above argument types.

$t->process($file, $vars, "/tmp/foo");
$t->process($file, $vars, \$output);
$t->process($file, $vars, \*MYGLOB);
$t->process($file, $vars, \@output); 
$t->process($file, $vars, $r);  # Apache::Request
...

OUTPUT_PATH

Top

The OUTPUT_PATH allows a directory to be specified into which output files should be written. An output file can be specified by the OUTPUT option, or passed by name as the third parameter to the Template Template#process() method.

my $template = Template->new({
    INCLUDE_PATH => "/tmp/src",
    OUTPUT_PATH  => "/tmp/dest",
});

my $vars = {
    ...
};

foreach my $file ('foo.html', 'bar.html') {
    $template->process($file, $vars, $file)
        || die $template->error();  
}

This example will read the input files /tmp/src/foo.html and /tmp/src/bar.html and write the processed output to /tmp/dest/foo.html and /tmp/dest/bar.html, respectively.

DEBUG

Top

The DEBUG option can be used to enable debugging within the various different modules that comprise the Template Toolkit. The Template::Constants module defines a set of DEBUG_XXXX constants which can be combined using the logical OR operator, '|'.

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_PARSER | DEBUG_PROVIDER,
});

For convenience, you can also provide a string containing a list of lower case debug options, separated by any non-word characters.

my $template = Template->new({
    DEBUG => 'parser, provider',
});

The following DEBUG_XXXX flags can be used:

  • DEBUG_SERVICE

    Enables general debugging messages for the Template::Service module.

  • DEBUG_CONTEXT

    Enables general debugging messages for the Template::Context module.

  • DEBUG_PROVIDER

    Enables general debugging messages for the Template::Provider module.

  • DEBUG_PLUGINS

    Enables general debugging messages for the Template::Plugins module.

  • DEBUG_FILTERS

    Enables general debugging messages for the Template::Filters module.

  • DEBUG_PARSER

    This flag causes the Template::Parser to generate debugging messages that show the Perl code generated by parsing and compiling each template.

  • DEBUG_UNDEF

    This option causes the Template Toolkit to throw an 'undef' error whenever it encounters an undefined variable value.

  • DEBUG_DIRS

    This option causes the Template Toolkit to generate comments indicating the source file, line and original text of each directive in the template. These comments are embedded in the template output using the format defined in the DEBUG_FORMAT configuration item, or a simple default format if unspecified.

    For example, the following template fragment: Hello World

    would generate this output:

    ## input text line 1 :  ##
    Hello 
    ## input text line 2 : World ##
    World
  • DEBUG_ALL

    Enables all debugging messages.

  • DEBUG_CALLER

    This option causes all debug messages that aren't newline terminated to have the file name and line number of the caller appended to them.

DEBUG_FORMAT

Top

The DEBUG_FORMAT option can be used to specify a format string for the debugging messages generated via the DEBUG_DIRS option described above. Any occurances of $file, $line or $text will be replaced with the current file name, line or directive text, respectively. Notice how the format is single quoted to prevent Perl from interpolating those tokens as variables.

my $template = Template->new({
    DEBUG => 'dirs',
    DEBUG_FORMAT => '<!-- $file line $line : [% $text %] -->',
});

The following template fragment:

[% foo = 'World' %]
Hello [% foo %]

would then generate this output:

<!-- input text line 2 : [% foo = 'World' %] -->
Hello <!-- input text line 3 : [% foo %] -->World

The DEBUG directive can also be used to set a debug format within a template.

[% DEBUG format '<!-- $file line $line : [% $text %] -->' %]

Caching and Compiling Options

Top

CACHE_SIZE

Top

The Template::Provider module caches compiled templates to avoid the need to re-parse template files or blocks each time they are used. The CACHE_SIZE option is used to limit the number of compiled templates that the module should cache.

By default, the CACHE_SIZE is undefined and all compiled templates are cached. When set to any positive value, the cache will be limited to storing no more than that number of compiled templates. When a new template is loaded and compiled and the cache is full (i.e. the number of entries == CACHE_SIZE), the least recently used compiled template is discarded to make room for the new one.

The CACHE_SIZE can be set to 0 to disable caching altogether.

my $template = Template->new({
    CACHE_SIZE => 64,   # only cache 64 compiled templates
});
my $template = Template->new({
    CACHE_SIZE => 0,   # don't cache any compiled templates
});

As well as caching templates as they are found, the Template::Provider also implements negative caching to keep track of templates that are not found. This allows the provider to quickly decline a request for a template that it has previously failed to locate, saving the effort of going to look for it again. This is useful when an INCLUDE_PATH includes multiple providers, ensuring that the request is passed down through the providers as quickly as possible.

STAT_TTL

Top

This value can be set to control how long the Template::Provider will keep a template cached in memory before checking to see if the source template has changed.

my $provider = Template::Provider->new({
    STAT_TTL => 60,  # one minute
});

The default value is 1 (second). You'll probably want to set this to a higher value if you're running the Template Toolkit inside a persistent web server application (e.g. mod_perl). For example, set it to 60 and the provider will only look for changes to templates once a minute at most. However, during development (or any time you're making frequent changes to templates) you'll probably want to keep it set to a low value so that you don't have to wait for the provider to notice that your templates have changed.

COMPILE_EXT

Top

From version 2 onwards, the Template Toolkit has the ability to compile templates to Perl code and save them to disk for subsequent use (i.e. cache persistence). The COMPILE_EXT option may be provided to specify a filename extension for compiled template files. It is undefined by default and no attempt will be made to read or write any compiled template files.

my $template = Template->new({
    COMPILE_EXT => '.ttc',
});

If COMPILE_EXT is defined (and COMPILE_DIR isn't, see below) then compiled template files with the COMPILE_EXT extension will be written to the same directory from which the source template files were loaded.

Compiling and subsequent reuse of templates happens automatically whenever the COMPILE_EXT or COMPILE_DIR options are set. The Template Toolkit will automatically reload and reuse compiled files when it finds them on disk. If the corresponding source file has been modified since the compiled version as written, then it will load and re-compile the source and write a new compiled version to disk.

This form of cache persistence offers significant benefits in terms of time and resources required to reload templates. Compiled templates can be reloaded by a simple call to Perl's require(), leaving Perl to handle all the parsing and compilation. This is a Good Thing.

COMPILE_DIR

Top

The COMPILE_DIR option is used to specify an alternate directory root under which compiled template files should be saved.

my $template = Template->new({
    COMPILE_DIR => '/tmp/ttc',
});

The COMPILE_EXT option may also be specified to have a consistent file extension added to these files.

my $template1 = Template->new({
    COMPILE_DIR => '/tmp/ttc',
    COMPILE_EXT => '.ttc1',
});
my $template2 = Template->new({
    COMPILE_DIR => '/tmp/ttc',
    COMPILE_EXT => '.ttc2',
});

When COMPILE_EXT is undefined, the compiled template files have the same name as the original template files, but reside in a different directory tree.

Each directory in the INCLUDE_PATH is replicated in full beneath the COMPILE_DIR directory. This example:

my $template = Template->new({
    COMPILE_DIR  => '/tmp/ttc',
    INCLUDE_PATH => '/home/abw/templates:/usr/share/templates',
});

would create the following directory structure:

/tmp/ttc/home/abw/templates/
/tmp/ttc/usr/share/templates/

Files loaded from different INCLUDE_PATH directories will have their compiled forms save in the relevant COMPILE_DIR directory.

On Win32 platforms a filename may by prefixed by a drive letter and colon. e.g.

C:/My Templates/header

The colon will be silently stripped from the filename when it is added to the COMPILE_DIR value(s) to prevent illegal filename being generated. Any colon in COMPILE_DIR elements will be left intact. For example:

# Win32 only
my $template = Template->new({
    DELIMITER    => ';',
    COMPILE_DIR  => 'C:/TT2/Cache',
    INCLUDE_PATH => 'C:/TT2/Templates;D:/My Templates',
});

This would create the following cache directories:

C:/TT2/Cache/C/TT2/Templates
C:/TT2/Cache/D/My Templates

Plugins and Filters

Top

PLUGINS

Top

The PLUGINS options can be used to provide a reference to a hash array that maps plugin names to Perl module names. A number of standard plugins are defined (e.g. table, format, cgi, etc.) which map to their corresponding Template::Plugin::* counterparts. These can be redefined by values in the PLUGINS hash.

my $template = Template->new({
    PLUGINS => {
        cgi => 'MyOrg::Template::Plugin::CGI',
        foo => 'MyOrg::Template::Plugin::Foo',
        bar => 'MyOrg::Template::Plugin::Bar',
    },  
}); 

The recommended convention is to specify these plugin names in lower case. The Template Toolkit first looks for an exact case-sensitive match and then tries the lower case conversion of the name specified.

[% USE Foo %]      # look for 'Foo' then 'foo'

If you define all your PLUGINS with lower case names then they will be located regardless of how the user specifies the name in the USE directive. If, on the other hand, you define your PLUGINS with upper or mixed case names then the name specified in the USE directive must match the case exactly.

The USE directive is used to create plugin objects and does so by calling the Template::Context#plugin() method on the current Template::Context object. If the plugin name is defined in the PLUGINS hash then the corresponding Perl module is loaded via require(). The context then calls the Template::Plugin#load() class method which should return the class name (default and general case) or a prototype object against which the Template::Plugin#new() method can be called to instantiate individual plugin objects.

If the plugin name is not defined in the PLUGINS hash then the PLUGIN_BASE and/or LOAD_PERL options come into effect.

PLUGIN_BASE

Top

If a plugin is not defined in the PLUGINS hash then the PLUGIN_BASE is used to attempt to construct a correct Perl module name which can be successfully loaded.

The PLUGIN_BASE can be specified as a reference to an array of module namespaces, or as a single value which is automatically converted to a list. The default PLUGIN_BASE value (Template::Plugin) is then added to the end of this list.

example 1:

my $template = Template->new({
    PLUGIN_BASE => 'MyOrg::Template::Plugin',
});

[% USE Foo %]    # => MyOrg::Template::Plugin::Foo
                   or        Template::Plugin::Foo 

example 2:

my $template = Template->new({
    PLUGIN_BASE => [   'MyOrg::Template::Plugin',
                       'YourOrg::Template::Plugin'  ],
});

template:

[% USE Foo %]    # =>   MyOrg::Template::Plugin::Foo
                   or YourOrg::Template::Plugin::Foo 
                   or          Template::Plugin::Foo 

If you don't want the default Template::Plugin namespace added to the end of the PLUGIN_BASE, then set the $Template::Plugins::PLUGIN_BASE variable to a false value before calling the Template Template#new() constructor method. This is shown in the example below where the Foo plugin is located as My::Plugin::Foo or Your::Plugin::Foo but not as Template::Plugin::Foo.

example 3:

use Template::Plugins;
$Template::Plugins::PLUGIN_BASE = '';

my $template = Template->new({
    PLUGIN_BASE => [   'My::Plugin',
                       'Your::Plugin'  ],
});

template:

[% USE Foo %]    # =>   My::Plugin::Foo
                   or Your::Plugin::Foo 

LOAD_PERL

Top

If a plugin cannot be loaded using the PLUGINS or PLUGIN_BASE approaches then the provider can make a final attempt to load the module without prepending any prefix to the module path. This allows regular Perl modules (i.e. those that don't reside in the Template::Plugin or some other such namespace) to be loaded and used as plugins.

By default, the LOAD_PERL option is set to 0 and no attempt will be made to load any Perl modules that aren't named explicitly in the PLUGINS hash or reside in a package as named by one of the PLUGIN_BASE components.

Plugins loaded using the PLUGINS or PLUGIN_BASE receive a reference to the current context object as the first argument to the Template::Plugin#new() constructor. Modules loaded using LOAD_PERL are assumed to not conform to the plugin interface. They must provide a new() class method for instantiating objects but it will not receive a reference to the context as the first argument.

Plugin modules should provide a Template::Plugin#load() class method (or inherit the default one from the Template::Plugin base class) which is called the first time the plugin is loaded. Regular Perl modules need not. In all other respects, regular Perl objects and Template Toolkit plugins are identical.

If a particular Perl module does not conform to the common, but not unilateral, new() constructor convention then a simple plugin wrapper can be written to interface to it.

FILTERS

Top

The FILTERS option can be used to specify custom filters which can then be used with the FILTER directive like any other. These are added to the standard filters which are available by default. Filters specified via this option will mask any standard filters of the same name.

The FILTERS option should be specified as a reference to a hash array in which each key represents the name of a filter. The corresponding value should contain a reference to an array containing a subroutine reference and a flag which indicates if the filter is static (0) or dynamic (1). A filter may also be specified as a solitary subroutine reference and is assumed to be static.

$template = Template->new({
    FILTERS => {
        'sfilt1' =>   \&static_filter,      # static
        'sfilt2' => [ \&static_filter, 0 ], # same as above
        'dfilt1' => [ \&dyanamic_filter_factory, 1 ],
    },
});

Additional filters can be specified at any time by calling the Template::Context#define_filter() method on the current Template::Context object. The method accepts a filter name, a reference to a filter subroutine and an optional flag to indicate if the filter is dynamic.

my $context = $template->context();
$context->define_filter('new_html', \&new_html);
$context->define_filter('new_repeat', \&new_repeat, 1);

Static filters are those where a single subroutine reference is used for all invocations of a particular filter. Filters that don't accept any configuration parameters (e.g. html) can be implemented statically. The subroutine reference is simply returned when that particular filter is requested. The subroutine is called to filter the output of a template block which is passed as the only argument. The subroutine should return the modified text.

sub static_filter {
    my $text = shift;
    # do something to modify $text...
    return $text;
}

The following template fragment:

[% FILTER sfilt1 %]
Blah blah blah.
[% END %]

is approximately equivalent to:

&static_filter("\nBlah blah blah.\n");

Filters that can accept parameters (e.g. truncate) should be implemented dynamically. In this case, the subroutine is taken to be a filter 'factory' that is called to create a unique filter subroutine each time one is requested. A reference to the current Template::Context object is passed as the first parameter, followed by any additional parameters specified. The subroutine should return another subroutine reference (usually a closure) which implements the filter.

sub dynamic_filter_factory {
    my ($context, @args) = @_;

    return sub {
        my $text = shift;
        # do something to modify $text...
        return $text;           
    }
}

The following template fragment:

[% FILTER dfilt1(123, 456) %] 
Blah blah blah
[% END %]              

is approximately equivalent to:

my $filter = &dynamic_filter_factory($context, 123, 456);
&$filter("\nBlah blah blah.\n");

See the FILTER directive for further examples.

Customisation and Extension

Top

LOAD_TEMPLATES

Top

The LOAD_TEMPLATES option can be used to provide a reference to a list of Template::Provider objects or sub-classes thereof which will take responsibility for loading and compiling templates.

my $template = Template->new({
    LOAD_TEMPLATES => [
        MyOrg::Template::Provider->new({ ... }),
        Template::Provider->new({ ... }),
    ],
});

When a PROCESS, INCLUDE or WRAPPER directive is encountered, the named template may refer to a locally defined BLOCK or a file relative to the INCLUDE_PATH (or an absolute or relative path if the appropriate ABSOLUTE or RELATIVE options are set). If a BLOCK definition can't be found (see the Template::Context Template::Context#template() method for a discussion of BLOCK locality) then each of the LOAD_TEMPLATES provider objects is queried in turn via the Template::Provider#fetch() method to see if it can supply the required template.

Each provider can return a compiled template, an error, or decline to service the request in which case the responsibility is passed to the next provider. If none of the providers can service the request then a 'not found' error is returned. The same basic provider mechanism is also used for the INSERT directive but it bypasses any BLOCK definitions and doesn't attempt is to parse or process the contents of the template file.

If LOAD_TEMPLATES is undefined, a single default provider will be instantiated using the current configuration parameters. For example, the Template::Provider INCLUDE_PATH option can be specified in the Template configuration and will be correctly passed to the provider's constructor method.

my $template = Template->new({
    INCLUDE_PATH => '/here:/there',
});

LOAD_PLUGINS

Top

The LOAD_PLUGINS options can be used to specify a list of provider objects (i.e. they implement the Template::Plugins#fetch() method) which are responsible for loading and instantiating template plugin objects. The Template::Context Template::Context#plugin() method queries each provider in turn in a "Chain of Responsibility" as per the Template::Context#template() and Template::Context#filter() methods.

my $template = Template->new({
    LOAD_PLUGINS => [
        MyOrg::Template::Plugins->new({ ... }),
        Template::Plugins->new({ ... }),
    ],
});

By default, a single Template::Plugins object is created using the current configuration hash. Configuration items destined for the Template::Plugins constructor may be added to the Template constructor.

my $template = Template->new({
    PLUGIN_BASE => 'MyOrg::Template::Plugins',
    LOAD_PERL   => 1,
});

LOAD_FILTERS

Top

The LOAD_FILTERS option can be used to specify a list of provider objects (i.e. they implement the Template::Filters#fetch() method) which are responsible for returning and/or creating filter subroutines. The Template::Context Template::Context#filter() method queries each provider in turn in a "Chain of Responsibility" as per the Template::Context#template() and Template::Context#plugin() methods.

my $template = Template->new({
    LOAD_FILTERS => [
        MyTemplate::Filters->new(),
        Template::Filters->new(),
    ],
});

By default, a single Template::Filters object is created for the LOAD_FILTERS list.

TOLERANT

Top

The TOLERANT flag is used by the various Template Toolkit provider modules (Template::Provider, Template::Plugins, Template::Filters) to control their behaviour when errors are encountered. By default, any errors are reported as such, with the request for the particular resource (template, plugin, filter) being denied and an exception raised.

When the TOLERANT flag is set to any true values, errors will be silently ignored and the provider will instead return STATUS_DECLINED. This allows a subsequent provider to take responsibility for providing the resource, rather than failing the request outright. If all providers decline to service the request, either through tolerated failure or a genuine disinclination to comply, then a '<resource> not found' exception is raised.

SERVICE

Top

A reference to a Template::Service object, or sub-class thereof, to which the Template module should delegate. If unspecified, a Template::Service object is automatically created using the current configuration hash.

my $template = Template->new({
    SERVICE => MyOrg::Template::Service->new({ ... }),
});

CONTEXT

Top

A reference to a Template::Context object which is used to define a specific environment in which template are processed. A Template::Context object is passed as the only parameter to the Perl subroutines that represent "compiled" template documents. Template subroutines make callbacks into the context object to access Template Toolkit functionality, for example, to to INCLUDE or PROCESS another template (Template::Context#include() and Template::Context#process() methods, respectively), to USE a plugin (Template::Context#plugin()) or instantiate a filter (Template::Context#filter()) or to access the stash (Template::Context#stash()) which manages variable definitions via the Template::Stash#get() and Template::Stash#set() methods.

my $template = Template->new({
    CONTEXT => MyOrg::Template::Context->new({ ... }),
});

STASH

Top

A reference to a Template::Stash object or sub-class which will take responsibility for managing template variables.

my $stash = MyOrg::Template::Stash->new({ ... });
my $template = Template->new({
    STASH => $stash,
});

If unspecified, a default stash object is created using the VARIABLES configuration item to initialise the stash variables.

my $template = Template->new({
    VARIABLES => {
        id    => 'abw',
        name  => 'Andy Wardley',
    },
};

PARSER

Top

The Template::Parser module implements a parser object for compiling templates into Perl code which can then be executed. A default object of this class is created automatically and then used by the Template::Provider whenever a template is loaded and requires compilation. The PARSER option can be used to provide a reference to an alternate parser object.

my $template = Template->new({
    PARSER => MyOrg::Template::Parser->new({ ... }),
});

GRAMMAR

Top

The GRAMMAR configuration item can be used to specify an alternate grammar for the parser. This allows a modified or entirely new template language to be constructed and used by the Template Toolkit.

Source templates are compiled to Perl code by the Template::Parser using the Template::Grammar (by default) to define the language structure and semantics. Compiled templates are thus inherently "compatible" with each other and there is nothing to prevent any number of different template languages being compiled and used within the same Template Toolkit processing environment (other than the usual time and memory constraints).

The Template::Grammar file is constructed from a YACC like grammar (using Parse::YAPP) and a skeleton module template. These files are provided, along with a small script to rebuild the grammar, in the parser sub-directory of the distribution.

You don't have to know or worry about these unless you want to hack on the template language or define your own variant. There is a README file in the same directory which provides some small guidance but it is assumed that you know what you're doing if you venture herein. If you grok LALR parsers, then you should find it comfortably familiar.

By default, an instance of the default Template::Grammar will be created and used automatically if a GRAMMAR item isn't specified.

use MyOrg::Template::Grammar;

my $template = Template->new({ 
    GRAMMAR = MyOrg::Template::Grammar->new();
});

/manual/Config.html last modified 10:57:38 31-May-2007
TT_v224_html_docs/old/manual/Credits.html000700 000765 000765 00000033120 10627520122 020117 0ustar00abwabw000000 000000 Template::Manual::Credits

HISTORY

Top

The Template Toolkit began its life as the Text::MetaText module, originally released to CPAN around 1996. This itself was the public manifestation of an earlier template processing system I developed while working at Peritas (now Knowledge Pool - http://www.knowledgepool.com/)

Text::MetaText was the prototype - the one we always planned to throw away. It did the job well, showing us what worked and what didn't, what was good and what was bad, and gave us some ideas about what could be done better, given the chance to start again from scratch.

Some time late in 1998 I threw away the prototype and started work on the Template Toolkit. By then I was working at Canon Research Centre Europe Ltd. (CRE), involved in a general research programme related to web publishing and dynamic content generation. The first alpha release was in June 1999, followed by numerous more alpha and beta releases culminating in 1.00 being released on 2nd December 1999.

A month or so later, work had begun on version 2.00. The plan was to get the template language relatively stable in version 1.00 and not worry too much about performance or other internal matters. Then, version 2.00 would follow to improve performance, clean up the architecture and fix anything that, with the benefit of hindsight, we thought could be improved. As it happens, me starting work on version 2.00 coincided with Doug Steinwand sending me his parser variant which compiled templates to Perl code, giving a major performance boost. As well as the speedups, there are a whole host of significant new features in version 2.00, and a greatly improved internal architecture. Apart from a few minor "fixups" the template directives and language have remained the same as in version 1.00

Version 2.00 was available in beta release form in July 2000, just in time for the 4th Perl Conference where version 1.00 was awarded "Best New Perl Module". After another extended beta release period, version 2.00 was released on 1st December 2000.

Version 3 has been in development ever since.

AUTHOR

Top

Andy Wardley <abw@wardley.org>

http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

The Template Toolkit is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

CONTRIBUTORS

Top

Many people have contributed ideas, inspiration, fixes and features to the Template Toolkit. Their efforts continue to be very much appreciated. Please let me know if you think anyone is missing from this list.

Chuck Adams, Stephen Adkins, Ivan Adzhubey, Mark Anderson, Bradley Baetz, Thierry-Michel Barral, Craig Barratt, Stas Bekman, Tony Bowden, Neil Bowers, Leon Brocard, Lyle Brooks, Dave Cash, Piers Cawley, Darren Chamberlain, Eric Cholet, Nik Clayton, Tosh Cooey, Dave Cross, Chris Dean, Francois Desarmenien, Horst Dumcke, Mark Fowler, Michael Fowler, Kenny Gatdula, Axel Gerstmair, Dylan William Hardison, Perrin Harkins, Bryce Harrington, Dave Hodgkinson, Lubomir Host, Dave Howorth, Harald Joerg, Colin Johnson, Adam Kennedy, Vivek Khera, Rafael Kitover, Ivan Kurmanov, Hans von Lengerke, Jonas Liljegren, Simon Luff, Andy Maas, Paul Makepeace, Gervase Markham, Sergey Martynoff, Simon Matthews, Robert McArthur, Craig McLane, Myk Melez, Eugene Miretskiy, Tatsuhiko Miyagawa, Bill Moseley, Keith G. Murphy, Chris Nandor, Leslie Michael Orchard, Paul Orrock, Steve Peters, Briac Pilpré, Yuri Pimenov, Martin Portman, Slaven Rezic, Jess Robinson, Josh Rosenbaum, Christian Schaffner, Mike Schilli, Randal L. Schwartz, Paul Seamons, Paul Sharpe, Ville Skyttä, Barrie Slaymaker, Doug Steinwand, Michael Stevens, Autrijus Tang, Drew Taylor, Swen Thuemmler, Richard Tietjen, Stathy G. Touloumis, Jim Vaughan, Simon Wilcox, Chris Winters


/manual/Credits.html last modified 11:15:46 31-May-2007
TT_v224_html_docs/old/manual/Directives.html000700 000765 000765 00000357322 10627516023 020645 0ustar00abwabw000000 000000 Template::Manual::Directives

Accessing and Updating Template Variables

Top

GET

Top

The GET directive retrieves and outputs the value of the named variable.

[% GET foo %]

The GET keyword is optional. A variable can be specified in a directive tag by itself.

[% foo %]

The variable can have an unlimited number of elements, each separated by a dot. Each element can have arguments specified within parentheses.

[% foo %]
[% bar.baz %]
[% biz.baz(10) %]
...etc...

See Template::Manual::Variables for a full discussion on template variables.

You can also specify expressions using the logical (and, or, not, ?, :) and mathematic operators (+, -, *, /, %, mod, div).

[% template.title or default.title %]

[% score * 100 %]

[% order.nitems ? checkout(order.total) : 'no items' %]

The div operator returns the integer result of division. Both % and mod return the modulus (i.e. remainder) of division.

[% 15 / 6 %]            # 2.5
[% 15 div 6 %]          # 2
[% 15 mod 6 %]          # 3

CALL

Top

The CALL directive is similar to GET in evaluating the variable named, but doesn't print the result returned. This can be useful when a variable is bound to a sub-routine or object method which you want to call but aren't interested in the value returned.

[% CALL dbi.disconnect %]

[% CALL inc_page_counter(page_count) %]

SET

Top

The SET directive allows you to assign new values to existing variables or create new temporary variables.

[% SET title = 'Hello World' %]

The SET keyword is also optional. [% title = 'Hello World' %]

Variables may be assigned the values of other variables, unquoted numbers (2.718), literal text ('single quotes') or quoted text ("double quotes"). In the latter case, any variable references within the text will be interpolated when the string is evaluated. Variables should be prefixed by $, using curly braces to explicitly scope the variable name where necessary.

[% foo  = 'Foo'  %]               # literal value 'Foo'
[% bar  =  foo   %]               # value of variable 'foo'
[% cost = '$100' %]               # literal value '$100'
[% item = "$bar: ${cost}.00" %]   # value "Foo: $100.00"

Multiple variables may be assigned in the same directive and are evaluated in the order specified. Thus, the above could have been written:

[% foo  = 'Foo'
   bar  = foo
   cost = '$100'
   item = "$bar: ${cost}.00"
%]

Simple expressions can also be used, as per GET.

[% ten    = 10 
   twenty = 20
   thirty = twenty + ten
   forty  = 2 * twenty 
   fifty  = 100 div 2
   six    = twenty mod 7
%]

You can concatenate strings together using the ' _ ' operator. In Perl 5, the . is used for string concatenation, but in Perl 6, as in the Template Toolkit, the . will be used as the method calling operator and ' _ ' will be used for string concatenation. Note that the operator must be specified with surrounding whitespace which, as Larry says, is construed as a feature:

[% copyright = '(C) Copyright' _ year _ ' ' _ author %]

You can, of course, achieve a similar effect with double quoted string interpolation.

[% copyright = "(C) Copyright $year $author" %]

DEFAULT

Top

The DEFAULT directive is similar to SET but only updates variables that are currently undefined or have no "true" value (in the Perl sense).

[% DEFAULT
    name = 'John Doe'
    id   = 'jdoe'
%]

This can be particularly useful in common template components to ensure that some sensible default are provided for otherwise undefined variables.

[% DEFAULT 
   title = 'Hello World'
   bgcol = '#ffffff'
%]
<html>
  <head>
    <title>[% title %]</title>
  </head>
  <body bgcolor="[% bgcol %]">
    ...etc...

Processing Template Files and Blocks

Top

INSERT

Top

The INSERT directive is used to insert the contents of an external file at the current position.

[% INSERT myfile %]

No attempt to parse or process the file is made. The contents, possibly including any embedded template directives, are inserted intact.

The filename specified should be relative to one of the INCLUDE_PATH directories. Absolute (i.e. starting with /) and relative (i.e. starting with .) filenames may be used if the ABSOLUTE and RELATIVE options are set, respectively. Both these options are disabled by default.

my $template = Template->new({
    INCLUDE_PATH => '/here:/there',
});

$template->process('myfile');

myfile:

[% INSERT foo %]            # looks for /here/foo then /there/foo
[% INSERT /etc/passwd %]    # file error: ABSOLUTE not set
[% INSERT ../secret %]      # file error: RELATIVE not set

For convenience, the filename does not need to be quoted as long as it contains only alphanumeric characters, underscores, dots or forward slashes. Names containing any other characters should be quoted.

[% INSERT misc/legalese.txt            %]
[% INSERT 'dos98/Program Files/stupid' %]

To evaluate a variable to specify a filename, you should explicitly prefix it with a $ or use double-quoted string interpolation.

[% language = 'en'
   legalese = 'misc/legalese.txt' 
%]

[% INSERT $legalese %]              # misc/legalese.txt
[% INSERT "$language/$legalese" %]  # en/misc/legalese.txt

Multiple files can be specified using + as a delimiter. All files should be unquoted names or quoted strings. Any variables should be interpolated into double-quoted strings.

[% INSERT legalese.txt + warning.txt %]
[% INSERT  "$legalese" + warning.txt %]  # requires quoting

INCLUDE

Top

The INCLUDE directive is used to process and include the output of another template file or block.

[% INCLUDE header %]

If a BLOCK of the specified name is defined in the same file, or in a file from which the current template has been called (i.e. a parent template) then it will be used in preference to any file of the same name.

[% INCLUDE table %]     # uses BLOCK defined below

[% BLOCK table %]
   <table>
     ...
   </table>
[% END %]

If a BLOCK definition is not currently visible then the template name should be a file relative to one of the INCLUDE_PATH directories, or an absolute or relative file name if the ABSOLUTE/RELATIVE options are appropriately enabled. The INCLUDE directive automatically quotes the filename specified, as per INSERT described above. When a variable contains the name of the template for the INCLUDE directive, it should be explicitly prefixed by $ or double-quoted

[% myheader = 'my/misc/header' %]
[% INCLUDE   myheader  %]           # 'myheader'
[% INCLUDE  $myheader  %]           # 'my/misc/header'
[% INCLUDE "$myheader" %]           # 'my/misc/header'

Any template directives embedded within the file will be processed accordingly. All variables currently defined will be visible and accessible from within the included template.

[% title = 'Hello World' %]
[% INCLUDE header %]
<body>
...

header:

<html>
<title>[% title %]</title>

output:

<html>
<title>Hello World</title>
<body>
...

Local variable definitions may be specified after the template name, temporarily masking any existing variables. Insignificant whitespace is ignored within directives so you can add variable definitions on the same line, the next line or split across several line with comments interspersed, if you prefer.

[% INCLUDE table %]

[% INCLUDE table title="Active Projects" %]

[% INCLUDE table 
     title   = "Active Projects" 
     bgcolor = "#80ff00"    # chartreuse
     border  = 2
%]

The INCLUDE directive localises (i.e. copies) all variables before processing the template. Any changes made within the included template will not affect variables in the including template.

[% foo = 10 %]

foo is originally [% foo %]
[% INCLUDE bar %]
foo is still [% foo %]

[% BLOCK bar %]
   foo was [% foo %]
   [% foo = 20 %]
   foo is now [% foo %]
[% END %]

output:

foo is originally 10
   foo was 10
   foo is now 20
foo is still 10

Technical Note: the localisation of the stash (that is, the process by which variables are copied before an INCLUDE to prevent being overwritten) is only skin deep. The top-level variable namespace (hash) is copied, but no attempt is made to perform a deep-copy of other structures (hashes, arrays, objects, etc.) Therefore, a foo variable referencing a hash will be copied to create a new foo variable but which points to the same hash array. Thus, if you update compound variables (e.g. foo.bar) then you will change the original copy, regardless of any stash localisation. If you're not worried about preserving variable values, or you trust the templates you're including then you might prefer to use the PROCESS directive which is faster by virtue of not performing any localisation.

You can specify dotted variables as "local" variables to an INCLUDE directive. However, be aware that because of the localisation issues explained above (if you skipped the previous Technical Note above then you might want to go back and read it or skip this section too), the variables might not actualy be "local". If the first element of the variable name already references a hash array then the variable update will affect the original variable.

[% foo = {
       bar = 'Baz'
   }
%]

[% INCLUDE somefile foo.bar='Boz' %]

[% foo.bar %]           # Boz

This behaviour can be a little unpredictable (and may well be improved upon in a future version). If you know what you're doing with it and you're sure that the variables in question are defined (nor not) as you expect them to be, then you can rely on this feature to implement some powerful "global" data sharing techniques. Otherwise, you might prefer to steer well clear and always pass simple (undotted) variables as parameters to INCLUDE and other similar directives.

If you want to process several templates in one go then you can specify each of their names (quoted or unquoted names only, no unquoted $variables) joined together by +. The INCLUDE directive will then process them in order.

[% INCLUDE html/header + "site/$header" + site/menu
     title = "My Groovy Web Site"
%]

The variable stash is localised once and then the templates specified are processed in order, all within that same variable context. This makes it slightly faster than specifying several separate INCLUDE directives (because you only clone the variable stash once instead of n times), but not quite as "safe" because any variable changes in the first file will be visible in the second, third and so on. This might be what you want, of course, but then again, it might not.

PROCESS

Top

The PROCESS directive is similar to INCLUDE but does not perform any localisation of variables before processing the template. Any changes made to variables within the included template will be visible in the including template.

[% foo = 10 %]

foo is [% foo %]
[% PROCESS bar %]
foo is [% foo %]

[% BLOCK bar %]
   [% foo = 20 %]
   changed foo to [% foo %]
[% END %]

output:

foo is 10
   changed foo to 20
foo is 20

Parameters may be specified in the PROCESS directive, but these too will become visible changes to current variable values.

[% foo = 10 %]
foo is [% foo %]
[% PROCESS bar
   foo = 20 
%]
foo is [% foo %]

[% BLOCK bar %]
   this is bar, foo is [% foo %]
[% END %]

output:

foo is 10
   this is bar, foo is 20
foo is 20

The PROCESS directive is slightly faster than INCLUDE because it avoids the need to localise (i.e. copy) the variable stash before processing the template. As with INSERT and INCLUDE, the first parameter does not need to be quoted as long as it contains only alphanumeric characters, underscores, periods or forward slashes. A $ prefix can be used to explicitly indicate a variable which should be interpolated to provide the template name:

[% myheader = 'my/misc/header' %]
[% PROCESS  myheader %]              # 'myheader'
[% PROCESS $myheader %]              # 'my/misc/header'

As with INCLUDE, multiple templates can be specified, delimited by +, and are processed in order.

[% PROCESS html/header + my/header %]

WRAPPER

Top

It's not unusual to find yourself adding common headers and footers to pages or sub-sections within a page. Something like this:

[% INCLUDE section/header
   title = 'Quantum Mechanics'
%]
   Quantum mechanics is a very interesting subject wish 
   should prove easy for the layman to fully comprehend.
[% INCLUDE section/footer %]

[% INCLUDE section/header
   title = 'Desktop Nuclear Fusion for under $50'
%]
   This describes a simple device which generates significant 
   sustainable electrical power from common tap water by process 
   of nuclear fusion.
[% INCLUDE section/footer %]

The individual template components being included might look like these:

section/header:

<p>
<h2>[% title %]</h2>

section/footer:

</p>

The WRAPPER directive provides a way of simplifying this a little. It encloses a block up to a matching END directive, which is first processed to generate some output. This is then passed to the named template file or BLOCK as the content variable.

[% WRAPPER section
   title = 'Quantum Mechanics'
%]
   Quantum mechanics is a very interesting subject wish 
   should prove easy for the layman to fully comprehend.
[% END %]

[% WRAPPER section
   title = 'Desktop Nuclear Fusion for under $50'
%]
   This describes a simple device which generates significant 
   sustainable electrical power from common tap water by process 
   of nuclear fusion.
[% END %]

The single 'section' template can then be defined as:

<h2>[% title %]</h2>
<p>
  [% content %]
</p>

Like other block directives, it can be used in side-effect notation:

[% INSERT legalese.txt WRAPPER big_bold_table %]

It's also possible to specify multiple templates to a WRAPPER directive. The specification order indicates outermost to innermost wrapper templates. For example, given the following template block definitions:

[% BLOCK bold   %]<b>[% content %]</b>[% END %]
[% BLOCK italic %]<i>[% content %]</i>[% END %]

the directive

[% WRAPPER bold+italic %]Hello World[% END %]

would generate the following output:

<b><i>Hello World</i></b>

BLOCK

Top

The BLOCK...END construct can be used to define template component blocks which can be processed with the INCLUDE, PROCESS and WRAPPER directives.

[% BLOCK tabrow %]
<tr>
  <td>[% name %]<td>
  <td>[% email %]</td>
</tr>
[% END %]

<table>
  [% PROCESS tabrow  name='Fred'  email='fred@nowhere.com' %]
  [% PROCESS tabrow  name='Alan'  email='alan@nowhere.com' %]
</table>

A BLOCK definition can be used before it is defined, as long as the definition resides in the same file. The block definition itself does not generate any output.

[% PROCESS tmpblk %]

[% BLOCK tmpblk %] This is OK [% END %]

You can use an anonymous BLOCK to capture the output of a template fragment.

[% julius = BLOCK %]
   And Caesar's spirit, ranging for revenge,
   With Ate by his side come hot from hell,
   Shall in these confines with a monarch's voice
   Cry  'Havoc', and let slip the dogs of war;
   That this foul deed shall smell above the earth
   With carrion men, groaning for burial.
[% END %]

Like a named block, it can contain any other template directives which are processed when the block is defined. The output generated by the block is then assigned to the variable julius.

Anonymous BLOCKs can also be used to define block macros. The enclosing block is processed each time the macro is called.

[% MACRO locate BLOCK %]
   The [% animal %] sat on the [% place %].
[% END %]

[% locate(animal='cat', place='mat') %]    # The cat sat on the mat
[% locate(animal='dog', place='log') %]    # The dog sat on the log

Conditional Processing

Top

IF / UNLESS / ELSIF / ELSE

Top

The IF and UNLESS directives can be used to process or ignore a block based on some run-time condition.

[% IF frames %]
   [% INCLUDE frameset %]
[% END %]

[% UNLESS text_mode %]
   [% INCLUDE biglogo %]
[% END %]

Multiple conditions may be joined with ELSIF and/or ELSE blocks.

[% IF age < 10 %]
   Hello [% name %], does your mother know you're 
   using her AOL account?
[% ELSIF age < 18 %]
   Sorry, you're not old enough to enter 
   (and too dumb to lie about your age)
[% ELSE %]
   Welcome [% name %].
[% END %]

The following conditional and boolean operators may be used:

== != < <= > >= && || ! and or not

Conditions may be arbitrarily complex and are evaluated with the same precedence as in Perl. Parenthesis may be used to explicitly determine evaluation order.

# ridiculously contrived complex example
[% IF (name == 'admin' || uid <= 0) && mode == 'debug' %]
   I'm confused.
[% ELSIF more > less %]
   That's more or less correct.
[% END %]

The and, or and not operator are provided as aliases for &&, || and !, respectively. Unlike Perl, which treats and, or and not as separate, lower-precedence versions of the other operators, the Template Toolkit performs a straightforward substitution of and for &&, and so on. That means that and, or and not have the same operator precedence as &&, || and !.

SWITCH / CASE

Top

The SWITCH / CASE construct can be used to perform a multi-way conditional test. The SWITCH directive expects an expression which is first evaluated and then compared against each CASE statement in turn. Each CASE directive should contain a single value or a list of values which should match. CASE may also be left blank or written as [% CASE DEFAULT %] to specify a default match. Only one CASE matches, there is no drop-through between CASE statements.

[% SWITCH myvar %]
[%   CASE value1 %]
       ...
[%   CASE [ value2 value3 ] %]   # multiple values
       ...
[%   CASE myhash.keys %]         # ditto
       ...
[%   CASE %]                     # default
       ...
[% END %]

Loop Processing

Top

FOREACH

Top

The FOREACH directive will iterate through the items in a list, processing the enclosed block for each one.

my $vars = {
    foo   => 'Foo',
    items => [ 'one', 'two', 'three' ],
};

template:
Things:
[% FOREACH thing = [ foo 'Bar' "$foo Baz" ] %]
   * [% thing %]
[% END %]

Items:
[% FOREACH i IN items %]
   * [% i %]
[% END %]

Stuff:
[% stuff = [ foo "$foo Bar" ] %]
[% FOREACH s IN stuff %]
   * [% s %]
[% END %]

output:

Things:
  * Foo
  * Bar
  * Foo Baz

Items:
  * one
  * two
  * three

Stuff:
  * Foo
  * Foo Bar

You can use also use IN instead of = if you prefer.

[% FOREACH crook IN government %]

When the FOREACH directive is used without specifying a target variable, any iterated values which are hash references will be automatically imported.

[% userlist = [
    { id => 'tom',   name => 'Thomas'  },
    { id => 'dick',  name => 'Richard'  },
    { id => 'larry', name => 'Lawrence' },
   ]
%]

[% FOREACH user IN userlist %]
   [% user.id %] [% user.name %]
[% END %]

short form:

[% FOREACH userlist %]
   [% id %] [% name %]
[% END %]

Note that this particular usage creates a localised variable context to prevent the imported hash keys from overwriting any existing variables. The imported definitions and any other variables defined in such a FOREACH loop will be lost at the end of the loop, when the previous context and variable values are restored.

However, under normal operation, the loop variable remains in scope after the FOREACH loop has ended (caveat: overwriting any variable previously in scope). This is useful as the loop variable is secretly an iterator object (see below) and can be used to analyse the last entry processed by the loop.

The FOREACH directive can also be used to iterate through the entries in a hash array. Each entry in the hash is returned in sorted order (based on the key) as a hash array containing 'key' and 'value' items.

[% users = {
     tom   => 'Thomas',
     dick  => 'Richard',
     larry => 'Lawrence',
   }
%]

[% FOREACH u IN users %]
   * [% u.key %] : [% u.value %]
[% END %]

Output:

* dick : Richard
* larry : Lawrence
* tom : Thomas      

The NEXT directive starts the next iteration in the FOREACH loop.

[% FOREACH user IN userlist %]
   [% NEXT IF user.isguest %]
   Name: [% user.name %]    Email: [% user.email %]
[% END %]

The LAST directive can be used to prematurely exit the loop. BREAK is also provided as an alias for LAST.

[% FOREACH match IN results.nsort('score').reverse %]
   [% LAST IF match.score < 50 %]
   [% match.score %] : [% match.url %]
[% END %]

The FOREACH directive is implemented using the Template::Iterator module. A reference to the iterator object for a FOREACH directive is implicitly available in the loop variable. The following methods can be called on the loop iterator.

size()      number of elements in the list
max()       index number of last element (size - 1)
index()     index of current iteration from 0 to max()
count()     iteration counter from 1 to size() (i.e. index() + 1)
first()     true if the current iteration is the first
last()      true if the current iteration is the last
prev()      return the previous item in the list
next()      return the next item in the list

See Template::Iterator for further details.

Example:

[% FOREACH item IN [ 'foo', 'bar', 'baz' ] -%]
   [%- "<ul>\n" IF loop.first %]
   <li>[% loop.count %]/[% loop.size %]: [% item %]
   [%- "</ul>\n" IF loop.last %]
[% END %]

Output:

<ul>
<li>1/3: foo
<li>2/3: bar
<li>3/3: baz
</ul>

Nested loops will work as expected, with the loop variable correctly referencing the innermost loop and being restored to any previous value (i.e. an outer loop) at the end of the loop.

[% FOREACH group IN grouplist;
     # loop => group iterator
     "Groups:\n" IF loop.first;

     FOREACH user IN group.userlist;
        # loop => user iterator
        "$loop.count: $user.name\n";
     END;

     # loop => group iterator
     "End of Groups\n" IF loop.last;
   END 
%]

The iterator plugin can also be used to explicitly create an iterator object. This can be useful within nested loops where you need to keep a reference to the outer iterator within the inner loop. The iterator plugin effectively allows you to create an iterator by a name other than loop. See Template::Plugin::Iterator for further details.

[% USE giter = iterator(grouplist) %]

[% FOREACH group IN giter %]
   [% FOREACH user IN group.userlist %]
         user #[% loop.count %] in
         group [% giter.count %] is
         named [% user.name %]
   [% END %]
[% END %]

WHILE

Top

The WHILE directive can be used to repeatedly process a template block while a conditional expression evaluates true. The expression may be arbitrarily complex as per IF / UNLESS.

[% WHILE total < 100 %]
   ...
   [% total = calculate_new_total %]
[% END %]

An assignment can be enclosed in parenthesis to evaluate the assigned value.

[% WHILE (user = get_next_user_record) %]
   [% user.name %]
[% END %]

The NEXT directive can be used to start the next iteration of a WHILE loop and BREAK can be used to exit the loop, both as per FOREACH.

The Template Toolkit uses a failsafe counter to prevent runaway WHILE loops which would otherwise never terminate. If the loop exceeds 1000 iterations then an undef exception will be thrown, reporting the error:

WHILE loop terminated (> 1000 iterations)

The $Template::Directive::WHILE_MAX variable controls this behaviour and can be set to a higher value if necessary.

Filters, Plugins, Macros and Perl

Top

FILTER

Top

The FILTER directive can be used to post-process the output of a block. A number of standard filters are provided with the Template Toolkit. The html filter, for example, escapes the '<', '>' and '&' characters to prevent them from being interpreted as HTML tags or entity reference markers.

[% FILTER html %]
   HTML text may have < and > characters embedded
   which you want converted to the correct HTML entities.
[% END %]

output:

HTML text may have &lt; and &gt; characters embedded
which you want converted to the correct HTML entities.

The FILTER directive can also follow various other non-block directives. For example:

[% INCLUDE mytext FILTER html %]

The | character can also be used as an alias for FILTER.

[% INCLUDE mytext | html %]

Multiple filters can be chained together and will be called in sequence.

[% INCLUDE mytext FILTER html FILTER html_para %]

or

[% INCLUDE mytext | html | html_para %]

Filters come in two flavours, known as 'static' or 'dynamic'. A static filter is a simple subroutine which accepts a text string as the only argument and returns the modified text. The html filter is an example of a static filter, implemented as:

sub html_filter {
    my $text = shift;
    for ($text) {
        s/&/&amp;/g;
        s/</&lt;/g;
        s/>/&gt;/g;
    }
    return $text;
}

Dynamic filters can accept arguments which are specified when the filter is called from a template. The repeat filter is such an example, accepting a numerical argument which specifies the number of times that the input text should be repeated.

[% FILTER repeat(3) %]blah [% END %]

output:

blah blah blah

These are implemented as filter 'factories'. The factory subroutine is passed a reference to the current Template::Context object along with any additional arguments specified. It should then return a subroutine reference (e.g. a closure) which implements the filter. The repeat filter factory is implemented like this:

sub repeat_filter_factory {
    my ($context, $iter) = @_;
    $iter = 1 unless defined $iter;

    return sub {
        my $text = shift;
        $text = '' unless defined $text;
        return join('\n', $text) x $iter;
    }
}

The FILTERS option, described in Template::Manual::Config, allows custom filters to be defined when a Template object is instantiated. The Template::Context#define_filter() method allows further filters to be defined at any time.

When using a filter, it is possible to assign an alias to it for further use. This is most useful for dynamic filters that you want to re-use with the same configuration.

[% FILTER echo = repeat(2) %]
Is there anybody out there?
[% END %]

[% FILTER echo %]
Mother, should I build a wall?
[% END %]

Output:

Is there anybody out there?
Is there anybody out there?
Mother, should I build a wall?
Mother, should I build a wall?

The FILTER directive automatically quotes the name of the filter. As with INCLUDE et al, you can use a variable to provide the name of the filter, prefixed by $.

[% myfilter = 'html' %]
[% FILTER $myfilter %]      # same as [% FILTER html %]
   ...
[% END %]

A template variable can also be used to define a static filter subroutine. However, the Template Toolkit will automatically call any subroutine bound to a variable and use the value returned. Thus, the above example could be implemented as:

my $vars = {
    myfilter => sub { return 'html' },
};

template:

[% FILTER $myfilter %]      # same as [% FILTER html %]
   ...
[% END %]

To define a template variable that evaluates to a subroutine reference that can be used by the FILTER directive, you should create a subroutine that, when called automatically by the Template Toolkit, returns another subroutine reference which can then be used to perform the filter operation. Note that only static filters can be implemented in this way.

my $vars = {
    myfilter => sub { \&my_filter_sub },
};

sub my_filter_sub {
    my $text = shift;
    # do something
    return $text;
}

template:

[% FILTER $myfilter %]
   ...
[% END %]

Alternately, you can bless a subroutine reference into a class (any class will do) to fool the Template Toolkit into thinking it's an object rather than a subroutine. This will then bypass the automatic "call-a-subroutine-to-return-a-value" magic.

my $vars = {
    myfilter => bless(\&my_filter_sub, 'anything_you_like'),
};

template:

[% FILTER $myfilter %]          
   ...
[% END %]

Filters bound to template variables remain local to the variable context in which they are defined. That is, if you define a filter in a PERL block within a template that is loaded via INCLUDE, then the filter definition will only exist until the end of that template when the stash is delocalised, restoring the previous variable state. If you want to define a filter which persists for the lifetime of the processor, or define additional dynamic filter factories, then you can call the Template::Context#define_filter() method on the current Template::Context object.

See Template::Manual::Filters for a complete list of available filters, their descriptions and examples of use.

USE

Top

The USE directive can be used to load and initialise "plugin" extension modules.

[% USE myplugin %]

A plugin is a regular Perl module that conforms to a particular object-oriented interface, allowing it to be loaded into and used automatically by the Template Toolkit. For details of this interface and information on writing plugins, consult Template::Plugin.

A number of standard plugins are included with the Template Toolkit (see below and Template::Manual::Plugins). The names of these standard plugins are case insensitive.

[% USE CGI   %]        # => Template::Plugin::CGI
[% USE Cgi   %]        # => Template::Plugin::CGI
[% USE cgi   %]        # => Template::Plugin::CGI

You can also define further plugins using the PLUGINS option.

my $tt = Template->new({
    PLUGINS => {
        foo => 'My::Plugin::Foo',
        bar => 'My::Plugin::Bar',
    },
});

The recommended convention is to specify these plugin names in lower case. The Template Toolkit first looks for an exact case-sensitive match and then tries the lower case conversion of the name specified.

[% USE Foo %]      # look for 'Foo' then 'foo'

If you define all your PLUGINS with lower case names then they will be located regardless of how the user specifies the name in the USE directive. If, on the other hand, you define your PLUGINS with upper or mixed case names then the name specified in the USE directive must match the case exactly.

If the plugin isn't defined in either the standard plugins ($Template::Plugins::STD_PLUGINS) or via the PLUGINS option, then the PLUGIN_BASE is searched.

In this case the plugin name is case-sensitive. It is appended to each of the PLUGIN_BASE module namespaces in turn (default: Template::Plugin) to construct a full module name which it attempts to locate and load. Any periods, '.', in the name will be converted to '::'.

[% USE MyPlugin %]     #  => Template::Plugin::MyPlugin
[% USE Foo.Bar  %]     #  => Template::Plugin::Foo::Bar

The LOAD_PERL option (disabled by default) provides a further way by which external Perl modules may be loaded. If a regular Perl module (i.e. not a Template::Plugin::* or other module relative to some PLUGIN_BASE) supports an object-oriented interface and a new() constructor then it can be loaded and instantiated automatically. The following trivial example shows how the IO::File module might be used.

[% USE file = IO.File('/tmp/mydata') %]

[% WHILE (line = file.getline) %]
   <!-- [% line %] -->
[% END %]

Any additional parameters supplied in parenthesis after the plugin name will be also be passed to the new() constructor. A reference to the current Template::Context object is passed as the first parameter.

[% USE MyPlugin('foo', 123) %]

equivalent to:

Template::Plugin::MyPlugin->new($context, 'foo', 123);

The only exception to this is when a module is loaded via the LOAD_PERL option. In this case the $context reference is not passed to the new() constructor. This is based on the assumption that the module is a regular Perl module rather than a Template Toolkit plugin so isn't expecting a context reference and wouldn't know what to do with it anyway.

Named parameters may also be specified. These are collated into a hash which is passed by reference as the last parameter to the constructor, as per the general code calling interface.

[% USE url('/cgi-bin/foo', mode='submit', debug=1) %]

equivalent to:

Template::Plugin::URL->new(
    $context, 
    '/cgi-bin/foo'
    { mode => 'submit', debug => 1 }
);

The plugin may represent any data type; a simple variable, hash, list or code reference, but in the general case it will be an object reference. Methods can be called on the object (or the relevant members of the specific data type) in the usual way:

[% USE table(mydata, rows=3) %]

[% FOREACH row IN table.rows %]
   <tr>    
   [% FOREACH item IN row %]
    <td>[% item %]</td>
   [% END %]
   </tr>
[% END %]

An alternative name may be provided for the plugin by which it can be referenced:

[% USE scores = table(myscores, cols=5) %]

[% FOREACH row IN scores.rows %]
   ...
[% END %]

You can use this approach to create multiple plugin objects with different configurations. This example shows how the Template::Plugin::Format plugin is used to create sub-routines bound to variables for formatting text as per printf().

[% USE bold = format('<b>%s</b>') %]
[% USE ital = format('<i>%s</i>') %]
[% bold('This is bold')   %]
[% ital('This is italic') %]

Output:

<b>This is bold</b>
<i>This is italic</i>

This next example shows how the Template::Plugin::URL plugin can be used to build dynamic URLs from a base part and optional query parameters.

[% USE mycgi = URL('/cgi-bin/foo.pl', debug=1) %]
<a href="[% mycgi %]">...
<a href="[% mycgi(mode='submit') %]"...

Output:

<a href="/cgi-bin/foo.pl?debug=1">...
<a href="/cgi-bin/foo.pl?mode=submit&debug=1">...

The Template::Plugin::CGI plugin is an example of one which delegates to another Perl module. In this this case, to Lincoln Stein's CGI module. All of the methods provided by the CGI module are available via the plugin.

[% USE CGI;
   CGI.start_form;
   CGI.checkbox_group( name   = 'colours', 
                       values = [ 'red' 'green' 'blue' ] );
   CGI.popup_menu( name   = 'items', 
                   values = [ 'foo' 'bar' 'baz' ] );
   CGI.end_form 
%]

See Template::Manual::Plugins for more information on the plugins distributed with the toolkit or available from CPAN.

MACRO

Top

The MACRO directive allows you to define a directive or directive block which is then evaluated each time the macro is called.

[% MACRO header INCLUDE header %]

Calling the macro as:

[% header %]

is then equivalent to:

[% INCLUDE header %]

Macros can be passed named parameters when called. These values remain local to the macro.

[% header(title='Hello World') %]  

equivalent to:

[% INCLUDE header title='Hello World' %]

A MACRO definition may include parameter names. Values passed to the macros are then mapped to these local variables. Other named parameters may follow these.

[% MACRO header(title) INCLUDE header %]
[% header('Hello World') %]
[% header('Hello World', bgcol='#123456') %]

equivalent to:

[% INCLUDE header title='Hello World' %]
[% INCLUDE header title='Hello World' bgcol='#123456' %]

Here's another example, defining a macro for display numbers in comma-delimited groups of 3, using the chunk and join virtual method.

[% MACRO number(n) GET n.chunk(-3).join(',') %]
[% number(1234567) %]    # 1,234,567

A MACRO may precede any directive and must conform to the structure of the directive.

[% MACRO header IF frames %]
   [% INCLUDE frames/header %]
[% ELSE %]
   [% INCLUDE header %]
[% END %]

[% header %]

A MACRO may also be defined as an anonymous BLOCK. The block will be evaluated each time the macro is called.

[% MACRO header BLOCK %]
   ...content...
[% END %]

[% header %]

If you've got the EVAL_PERL option set, then you can even define a MACRO as a PERL block (see below):

[% MACRO triple(n) PERL %]
     my $n = $stash->get('n');
     print $n * 3;
[% END -%]

PERL

Top

(for the advanced reader)

The PERL directive is used to mark the start of a block which contains Perl code for evaluation. The EVAL_PERL option must be enabled for Perl code to be evaluated or a perl exception will be thrown with the message 'EVAL_PERL not set'.

Perl code is evaluated in the Template::Perl package. The $context package variable contains a reference to the current Template::Context object. This can be used to access the functionality of the Template Toolkit to process other templates, load plugins, filters, etc. See Template::Context for further details.

[% PERL %]
   print $context->include('myfile');
[% END %]

The $stash variable contains a reference to the top-level stash object which manages template variables. Through this, variable values can be retrieved and updated. See Template::Stash for further details.

[% PERL %]
   $stash->set(foo => 'bar');
   print "foo value: ", $stash->get('foo');
[% END %]

Output:

foo value: bar

Output is generated from the PERL block by calling print(). Note that the Template::Perl::PERLOUT handle is selected (tied to an output buffer) instead of STDOUT.

[% PERL %]
   print "foo\n";                           # OK
   print PERLOUT "bar\n";                   # OK, same as above
   print Template::Perl::PERLOUT "baz\n";   # OK, same as above
   print STDOUT "qux\n";                    # WRONG!
[% END %]

The PERL block may contain other template directives. These are processed before the Perl code is evaluated.

[% name = 'Fred Smith' %]

[% PERL %]
   print "[% name %]\n";
[% END %]

Thus, the Perl code in the above example is evaluated as:

print "Fred Smith\n";

Exceptions may be thrown from within PERL blocks using die(). They will be correctly caught by enclosing TRY blocks.

[% TRY %]
   [% PERL %]
      die "nothing to live for\n";
   [% END %]
[% CATCH %]
   error: [% error.info %]
[% END %]

output: error: nothing to live for

RAWPERL

Top

(for the very advanced reader)

The Template Toolkit parser reads a source template and generates the text of a Perl subroutine as output. It then uses eval() to evaluate it into a subroutine reference. This subroutine is then called to process the template, passing a reference to the current Template::Context object through which the functionality of the Template Toolkit can be accessed. The subroutine reference can be cached, allowing the template to be processed repeatedly without requiring any further parsing.

For example, a template such as:

[% PROCESS header %]
The [% animal %] sat on the [% location %]
[% PROCESS footer %]

is converted into the following Perl subroutine definition:

sub {
    my $context = shift;
    my $stash   = $context->stash;
    my $output  = '';
    my $error;

    eval { BLOCK: {
        $output .=  $context->process('header');
        $output .=  "The ";
        $output .=  $stash->get('animal');
        $output .=  " sat on the ";
        $output .=  $stash->get('location');
        $output .=  $context->process('footer');
        $output .=  "\n";
    } };
    if ($@) {
        $error = $context->catch($@, \$output);
        die $error unless $error->type eq 'return';
    }

    return $output;
}

To examine the Perl code generated, such as in the above example, set the $Template::Parser::DEBUG package variable to any true value. You can also set the $Template::Directive::PRETTY variable true to have the code formatted in a readable manner for human consumption. The source code for each generated template subroutine will be printed to STDERR on compilation (i.e. the first time a template is used).

$Template::Parser::DEBUG = 1;
$Template::Directive::PRETTY = 1;

$template->process($file, $vars)
    || die $template->error(), "\n";

The PERL ... END construct allows Perl code to be embedded into a template when the EVAL_PERL option is set. It is evaluated at "runtime" using eval() each time the template subroutine is called. This is inherently flexible, but not as efficient as it could be, especially in a persistent server environment where a template may be processed many times.

The RAWPERL directive allows you to write Perl code that is integrated directly into the generated Perl subroutine text. It is evaluated once at compile time and is stored in cached form as part of the compiled template subroutine. This makes RAWPERL blocks more efficient than PERL blocks.

The downside is that you must code much closer to the metal. For example, in a PERL block you can call print() to generate some output. RAWPERL blocks don't afford such luxury. The code is inserted directly into the generated subroutine text and should conform to the convention of appending to the $output variable.

[% PROCESS  header %]

[% RAWPERL %]
   $output .= "Some output\n";
   ...
   $output .= "Some more output\n";
[% END %]

The critical section of the generated subroutine for this example would then look something like:

...
eval { BLOCK: {
    $output .=  $context->process('header');
    $output .=  "\n";
    $output .= "Some output\n";
    ...
    $output .= "Some more output\n";
    $output .=  "\n";
} };
...

As with PERL blocks, the Template::Context and Template::Stash references are pre-defined and available for use within RAWPERL code.

Exception Handling and Flow Control

Top

TRY / THROW / CATCH / FINAL

Top

(more advanced material)

The Template Toolkit supports fully functional, nested exception handling. The TRY directive introduces an exception handling scope which continues until the matching END directive. Any errors that occur within that block will be caught and can be handled by one of the CATCH blocks defined.

[% TRY %]
   ...blah...blah...
   [% CALL somecode %]
   ...etc...
   [% INCLUDE someblock %]
   ...and so on...
[% CATCH %]
   An error occurred!
[% END %]

Errors are raised as exceptions (objects of the Template::Exception class) which contain two fields: type and info. The exception type is used to indicate the kind of error that occurred. It is a simple text string which can contain letters, numbers, '_' or '.'. The info field contains an error message indicating what actually went wrong. Within a catch block, the exception object is aliased to the error variable. You can access the type and info fields directly.

[% mydsn = 'dbi:MySQL:foobar' %]
...

[% TRY %]
   [% USE DBI(mydsn) %]
[% CATCH %]
   ERROR! Type: [% error.type %]
          Info: [% error.info %]
[% END %]

output (assuming a non-existant database called 'foobar'):

ERROR!  Type: DBI
        Info: Unknown database "foobar"

The error variable can also be specified by itself and will return a string of the form "$type error - $info".

...
[% CATCH %]
ERROR: [% error %]
[% END %]

Output:

ERROR: DBI error - Unknown database "foobar"

Each CATCH block may be specified with a particular exception type denoting the kind of error that it should catch. Multiple CATCH blocks can be provided to handle different types of exception that may be thrown in the TRY block. A CATCH block specified without any type, as in the previous example, is a default handler which will catch any otherwise uncaught exceptions. This can also be specified as [% CATCH DEFAULT %].

[% TRY %]
   [% INCLUDE myfile %]
   [% USE DBI(mydsn) %]
   [% CALL somecode %]
[% CATCH file %]
   File Error! [% error.info %]
[% CATCH DBI %]
   [% INCLUDE database/error.html %]
[% CATCH %]
   [% error %]
[% END %]

Remember that you can specify multiple directives within a single tag, each delimited by ';'. So the above example can be written more concisely as:

[% TRY;
       INCLUDE myfile;
       USE DBI(mydsn);
       CALL somecode;
   CATCH file;
       "File Error! $error.info";
   CATCH DBI;
       INCLUDE database/error.html;
   CATCH;
       error;
   END 
%]

The DBI plugin throws exceptions of the DBI type (in case that wasn't already obvious). The other specific exception caught here is of the file type.

A file exception is automatically thrown by the Template Toolkit when it can't find a file, or fails to load, parse or process a file that has been requested by an INCLUDE, PROCESS, INSERT or WRAPPER directive. If myfile can't be found in the example above, the [% INCLUDE myfile %] directive will raise a file exception which is then caught by the [% CATCH file %] block. The output generated would be:

File Error! myfile: not found

Note that the DEFAULT option (disabled by default) allows you to specify a default file to be used any time a template file can't be found. This will prevent file exceptions from ever being raised when a non-existant file is requested (unless, of course, the DEFAULT file your specify doesn't exist). Errors encountered once the file has been found (i.e. read error, parse error) will be raised as file exceptions as per usual.

Uncaught exceptions (i.e. if the TRY block doesn't have a type specific or default CATCH handler) may be caught by enclosing TRY blocks which can be nested indefinitely across multiple templates. If the error isn't caught at any level then processing will stop and the Template Template#process() method will return a false value to the caller. The relevant Template::Exception object can be retrieved by calling the Template#error() method.

[% TRY %]
   ...
   [% TRY %]
      [% INCLUDE $user.header %]
   [% CATCH file %]
      [% INCLUDE header %]
   [% END %]
   ...
[% CATCH DBI %]
   [% INCLUDE database/error.html %]
[% END %]

In this example, the inner TRY block is used to ensure that the first INCLUDE directive works as expected. We're using a variable to provide the name of the template we want to include, user.header, and it's possible this contains the name of a non-existant template, or perhaps one containing invalid template directives. If the INCLUDE fails with a file error then we CATCH it in the inner block and INCLUDE the default header file instead. Any DBI errors that occur within the scope of the outer TRY block will be caught in the relevant CATCH block, causing the database/error.html template to be processed. Note that included templates inherit all currently defined template variable so these error files can quite happily access the <error> variable to retrieve information about the currently caught exception. For example, the database/error.html template might look like this:

<h2>Database Error</h2>
A database error has occurred: [% error.info %]

You can also specify a FINAL block. This is always processed regardless of the outcome of the TRY and/or CATCH blocks. If an exception is uncaught then the FINAL block is processed before jumping to the enclosing block or returning to the caller.

[% TRY %]
   ...
[% CATCH this %] 
   ...
[% CATCH that %] 
   ...
[% FINAL %]
   All done!
[% END %]

The output from the TRY block is left intact up to the point where an exception occurs. For example, this template:

[% TRY %]
   This gets printed 
   [% THROW food 'carrots' %]
   This doesn't
[% CATCH food %]
   culinary delights: [% error.info %]
[% END %]    

generates the following output:

This gets printed
culinary delights: carrots

The CLEAR directive can be used in a CATCH or FINAL block to clear any output created in the TRY block.

[% TRY %]
   This gets printed 
   [% THROW food 'carrots' %]
   This doesn't
[% CATCH food %]
   [% CLEAR %]
   culinary delights: [% error.info %]
[% END %]    

Output:

culinary delights: carrots

Exception types are hierarchical, with each level being separated by the familiar dot operator. A DBI.connect exception is a more specific kind of DBI error. Similarly, an example.error.barf is a more specific kind of example.error type which itself is also a example error.

A CATCH handler that specifies a general exception type (such as DBI or example.error) will also catch more specific types that have the same prefix as long as a more specific handler isn't defined. Note that the order in which CATCH handlers are defined is irrelevant; a more specific handler will always catch an exception in preference to a more generic or default one.

[% TRY %]
   ...
[% CATCH DBI ;
     INCLUDE database/error.html ;
   CATCH DBI.connect ;
     INCLUDE database/connect.html ;
   CATCH ; 
     INCLUDE error.html ;
   END
%]

In this example, a DBI.connect error has it's own handler, a more general DBI block is used for all other DBI or DBI.* errors and a default handler catches everything else.

Exceptions can be raised in a template using the THROW directive. The first parameter is the exception type which doesn't need to be quoted (but can be, it's the same as INCLUDE) followed by the relevant error message which can be any regular value such as a quoted string, variable, etc.

[% THROW food "Missing ingredients: $recipe.error" %]
[% THROW user.login 'no user id: please login' %]
[% THROW $myerror.type "My Error: $myerror.info" %]

It's also possible to specify additional positional or named parameters to the THROW directive if you want to pass more than just a simple message back as the error info field.

[% THROW food 'eggs' 'flour' msg='Missing Ingredients' %]

In this case, the error info field will be a hash array containing the named arguments and an args item which contains a list of the positional arguments.

type => 'food',
info => {
    msg  => 'Missing Ingredients',
    args => ['eggs', 'flour'],
}

In addition to specifying individual positional arguments as [% error.info.args.n %], the info hash contains keys directly pointing to the positional arguments, as a convenient shortcut.

[% error.info.0 %]   # same as [% error.info.args.0 %]

Exceptions can also be thrown from Perl code which you've bound to template variables, or defined as a plugin or other extension. To raise an exception, call die() passing a reference to a Template::Exception object as the argument. This will then be caught by any enclosing TRY blocks from where the code was called.

use Template::Exception;
...
my $vars = {
    foo => sub {
        # ... do something ...
        die Template::Exception->new('myerr.naughty',
                                     'Bad, bad error');
    },
};

Template:

[% TRY %]
   [% foo %]
[% CATCH myerr ;
     "Error: $error" ;
   END
%]

Output:

Error: myerr.naughty error - Bad, bad error

The info field can also be a reference to another object or data structure, if required.

die Template::Exception->new('myerror', { 
    module => 'foo.pl', 
    errors => [ 'bad permissions', 'naughty boy' ],
});

Later, in a template:

[% TRY %]
   ...
[% CATCH myerror %]
   [% error.info.errors.size or 'no';
      error.info.errors.size == 1 ? ' error' : ' errors' %]
   in [% error.info.module %]: 
      [% error.info.errors.join(', ') %].
[% END %]

Generating the output:

2 errors in foo.pl:
   bad permissions, naughty boy.

You can also call die() with a single string, as is common in much existing Perl code. This will automatically be converted to an exception of the 'undef' type (that's the literal string 'undef', not the undefined value). If the string isn't terminated with a newline then Perl will append the familiar " at $file line $line" message.

sub foo {
    # ... do something ...
    die "I'm sorry, Dave, I can't do that\n";
}

If you're writing a plugin, or some extension code that has the current Template::Context in scope (you can safely skip this section if this means nothing to you) then you can also raise an exception by calling the context Template::Context#throw() method. You can pass it an Template::Exception object reference, a pair of ($type, $info) parameters or just an $info string to create an exception of 'undef' type.

$context->throw($e);            # exception object
$context->throw('Denied');      # 'undef' type
$context->throw('user.passwd', 'Bad Password');

NEXT

Top

The NEXT directive can be used to start the next iteration of a FOREACH or WHILE loop.

[% FOREACH user IN users %]
   [% NEXT IF user.isguest %]
   Name: [% user.name %]    Email: [% user.email %]
[% END %]

LAST

Top

The LAST directive can be used to prematurely exit a FOREACH or WHILE loop.

[% FOREACH user IN users %]
   Name: [% user.name %]    Email: [% user.email %]
   [% LAST IF some.condition %]
[% END %]

BREAK can also be used as an alias for LAST.

RETURN

Top

The RETURN directive can be used to stop processing the current template and return to the template from which it was called, resuming processing at the point immediately after the INCLUDE, PROCESS or WRAPPER directive. If there is no enclosing template then the Template Template#process() method will return to the calling code with a true value.

Before
[% INCLUDE half_wit %]
After

[% BLOCK half_wit %]
This is just half...
[% RETURN %]
...a complete block
[% END %]

Output:

Before
This is just half...
After

STOP

Top

The STOP directive can be used to indicate that the processor should stop gracefully without processing any more of the template document. This is a planned stop and the Template Template#process() method will return a true value to the caller. This indicates that the template was processed successfully according to the directives within it.

[% IF something.terrible.happened %]
   [% INCLUDE fatal/error.html %]
   [% STOP %]
[% END %]

[% TRY %]
   [% USE DBI(mydsn) %]
   ...
[% CATCH DBI.connect %]
   <h1>Cannot connect to the database: [% error.info %]</h1>
   <p>
     We apologise for the inconvenience.
   </p>
   [% INCLUDE footer %]
   [% STOP %]
[% END %]

CLEAR

Top

The CLEAR directive can be used to clear the output buffer for the current enclosing block. It is most commonly used to clear the output generated from a TRY block up to the point where the error occurred.

[% TRY %]
   blah blah blah            # this is normally left intact
   [% THROW some 'error' %]  # up to the point of error
   ...
[% CATCH %]
   [% CLEAR %]               # clear the TRY output
   [% error %]               # print error string
[% END %]

Miscellaneous

Top

META

Top

The META directive allows simple metadata items to be defined within a template. These are evaluated when the template is parsed and as such may only contain simple values (e.g. it's not possible to interpolate other variables values into META variables).

[% META
   title   = 'The Cat in the Hat'
   author  = 'Dr. Seuss'
   version = 1.23 
%]

The template variable contains a reference to the main template being processed. These metadata items may be retrieved as attributes of the template.

<h1>[% template.title %]</h1>
<h2>[% template.author %]</h2>

The name and modtime metadata items are automatically defined for each template to contain its name and modification time in seconds since the epoch.

[% USE date %]              # use Date plugin to format time
...
[% template.name %] last modified
at [% date.format(template.modtime) %]

The PRE_PROCESS and POST_PROCESS options allow common headers and footers to be added to all templates. The template reference is correctly defined when these templates are processed, allowing headers and footers to reference metadata items from the main template.

$template = Template->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
});

$template->process('cat_in_hat');

header:

<html>
  <head>
    <title>[% template.title %]</title>
  </head>
  <body>

cat_in_hat:

[% META
     title   = 'The Cat in the Hat'
     author  = 'Dr. Seuss'
     version = 1.23 
     year    = 2000
%]

    The cat in the hat sat on the mat.

footer:

    <hr>
    &copy; [% template.year %] [% template.author %]
  </body>
</html>

The output generated from the above example is:

<html>
  <head>
    <title>The Cat in the Hat</title>
  </head>
  <body>
    The cat in the hat sat on the mat.
    <hr>
    &copy; 2000 Dr. Seuss
  </body>
</html>

TAGS

Top

The TAGS directive can be used to set the START_TAG and END_TAG values on a per-template file basis.

[% TAGS <+ +> %]

<+ INCLUDE header +>

The TAGS directive may also be used to set a named TAG_STYLE

[% TAGS html %]
<!-- INCLUDE header -->

See the Template::Manual::Config#TAGS and Template::Manual::Config#TAG_STYLE configuration options for further details.

DEBUG

Top

The DEBUG directive can be used to enable or disable directive debug messages within a template. The DEBUG configuration option must be set to include DEBUG_DIRS for the DEBUG directives to have any effect. If DEBUG_DIRS is not set then the parser will automatically ignore and remove any DEBUG directives.

The DEBUG directive can be used with an on or off parameter to enable or disable directive debugging messages from that point forward. When enabled, the output of each directive in the generated output will be prefixed by a comment indicate the file, line and original directive text.

[% DEBUG on %]
directive debugging is on (assuming DEBUG option is set true)
[% DEBUG off %]
directive debugging is off

The format parameter can be used to change the format of the debugging message.

[% DEBUG format '<!-- $file line $line : [% $text %] -->' %]

/manual/Directives.html last modified 10:57:39 31-May-2007
TT_v224_html_docs/old/manual/Filters.html000700 000765 000765 00000113567 10627516023 020155 0ustar00abwabw000000 000000 Template::Manual::Filters

format(format)

Top

The format filter takes a format string as a parameter (as per printf()) and formats each line of text accordingly.

[% FILTER format('<!-- %-40s -->') %]
This is a block of text filtered 
through the above format.
[% END %]

Output:

<!-- This is a block of text filtered        -->
<!-- through the above format.               -->

upper

Top

Folds the input to UPPER CASE.

[% "hello world" FILTER upper %]

Output:

HELLO WORLD

lower

Top

Folds the input to lower case.

[% "Hello World" FILTER lower %]

Output:

hello world

ucfirst

Top

Folds the first character of the input to UPPER CASE.

[% "hello" FILTER ucfirst %]

Output:

Hello

lcfirst

Top

Folds the first character of the input to lower case.

[% "HELLO" FILTER lcfirst %]

Output:

hELLO

trim

Top

Trims any leading or trailing whitespace from the input text. Particularly useful in conjunction with INCLUDE, PROCESS, etc., having the same effect as the TRIM configuration option.

[% INCLUDE myfile | trim %]

collapse

Top

Collapse any whitespace sequences in the input text into a single space. Leading and trailing whitespace (which would be reduced to a single space) is removed, as per trim.

[% FILTER collapse %]

   The   cat

   sat    on

   the   mat

[% END %]

Output:

The cat sat on the mat

html

Top

Converts the characters <, >, & and " to &lt;, &gt;, &amp;, and &quot; respectively, protecting them from being interpreted as representing HTML tags or entities.

[% FILTER html %]
Binary "<=>" returns -1, 0, or 1 depending on...
[% END %]

Output:

Binary "&lt;=&gt;" returns -1, 0, or 1 depending on...

html_entity

Top

The html filter is fast and simple but it doesn't encode the full range of HTML entities that your text may contain. The html_entity filter uses either the Apache::Util module (which is written in C and is therefore faster) or the HTML::Entities module (written in Perl but equally as comprehensive) to perform the encoding. If one or other of these modules are installed on your system then the text will be encoded (via the escape_html() or encode_entities() subroutines respectively) to convert all extended characters into their appropriate HTML entities (e.g. converting 'é' to '&eacute;'). If neither module is available on your system then an 'html_entity' exception will be thrown reporting an appropriate message.

For further information on HTML entity encoding, see http://www.w3.org/TR/REC-html40/sgml/entities.html.

html_para

Top

This filter formats a block of text into HTML paragraphs. A sequence of two or more newlines is used as the delimiter for paragraphs which are then wrapped in HTML <p>...</p> tags.

[% FILTER html_para %]
The cat sat on the mat.

Mary had a little lamb.
[% END %]

Output:

<p>
The cat sat on the mat.
</p>

<p>
Mary had a little lamb.
</p>

html_break / html_para_break

Top

Similar to the html_para filter described above, but uses the HTML tag sequence <br><br> to join paragraphs.

[% FILTER html_break %]
The cat sat on the mat.

Mary had a little lamb.
[% END %]

Output:

The cat sat on the mat.
<br>
<br>
Mary had a little lamb.

html_line_break

Top

This filter replaces any newlines with <br> HTML tags, thus preserving the line breaks of the original text in the HTML output.

[% FILTER html_line_break %]
The cat sat on the mat.
Mary had a little lamb.
[% END %]

Output:

The cat sat on the mat.<br>
Mary had a little lamb.<br>

uri

Top

This filter URI escapes the input text, converting any characters outside of the permitted URI character set (as defined by RFC 2396) into a %nn hex escape.

[% 'my file.html' | uri %]

Output:

my%20file.html

The uri filter correctly encodes all reserved characters, including &, @, /, ;, :, =, +, ? and $. This filter is typically used to encode parameters in a URL that could otherwise be interpreted as part of the URL. Here's an example:

[% path  = 'http://tt2.org/example'
   back  = '/other?foo=bar&baz=bam' 
   title = 'Earth: "Mostly Harmless"'
%]
<a href="[% path %]?back=[% back | uri %]&title=[% title | uri %]">

The output generated is rather long so we'll show it split across two lines:

<a href="http://tt2.org/example?back=%2Fother%3Ffoo%3Dbar%26
baz%3Dbam&title=Earth%3A%20%22Mostly%20Harmless%22">

Without the uri filter the output would look like this (also split across two lines).

<a href="http://tt2.org/example?back=/other?foo=bar
&baz=bam&title=Earth: "Mostly Harmless"">

In this rather contrived example we've manage to generate both a broken URL (the repeated ? is not allowed) and a broken HTML element (the href attribute is terminated by the first " after Earth: leaving Mostly Harmless" dangling on the end of the tag in precisely the way that harmless things shouldn't dangle). So don't do that. Always use the uri filter to encode your URL parameters.

However, you should not use the uri filter to encode an entire URL.

<a href="[% page_url | uri %]">   # WRONG!

This will incorrectly encode any reserved characters like : and / and that's almost certainly not what you want in this case. Instead you should use the url (note spelling) filter for this purpose.

<a href="[% page_url | url %]">   # CORRECT

Please note that this behaviour was changed in version 2.16 of the Template Toolkit. Prior to that, the uri filter did not encode the reserved characters, making it technically incorrect according to the RFC 2396 specification. So we fixed it in 2.16 and provided the url filter to implement the old behaviour of not encoding reserved characters.

url

Top

The url filter is a less aggressive version of the uri filter. It encodes any characters outside of the permitted URI character set (as defined by RFC 2396) into %nn hex escapes. However, unlike the uri filter, the url filter does not encode the reserved characters &, @, /, ;, :, =, +, ? and $.

indent(pad)

Top

Indents the text block by a fixed pad string or width. The 'pad' argument can be specified as a string, or as a numerical value to indicate a pad width (spaces). Defaults to 4 spaces if unspecified.

[% FILTER indent('ME> ') %]
blah blah blah
cabbages, rhubard, onions 
[% END %]

Output:

ME> blah blah blah
ME> cabbages, rhubard, onions

truncate(length,dots)

Top

Truncates the text block to the length specified, or a default length of 32. Truncated text will be terminated with '...' (i.e. the '...' falls inside the required length, rather than appending to it).

[% FILTER truncate(21) %]
I have much to say on this matter that has previously 
been said on more than one occasion.
[% END %]

Output:

I have much to say...

If you want to use something other than '...' you can pass that as a second argument.

[% FILTER truncate(26, '&hellip;') %]
I have much to say on this matter that has previously 
been said on more than one occasion.
[% END %]

Output:

I have much to say&hellip;

repeat(iterations)

Top

Repeats the text block for as many iterations as are specified (default: 1).

[% FILTER repeat(3) %]
We want more beer and we want more beer,
[% END %]
We are the more beer wanters!

Output:

We want more beer and we want more beer,
We want more beer and we want more beer,
We want more beer and we want more beer,
We are the more beer wanters!

remove(string)

Top

Searches the input text for any occurrences of the specified string and removes them. A Perl regular expression may be specified as the search string.

[% "The  cat  sat  on  the  mat" FILTER remove('\s+') %]

Output:

Thecatsatonthemat

replace(search, replace)

Top

Similar to the remove filter described above, but taking a second parameter which is used as a replacement string for instances of the search string.

[% "The  cat  sat  on  the  mat" | replace('\s+', '_') %]

Output:

The_cat_sat_on_the_mat

redirect(file, options)

Top

The redirect filter redirects the output of the block into a separate file, specified relative to the OUTPUT_PATH configuration item.

[% FOREACH user IN myorg.userlist %]
   [% FILTER redirect("users/${user.id}.html") %]
      [% INCLUDE userinfo %]
   [% END %]
[% END %]

or more succinctly, using side-effect notation:

[%  FOREACH user IN myorg.userlist;
      INCLUDE userinfo 
        FILTER redirect("users/${user.id}.html");
    END
%]

A file exception will be thrown if the OUTPUT_PATH option is undefined.

An optional binmode argument can follow the filename to explicitly set the output file to binary mode.

[% PROCESS my/png/generator 
     FILTER redirect("images/logo.png", binmode=1) %]

For backwards compatibility with earlier versions, a single true/false value can be used to set binary mode.

[% PROCESS my/png/generator 
     FILTER redirect("images/logo.png", 1) %]

For the sake of future compatibility and clarity, if nothing else, we would strongly recommend you explicitly use the named binmode option as shown in the first example.

eval / evaltt

Top

The eval filter evaluates the block as template text, processing any directives embedded within it. This allows template variables to contain template fragments, or for some method to be provided for returning template fragments from an external source such as a database, which can then be processed in the template as required.

my $vars  = {
    fragment => "The cat sat on the [% place %]",
};
$template->process($file, $vars);

The following example:

[% fragment | eval %]

is therefore equivalent to

The cat sat on the [% place %]

The evaltt filter is provided as an alias for eval.

perl / evalperl

Top

The perl filter evaluates the block as Perl code. The EVAL_PERL option must be set to a true value or a perl exception will be thrown.

[% my_perl_code | perl %]

In most cases, the [% PERL %] ... [% END %] block should suffice for evaluating Perl code, given that template directives are processed before being evaluate as Perl. Thus, the previous example could have been written in the more verbose form:

[% PERL %]
[% my_perl_code %]
[% END %]

as well as

[% FILTER perl %]
[% my_perl_code %]
[% END %]

The evalperl filter is provided as an alias for perl for backwards compatibility.

stdout(options)

Top

The stdout filter prints the output generated by the enclosing block to STDOUT. The binmode option can be passed as either a named parameter or a single argument to set STDOUT to binary mode (see the binmode perl function).

[% PROCESS something/cool
       FILTER stdout(binmode=1) # recommended %]

[% PROCESS something/cool
       FILTER stdout(1)         # alternate %]

The stdout filter can be used to force binmode on STDOUT, or also inside redirect, null or stderr blocks to make sure that particular output goes to STDOUT. See the null filter below for an example.

stderr

Top

The stderr filter prints the output generated by the enclosing block to STDERR.

null

Top

The null filter prints nothing. This is useful for plugins whose methods return values that you don't want to appear in the output. Rather than assigning every plugin method call to a dummy variable to silence it, you can wrap the block in a null filter:

[% FILTER null;
    USE im = GD.Image(100,100);
    black = im.colorAllocate(0,   0, 0);
    red   = im.colorAllocate(255,0,  0);
    blue  = im.colorAllocate(0,  0,  255);
    im.arc(50,50,95,75,0,360,blue);
    im.fill(50,50,red);
    im.png | stdout(1);
   END;
-%]

Notice the use of the stdout filter to ensure that a particular expression generates output to STDOUT (in this case in binary mode).


/manual/Filters.html last modified 10:57:39 31-May-2007
TT_v224_html_docs/old/manual/index.html000700 000765 000765 00000037304 10627516137 017654 0ustar00abwabw000000 000000 Template::Manual

Template Toolkit Manual

Top

The Template Toolkit manual contains documentation on using and extending the Template Toolkit.

Template::Manual::Intro

Top

The Template::Manual::Intro page provides an introduction to the Template Toolkit

Template::Manual::Syntax

Top

The Template::Manual::Syntax desribes the syntax and structure of templates and the directive tags embedded within them.

Template::Manual::Directives

Top

The Template::Manual::Directives page lists all the Template Toolkit directives and gives examples of their use.

Template::Manual::Variables

Top

The Template::Manual::Variables page describes the use of variables in templates.

Template::Manual::VMethods

Top

The Template::Manual::VMethods page provides a full list of virtual methods that can be used in conjunction with variables, and gives examples of their use.

Template::Manual::Config

Top

The Template::Manual::Config page describes all of the Template Toolkit configuration options.

Template::Manual::Filters

Top

The Template::Manual::Filters page lists all of the Template Toolkit filters and gives examples of their use.

Template::Manual::Plugins

Top

The Template::Manual::Plugins page lists all of the standard plugins distributed with Template Toolkit and gives examples of their use.

Template::Manual::Internals

Top

The Template::Manual::Internals page describes the internal workings of the Template Toolkit. It is aimed at developers who wish to extend or modify the

Template::Manual::Views

Top

The Template::Manual::Views page describes the experimental VIEW directive.

Template::Manual::Credits

Top

The Template::Manual::Credits page lists the people who have contributed to the Template Toolkit.


/manual/index.html last modified 10:58:55 31-May-2007
TT_v224_html_docs/old/manual/Internals.html000700 000765 000765 00000110543 10627516024 020474 0ustar00abwabw000000 000000 Template::Manual::Internals

Outside Looking In

Top

The Template module is simply a front end module which creates and uses a Template::Service and pipes the output wherever you want it to go (STDOUT by default, or maybe a file, scalar, etc). The Apache::Template module (available separately from CPAN) is another front end. That creates a Template::Service::Apache object, calls on it as required and sends the output back to the relevant Apache::Request object.

These front-end modules are really only there to handle any specifics of the environment in which they're being used. The Apache::Template front end, for example, handles Apache::Request specifics and configuration via the httpd.conf. The regular Template front-end deals with STDOUT, variable refs, etc. Otherwise it is Template::Service (or subclass) which does all the work.

The Template::Service module provides a high-quality template delivery service, with bells, whistles, signed up service level agreement and a 30-day no quibble money back guarantee. "Have a good time, all the time", that's our motto.

Within the lower levels of the Template Toolkit, there are lots of messy details that we generally don't want to have to worry about most of the time. Things like templates not being found, or failing to parse correctly, uncaught exceptions being thrown, missing plugin modules or dependencies, and so on. Template::Service hides that all away and makes everything look simple to the outsider. It provides extra features, like PRE_PROCESS, PROCESS and POST_PROCESS, and also provides the error recovery mechanism via ERROR. You ask it to process a template and it takes care of everything for you. The Template::Service::Apache module goes a little bit further, adding some extra headers to the Apache::Request, setting a few extra template variables, and so on.

For the most part, the job of a service is really just one of scheduling and dispatching. It receives a request in the form of a call to its Template::Service#process() method and schedules the named template specified as an argument, and possibly several other templates (PRE_PROCESS, etc) to be processed in order. It doesn't actually process the templates itself, but instead makes a Template::Context#process() call against a Template::Context object.

Template::Context is the runtime engine for the Template Toolkit - the module that hangs everything together in the lower levels of the Template Toolkit and that one that does most of the real work, albeit by crafty delegation to various other friendly helper modules.

Given a template name (or perhaps a reference to a scalar or file handle) the context process() method must load and compile, or fetch a cached copy of a previously compiled template, corresponding to that name. It does this by calling on a list of one or more Template::Provider objects (the LOAD_TEMPLATES posse) who themselves might get involved with a Template::Parser to help turn source templates into executable Perl code (but more on that later).

Thankfully, all of this complexity is hidden away behind a simple Template::Context#template() method. You call it passing a template name as an argument, and it returns a compiled template in the form of a Template::Document object, or otherwise raises an exception.

A Template::Document is a thin object wrapper around a compiled template subroutine. The object implements a Template::Document#process() method which performs a little bit of housekeeping and then calls the template subroutine. The object also defines template metadata (defined in [% META ... %] directives) and has a Template::Document#block() method which returns a hash of any additional [% BLOCK xxxx %] definitions found in the template source.

So the context fetches a compiled document via its own Template::Context#template() method and then gets ready to process it. It first updates the stash (the place where template variables get defined - more on that shortly) to set any template variable definitions specified as the second argument by reference to hash array. Then, it calls the document Template::Document#process() method, passing a reference to itself, the context object, as an argument. In doing this, it provides itself as an object against which template code can make callbacks to access runtime resources and Template Toolkit functionality.

What we're trying to say here is this: not only does the Template::Context object receive calls from the outside, i.e. those originating in user code calling the process() method on a Template object, but it also receives calls from the inside, i.e. those originating in template directives of the form [% PROCESS template %].

Before we move on to that, here's a simple structure diagram showing the outer layers of the Template Toolkit heading inwards, with pseudo code annotations showing a typical invocation sequence.

 ,--------.
 | Caller |     use Template;
 `--------'     my $tt = Template->new( ... );
      |         $tt->process($template, \%vars);
      |                                                     Outside
- - - | - - - - - - - - - - - - - - - - - - - - - - - - - - - - T T 
      |         package Template;                            Inside
      V
+----------+    sub process($template, \%vars) {
| Template |        $out = $self->SERVICE->process($template, $vars);
+----------+        print $out or send it to $self->OUTPUT;
      |         }
      |
      |         package Template::Service;
      |
      |         sub process($template, \%vars) {
      |             try {
+----------+            foreach $p in @self->PRE_PROCESS
| Service  |                $self->CONTEXT->process($p, $vars);
+----------+
      |                 $self->CONTEXT->process($template, $vars);
      |
      |                 foreach $p @self->POST_PROCESS
      |                     $self->CONTEXT->process($p, $vars);
      |             }
      |             catch {
      |                 $self->CONTEXT->process($self->ERROR);
      |             }
      |         }
      |
      V         package Template::Context;
+----------+    
| Context  |    sub process($template, \%vars) {
+----------+        # fetch compiled template
      |             $template = $self->template($template)
      |             # update stash
      |             $self->STASH->update($vars);
      |             # process template
      |             $template->process($self)
      |         }
      V     
+----------+    package Template::Document;
| Document |    
+----------+    sub process($context) {
                    $output = &{ $self->BLOCK }($context);
                }

Inside Looking Out

Top

To understand more about what's going on in these lower levels, we need to look at what a compiled template looks like. In fact, a compiled template is just a regular Perl sub-routine. Here's a very simple one.

sub my_compiled_template {
    return "This is a compiled template.\n";
}

You're unlikely to see a compiled template this simple unless you wrote it yourself but it is entirely valid. All a template subroutine is obliged to do is return some output (which may be an empty of course). If it can't for some reason, then it should raise an error via die().

sub my_todo_template {
    die "This template not yet implemented\n";
}

If it wants to get fancy, it can raise an error as a Template::Exception object. An exception object is really just a convenient wrapper for the 'type' and 'info' fields.

sub my_solilique_template {
    die (Template::Exception->new('yorrick', 'Fellow of infinite jest'));
}

Templates generally need to do a lot more than just generate static output or raise errors. They may want to inspect variable values, process another template, load a plugin, run a filter, and so on. Whenever a template subroutine is called, it gets passed a reference to a Template::Context object. It is through this context object that template code can access the features of the Template Toolkit.

We described earlier how the Template::Service object calls on Template::Context to handle a Template::Context#process() request from the outside. We can make a similar request on a context to process a template, but from within the code of another template. This is a call from the inside.

sub my_process_template {
    my $context = shift;
    my $output = $context->process('header', { title => 'Hello World' })
               . "\nsome content\n"
               . $context->process('footer');
}

This is then roughly equivalent to a source template something like this:

[% PROCESS header
    title = 'Hello World'
%]
some content
[% PROCESS footer %]

Template variables are stored in, and managed by a Template::Stash object. This is a blessed hash array in which template variables are defined. The object wrapper provides Template::Stash#get() and Template::Stash#set() method which implement all the magical.variable.features of the Template Toolkit.

Each context object has its own stash, a reference to which can be returned by the appropriately named Template::Context#stash() method. So to print the value of some template variable, or for example, to represent the following source template:

<title>[% title %]</title>

we might have a subroutine definition something like this:

sub {
    my $context = shift;
    my $stash = $context->stash();
    return '<title>' . $stash->get('title') . '</title>';
}

The stash Template::Stash#get() method hides the details of the underlying variable types, automatically calling code references, checking return values, and performing other such tricks. If 'title' happens to be bound to a subroutine then we can specify additional parameters as a list reference passed as the second argument to get().

[% title('The Cat Sat on the Mat') %]

This translates to the stash call:

$stash->get([ 'title', ['The Cat Sat on the Mat'] ]);

Dotted compound variables can be requested by passing a single list reference to the get() method in place of the variable name. Each pair of elements in the list should correspond to the variable name and reference to a list of arguments for each dot-delimited element of the variable.

[% foo(1, 2).bar(3, 4).baz(5) %]

is thus equivalent to

$stash->get([ foo => [1,2], bar => [3,4], baz => [5] ]);

If there aren't any arguments for an element, you can specify an empty, zero or null argument list.

[% foo.bar %]
$stash->get([ 'foo', 0, 'bar', 0 ]);

The Template::Stash#set() method works in a similar way. It takes a variable name and a variable value which should be assigned to it.

[% x = 10 %]         
$stash->set('x', 10);

[% x.y = 10 %]
$stash->set([ 'x', 0, 'y', 0 ], 10);

So the stash gives us access to template variables and the context provides the higher level functionality.

Alongside the Template::Context#process() method lies the Template::Context#include() method. Just as with the PROCESS / INCLUDE directives, the key difference is in variable localisation. Before processing a template, the process() method simply updates the stash to set any new variable definitions, overwriting any existing values. In contrast, the include() method creates a copy of the existing stash, in a process known as cloning the stash, and then uses that as a temporary variable store. Any previously existing variables are still defined, but any changes made to variables, including setting the new variable values passed aas arguments will affect only the local copy of the stash (although note that it's only a shallow copy, so it's not foolproof). When the template has been processed, the include() method restores the previous variable state by decloning the stash.

The context also provides an Template::Context#insert() method to implement the INSERT directive, but no wrapper() method. This functionality can be implemented by rewriting the Perl code and calling include().

[% WRAPPER foo -%]
   blah blah [% x %]
[%- END %]

$context->include('foo', {
    content => 'blah blah ' . $stash->get('x'),
});

Other than the template processing methods process(), include() and insert(), the context defines methods for fetching plugin objects, Template::Context#plugin(), and filters, Template::Context#filter().

# TT USE directive
[% USE foo = Bar(10) %]

# equivalent Perl
$stash->set('foo', $context->plugin('Bar', [10]));
# TT FILTER block
[% FILTER bar(20) %]
   blah blah blah
[% END %]

# equivalent Perl
my $filter = $context->filter('bar', [20]);
&$filter('blah blah blah');

Pretty much everything else you might want to do in a template can be done in Perl code. Things like IF, UNLESS, FOREACH and so on all have direct counterparts in Perl.

# TT IF directive
[% IF msg %]
   Message: [% msg %]
[% END %];
# equivalent Perl
if ($stash->get('msg')) {
    $output .=  'Message: ';
    $output .= $stash->get('msg');
}

The best way to get a better understanding of what's going on underneath the hood is to set the $Template::Parser::DEBUG flag to a true value and start processing templates. This will cause the parser to print the generated Perl code for each template it compiles to STDERR. You'll probably also want to set the $Template::Directive::PRETTY option to have the Perl pretty-printed for human consumption.

use Template;
use Template::Parser;
use Template::Directive;

$Template::Parser::DEBUG = 1;
$Template::Directive::PRETTY = 1;

my $template = Template->new();
$template->process(\*DATA, { cat => 'dog', mat => 'log' });

__DATA__
The [% cat %] sat on the [% mat %]

The output sent to STDOUT remains as you would expect:

The dog sat on the log

The output sent to STDERR would look something like this:

compiled main template document block:
sub {
    my $context = shift || die "template sub called without context\n";
    my $stash   = $context->stash;
    my $output  = '';
    my $error;

    eval { BLOCK: {
        $output .=  "The ";
        $output .=  $stash->get('cat');
        $output .=  " sat on the ";
        $output .=  $stash->get('mat');
        $output .=  "\n";
    } };
    if ($@) {
        $error = $context->catch($@, \$output);
        die $error unless $error->type eq 'return';
    }

    return $output;
}

Hacking on the Template Toolkit

Top

Please feel free to hack on the Template Toolkit. If you find a bug that needs fixing, if you have an idea for something that's missing, or you feel inclined to tackle something on the TODO list, then by all means go ahead and do it!

If you're contemplating something non-trivial then you'll probably want to bring it up on the mailing list first to get an idea about the current state of play, find out if anyone's already working on it, and so on.

When you start to hack on the Template Toolkit, please make sure you start from the latest developer release. Stable releases are uploaded to CPAN and have all-numerical version numbers, e.g. 2.04, 2.05. Developer releases are available from the Template Toolkit web site and have a character suffix on the version, e.g. 2.04a, 2.04b, etc.

Once you've made your changes, please remember to update the test suite by adding extra tests to one of the existing test scripts in the t sub-directory, or by adding a new test script of your own. And of course, run make test to ensure that all the tests pass with your new code.

Don't forget that any files you do add will need to be added to the MANIFEST. Running make manifest will do this for you, but you need to make sure you haven't got any other temporary files lying around that might also get added to it.

Documentation is often something that gets overlooked but it's just as important as the code. If you're adding a new module, a plugin module, for example, then it's OK to include the POD documentation in with the module, but please write it all in one piece at the end of the file, after the code (just look at any other Template::* module for an example). It's a religious issue, I know, but I have a strong distaste for POD documentation interspersed throughout the code. In my not-so-humble opinion, it makes both the code and the documentation harder to read (same kinda problem as embedding Perl in HTML).

To share your changes with the rest of the world, you'll need to prepare a patch file. To do this you should have 2 directories side-by-side, one which is the original, unmodified distribution directory for the latest developer release, and the other is a copy of that same directory which includes your changes.

The following example shows a typical hacking session. First we unpack the latest developer release.

$ tar zxf Template-Toolkit-2.05c.tar.gz

At this point, it's a good idea to rename the directory to give some indicate of what it contains.

$ mv Template-Toolkit-2.05c Template-Toolkit-2.05c-abw-xyz-hack

Then go hack!

$ cd Template-Toolkit-2.05c-abw-xyz-hack
[ hacking ]
$ cd ..

When you're all done and ready to prepare a patch, unpack the distribution archive again so that you've got the original to diff against your new code.

$ tar zxf Template-Toolkit-2.05c.tar.gz

You should now have an original distribution directory and a modified version of that same directory, side-by-side.

$ ls
Template-Toolkit-2.05c  Template-Toolkit-2.05c-abw-xyz-hack

Now run diff and save the output into an appropriately named patch file.

$ diff -Naur Template-Toolkit-2.05c Template-Toolkit-2.05c-abw-xyz-hack > patch-TT205c-abw-xyz-hack

You can then post the generated patch file to the mailing list, describing what it does, why it does it, how it does it and any other relevant information.

If you want to apply someone else's patch then you should start with the same original distribution source on which the patch is based. From within the root of the distribution, run patch feeding in the patch file as standard input. The 'p1' option is required to strip the first element of the path name (e.g. Template-Toolkit-2.05c/README becomes README which is then the correct path).

$ tar zxf Template-Toolkit-2.05c.tar.gz
$ cd Template-Toolkit-2.05c
$ patch -p1 < ../patch-TT205c-abw-xyz-hack

The output generated by patch should be something like the following:

patching file README
patching file lib/Template.pm
patching file lib/Template/Provider.pm
patching file t/provider.t

/manual/Internals.html last modified 10:57:40 31-May-2007
TT_v224_html_docs/old/manual/Intro.html000700 000765 000765 00000053702 10627516025 017634 0ustar00abwabw000000 000000 Template::Manual::Intro

Introduction

Top

The Template Toolkit is a collection of Perl modules which implement a fast, flexible, powerful and extensible template processing system. It is most often used for generating dynamic web content, although it can be used equally well for processing any kind of text documents.

At the simplest level it provides an easy way to process template files, filling in embedded variable references with their equivalent values. Here's an example of a template.

Dear [% name %],

It has come to our attention that your account is in 
arrears to the sum of [% debt %].

Please settle your account before [% deadline %] or we 
will be forced to revoke your Licence to Thrill.

The Management.

By default, template directives are embedded within the character sequences [% ... %] but you can change these and various other options to configure how the Template Toolkit looks, feels and works. You can set the INTERPOLATE option, for example, if you prefer to embed your variables in Perl style:

Dear $name,

It has come to our attention that your account is in 
arrears to the sum of $debt.
...etc...

The Template Perl Module

Top

The Template Perl module is the front end to the Template Toolkit for Perl programmers, providing access to the full range of functionality through a single module with a simple interface. It loads the other modules as required and instantiates a default set of objects to handle subsequent template processing requests. Configuration parameters may be passed to the Template constructor method, Template#new(), which are then used to configure the generate object.

use Template;

my $tt = Template->new({
    INCLUDE_PATH => '/usr/local/templates',
    INTERPOLATE  => 1,
}) || die "$Template::ERROR\n";

The Template object implements a Template#process() method for processing template files or text. The name of the input template (or various other sources) is passed as the first argument, followed by a reference to a hash array of variable definitions for substitution in the template.

my $vars = {
    name     => 'Count Edward van Halen',
    debt     => '3 riffs and a solo',
    deadline => 'the next chorus',
};

$tt->process('letters/overdrawn', $vars)
    || die $tt->error(), "\n";

The Template#process() method returns a true value (1) on success and prints the template output to STDOUT, by default. On error, the Template#process() method returns a false value (undef). The Template#error() method can then be called to retrieve details of the error.

Component Based Content Construction

Top

A number of special directives are provided, such as INSERT, INCLUDE and PROCESS, which allow content to be built up from smaller template components. This permits a modular approach to building a web site or other content repository, promoting reusability, cross-site consistency, ease of construction and subsequent maintenance. Common elements such as headers, footers, menu bars, tables, and so on, can be created as separate template files which can then be processed into other documents as required. All defined variables are inherited by these templates along with any additional "local" values specified.

[% PROCESS header 
     title = "The Cat Sat on the Mat"
%]

[% PROCESS menu %]

The location of the missing feline has now been established.
Thank you for your assistance.

[% INSERT legal/disclaimer %]

[% PROCESS footer %]

You can also define a template as a BLOCK within the same file and PROCESS it just like any other template file. This can be invaluable for building up repetitive elements such as tables, menus, etc.

[% BLOCK tabrow %]
   <tr><td>[% name %]</td><td>[% email %]</td></tr>
[% END %]

<table>
[% PROCESS tabrow name="tom"   email="tom@here.org"    %]
[% PROCESS tabrow name="dick"  email="disk@there.org"  %]
[% PROCESS tabrow name="larry" email="larry@where.org" %]
</table>

Data and Code Binding

Top

One of the key features that sets the Template Toolkit apart from other template processors is the ability to bind template variables to any kind of Perl data: scalars, lists, hash arrays, sub-routines and objects.

my $vars = {
    root   => 'http://here.com/there',
    menu   => [ 'modules', 'authors', 'scripts' ],
    client => {
        name => 'Doctor Joseph von Satriani',
        id   => 'JVSAT',
    },
    checkout => sub { my $total = shift; ...; return $something },
    shopcart => My::Cool::Shopping::Cart->new(),
};

The Template Toolkit will automatically Do The Right Thing to access the data in an appropriate manner to return some value which can then be output. The dot operator '.' is used to access into lists and hashes or to call object methods. The FOREACH directive is provided for iterating through lists, and various logical tests are available using directives such as IF, UNLESS, ELSIF, ELSE, SWITCH, CASE, etc.

[% FOREACH section = menu %]
   <a href="[% root %]/[% section %]/index.html">[% section %]</a>
[% END %]

<b>Client</a>: [% client.name %] (id: [% client.id %])

[% IF shopcart.nitems %]
   Your shopping cart contains the following items:
   <ul>
   [% FOREACH item = shopcart.contents %]
     <li>[% item.name %] : [% item.qty %] @ [% item.price %]
   [% END %]
   </ul>

   [% checkout(shopcart.total) %]

[% ELSE %]
   No items currently in shopping cart.
[% END %]

Advanced Features: Filters, Macros, Exceptions, Plugins

Top

The Template Toolkit also provides a number of additional directives for advanced processing and programmatical functionality. It supports output filters (FILTER), allows custom macros to be defined (MACRO), has a fully-featured exception handling system (TRY, THROW, CATCH, FINAL) and supports a plugin architecture (USE) which allows special plugin modules and even regular Perl modules to be loaded and used with the minimum of fuss. The Template Toolkit is "just" a template processor but you can trivially extend it to incorporate the functionality of any Perl module you can get your hands on. Thus, it is also a scalable and extensible template framework, ideally suited for managing the presentation layer for application servers, content management systems and other web applications.

Separating Presentation and Application Logic

Top

Rather than embedding Perl code or some other scripting language directly into template documents, it encourages you to keep functional components (i.e. Perl code) separate from presentation components (e.g. HTML templates). The template variables provide the interface between the two layers, allowing data to be generated in code and then passed to a template component for displaying (pipeline model) or for sub-routine or object references to be bound to variables which can then be called from the template as and when required (callback model).

The directives that the Template Toolkit provide implement their own mini programming language, but they're not really designed for serious, general purpose programming. Perl is a far more appropriate language for that. If you embed application logic (e.g. Perl or other scripting language fragments) in HTML templates then you risk losing the clear separation of concerns between functionality and presentation. It becomes harder to maintain the two elements in isolation and more difficult, if not impossible, to reuse code or presentation elements by themselves. It is far better to write your application code in separate Perl modules, libraries or scripts and then use templates to control how the resulting data is presented as output. Thus you should think of the Template Toolkit language as a set of layout directives for displaying data, not calculating it.

Having said that, the Template Toolkit doesn't force you into one approach or the other. It attempts to be pragmatic rather than dogmatic in allowing you to do whatever best gets the job done. Thus, if you enable the EVAL_PERL option then you can happily embed real Perl code in your templates within PERL ... END directives.

Performance

Top

The Template Toolkit uses a fast YACC-like parser which compiles templates into Perl code for maximum runtime efficiency. It also has an advanced caching mechanism which manages in-memory and on-disk (i.e. persistent) versions of compiled templates. The modules that comprise the toolkit are highly configurable and the architecture around which they're built is designed to be extensible. The Template Toolkit provides a powerful framework around which content creation and delivery systems can be built while also providing a simple interface through the Template front-end module for general use.


/manual/Intro.html last modified 10:57:41 31-May-2007
TT_v224_html_docs/old/manual/Plugins.html000700 000765 000765 00000072651 10627516025 020166 0ustar00abwabw000000 000000 Template::Manual::Plugins

TEMPLATE TOOLKIT PLUGINS

Top

The following plugin modules are distributed with the Template Toolkit. Some of the plugins interface to external modules (detailed below) which should be downloaded from any CPAN site and installed before using the plugin.

Autoformat

Top

The Template::Plugin::Autoformat plugin is an interface to Damian Conway's Text::Autoformat Perl module which provides advanced text wrapping and formatting. See Template::Plugin::Autoformat and Text::Autoformat for further details.

[% USE autoformat(left=10, right=20) %]
[% autoformat(mytext) %]        # call autoformat sub
[% mytext FILTER autoformat %]  # or use autoformat filter

The Text::Autoformat module is available from CPAN:

L<http://www.cpan.org/modules/by-module/Text/>

CGI

Top

The Template::Plugin::CGI plugin is a wrapper around Lincoln Stein's CGI.pm module. The plugin is distributed with the Template Toolkit (see Template::Plugin::CGI) and the CGI module itself is distributed with recent versions Perl, or is available from CPAN.

[% USE CGI %]
[% CGI.param('param_name') %]
[% CGI.start_form %]
[% CGI.popup_menu( Name   => 'color', 
                   Values => [ 'Green', 'Brown' ] ) %]
[% CGI.end_form %]

Datafile

Top

Provides an interface to data stored in a plain text file in a simple delimited format. The first line in the file specifies field names which should be delimiter by any non-word character sequence. Subsequent lines define data using the same delimiter as in the first line. Blank lines and comments (lines starting '#') are ignored. See Template::Plugin::Datafile for further details.

/tmp/mydata:

# define names for each field
id : email : name : tel
# here's the data
fred : fred@here.com : Fred Smith : 555-1234
bill : bill@here.com : Bill White : 555-5678

example:

[% USE userlist = datafile('/tmp/mydata') %]

[% FOREACH user = userlist %]
   [% user.name %] ([% user.id %])
[% END %]

Date

Top

The Template::Plugin::Date plugin provides an easy way to generate formatted time and date strings by delegating to the POSIX strftime() routine. See Template::Plugin::Date and POSIX for further details.

[% USE date %]
[% date.format %]        # current time/date

File last modified: [% date.format(template.modtime) %]

Directory

Top

The Template::Plugin::Directory plugin provides a simple interface to a directory and the files within it. See Template::Plugin::Directory for further details.

[% USE dir = Directory('/tmp') %]
[% FOREACH file = dir.files %]
    # all the plain files in the directory
[% END %]
[% FOREACH file = dir.dirs %]
    # all the sub-directories
[% END %]

DBI

Top

The DBI plugin is no longer distributed as part of the Template Toolkit (as of version 2.15). It is now available as a separate Template-Plugin-DBI distribution from CPAN.

Dumper

Top

The Template::Plugin::Dumper plugin provides an interface to the Data::Dumper module. See Template::Plugin::Dumper and Data::Dumper for futher details.

[% USE dumper(indent=0, pad="<br>") %]
[% dumper.dump(myvar, yourvar) %]

File

Top

The Template::Plugin::File plugin provides a general abstraction for files and can be used to fetch information about specific files within a filesystem. See Template::Plugin::File for further details.

[% USE File('/tmp/foo.html') %]
[% File.name %]     # foo.html
[% File.dir %]      # /tmp
[% File.mtime %]    # modification time

Filter

Top

This module implements a base class plugin which can be subclassed to easily create your own modules that define and install new filters.

package MyOrg::Template::Plugin::MyFilter;

use Template::Plugin::Filter;
use base qw( Template::Plugin::Filter );

sub filter {
    my ($self, $text) = @_;
    # ...mungify $text...
    return $text;
}

Example of use:

# now load it...
[% USE MyFilter %]

# ...and use the returned object as a filter
[% FILTER $MyFilter %]
  ...
[% END %]

See Template::Plugin::Filter for further details.

Format

Top

The Template::Plugin::Format plugin provides a simple way to format text according to a printf()-like format. See Template::Plugin::Format for further details.

[% USE bold = format('<b>%s</b>') %]
[% bold('Hello') %]

GD

Top

The GD plugins are no longer part of the core Template Toolkit distribution. They are now available in a separate Template-GD distribution.

HTML

Top

The Template::Plugin::HTML plugin is very basic, implementing a few useful methods for generating HTML. It is likely to be extended in the future or integrated with a larger project to generate HTML elements in a generic way.

[% USE HTML %]
[% HTML.escape("if (a < b && c > d) ..." %]
[% HTML.attributes(border => 1, cellpadding => 2) %]
[% HTML.element(table => { border => 1, cellpadding => 2 }) %]

See Template::Plugin::HTML for further details.

Iterator

Top

The Template::Plugin::Iterator plugin provides a way to create a Template::Iterator object to iterate over a data set. An iterator is created automatically by the FOREACH directive and is aliased to the loop variable. This plugin allows an iterator to be explicitly created with a given name, or the default plugin name, iterator. See Template::Plugin::Iterator for further details.

[% USE iterator(list, args) %]

[% FOREACH item = iterator %]
   [% '<ul>' IF iterator.first %]
   <li>[% item %]
   [% '</ul>' IF iterator.last %]
[% END %]

Pod

Top

This plugin provides an interface to the Pod::POM module which parses POD documents into an internal object model which can then be traversed and presented through the Template Toolkit.

[% USE Pod(podfile) %]

[% FOREACH head1 = Pod.head1;
     FOREACH head2 = head1/head2;
       ...
     END;
   END
%]

String

Top

The Template::Plugin::String plugin implements an object-oriented interface for manipulating strings. See Template::Plugin::String for further details.

[% USE String 'Hello' %]
[% String.append(' World') %]

[% msg = String.new('Another string') %]
[% msg.replace('string', 'text') %]

The string "[% msg %]" is [% msg.length %] characters long.

Table

Top

The Template::Plugin::Table plugin allows you to format a list of data items into a virtual table by specifying a fixed number of rows or columns, with an optional overlap. See Template::Plugin::Table for further details.

[% USE table(list, rows=10, overlap=1) %]

[% FOREACH item = table.col(3) %]
   [% item %]
[% END %]

URL

Top

The Template::Plugin::URL plugin provides a simple way of contructing URLs from a base part and a variable set of parameters. See Template::Plugin::URL for further details.

[% USE mycgi = url('/cgi-bin/bar.pl', debug=1) %]

[% mycgi %]
   # ==> /cgi/bin/bar.pl?debug=1

[% mycgi(mode='submit') %]
   # ==> /cgi/bin/bar.pl?mode=submit&debug=1

Wrap

Top

The Template::Plugin::Wrap plugin uses the Text::Wrap module to provide simple paragraph formatting. See Template::Plugin::Wrap and Text::Wrap for further details.

[% USE wrap %]
[% wrap(mytext, 40, '* ', '  ') %]    # use wrap sub
[% mytext FILTER wrap(40) -%]    # or wrap FILTER

The Text::Wrap module is available from CPAN:

http://www.cpan.org/modules/by-module/Text/

XML

Top

The XML::DOM, XML::RSS, XML::Simple and XML::XPath plugins are no longer distributed with the Template Toolkit as of version 2.15

They are now available in a separate Template-XML distribution.


/manual/Plugins.html last modified 10:57:41 31-May-2007
TT_v224_html_docs/old/manual/Refs.html000700 000765 000765 00000030735 10626336402 017437 0ustar00abwabw000000 000000 Template Toolkit Documentation

DESCRIPTION

Top

Resources

Top

The Template Toolkit web site contains the latest information, news and other resources.

http://www.template-toolkit.org/

A mailing list exists for up-to-date information on the Template Toolkit and for following and contributing to the development process. To subscribe, send an email to

templates-request@template-toolkit.org

with the message 'subscribe' in the body. You can also use the web interface to subscribe or browse the archives:

http://www.template-toolkit.org/mailman/listinfo/templates

The tpage and ttree scripts are distributed and installed along with the Template Toolkit. The tpage script simply processes named files or STDIN if unspecified, using a default Template object. The ttree script can be used to process entire directory trees of templates, allowing large content systems such as web sites to be rebuilt from a single command or configuration file.

perldoc tpage
perldoc ttree

The Template::Tutorial document provides an introduction to the Template Toolkit and shows some typical examples of usage.

perldoc Template::Tutorial

You may also like to consult the paper 'Building and Managing Web Systems with the Template Toolkit' and accompanying slides from the presentation at the 4th Perl Conference. These are available from the Template Toolkit web site:

http://www.template-toolkit.org/docs.html

Projects

Top

There are a number of other projects related to the Template Toolkit.

  • OpenInteract

    OpenInteract is a robust web application framework built to run under Apache and mod_perl using the Template Toolkit as a foundation.

    http://www.openinteract.org/
  • Apache::Template

    This is an Apache/mod_perl interface to the Template Toolkit. Available from CPAN in the directory:

    http://www.cpan.org/modules/by-module/Apache/
  • AxKit::Template

    AxKit is Matt Sergeant's Apache XML Delivery Toolkit. AxKit::Template provides an interface between AxKit and the Template Toolkit. Available from CPAN in the directory:

    http://www.cpan.org/modules/by-module/Apache/
  • Slashcode

    Slashcode is the code which runs Slashdot. Version 2 uses the Template Toolkit for generating the user interface from database driven template.

    http://slashcode.org/
  • OpenFrame

    OpenFrame is an open source application framework for distributed media applications. It ships with a generator for the Template Toolkit.

    http://openframe.fotango.com/
  • PCMT

    PCMT is the Personal Content Management Toolkit. It uses the Template Toolkit as the presentation engine.

    http://pcmt.sf.net/

AUTHOR

Top

Andy Wardley <abw@wardley.org>

http://wardley.org/|http://wardley.org/

VERSION

Top

Template Toolkit version 2.19, released on 27 April 2007.

COPYRIGHT

Top
Copyright (C) 1996-2007 Andy Wardley.  All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/old/manual/Syntax.html000700 000765 000765 00000047462 10627516026 020036 0ustar00abwabw000000 000000 Template::Manual::Syntax

Tag Styles

Top

By default, template directives are embedded within the character sequences [% and %].

[% PROCESS header %]

<h1>Hello World!</h1>
<a href="[% page.next %]"><img src="[% icon.next %].gif"></a>

[% PROCESS footer %]

You can change the tag characters using the START_TAG, END_TAG and TAG_STYLE configuration options. You can also use the TAGS directive to define a new tag style for the current template file.

You can also set the INTERPOLATE option to allow simple variable references to be embedded directly in templates, prefixed by a $.

# INTERPOLATE = 0
<td>[% name %]</td>
<td>[% email %]</td>

# INTERPOLATE = 1
<td>$name</td>
<td>$email</td>

Directives may be embedded anywhere in a line of text and can be split across several lines. Insignificant whitespace is generally ignored within the directive.

[% INCLUDE header
     title = 'Hello World' 
     bgcol = '#ffffff' 
%]

[%INCLUDE menu align='right'%]

Name: [% name %]  ([%id%])

Comments

Top

The # character is used to indicate comments within a directive. When placed immediately inside the opening directive tag, it causes the entire directive to be ignored.

[%# this entire directive is ignored no
    matter how many lines it wraps onto
%]

In any other position, it causes the remainder of the current line to be treated as a comment.

[% # this is a comment
   theta = 20      # so is this
   rho   = 30      # <aol>me too!</aol>
%]

Chomping Whitespace

Top

You can add - or + to the immediate start or end of a directive tag to control the whitespace chomping options. See the PRE_CHOMP and POST_CHOMP options for further details.

[% BLOCK foo -%]    # remove trailing newline
This is block foo
[%- END %]          # remove leading newline

Implicit Directives: GET and SET

Top

The simplest directives are GET and SET which retrieve and update variable values respectively. The GET and SET keywords are actually optional as the parser is smart enough to see them for what they really are (but note the caveat below on using side-effect notation). Thus, you'll generally see:

[% SET foo = 10 %]
[% GET foo %]

written as:

[% foo = 10 %]
[% foo %]

You can also express simple logical statements as implicit GET directives:

[% title or template.title or 'Default Title' %]

[% mode == 'graphics' ? "Graphics Mode Enabled" : "Text Mode" %]

All other directives should start with a keyword specified in UPPER CASE (but see the ANYCASE option). All directives keywords are in UPPER CASE to make them visually distinctive and to distinguish them from variables of the same name but different case. It is perfectly valid, for example, to define a variable called stop which is entirely separate from the STOP directive.

[% stop = 'Clackett Lane Bus Depot' %]

The bus will next stop at [% stop %]    # variable

[% STOP %]                              # directive

Block Directives

Top

Directives such as FOREACH, WHILE, BLOCK, FILTER, etc., mark the start of a block which may contain text or other directives up to the matching END directive. Blocks may be nested indefinitely. The IF, UNLESS, ELSIF and ELSE directives also define blocks and may be grouped together in the usual manner.

[% FOREACH item = [ 'foo' 'bar' 'baz' ] %]
   * Item: [% item %]
[% END %]

[% BLOCK footer %]
   Copyright 2000 [% me %]
   [% INCLUDE company/logo %]
[% END %]

[% IF foo %]
   [% FOREACH thing = foo.things %]
      [% thing %]
   [% END %]
[% ELSIF bar %]
   [% INCLUDE barinfo %]
[% ELSE %]
   do nothing...
[% END %]

Block directives can also be used in a convenient side-effect notation.

[% INCLUDE userinfo FOREACH user = userlist %]

[% INCLUDE debugtxt msg="file: $error.info" 
     IF debugging %] 

[% "Danger Will Robinson" IF atrisk %]

versus:

[% FOREACH user = userlist %]
   [% INCLUDE userinfo %]
[% END %]

[% IF debugging %]
   [% INCLUDE debugtxt msg="file: $error.info" %]
[% END %]

[% IF atrisk %]
Danger Will Robinson
[% END %]

Capturing Block Output

Top

The output of a directive can be captured by simply assigning the directive to a variable.

[% headtext = PROCESS header title="Hello World" %]

[% people = PROCESS userinfo FOREACH user = userlist %]

This can be used in conjunction with the BLOCK directive for defining large blocks of text or other content.

[% poem = BLOCK %]
   The boy stood on the burning deck,
   His fleece was white as snow.
   A rolling stone gathers no moss,
   And Keith is sure to follow.
[% END %]

Note one important caveat of using this syntax in conjunction with side-effect notation. The following directive does not behave as might be expected:

[% var = 'value' IF some_condition %]   # does not work

In this case, the directive is interpreted as (spacing added for clarity)

[% var = IF some_condition %]
   value
[% END %]

rather than

[% IF some_condition %]
   [% var = 'value' %]
[% END %]

The variable is assigned the output of the IF block which returns 'value' if true, but nothing if false. In other words, the following directive will always cause 'var' to be cleared.

[% var = 'value' IF 0 %]

To achieve the expected behaviour, the directive should be written as:

[% SET var = 'value' IF some_condition %]

Chaining Filters

Top

Multiple FILTER directives can be chained together in sequence. They are called in the order defined, piping the output of one into the input of the next.

[% PROCESS somefile FILTER truncate(100) FILTER html %]

The pipe character, |, can also be used as an alias for FILTER.

[% PROCESS somefile | truncate(100) | html %]

Multiple Directive Blocks

Top

Multiple directives can be included within a single tag when delimited by semi-colons. Note however that the TAGS directive must always be specified in a tag by itself.

[% IF title; 
      INCLUDE header; 
   ELSE; 
      INCLUDE other/header  title="Some Other Title";
   END
%]

versus

[% IF title %]
   [% INCLUDE header %]
[% ELSE %]
   [% INCLUDE other/header  title="Some Other Title" %]
[% END %]

/manual/Syntax.html last modified 10:57:42 31-May-2007
TT_v224_html_docs/old/manual/Variables.html000700 000765 000765 00000152610 10627516026 020450 0ustar00abwabw000000 000000 Template::Manual::Variables

Template Variables

Top

A reference to a hash array may be passed as the second argument to the Template#process() method, containing definitions of template variables. The VARIABLES (a.k.a. PRE_DEFINE) option can also be used to pre-define variables for all templates processed by the object.

my $tt = Template->new({
    VARIABLES => {
        version => 3.14,
        release => 'Sahara',
    },  
});

my $vars = {
    serial_no => 271828,
};

$tt->process('myfile', $vars);

myfile template:

This is version [% version %] ([% release %]).
Serial number: [% serial_no %]

Generated Output:

This is version 3.14 (Sahara)
Serial number: 271828

Variable names may contain any alphanumeric characters or underscores. They may be lower, upper or mixed case although the usual convention is to use lower case. The case is significant however, and 'foo', 'Foo' and 'FOO' are all different variables. Upper case variable names are permitted, but not recommended due to a possible conflict with an existing or future reserved word. As of version 2.00, these are:

GET CALL SET DEFAULT INSERT INCLUDE PROCESS WRAPPER 
IF UNLESS ELSE ELSIF FOR FOREACH WHILE SWITCH CASE
USE PLUGIN FILTER MACRO PERL RAWPERL BLOCK META
TRY THROW CATCH FINAL NEXT LAST BREAK RETURN STOP 
CLEAR TO STEP AND OR NOT MOD DIV END

The variable values may be of virtually any Perl type, including simple scalars, references to lists, hash arrays, subroutines or objects. The Template Toolkit will automatically apply the correct procedure to accessing these values as they are used in the template.

Example data:

my $vars = {
    article => 'The Third Shoe',
    person  => { 
        id    => 314, 
        name  => 'Mr. Blue',
        email => 'blue@nowhere.org',
    },
    primes  => [ 2, 3, 5, 7, 11, 13 ],
    wizard  => sub { return join(' ', 'Abracadabra!', @_) },
    cgi     => CGI->new('mode=submit&debug=1'),
};

Example template:

[% article %]

[% person.id %]: [% person.name %] <[% person.email %]>

[% primes.first %] - [% primes.last %], including [% primes.3 %]
[% primes.size %] prime numbers: [% primes.join(', ') %]

[% wizard %]
[% wizard('Hocus Pocus!') %]

[% cgi.param('mode') %]

Generated output:

The Third Shoe

314: Mr. Blue <blue@nowhere.org>

2 - 13, including 7
6 prime numbers: 2, 3, 5, 7, 11, 13

Abracadabra!
Abracadabra! Hocus Pocus!

submit

Scalar Values

Top

Regular scalar variables are accessed by simply specifying their name. As these are just entries in the top-level variable hash they can be considered special cases of hash array referencing as described below, with the main namespace hash automatically implied.

[% article %]

Hash Array References

Top

Members of hash arrays are accessed by specifying the hash reference and key separated by the dot '.' operator.

Example data:

my $vars = {
    'home' => 'http://www.myserver.com/homepage.html',
    'page' => {
        'this' => 'mypage.html',
        'next' => 'nextpage.html',
        'prev' => 'prevpage.html',
    },
};

Example template:

<a href="[% home %]">Home</a>
<a href="[% page.prev %]">Previous Page</a>
<a href="[% page.next %]">Next Page</a>

Generated output:

<a href="http://www.myserver.com/homepage.html">Home</a>
<a href="prevpage.html">Previous Page</a>
<a href="nextpage.html">Next Page</a>

Any key in a hash which starts with a '_' or '.' character will be considered private and cannot be evaluated or updated from within a template. The undefined value will be returned for any such variable accessed which the Template Toolkit will silently ignore (unless the DEBUG option is enabled).

Example data:

my $vars = {
    message => 'Hello World!',
    _secret => "On the Internet, no-one knows you're a dog",
    thing   => {
        public    => 123,
        _private  => 456,
        '.hidden' => 789,
    },
};

Example template:

[% message %]           # outputs "Hello World!"
[% _secret %]           # no output
[% thing.public %]      # outputs "123"
[% thing._private %]    # no output
[% thing..hidden %]     # ERROR: unexpected token (..)

You can disable this feature by setting the $Template::Stash::PRIVATE package variable to a false value.

$Template::Stash::PRIVATE = undef;   # now you can thing._private

To access a hash entry using a key stored in another variable, prefix the key variable with '$' to have it interpolated before use (see Variable Interpolation).

[% pagename = 'next' %]
[% page.$pagename %]       # same as [% page.next %]

When you assign to a variable that contains multiple namespace elements (i.e. it has one or more '.' characters in the name), any hashes required to represent intermediate namespaces will be created automatically. In this following example, the product variable automatically springs into life as a hash array unless otherwise defined.

[% product.id    = 'XYZ-2000' 
   product.desc  = 'Bogon Generator'
   product.price = 666 
%]

The [% product.id %] [% product.desc %] 
costs $[% product.price %].00

Generated output:

The XYZ-2000 Bogon Generator 
costs $666.00

You can use Perl's familiar { ... } construct to explicitly create a hash and assign it to a variable. Note that commas are optional between key/value pairs and = can be used in place of =>.

# minimal TT style
[% product = {
     id    = 'XYZ-2000'
     desc  = 'Bogon Generator'
     price = 666
   }
%]
# perl style
[% product = {
     id    => 'XYZ-2000',
     desc  => 'Bogon Generator',
     price => 666,
   }
%]

List References

Top

Items in lists are also accessed by use of the dot operator.

Example data:

my $vars = {
    people => [ 'Tom', 'Dick', 'Larry' ],
};

Example template:

[% people.0 %]          # Tom
[% people.1 %]          # Dick
[% people.2 %]          # Larry

The FOREACH directive can be used to iterate through items in a list.

[% FOREACH person IN people %]
Hello [% person %]
[% END %]

Generated output:

Hello Tom
Hello Dick
Hello Larry

Lists can be constructed in-situ using the regular anonymous list [ ... ] construct. Commas between items are optional.

[% cols = [ 'red', 'green', 'blue' ] %]

[% FOREACH c IN cols %]
   [% c %]
[% END %]

or:

[% FOREACH c IN [ 'red', 'green', 'blue' ] %]
   [% c %]
[% END %]

You can also create simple numerical sequences using the .. range operator:

[% n = [ 1 .. 4 ] %]    # n is [ 1, 2, 3, 4 ] 

[% x = 4
   y = 8
   z = [x..y]           # z is [ 4, 5, 6, 7, 8 ]
%]

Subroutines

Top

Template variables can contain references to Perl subroutines. When the variable is used, the Template Toolkit will automatically call the subroutine, passing any additional arguments specified. The return value from the subroutine is used as the variable value and inserted into the document output.

my $vars = {
    wizard  => sub { return join(' ', 'Abracadabra!', @_) },
};  

Example template:

[% wizard %]                    # Abracadabra!
[% wizard('Hocus Pocus!') %]    # Abracadabra! Hocus Pocus!

Objects

Top

Template variables can also contain references to Perl objects. Methods are called using the dot operator to specify the method against the object variable. Additional arguments can be specified as with subroutines.

use CGI;

my $vars = {
    # hard coded CGI params for purpose of example
    cgi  => CGI->new('mode=submit&debug=1'),
};

Example template:

[% FOREACH p IN cgi.param %]     # returns list of param keys
[% p %] => [% cgi.param(p) %]   # fetch each param value
[% END %]

Generated output:

mode => submit
debug => 1

Object methods can also be called as lvalues. That is, they can appear on the left side of an assignment. The method will be called passing the assigning value as an argument.

[% myobj.method = 10 %]

equivalent to:

[% myobj.method(10) %]

Passing Parameters and Returning Values

Top

Subroutines and methods will be passed any arguments specified in the template. Any template variables in the argument list will first be evaluated and their resultant values passed to the code.

my $vars = {
    mycode => sub { return 'received ' . join(', ', @_) },
};

template:

[% foo = 10 %]
[% mycode(foo, 20) %]       # received 10, 20

Named parameters may also be specified. These are automatically collected into a single hash array which is passed by reference as the last parameter to the sub-routine. Named parameters can be specified using either => or = and can appear anywhere in the argument list.

my $vars = {
    myjoin => \&myjoin,
};

sub myjoin {
    # look for hash ref as last argument
    my $params = ref $_[-1] eq 'HASH' ? pop : { };
    return join($params->{ joint } || ' + ', @_);
}

Example template:

[% myjoin(10, 20, 30) %]
[% myjoin(10, 20, 30, joint = ' - ' %]
[% myjoin(joint => ' * ', 10, 20, 30 %]

Generated output:

10 + 20 + 30
10 - 20 - 30
10 * 20 * 30

Parenthesised parameters may be added to any element of a variable, not just those that are bound to code or object methods. At present, parameters will be ignored if the variable isn't "callable" but are supported for future extensions. Think of them as "hints" to that variable, rather than just arguments passed to a function.

[% r = 'Romeo' %]
[% r(100, 99, s, t, v) %]       # outputs "Romeo"

User code should return a value for the variable it represents. This can be any of the Perl data types described above: a scalar, or reference to a list, hash, subroutine or object. Where code returns a list of multiple values the items will automatically be folded into a list reference which can be accessed as per normal.

my $vars = {
    # either is OK, first is recommended
    items1 => sub { return [ 'foo', 'bar', 'baz' ] },
    items2 => sub { return ( 'foo', 'bar', 'baz' ) },
};

Example template:

[% FOREACH i IN items1 %]
   ...
[% END %]

[% FOREACH i IN items2 %]
   ...
[% END %]

Error Handling

Top

Errors can be reported from user code by calling die(). Errors raised in this way are caught by the Template Toolkit and converted to structured exceptions which can be handled from within the template. A reference to the exception object is then available as the error variable.

my $vars = {
    barf => sub { 
        die "a sick error has occurred\n";
    },
};

Example template:

[% TRY %]
   [% barf %]       # calls sub which throws error via die()
[% CATCH %]
   [% error.info %]     # outputs "a sick error has occurred\n"
[% END %]

Error messages thrown via die() are converted to exceptions of type undef (the literal string "undef" rather than the undefined value). Exceptions of user-defined types can be thrown by calling die() with a reference to a Template::Exception object.

use Template::Exception;

my $vars = {
    login => sub { 
        ...do something...
        die Template::Exception->new( badpwd => 'password too silly' );
    },
};

Example template:

[% TRY %]
   [% login %]
[% CATCH badpwd %]
   Bad password: [% error.info %]
[% CATCH %]
   Some other '[% error.type %]' error: [% error.info %]
[% END %]

The exception types stop and return are used to implement the STOP and RETURN directives. Throwing an exception as:

die (Template::Exception->new('stop'));

has the same effect as the directive:

[% STOP %]

Virtual Methods

Top

The Template Toolkit implements a number of "virtual methods" which can be applied to scalars, hashes or lists. For example:

[% mylist = [ 'foo', 'bar', 'baz' ] %]
[% newlist = mylist.sort %]

Here mylist is a regular reference to a list, and 'sort' is a virtual method that returns a new list of the items in sorted order. You can chain multiple virtual methods together. For example:

[% mylist.sort.join(', ') %]

Here the join virtual method is called to join the sorted list into a single string, generating the following output:

bar, baz, foo

See Template::Manual::VMethods for details of all the virtual methods available.

Variable Interpolation

Top

The Template Toolkit uses $ consistently to indicate that a variable should be interpolated in position. Most frequently, you see this in double-quoted strings:

[% fullname = "$honorific $firstname $surname" %]

Or embedded in plain text when the INTERPOLATE option is set:

Dear $honorific $firstname $surname,

The same rules apply within directives. If a variable is prefixed with a $ then it is replaced with its value before being used. The most common use is to retrieve an element from a hash where the key is stored in a variable.

[% uid = 'abw' %]
[% users.$uid %]         # same as 'userlist.abw'

Curly braces can be used to delimit interpolated variable names where necessary.

[% users.${me.id}.name %]    

Directives such as INCLUDE, PROCESS, etc., that accept a template name as the first argument, will automatically quote it for convenience.

[% INCLUDE foo/bar.txt %]

The above example is equivalent to:

[% INCLUDE "foo/bar.txt" %]

To INCLUDE a template whose name is stored in a variable, simply prefix the variable name with $ to have it interpolated.

[% myfile = 'header' %]
[% INCLUDE $myfile %]

This is equivalent to:

[% INCLUDE header %]

Note also that a variable containing a reference to a Template::Document object can also be processed in this way.

my $vars = {
    header => Template::Document->new({ ... }),
};

Example template:

[% INCLUDE $header %]

Local and Global Variables

Top

Any simple variables that you create, or any changes you make to existing variables, will only persist while the template is being processed. The top-level variable hash is copied before processing begins and any changes to variables are made in this copy, leaving the original intact.

The same thing happens when you INCLUDE another template. The current namespace hash is cloned to prevent any variable changes made in the included template from interfering with existing variables. The PROCESS option bypasses the localisation step altogether making it slightly faster, but requiring greater attention to the possibility of side effects caused by creating or changing any variables within the processed template.

[% BLOCK change_name %]
   [% name = 'bar' %]
[% END %]

[% name = 'foo' %] 
[% INCLUDE change_name %]
[% name %]              # foo
[% PROCESS change_name %]
[% name %]              # bar

Dotted compound variables behave slightly differently because the localisation process is only skin deep. The current variable namespace hash is copied, but no attempt is made to perform a deep-copy of other structures within it (hashes, arrays, objects, etc). A variable referencing a hash, for example, will be copied to create a new reference but which points to the same hash. Thus, the general rule is that simple variables (undotted variables) are localised, but existing complex structures (dotted variables) are not.

[% BLOCK all_change %]
   [% x = 20 %]         # changes copy
   [% y.z = 'zulu' %]       # changes original
[% END %]

[% x = 10
   y = { z => 'zebra' }
%]
[% INCLUDE all_change %]
[% x %]             # still '10'
[% y.z %]               # now 'zulu'

If you create a complex structure such as a hash or list reference within a local template context then it will cease to exist when the template is finished processing.

[% BLOCK new_stuff %]
   [% # define a new 'y' hash array in local context
      y = { z => 'zulu' }
   %]
[% END %]

[% x = 10 %]
[% INCLUDE new_stuff %]
[% x %]             # outputs '10'
[% y %]             # nothing, y is undefined

Similarly, if you update an element of a compound variable which doesn't already exists then a hash will be created automatically and deleted again at the end of the block.

[% BLOCK new_stuff %]
   [% y.z = 'zulu' %]
[% END %]

However, if the hash does already exist then you will modify the original with permanent effect. To avoid potential confusion, it is recommended that you don't update elements of complex variables from within blocks or templates included by another.

If you want to create or update truly global variables then you can use the 'global' namespace. This is a hash array automatically created in the top-level namespace which all templates, localised or otherwise see the same reference to. Changes made to variables within this hash are visible across all templates.

[% global.version = 123 %]

Compile Time Constant Folding

Top

In addition to variables that get resolved each time a template is processed, you can also define variables that get resolved just once when the template is compiled. This generally results in templates processing faster because there is less work to be done.

To define compile-time constants, specify a CONSTANTS hash as a constructor item as per VARIABLES. The CONSTANTS hash can contain any kind of complex, nested, or dynamic data structures, just like regular variables.

my $tt = Template->new({
    CONSTANTS => {
        version => 3.14,
        release => 'skyrocket',
        col     => {
            back => '#ffffff',
            fore => '#000000',
        },
        myobj => My::Object->new(),
        mysub => sub { ... },
        joint => ', ',
    },
});

Within a template, you access these variables using the constants namespace prefix.

Version [% constants.version %] ([% constants.release %])
Background: [% constants.col.back %]

When the template is compiled, these variable references are replaced with the corresponding value. No further variable lookup is then required when the template is processed.

You can call subroutines, object methods, and even virtual methods on constant variables.

[% constants.mysub(10, 20) %]
[% constants.myobj(30, 40) %]
[% constants.col.keys.sort.join(', ') %]

One important proviso is that any arguments you pass to subroutines or methods must also be literal values or compile time constants.

For example, these are both fine:

# literal argument
[% constants.col.keys.sort.join(', ') %]

# constant argument
[% constants.col.keys.sort.join(constants.joint) %]

But this next example will raise an error at parse time because joint is a runtime variable and cannot be determined at compile time.

# ERROR: runtime variable argument!
[% constants.col.keys.sort.join(joint) %]

The CONSTANTS_NAMESPACE option can be used to provide a different namespace prefix for constant variables. For example:

my $tt = Template->new({
    CONSTANTS => {
        version => 3.14,
        # ...etc...
    },
    CONSTANTS_NAMESPACE => 'const',
});

Constants would then be referenced in templates as:

[% const.version %]

Special Variables

Top

A number of special variables are automatically defined by the Template Toolkit.

template

Top

The template variable contains a reference to the main template being processed, in the form of a Template::Document object. This variable is correctly defined within PRE_PROCESS, PROCESS and POST_PROCESS templates, allowing standard headers, footers, etc., to access metadata items from the main template. The name and modtime metadata items are automatically provided, giving the template name and modification time in seconds since the epoch.

Note that the template variable always references the top-level template, even when processing other template components via INCLUDE, PROCESS, etc.

component

Top

The component variable is like template but always contains a reference to the current, innermost template component being processed. In the main template, the template and component variable will reference the same Template::Document object. In any other template component called from the main template, the template variable will remain unchanged, but component will contain a new reference to the current component.

This example should demonstrate the difference:

$template->process('foo')
    || die $template->error(), "\n";

foo template:

[% template.name %]         # foo
[% component.name %]        # foo
[% PROCESS footer %]

footer template:

[% template.name %]         # foo
[% component.name %]        # footer

Additionally, the component variable has two special fields: caller and callers. caller contains the name of the template that called the current template (or undef if the values of template and component are the same). callers contains a reference to a list of all the templates that have been called on the road to calling the current component template (like a call stack), with the outer-most template first.

Here's an example:

outer.tt2 template:

[% component.name %]        # 'outer.tt2'
[% component.caller %]      # undef
[% component.callers %]     # undef
[% PROCESS 'middle.tt2' %]

middle.tt2 template:

[% component.name %]        # 'middle.tt2'
[% component.caller %]      # 'outer.tt2'
[% component.callers %]     # [ 'outer.tt2' ]
[% PROCESS 'inner.tt2' %]

inner.tt2 template:

[% component.name %]        # 'inner.tt2'
[% component.caller %]      # 'middle.tt2'
[% component.callers %]     # [ 'outer.tt2', 'middle.tt2' ]

loop

Top

Within a FOREACH loop, the loop variable references the Template::Iterator object responsible for controlling the loop.

[% FOREACH item = [ 'foo', 'bar', 'baz' ] -%]
   [% "Items:\n" IF loop.first -%]
   [% loop.count %]/[% loop.size %]: [% item %]
[% END %]

error

Top

Within a CATCH block, the error variable contains a reference to the Template::Exception object thrown from within the TRY block. The type and info methods can be called or the variable itself can be printed for automatic stringification into a message of the form "$type error - $info". See Template::Exception for further details.

[% TRY %]
   ...
[% CATCH %]
   [% error %]
[% END %]

content

Top

The WRAPPER method captures the output from a template block and then includes a named template, passing the captured output as the 'content' variable.

[% WRAPPER box %]
Be not afeard; the isle is full of noises,
Sounds and sweet airs, that give delight and hurt not.
[% END %]
[% BLOCK box %]
<blockquote class="prose">
  [% content %]
</blockquote>
[% END %]

Compound Variables

Top

Compound 'dotted' variables may contain any number of separate elements. Each element may evaluate to any of the permitted variable types and the processor will then correctly use this value to evaluate the rest of the variable. Arguments may be passed to any of the intermediate elements.

[% myorg.people.sort('surname').first.fullname %]

Intermediate variables may be used and will behave entirely as expected.

[% sorted = myorg.people.sort('surname') %]
[% sorted.first.fullname %]

This simplified dotted notation has the benefit of hiding the implementation details of your data. For example, you could implement a data structure as a hash array one day and then change it to an object the next without requiring any change to the templates.


/manual/Variables.html last modified 10:57:42 31-May-2007
TT_v224_html_docs/old/manual/Views.html000700 000765 000765 00000112657 10627516027 017645 0ustar00abwabw000000 000000 Template::Manual::Views

Overview

Top

A view is effectively a collection of templates and/or variable definitions which can be passed around as a self-contained unit. This then represents a particular interface or presentation style for other objects or items of data.

You can use views to implement custom "skins" for an application or content set. You can use them to help simplify the presentation of common objects or data types. You can even use then to automate the presentation of complex data structures such as that generated in an XML::DOM tree or similar. You let an iterator do the walking, and the view does the talking (or in this case, the presenting). Voila - you have view independant, structure shy traversal using templates.

In general, views can be used in a number of different ways to achieve several different things. They elegantly solve some problems which were otherwise difficult or complicated, and make easy some things that were previously hard.

At the moment, they're still very experimental. The directive syntax and underlying API are likely to change quite considerably over the next version or two. Please be very wary about building your multi-million dollar e-commerce solutions based around this feature.

Views as Template Collectors/Providers

Top

The VIEW directive starts a view definition and includes a name by which the view can be referenced. The view definition continues up to the matching END directive.

[% VIEW myview %]
   ...
[% END %]

The first role of a view is to act as a collector and provider of templates. The include() method can be called on a view to effectively do the same thing as the INCLUDE directive. The template name is passed as the first argument, followed by any local variable definitions for the template.

[% myview.include('header', title='The Title') %]

# equivalent to
[% INCLUDE header  title='The Title' %] 

Views accept a number of configuration options which can be used to control different aspects of their behaviour. The 'prefix' and 'suffix' options can be specified to add a fixed prefix and/or suffix to the name of each template.

[% VIEW myview 
     prefix = 'my/'
     suffix = '.tt2' ;
   END
%]

Now the call

[% myview.include('header', title='The Title') %]

is equivalent to

[% INCLUDE my/header.tt2  title='The Title' %]

Views provide an AUTOLOAD method which maps method names to the include() method. Thus, the following are all equivalent:

[% myview.include('header', title='Hello World') %]
[% myview.include_header(title='Hello World') %]
[% myview.header(title='Hello World') %]

Local BLOCK Definitions

Top

A VIEW definition can include BLOCK definitions which remain local to the view. A request for a particular template will return a BLOCK, if defined, in preference to any other template of the same name.

[% BLOCK foo %]
   public foo block
[% END %]

[% VIEW plain %]
   [% BLOCK foo %]
   plain foo block
   [% END %]
[% END %]

[% VIEW fancy %]
   [% BLOCK foo %]
   fancy foo block
   [% END %]
[% END %]

[% INCLUDE foo %]       # public foo block
[% plain.foo %]         # plain foo block 
[% fancy.foo %]         # fancy foo block 

In addition to BLOCK definitions, a VIEW can contain any other template directives. The entire VIEW definition block is processed to initialise the view but no output is generated (this may change RSN - and get stored as 'output' item, subsequently accessible as [% view.output %]). However, directives that have side-effects, such as those that update a variable, will have noticable consequences.

Preserving Variable State within Views

Top

Views can also be used to save the values of any existing variables, or to create new ones at the point at which the view is defined. Unlike simple template metadata (META) which can only contain static string values, the view initialisation block can contain any template directives and generate any kind of dynamic output and/or data items.

[% VIEW my_web_site %]
   [% view.title   = title or 'My Cool Web Site' %]
   [% view.author  = "$abw.name, $abw.email" %]
   [% view.sidebar = INCLUDE my/sidebar.tt2 %]
[% END %]

Note that additional data items can be specified as arguments to the VIEW directive. Anything that doesn't look like a configuration parameter is assumed to be a data item. This can be a little hazardous, of course, because you never know when a new configuration item might get added which interferes with your data.

[% VIEW my_web_site
        # config options
        prefix = 'my/'
        # misc data
        title   = title or 'My Cool Web Site'
        author  = "$abw.name, $abw.email"
        sidebar = INCLUDE my/sidebar.tt2 
%]
   ...
[% END %]

Outside of the view definition you can access the view variables as, for example:

[% my_web_site.title %]

One important feature is the equivalence of simple variables and templates. You can implement the view item 'title' as a simple variable, a template defined in an external file, possibly with a prefix/suffix automatically appended, or as a local BLOCK definition within the [% VIEW %] ... [% END %] definition. If you use the syntax above then the view will Do The Right Thing to return the appropriate output.

At the END of the VIEW definition the view is "sealed" to prevent you from accidentally updating any variable values. If you attempt to change the value of a variable after the END of the VIEW definition block then a view error will be thrown.

[% TRY; 
     my_web_site.title = 'New Title';
   CATCH;
     error;
   END
%]

The error above will be reported as:

view error - cannot update item in sealed view: title

The same is true if you pass a parameter to a view variable. This is interpreted as an attempt to update the variable and will raise the same warning.

[% my_web_site.title('New Title') %]    # view error!

You can set the silent parameter to have the view ignore these parameters and simply return the variable value.

[% VIEW my_web_site
        silent = 1
        title  = title or 'My Cool Web Site'
        # ... ;
   END
%]

[% my_web_site.title('Blah Blah') %]   # My Cool Web Site

Alternately, you can specify that a view is unsealed allowing existing variables to be updated and new variables defined.

[% VIEW my_web_site
        sealed = 0
        title  = title or 'My Cool Web Site'
        # ... ;
   END
%]

[% my_web_site.title('Blah Blah') %]   # Blah Blah
[% my_web_site.title %]                # Blah Blah

Inheritance, Delegation and Reuse

Top

Views can be inherited from previously defined views by use of the base parameter. This example shows how a base class view is defined which applies a view/default/ prefix to all template names.

[% VIEW my.view.default
        prefix = 'view/default/';
   END
%]

Thus the directive:

[% my.view.default.header(title='Hello World') %]

is now equivalent to:

[% INCLUDE view/default/header title='Hello World' %]

A second view can be defined which specifies the default view as a base.

[% VIEW my.view.fancy
        base   = my.view.default
        prefix = 'view/fancy/';
   END
%]

Now the directive:

[% my.view.fancy.header(title='Hello World') %]

will resolve to:

[% INCLUDE view/fancy/header title='Hello World' %]

or if that doesn't exist, it will be handled by the base view as:

[% INCLUDE view/default/header title='Hello World' %]

When a parent view is specified via the base parameter, the delegation of a view to its parent for fetching templates and accessing user defined variables is automatic. You can also implement your own inheritance, delegation or other reuse patterns by explicitly delegating to other views.

[% BLOCK foo %]
   public foo block
[% END %]

[% VIEW plain %]
   [% BLOCK foo %]
   <plain>[% PROCESS foo %]</plain>
   [% END %]
[% END %]

[% VIEW fancy %]
   [% BLOCK foo %]
   [% plain.foo | replace('plain', 'fancy') %]
   [% END %]
[% END %]
[% plain.foo %]     # <plain>public foo block</plain>
[% fancy.foo %]     # <fancy>public foo block</fancy>

Note that the regular INCLUDE/PROCESS/WRAPPER directives work entirely independantly of views and will always get the original, unaltered template name rather than any local per-view definition.

Self-Reference

Top

A reference to the view object under definition is available with the VIEW ... END block by its specified name and also by the special name 'view' (similar to the my $self = shift; in a Perl method or the 'this' pointer in C++, etc). The view is initially unsealed allowing any data items to be defined and updated within the VIEW ... END block. The view is automatically sealed at the end of the definition block, preventing any view data from being subsequently changed.

(NOTE: sealing should be optional. As well as sealing a view to prevent updates (SEALED), it should be possible to set an option in the view to allow external contexts to update existing variables (UPDATE) or even create totally new view variables (CREATE)).

[% VIEW fancy %]
   [% fancy.title  = 'My Fancy Title' %]
   [% fancy.author = 'Frank Open' %]
   [% fancy.col    = { bg => '#ffffff', bar => '#a0a0ff' } %]
[% END %]

or

[% VIEW fancy %]
   [% view.title  = 'My Fancy Title' %]
   [% view.author = 'Frank Open' %]
   [% view.col    = { bg => '#ffffff', bar => '#a0a0ff' } %]
[% END %]

It makes no real difference in this case if you refer to the view by its name, 'fancy', or by the general name, 'view'. Outside of the view block, however, you should always use the given name, 'fancy':

[% fancy.title  %]
[% fancy.author %]
[% fancy.col.bg %]

The choice of given name or 'view' is much more important when it comes to BLOCK definitions within a VIEW. It is generally recommended that you use 'view' inside a VIEW definition because this is guaranteed to be correctly defined at any point in the future when the block gets called. The original name of the view might have long since been changed or reused but the self-reference via 'view' should always be intact and valid.

Take the following VIEW as an example:

[% VIEW foo %]
   [% view.title = 'Hello World' %]
   [% BLOCK header %]
   Title: [% view.title %]
   [% END %]
[% END %]

Even if we rename the view, or create a new foo variable, the header block still correctly accesses the title attribute of the view to which it belongs. Whenever a view BLOCK is processed, the view variable is always updated to contain the correct reference to the view object to which it belongs.

[% bar = foo %]
[% foo = { title => "New Foo" } %]  # no problem
[% bar.header %]                    # => Title: Hello World

Saving References to External Views

Top

When it comes to view inheritance, it's always a good idea to take a local copy of a parent or delegate view and store it as an attribute within the view for later use. This ensures that the correct view reference is always available, even if the external name of a view has been changed.

[% VIEW plain %]
   ...
[% END %]

[% VIEW fancy %]
   [% view.plain = plain %]
   [% BLOCK foo %]
   [% view.plain.foo | replace('plain', 'fancy') %]
   [% END %]
[% END %]

[% plain.foo %]         # => <plain>public foo block</plain>
[% plain = 'blah' %]    # no problem
[% fancy.foo %]         # => <fancy>public foo block</fancy>

Views as Data Presenters

Top

Another key role of a view is to act as a dispatcher to automatically apply the correct template to present a particular object or data item. This is handled via the print() method.

Here's an example:

[% VIEW foo %]

   [% BLOCK text %]
      Some text: [% item %]
   [% END %]

   [% BLOCK hash %]
      a hash:
      [% FOREACH key = item.keys.sort -%]
         [% key %] => [% item.$key %]
      [% END -%]
   [% END %]

   [% BLOCK list %]
      a list: [% item.sort.join(', ') %]
   [% END %]

[% END %]

We can now use the view to print text, hashes or lists. The print() method includes the right template depending on the typing of the argument (or arguments) passed.

[% some_text = 'I read the news today, oh boy.' %]
[% a_hash    = { house => 'Lords', hall => 'Albert' } %]
[% a_list    = [ 'sure', 'Nobody', 'really' ] %]

[% view.print(some_text) %]
                    # Some text: I read the news today, oh boy.

[% view.print(a_hash) %]
                    # a hash:
                         hall => Albert
                         house => Lords
[% view.print(a_list) %]
                    # a list: Nobody, really, sure

You can also provide templates to print objects of any other class. The class name is mapped to a template name with all non-word character sequences such as '::' converted to a single '_'.

[% VIEW foo %]
   [% BLOCK Foo_Bar %]
      a Foo::Bar object: 
          thingies: [% view.print(item.thingies) %]
           doodahs: [% view.print(item.doodahs)  %]
   [% END %]
[% END %]

[% USE fubar = Foo::Bar(...) %]

[% foo.print(fubar) %]

Note how we use the view object to display various items within the objects ('thingies' and 'doodahs'). We don't need to worry what kind of data these represent (text, list, hash, etc) because we can let the view worry about it, automatically mapping the data type to the correct template.

Views may define their own type => template map.

[% VIEW foo 
     map = { TEXT  => 'plain_text',
             ARRAY => 'show_list', 
             HASH  => 'show_hash',
             My::Module => 'template_name'
             default    => 'any_old_data'
           }
%]
    [% BLOCK plain_text %]
       ...
    [% END %]

    ...
[% END %]

They can also provide a default map entry, specified as part of the map hash or as a parameter by itself.

[% VIEW foo 
     map     = { ... },
     default = 'whatever'
%]
   ...
[% END %]

or

[% VIEW foo %]
   [% view.map     = { ... }
      view.default = 'whatever'
   %]
   ...
[% END %]

The print() method provides one more piece of magic. If you pass it a reference to an object which provides a present() method, then the method will be called passing the view as an argument. This then gives any object a chance to determine how it should be presented via the view.

package Foo::Bar;
...
sub present {
    my ($self, $view) = @_;
    return "a Foo::Bar object:\n"
         . "thingies: " . $view.print($self->{ _THINGIES }) . "\n"
         . "doodahs: " . $view.print($self->{ _DOODAHS }) . "\n";
}

The object is free to delve deeply into its innards and mess around with its own private data, before presenting the relevant data via the view. In a more complex example, a present() method might walk part of a tree making calls back against the view to present different nodes within the tree. We may not want to expose the internal structure of the tree (because that would break encapsulation and make our presentation code dependant on it) but we want to have some way of walking the tree and presenting items found in a particular manner.

This is known as Structure Shy Traversal. Our view object doesn't require prior knowledge about the internal structure of any data set to be able to traverse it and present the data contained therein. The data items themselves, via the present() method, can implement the internal iterators to guide the view along the right path to presentation happiness.

The upshot is that you can use views to greatly simplify the display of data structures like XML::DOM trees. The documentation for the Template::Plugin::XML::DOM module contains an example of this. In essence, it looks something like this:

XML source:

<user name="Andy Wardley">
    <project id="iCan" title="iCan, but theyCan't"/>
    <project id="p45"  title="iDid, but theyDidn't"/>
</user>

TT View:

[% VIEW fancy %]
   [% BLOCK user %]
      User: [% item.name %]
            [% item.content(myview) %]
   [% END %]

   [% BLOCK project %]
        Project: [% project.id %] - [% project.name %]
   [% END %]
[% END %]

Generate view:

[% USE dom = XML.DOM %]
[% fancy.print(dom.parse(xml_source)) %]

Output:

User: Andy Wardley
  Project: iCan - iCan, but theyCan't
  Project: p45 - iDid, but theyDidn't

The same approach can be applied to many other areas. Here's an example from the File/Directory plugins.

[% VIEW myview %]
   [% BLOCK file %]
      - [% item.name %]
   [% END %]

   [% BLOCK directory %]
      * [% item.name %]
        [% item.content(myview) FILTER indent %]
   [% END %]
[% END %]

[% USE dir = Directory(dirpath) %]
[% myview.print(dir) %]

And here's the same approach use to convert POD documentation to any other format via template.

[%  # load Pod plugin and parse source file into Pod Object Model
    USE Pod;
    pom = Pod.parse_file(my_pod_file);

    # define view to map all Pod elements to "pod/html/xxx" templates
    VIEW pod2html
        prefix='pod/html';
    END;

    # now print document via view (i.e. as HTML)
    pod2html.print(pom) 
%]

Here we simply define a template prefix for the view which causes the view to look for pod/html/head1, pod/html/head2, pod/html/over as templates to present the different sections of the parsed Pod document.

There are some examples in the Template Toolkit test suite: t/pod.t and t/view.t which may shed some more light on this. See the distribution sub-directory examples/pod/html for examples of Pod -> HTML templates.


/manual/Views.html last modified 10:57:43 31-May-2007
TT_v224_html_docs/old/manual/VMethods.html000700 000765 000765 00000160530 10627516027 020272 0ustar00abwabw000000 000000 Template::Manual::VMethods

Scalar Virtual Methods

Top

defined

Top

Returns true if the value is defined.

[% user = get_user(uid) IF uid.defined %]

length

Top

Returns the length of the string representation of the item:

[% IF password.length < 8 %]
   Password too short, dumbass!
[% END %]

repeat(n)

Top

Repeat the string a specified number of times.

[% name = 'foo' %]
[% name.repeat(3) %]        # foofoofoo

replace(search, replace)

Top

Outputs the string with all instances of the first argument (specified as a Perl regular expression) with the second.

[% name = 'foo, bar & baz' %]
[% name.replace('\W+', '_') %]    # foo_bar_baz

remove(pattern)

Top

Outputs the string with all instances of the pattern (specified as a Perl regular expression) removed.

[% name = 'foo, bar & baz' %]
[% name.remove('\W+') %]    # foobarbaz

match(pattern, global)

Top

Performs a regular expression match on the string using the pattern passed as an argument. If the pattern matches the string then the method returns a reference to a list of any strings captured within parenthesis in the pattern.

[% name = 'Larry Wall' %]
[% matches = name.match('(\w+) (\w+)') %]
[% matches.1 %], [% matches.0 %]        # Wall, Larry

If the pattern does not match then the method returns false, rather than returning an empty list which Perl and the Template Toolkit both consider to be a true value. This allows you to write expression like this.

[% "We're not worthy!" IF name.match('Larry Wall') %]
[% IF (matches = name.match('(\w+) (\w+)')) %]
   pattern matches: [% matches.join(', ') %]
[% ELSE %]
   pattern does not match
[% END %]

Any regex modifiers, like /s, should be added in the regex using the (?s) syntax. For example, to modify the regex to disregard whitespace (the /x switch), use:

[% re = '(?x)
           (\w+)
           [ ]
           (\w+)
         ';
  matches = name.match(re);
%]

To perform a global search to match the pattern as many times as it appears in the source string, provide a true value for the global argument following the pattern.

[% text = 'bandanna';
   text.match('an+', 1).join(', )      # an, ann
%]
Top

Performs a similar function to match but simply returns true if the string matches the regular expression pattern passed as an argument.

[% name = 'foo bar baz' %]
[% name.search('bar') ? 'bar' : 'no bar' %]        # bar

This virtual method is now deprecated in favour of match. Move along now, there's nothing more to see here.

split(pattern)

Top

Calls Perl's split() function to split a string into a list of strings.

[% FOREACH dir IN mypath.split(':') %]
   [% dir %]
[% END %]

chunk(size)

Top

Splits the value into a list of chunks of a certain size.

[% ccard_no = "1234567824683579";
   ccard_no.chunk(4).join
%]

Output:

1234 5678 2468 3579

If the size is specified as a negative number then the text will be chunked from right-to-left. This gives the correct grouping for numbers, for example.

[% number = 1234567;
   number.chunk(-3).join(',')
%]

Output:

1,234,567

substr(offset, length, replacement)

Top

Returns a substring starting at offset, for length characters.

[% str 'foo bar baz wiz waz woz') %]
[% str.substr(4, 3) %]    # bar

If length is not specified then it returns everything from the offset to the end of the string.

[% str.substr(12) %]      # wiz waz woz

If both length and replacement are specified, then the method replaces everything from offset for length characters with $replacement. The substring removed from the string is then returned.

[% str.substr(0, 11, 'FOO') %]   # foo bar baz
[% str %]                        # FOO wiz waz woz

list

Top

Return the value as a single element list. This can be useful if you have a variable which may contain a single item or a list and you want to treat them equally. The list method can be called against a list reference and will simply return the original reference, effectively a no-op.

[% thing.list.size %]  # thing can be a scalar or a list

hash

Top

Return the value as a hash reference containing a single entry with the key value indicating the original scalar value. As with the list virtual method, this is generally used to help massage data into different formats.

size

Top

Always returns 1 for scalar values. This method is provided for consistency with the hash and list size methods.

Hash Virtual Methods

Top

keys

Top

Returns a list of keys in the hash. They are not returned in any particular order, but the order is the same as for the corresponding values method.

[% FOREACH key IN hash.keys %]
   * [% key %]
[% END %]

If you want the keys in sorted order, use the list sort method.

[% FOREACH key IN hash.keys.sort %]
   * [% key %]
[% END %]

Having got the keys in sorted order, you can then use variable interpolation to fetch the value. This is shown in the following example by the use of $key to fetch the item from hash whose key is stored in the key variable.

[% FOREACH key IN hash.keys.sort %]
   * [% key %] = [% hash.$key %]
[% END %]

Alternately, you can use the pairs method to get a list of key/value pairs in sorted order.

values

Top

Returns a list of the values in the hash. As with the keys method, they are not returned in any particular order, although it is the same order that the keys are returned in.

[% hash.values.join(', ') %]

items

Top

Returns a list of both the keys and the values expanded into a single list.

[% hash = {
      a = 10
      b = 20
   };

   hash.items.join(', ')    # a, 10, b, 20
%]

each

Top

This method currently returns the same thing as the items method.

However, please note that this method will change in the next major version of the Template Toolkit (v3) to return the same thing as the pairs method. This will be done in an effort to make these virtual method more consistent with each other and how Perl works.

In anticipation of this, we recommend that you stop using hash.each and instead use hash.items.

pairs

Top

This method returns a list of key/value pairs. They are returned in sorted order according to the keys.

[% FOREACH pair IN product.pairs %]
   * [% pair.key %] is [% pair.value %]
[% END %]

list

Top

Returns the contents of the hash in list form. An argument can be passed to indicate the desired items required in the list: keys to return a list of the keys (same as hash.keys), values to return a list of the values (same as hash.values), each to return as list of key and values (same as hash.each), or pairs to return a list of key/value pairs (same as hash.pairs).

[% keys   = hash.list('keys') %]
[% values = hash.list('values') %]
[% items  = hash.list('each') %]
[% pairs  = hash.list('pairs') %]

When called without an argument it currently returns the same thing as the pairs method. However, please note that this method will change in the next major version of the Template Toolkit (v3) to return a reference to a list containing the single hash reference (as per the scalar list method).

In anticipation of this, we recommend that you stop using hash.list and instead use hash.pairs.

sort, nsort

Top

Return a list of the keys, sorted alphabetically (sort) or numerically (nsort) according to the corresponding values in the hash.

[% FOREACH n IN phones.sort %]
   [% phones.$n %] is [% n %],
[% END %]

import

Top

The import method can be called on a hash array to import the contents of another hash array.

[% hash1 = {
     foo = 'Foo'
     bar = 'Bar'
   }
   hash2 = {
       wiz = 'Wiz'
       woz = 'Woz'
   }
%]

[% hash1.import(hash2) %]
[% hash1.wiz %]             # Wiz

You can also call the import() method by itself to import a hash array into the current namespace hash.

[% user = { id => 'lwall', name => 'Larry Wall' } %]
[% import(user) %]
[% id %]: [% name %]        # lwall: Larry Wall

defined, exists

Top

Returns a true or false value if an item in the hash denoted by the key passed as an argument is defined or exists, respectively.

[% hash.defined('somekey') ? 'yes' : 'no' %]
[% hash.exists('somekey') ? 'yes' : 'no' %]

When called without any argument, hash.defined returns true if the hash itself is defined (e.g. the same effect as scalar.defined).

delete

Top

Delete one or more items from the hash.

[% hash.delete('foo', 'bar') %]

size

Top

Returns the number of key/value pairs in the hash.

item

Top

Returns an item from the hash using a key passed as an argument.

[% hash.item('foo') %]  # same as hash.foo

List Virtual Methods

Top

first, last

Top

Returns the first/last item in the list. The item is not removed from the list.

[% results.first %] to [% results.last %]

If either is given a numeric argument n, they return the first or last n elements:

The first 5 results are [% results.first(5).join(", ") %].

size, max

Top

Returns the size of a list (number of elements) and the maximum index number (size - 1), respectively.

[% results.size %] search results matched your query

defined

Top

Returns a true or false value if the item in the list denoted by the argument is defined.

[% list.defined(3) ? 'yes' : 'no' %]

When called without any argument, list.defined returns true if the list itself is defined (e.g. the same effect as scalar.defined).

reverse

Top

Returns the items of the list in reverse order.

[% FOREACH s IN scores.reverse %]
   ...
[% END %]

join

Top

Joins the items in the list into a single string, using Perl's join() function.

[% items.join(', ') %]

grep

Top

Returns a list of the items in the list that match a regular expression pattern.

[% FOREACH directory.files.grep('\.txt$') %]
   ...
[% END %]

sort, nsort

Top

Returns the items in alpha (sort) or numerical (nsort) order.

[% library = books.sort %]

An argument can be provided to specify a search key. Where an item in the list is a hash reference, the search key will be used to retrieve a value from the hash which will then be used as the comparison value. Where an item is an object which implements a method of that name, the method will be called to return a comparison value.

[% library = books.sort('author') %]

In the example, the books list can contains hash references with an author key or objects with an author method.

unshift(item), push(item)

Top

The push() method adds an item or items to the end of list.

[% mylist.push(foo) %]
[% mylist.push(foo, bar) %]

The C<unshift()> method adds an item or items to the start of a list.
[% mylist.unshift(foo) %]
[% mylist.push(foo, bar)    %]

shift, pop

Top

Removes the first/last item from the list and returns it.

[% first = mylist.shift %]
[% last  = mylist.pop   %]

unique

Top

Returns a list of the unique elements in a list, in the same order as in the list itself.

[% mylist = [ 1, 2, 3, 2, 3, 4, 1, 4, 3, 4, 5 ] %]
[% numbers = mylist.unique %]

While this can be explicitly sorted, it is not required that the list be sorted before the unique elements are pulled out (unlike the Unix command line utility).

[% numbers = mylist.unique.sort %]

import

Top

Appends the contents of one or more other lists to the end of the current list.

[% one   = [ 1 2 3 ];
   two   = [ 4 5 6 ];
   three = [ 7 8 9 ];
   one.import(two, three);
   one.join(', );     # 1, 2, 3, 4, 5, 6, 7, 8, 9       
%]

merge

Top

Returns a list composed of zero or more other lists:

[% list_one = [ 1 2 3 ];
   list_two = [ 4 5 6 ];
   list_three = [ 7 8 9 ];
   list_four = list_one.merge(list_two, list_three);
%]

The original lists are not modified.

slice(from, to)

Top

Returns a slice of items in the list between the bounds passed as arguments. If the second argument, to, isn't specified, then it defaults to the last item in the list. The original list is not modified.

[% first_three = list.slice(0,2) %]
[% last_three  = list.slice(-3, -1) %]

splice(offset, length, list)

Top

Behaves just like Perl's splice() function allowing you to selectively remove and/or replace elements in a list. It removes length items from the list, starting at offset and replaces them with the items in list.

[% play_game = [ 'play', 'scrabble' ];
   ping_pong = [ 'ping', 'pong' ];
   redundant = play_game.splice(1, 1, ping_pong);
   redundant.join;     # scrabble
   play_game.join;     # play ping pong
%]

The method returns a list of the items removed by the splice. You can use the CALL directive to ignore the output if you're not planning to do anything with it.

[% CALL play_game.splice(1, 1, ping_pong) %]

As well as providing a reference to a list of replacement values, you can pass in a list of items.

[% CALL list.splice(-1, 0, 'foo', 'bar') %]

Be careful about passing just one item in as a replacement value. If it is a reference to a list then the contents of the list will be used. If it's not a list, then it will be treated as a single value. You can use square brackets around a single item if you need to be explicit:

[% # push a single item, an_item
   CALL list.splice(-1, 0, an_item);

   # push the items from another_list
   CALL list.splice(-1, 0, another_list);

   # push a reference to another_list
   CALL list.splice(-1, 0, [ another_list ]);
%]

hash

Top

Returns a reference to a hash array comprised of the elements in the list. The even-numbered elements (0, 2, 4, etc) become the keys and the odd-numbered elements (1, 3, 5, etc) the values.

[% list = ['pi', 3.14, 'e', 2.718] %]
[% hash = list.hash %]
[% hash.pi %]               # 3.14
[% hash.e  %]               # 2.718

If a numerical argument is provided then the hash returned will have keys generated for each item starting at the number specified.

[% list = ['beer', 'peanuts'] %]
[% hash = list.hash(1) %]
[% hash.1  %]               # beer          
[% hash.2  %]               # peanuts

Automagic Promotion of Scalar to List for Virtual Methods

Top

In addition to the scalar virtual methods listed in the previous section, you can also call any list virtual method against a scalar. The item will be automagically promoted to a single element list and the appropriate list virtual method will be called.

One particular benefit of this comes when calling subroutines or object methods that return a list of items, rather than the preferred reference to a list of items. In this case, the Template Toolkit automatically folds the items returned into a list.

The upshot is that you can continue to use existing Perl modules or code that returns lists of items, without having to refactor it just to keep the Template Toolkit happy (by returning references to list). Class::DBI module is just one example of a particularly useful module which returns values this way.

If only a single item is returned from a subroutine then the Template Toolkit assumes it meant to return a single item (rather than a list of 1 item) and leaves it well alone, returning the single value as it is. If you're executing a database query, for example, you might get 1 item returned, or perhaps many items which are then folded into a list.

The FOREACH directive will happily accept either a list or a single item which it will treat as a list. So it's safe to write directives like this, where we assume that the something variable is bound to a subroutine which may return one or more items:

[% FOREACH item IN something %]
   ...
[% END %]

The automagic promotion of scalars to single item lists means that you can also use list virtual methods safely, even if you only get one item returned. For example:

[% something.first   %]
[% something.join    %]
[% something.reverse.join(', ') %]

Note that this is very much a last-ditch behaviour. If the single item return is an object with a first method, for example, then that will be called, as expected, in preference to the list virtual method.

Defining Custom Virtual Methods

Top

You can define your own virtual methods for scalars, lists and hash arrays. The Template::Stash package variables $SCALAR_OPS, $LIST_OPS and $HASH_OPS are references to hash arrays that define these virtual methods. HASH_OPS and LIST_OPS methods are subroutines that accept a hash/list reference as the first item. SCALAR_OPS are subroutines that accept a scalar value as the first item. Any other arguments specified when the method is called will be passed to the subroutine.

# load Template::Stash to make method tables visible
use Template::Stash;

# define list method to return new list of odd numbers only
$Template::Stash::LIST_OPS->{ odd } = sub {
    my $list = shift;
    return [ grep { $_ % 2 } @$list ];
};

Example template:

[% primes = [ 2, 3, 5, 7, 9 ] %]
[% primes.odd.join(', ') %]        # 3, 5, 7, 9

TODO: document the define_vmethod() method which makes this even easier


/manual/VMethods.html last modified 10:57:43 31-May-2007
TT_v224_html_docs/old/js/tt2.js000700 000765 000765 00000016024 10627516021 016051 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------ * set_cookie(name, value, days) * * Set a cookie with the name and value passed as the first two arguments, * set to expire in the number of days specified in the third argument. *------------------------------------------------------------------------*/ function set_cookie(name, value, days) { var expires; if (days) { var date = new Date(); date.setTime(date.getTime() + (days*24*60*60*1000)); expires = "; expires=" + date.toGMTString(); } else expires = ""; document.cookie = name + "=" + value + expires + "; path=/"; } /*------------------------------------------------------------------------ * get_cookie(name) * * Returns the value of the cookie identified by the name argument. *------------------------------------------------------------------------*/ function get_cookie(name) { var namestr = name + "="; var cookbits = document.cookie.split(';'); var n; for(n = 0; n < cookbits.length; n++) { var c = cookbits[n]; /* remove leading whitespace */ while (c.charAt(0) == ' ') c = c.substring(1, c.length); /* if the name start this cookie fragment, return the value */ if (c.indexOf(namestr) == 0) return c.substring(namestr.length, c.length); } return null; } /*------------------------------------------------------------------------ * functions to handle multiple handler for onload and onunload events. *------------------------------------------------------------------------*/ var onload_functions = new Array(); var onunload_functions = new Array(); function page_onload(func) { onload_functions.push(func); } function page_onunload(func) { onunload_functions.push(func); } function page_load() { for(var i = 0; i < onload_functions.length; i++) { try { eval(onload_functions[i]); } catch(err) { alert(err) } } } function page_unload() { for(var i = 0; i < onunload_functions.length; i++) eval(onunload_functions[i]); } window.onload = page_load; window.onunload = page_unload; page_onload('load_style()'); // page_onunload('save_style()'); /*------------------------------------------------------------------------ * load_style() * * Initialises the stylesheet based on any cookie currently set. *------------------------------------------------------------------------*/ function load_style() { var style; if (style = get_cookie("stylesheet")) set_style(style); if (style = get_cookie("body")) document.getElementById("body").className = style; } /*------------------------------------------------------------------------ * save_style() * * Saves the stylesheet name back to a cookie *------------------------------------------------------------------------*/ function save_style() { var style; if (style = get_style()) set_cookie("stylesheet", style, 365); } /*------------------------------------------------------------------------ * get_style() * * Returns the title of the current active stylesheet. *------------------------------------------------------------------------*/ function get_style() { var elems = document.getElementsByTagName("link"); var n, elem, title; for (n = 0; (elem = elems[n]); n++) { if (elem.getAttribute("rel").indexOf("style") != -1 && (title = elem.getAttribute("title")) && ! elem.disabled) return title; } return null; } /*------------------------------------------------------------------------ * set_style(title) * * Set the active stylesheet by enabling the * element that has a title attribute matching the title argument, * and disabling all others. *------------------------------------------------------------------------*/ function set_style(title) { var elems = document.getElementsByTagName("link"); var n, elem, tattr; // alert("SET " + title); set_cookie("stylesheet", title, 365); for (n = 0; n < elems.length; n++) { elem = elems[n]; if (elem.getAttribute("rel").indexOf("style") != -1 && (tattr = elem.getAttribute("title"))) { elem.disabled = true; if (tattr == title) { elem.disabled = false; } } } return false; } /*------------------------------------------------------------------------ * widescreen_on() * widescreen_off() * * Turn widescreen mode on/off by setting the #body class *------------------------------------------------------------------------*/ function widescreen_on() { document.getElementById("body").className = "wide"; set_cookie("body", "wide", 365); } function widescreen_off() { document.getElementById("body").className = ""; set_cookie("body", "", 365); } /*------------------------------------------------------------------------ * switch_element(node, class) * * Toggle the node's className between "open $class" and "shut $class" *------------------------------------------------------------------------*/ function switch_element(node, classname) { node.className = node.className == 'open ' + classname ? 'shut ' + classname : 'open ' + classname; return false; } function switch_section(section) { return switch_element(section.parentNode.parentNode, 'section'); } function switch_subsection(subsect) { return switch_element(subsect.parentNode.parentNode, 'subsection'); } /*------------------------------------------------------------------------ * switch_tag_class(root, tag, from, to) * * Switch all tag elements under the root from one class to another. *------------------------------------------------------------------------*/ function switch_tag_class(root, tag, cfrom, cto) { var nodes = root.getElementsByTagName(tag); var n, node; for (n = 0; (node = nodes[n]); n++) { if (node.className == cfrom) { node.className = cto; } } } function shut_all(root) { if (! root) root = document; switch_tag_class(root, 'div', 'section', 'shut section'); switch_tag_class(root, 'div', 'subsection', 'shut subsection'); switch_tag_class(root, 'div', 'open section', 'shut section'); switch_tag_class(root, 'div', 'open subsection', 'shut subsection'); switch_tag_class(root, 'div', 'wedged section', 'open section'); switch_tag_class(root, 'div', 'wedged subsection', 'open subsection'); return false; } function open_all(root) { if (! root) root = document; switch_tag_class(root, 'div', 'section', 'open section'); switch_tag_class(root, 'div', 'subsection', 'open subsection'); switch_tag_class(root, 'div', 'shut section', 'open section'); switch_tag_class(root, 'div', 'shut subsection', 'open subsection'); switch_tag_class(root, 'div', 'wedged section', 'open section'); switch_tag_class(root, 'div', 'wedged subsection', 'open subsection'); return false; } page_onload('open_all()'); TT_v224_html_docs/old/css/blue.css000700 000765 000765 00000050401 10627516136 016623 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* default styles */ /*------------------------------------------------------------------------*/ h1, h2, h3, h4, h5, h6 { color: #444444; } h1 { margin: 0px 0 5px 0; } p { color: #333; padding: 8px 0; } p.tight { padding: 4px 0; margin: 0; } pre { line-height: 120%; } code { color: #224; font-weight: bold; } a { text-decoration: none; color: #00AAF0; } a:visited { color: #0059a5; } a:hover { color: #FF7F00; } a:focus { -moz-outline: none; } .alt { display: none; } .sample { display: block; width: 100px; height: 30px; } br.clear { clear: both; } /*------------------------------------------------------------------------*/ /* main body style */ /*------------------------------------------------------------------------*/ body { font: 14px Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #333; margin: 0px; padding: 10px 10px 20px 10px; background: #00AAF0 url('../images/glass/blue/top_grad.gif') repeat-x top left; } #layout { background: white url('../images/glass/blue/left.gif') repeat-y top left; min-width: 600px; } /*------------------------------------------------------------------------*/ /* header */ /*------------------------------------------------------------------------*/ #header { position: relative; height: 130px; margin: 0px; padding: 0 25px 0 220px; background: url('../images/glass/blue/header.gif') no-repeat top right; } #header #logo { display: block; position: absolute; top: 0; left: 0; width: 220px; height: 130px; background: url('../images/glass/blue/logo_blue.gif') no-repeat top right; } #header #logo:hover { background-image: url('../images/glass/blue/logo_orange.gif'); } #header #trail { height: 40px; margin: 0; padding: 0 0 0 10px; background: url('../images/glass/blue/tab_pre.gif') no-repeat top left; } #header #trail.blank { background-image: none; } #header #trail li { display: block; float: left; background: url('../images/glass/blue/tab_cold.gif') no-repeat top left; padding: 0 0 0 10px; } #header #trail li a { display: block; float: left; font-size: 11px; text-decoration: none; color: #888888; line-height: 14px; height: 30px; min-width: 60px; padding: 10px 15px 0 0; background: url('../images/glass/blue/tab_cold.gif') no-repeat top right; } #header #trail li a:hover { color: #FF7F00; } #header #trail li:hover, #header #trail li:hover a { background-image: url('../images/glass/blue/tab_roll.gif'); } #header #trail li.last { background-image: url('../images/glass/blue/tab_warm.gif'); color: #444444; } #header #trail li.last a { background-image: url('../images/glass/blue/tab_warm.gif'); color: #444444; padding-right: 45px; } #header .headline { font-size: 24px; margin: 8px 0 8px 0; padding: 0 100px 0 0; color: #444444; } #header .subhead { font-size: 16px; line-height: 18px; padding: 0 110px 0 0; margin: 0; color: #444; } #header .controls { position: absolute; display: block; top: 40px; right: 20px; width: 130px; height: 70px; overflow: visible; } /*------------------------------------------------------------------------*/ /* main page content and sidebar */ /*------------------------------------------------------------------------*/ #page { margin-bottom: 0; padding: 0; padding-left: 220px; background: url('../images/glass/blue/right.gif') repeat-y top right; } #sidebar { position: relative; float: left; padding: 0; width: 220px; margin: 0; margin-left: -220px; } #content { position: relative; margin: 0; padding: 10px 40px 10px 15px; } #sidebar #menu { width: 220px; margin: 0; padding: 0; background: url('../images/glass/blue/menu_body.gif') repeat-y top left; } #sidebar #menu div.foot { height: 20px; background: url('../images/glass/blue/menu_foot.gif') no-repeat bottom left; } #page div.pageinfo { text-align: center; font-size: 10px; color: #ccc; } /*------------------------------------------------------------------------*/ /* footer */ /*------------------------------------------------------------------------*/ #footer { clear: both; position: relative; padding: 0 145px 0px 270px; height: 100px; background: url('../images/glass/blue/footer.gif') no-repeat bottom left; } #footer a.osi { position: absolute; display: block; left: 200px; bottom: 30px; width: 70px; height: 50px; cursor: pointer; background: url('../images/glass/blue/osi.gif') no-repeat top left; } #footer .copyright { text-align: center; color: #666; font-size: 12px; padding: 14px 0 0 0; } #footer .licence { text-align: center; padding-top: 5px; color: #888; font-size: 11px; line-height: 15px; padding: 0 20px; } #footer .copyright a, #footer .copyright a:visited, #footer .licence a, #footer .licence a:visited { color: #40698c; } #footer .copyright a:hover, #footer .licence a:hover { color: #FF7F00; } #footer .controls { position: absolute; display: block; bottom: 0; right: 0; width: 125px; height: 100px; padding: 0 25px 0 0; background: url('../images/glass/blue/footer.gif') no-repeat bottom right; } /*------------------------------------------------------------------------*/ /* widescreen mode */ /*------------------------------------------------------------------------*/ #body.wide { padding: 10px 0 0 0; } #body.wide #palette { display: none; } #body.wide #header { padding: 0 20px 0 20px; margin: -50px -20px 0 0; } #body.wide #header #logo { display: none; } #body.wide #page { padding: 10px; margin: 0 0 0 0; background-image: none; background-color: white; min-width: 560px; } #body.wide #sidebar { display: none; } #body.wide #content { padding: 0 10px; background: white none; } #body.wide #footer { padding: 0 150px 0px 90px; margin-right: -20px; background-position: bottom right; } #body.wide #footer a.osi { left: 20px; } /*------------------------------------------------------------------------*/ /* controls for showing/hiding the menu */ /*------------------------------------------------------------------------*/ div.controls a.menu { display: block; float: right; margin-right: 5px; width: 40px; height: 30px; background: url('../images/glass/blue/hide_menu.gif') no-repeat 0 5px; } div.controls a.hide:hover { background-image: url('../images/glass/blue/hide_menu_roll.gif'); } div.controls a.show { background-image: url('../images/glass/blue/show_menu.gif'); } div.controls a.show:hover { background-image: url('../images/glass/blue/show_menu_roll.gif'); } body div.controls a.hide { display: block; } body div.controls a.show { display: none; } body.wide div.controls a.hide { display: none; } body.wide div.controls a.show { display: block; } /*------------------------------------------------------------------------*/ /* rollover tooltip box for our talking badger */ /*------------------------------------------------------------------------*/ div.controls a span.about, div.controls span span.about { display: none; position: absolute; right: 175px; top: 5px; height: 40px; width: 200px; padding: 10px 37px 13px 10px; font-size: 10px; line-height: 13px; text-align: left; color: #888888; background: url('../images/glass/common/talkbox.gif') no-repeat top right; } div.controls a:hover span.about, div.controls span:hover span.about { display: block; } div.controls span.about h4 { display: block; font-size: 11px; margin: 0; padding: 0 0 1px 0; color: #444444; } /*------------------------------------------------------------------------*/ /* pager for going to the previous/index/next page */ /*------------------------------------------------------------------------*/ div.pager { clear: right; float: right; padding-top: 5px; width: 98px; } div.pager .go { display: block; float: left; height: 18px; padding-top: 18px; width: 32px; font-size: 10px; text-align: center; background: url('../images/arrows/large/blank/dot.gif') no-repeat top center; } div.pager span.go { color: #aaa; } div.pager a.go { color: #00AAF0; } div.pager a.go:hover { color: #FF7F00; } div.pager a.back { background-image: url('../images/arrows/large/blue/left.gif'); } div.pager a.back:hover { background-image: url('../images/arrows/large/orange/left.gif'); } div.pager span.back { background-image: url('../images/arrows/large/blank/left.gif'); } div.pager a.next { background-image: url('../images/arrows/large/blue/right.gif'); } div.pager a.next:hover { background-image: url('../images/arrows/large/orange/right.gif'); } div.pager span.next { background-image: url('../images/arrows/large/blank/right.gif'); } div.pager a.up { background-image: url('../images/arrows/large/blue/up.gif'); } div.pager a.up:hover { background-image: url('../images/arrows/large/orange/up.gif'); } div.pager span.up { background-image: url('../images/arrows/large/blank/up.gif'); } /*------------------------------------------------------------------------*/ /* pager is repeated in footer, but with text above arrows not below */ /*------------------------------------------------------------------------*/ #footer .pager { padding-top: 0; } #footer .pager .go { height: 42px; padding-top: 0; background-position: bottom center; } #footer a span.about { display: none; position: absolute; right: 28px; width: 200px; top: 58px; height: 25px; padding: 0; font-size: 11px; line-height: 13px; text-align: right; color: #444444; background-image: none; } #footer span span.about { display: none; } #footer a:hover span.about { display: block; } /*------------------------------------------------------------------------*/ /* colour selection palette */ /*------------------------------------------------------------------------*/ #palette { position: absolute; top: 0; right: 60px; height: 20px; margin-top: 0px; width: 144px; background: url('../images/glass/blue/palette.gif') no-repeat top right; } #palette ul { display: block; height: 20px; margin: 0 12px 0 0; padding: 0 0 0 12px; background: url('../images/glass/blue/palette.gif') no-repeat top left; } #palette li { display: inline; padding: 0; margin: 0; } #palette li a { display: block; float: left; height: 20px; width: 24px; padding: 0; margin: 0; background: url('../images/glass/blue/col_grey_in.gif') no-repeat top right; } #palette li a.blue { background-image: url('../images/glass/blue/col_blue_out.gif'); } #palette li a.blue:hover { background-image: url('../images/glass/blue/col_blue_out.gif'); } #palette li a.orange { background-image: url('../images/glass/blue/col_orange_in.gif'); } #palette li a.orange:hover { background-image: url('../images/glass/blue/col_orange_out.gif'); } #palette li a.green { background-image: url('../images/glass/blue/col_green_in.gif'); } #palette li a.green:hover { background-image: url('../images/glass/blue/col_green_out.gif'); } #palette li a.purple { background-image: url('../images/glass/blue/col_purple_in.gif'); } #palette li a.purple:hover { background-image: url('../images/glass/blue/col_purple_out.gif'); } #palette li a.grey { background-image: url('../images/glass/blue/col_grey_in.gif'); } #palette li a.grey:hover { background-image: url('../images/glass/blue/col_grey_out.gif'); } /*------------------------------------------------------------------------*/ /* menu styles */ /*------------------------------------------------------------------------*/ ul.menu { list-style: none; margin: 0 20px; padding: 0; } ul.menu li { list-style: none; display: block; margin: 0; padding: 0; } ul.menu li.last { background: url('../images/glass/blue/menu_item_foot.gif') no-repeat top left; padding-top: 1px; } ul.menu li a { display: block; margin: 0; padding: 4px 8px; font-size: 13px; line-height: 16px; min-height: 16px; color: #0059a5; text-decoration: none; background: url('../images/glass/blue/menu_item_body.gif') no-repeat top left; } ul.menu li.first a { background-image: url('../images/glass/blue/menu_item_head.gif'); } ul.menu li.last a { background: url('../images/glass/blue/menu_item_foot.gif') no-repeat bottom left; } ul.menu li a:hover { color: #FF7F00; background-image: url('../images/glass/blue/menu_warm_body.gif'); */ } ul.menu li a.warm { font-weight: bold; background-image: url('../images/glass/blue/menu_warm_body.gif'); */ } ul.menu li.first a.warm, ul.menu li.first a:hover { background-image: url('../images/glass/blue/menu_warm_head.gif'); } ul.menu li.last a.warm, ul.menu li.last a:hover { background: url('../images/glass/blue/menu_warm_foot.gif') no-repeat bottom left; } ul.menu li.l1 a { padding: 3px 8px 3px 22px; font-size: 11px; } ul.menu li.l2 a { padding: 3px 8px 3px 36px; font-size: 11px; } ul.menu li.l3 a { padding: 3px 8px 3px 50px; font-size: 11px; } ul.menu li.l4 a { padding: 3px 8px 3px 64px; font-size: 11px; } ul.menu li.l5 a { padding: 3px 8px 3px 78px; font-size: 11px; } ul.menu li.l6 a { padding: 3px 8px 3px 92px; font-size: 11px; } ul.menu li.l7 a { padding: 3px 8px 3px 106px; font-size: 11px; } /*------------------------------------------------------------------------*/ /* Styles for table of contents */ /*------------------------------------------------------------------------*/ ul.toc { margin: 0 0 20px 0; padding: 0; } ul.toc li { list-style: none; margin: 0; font-size: 14px; line-height: 18px; } ul.toc li a { font-size: 14px; line-height: 16px; min-height: 14px; text-decoration: none; margin: 0; padding: 4px 0 1px 18px; background: url('../images/arrows/small/blue/dot.gif') 0px 4px no-repeat; color: #00AAF0; } * html ul.toc li a { height: 16px; } ul.toc li.sub { margin: 0; line-height: 14px; } ul.toc li.sub a { display: block; margin: 0; padding: 2px 0 1px 34px; font-size: 12px; line-height: 13px; background: url('../images/arrows/small/blue/minidot.gif') 20px 3px no-repeat; } ul.toc li.subsub a { display: block; margin: 0; padding: 0 0 0 60px; font-size: 12px; background: url('../images/arrows/small/blue/minidot.gif') 40px 2px no-repeat; } ul.toc li a:hover { background-image: url('../images/arrows/small/orange/dot.gif'); color: #FF7F00; } ul.toc li.sub a:hover, ul.toc li.subsub a:hover { background-image: url('../images/arrows/small/orange/minidot.gif'); color: #FF7F00; } /*------------------------------------------------------------------------*/ /* sections */ /*------------------------------------------------------------------------*/ div.section, div.subsection { padding-left: 20px; clear: right; } div.section div.head, div.subsection div.head { position: relative; margin: 6px 0px 4px 0; min-height: 20px; } div.section > div.head { border-bottom: 1px dashed #bbb; } div.subsection div.head { border-bottom: 1px dashed #ddd; margin-bottom: 2px; } div.section div.head h1 { padding: 0 80px 4px 28px; margin: 0 0 0 -28px; font-size: 18px; line-height: 22px; font-weight: bold; background: url('../images/arrows/large/blue/dot.gif') no-repeat top left; } div.section div.head h2 { padding: 0 80px 2px 20px; margin: 0 0 0 -20px; font-size: 16px; line-height: 20px; font-weight: bold; background: url('../images/arrows/small/blue/dot.gif') no-repeat 0 3px; } div.section h3 { margin: 0; padding: 5px 0 0 0; font-size: 14px; line-height: 18px; line-height: } div.section.open > div.head h1 { background-image: url('../images/arrows/large/blue/dotminus.gif'); } div.section.open > div.head:hover h1 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/large/orange/dotminus.gif'); } div.section.shut > div.head h1 { background-image: url('../images/arrows/large/blue/dotplus.gif'); } div.section.shut > div.head:hover h1 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/large/orange/dotplus.gif'); } div.subsection.open > div.head h2 { background-image: url('../images/arrows/small/blue/dotminus.gif'); } div.subsection.open > div.head:hover h2 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/small/orange/dotminus.gif'); } div.subsection.shut > div.head h2 { background-image: url('../images/arrows/small/blue/dotplus.gif'); } div.subsection.shut > div.head:hover h2 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/small/orange/dotplus.gif'); } div.section div.head a.top { position: absolute; bottom: 4px; right: 0px; padding: 0px 20px 0px 0; margin: 0px; width: 25px; text-align: right; font-size: 11px; height: 16px; background: url('../images/arrows/small/blue/up.gif') no-repeat 28px 3px; } div.section div.head a.top:hover { background-image: url('../images/arrows/small/orange/up.gif'); } div.section div.head a.open, div.section div.head a.shut, div.subsection div.head a.open, div.subsection div.head a.shut { position: absolute; bottom: 4px; right: 45px; margin: 0px; padding: 0px 5px; font-size: 11px; height: 16px; width: 3em; text-align: right; border-right: 1px solid #ddd; display: none; } div.section.shut > div.head a.open, div.subsection.shut div.head a.open { display: block; } div.section.shut > div.head a.shut, div.subsection.shut div.head a.shut { display: none; } div.section.open > div.head a.open, div.subsection.open div.head a.open { display: none; } div.section.open > div.head a.shut, div.subsection.open div.head a.shut { display: block; } div.section div.body { display: block; margin: 0; padding: 0 0 10px 0; } div.subsection div.body { display: block; padding: 0 0 10px 0; } div.section.shut div.body, div.subsection.shut div.body { display: none; } /*------------------------------------------------------------------------*/ /* POD markup */ /*------------------------------------------------------------------------*/ div.pod { } div.pod p { margin: 0px 0px 10px 0px; } div.pod pre { margin: 10px 0 10px 20px; padding: 10px; border: 1px solid #ddd; background-color: #f6f6f6; color: #226; } /*------------------------------------------------------------------------*/ /* Index page list */ /*------------------------------------------------------------------------*/ ul.index { margin: 10px 10px 10px 0; padding: 0px; } ul.index li { list-style: none; margin: 0 0 5px 0; padding: 0; } ul.index li a { text-decoration: none; font-weight: bold; padding: 0 0 0 20px; margin: 0; color: ; background: url('../images/arrows/ff16_blue/right.gif') no-repeat top left; } ul.index li a:hover { color: ; background-image: url('../images/arrows/ff16_orange/right.gif'); } ul.index li p { margin: 0 0 10px 0; padding: 0 0 0 20px; } TT_v224_html_docs/old/css/green.css000700 000765 000765 00000050471 10627516016 017000 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* default styles */ /*------------------------------------------------------------------------*/ h1, h2, h3, h4, h5, h6 { color: #444444; } h1 { margin: 0px 0 5px 0; } p { color: #333; padding: 8px 0; } p.tight { padding: 4px 0; margin: 0; } pre { line-height: 120%; } code { color: #224; font-weight: bold; } a { text-decoration: none; color: #39b93f; } a:visited { color: #216b25; } a:hover { color: #7239b9; } a:focus { -moz-outline: none; } .alt { display: none; } .sample { display: block; width: 100px; height: 30px; } br.clear { clear: both; } /*------------------------------------------------------------------------*/ /* main body style */ /*------------------------------------------------------------------------*/ body { font: 14px Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #333; margin: 0px; padding: 10px 10px 20px 10px; background: #39b93f url('../images/glass/green/top_grad.gif') repeat-x top left; } #layout { background: white url('../images/glass/green/left.gif') repeat-y top left; min-width: 600px; } /*------------------------------------------------------------------------*/ /* header */ /*------------------------------------------------------------------------*/ #header { position: relative; height: 130px; margin: 0px; padding: 0 25px 0 220px; background: url('../images/glass/green/header.gif') no-repeat top right; } #header #logo { display: block; position: absolute; top: 0; left: 0; width: 220px; height: 130px; background: url('../images/glass/green/logo_green.gif') no-repeat top right; } #header #logo:hover { background-image: url('../images/glass/green/logo_purple.gif'); } #header #trail { height: 40px; margin: 0; padding: 0 0 0 10px; background: url('../images/glass/green/tab_pre.gif') no-repeat top left; } #header #trail.blank { background-image: none; } #header #trail li { display: block; float: left; background: url('../images/glass/green/tab_cold.gif') no-repeat top left; padding: 0 0 0 10px; } #header #trail li a { display: block; float: left; font-size: 11px; text-decoration: none; color: #888888; line-height: 14px; height: 30px; min-width: 60px; padding: 10px 15px 0 0; background: url('../images/glass/green/tab_cold.gif') no-repeat top right; } #header #trail li a:hover { color: #7239b9; } #header #trail li:hover, #header #trail li:hover a { background-image: url('../images/glass/green/tab_roll.gif'); } #header #trail li.last { background-image: url('../images/glass/green/tab_warm.gif'); color: #444444; } #header #trail li.last a { background-image: url('../images/glass/green/tab_warm.gif'); color: #444444; padding-right: 45px; } #header .headline { font-size: 24px; margin: 8px 0 8px 0; padding: 0 100px 0 0; color: #444444; } #header .subhead { font-size: 16px; line-height: 18px; padding: 0 110px 0 0; margin: 0; color: #444; } #header .controls { position: absolute; display: block; top: 40px; right: 20px; width: 130px; height: 70px; overflow: visible; } /*------------------------------------------------------------------------*/ /* main page content and sidebar */ /*------------------------------------------------------------------------*/ #page { margin-bottom: 0; padding: 0; padding-left: 220px; background: url('../images/glass/green/right.gif') repeat-y top right; } #sidebar { position: relative; float: left; padding: 0; width: 220px; margin: 0; margin-left: -220px; } #content { position: relative; margin: 0; padding: 10px 40px 10px 15px; } #sidebar #menu { width: 220px; margin: 0; padding: 0; background: url('../images/glass/green/menu_body.gif') repeat-y top left; } #sidebar #menu div.foot { height: 20px; background: url('../images/glass/green/menu_foot.gif') no-repeat bottom left; } #page div.pageinfo { text-align: center; font-size: 10px; color: #ccc; } /*------------------------------------------------------------------------*/ /* footer */ /*------------------------------------------------------------------------*/ #footer { clear: both; position: relative; padding: 0 140px 0px 265px; height: 100px; background: url('../images/glass/green/footer.gif') no-repeat bottom left; } #footer a.osi { position: absolute; display: block; left: 200px; bottom: 30px; width: 70px; height: 50px; cursor: pointer; background: url('../images/glass/green/osi.gif') no-repeat top left; } #footer .copyright { text-align: center; color: #666; font-size: 12px; padding: 14px 0 0 0; } #footer .licence { text-align: center; padding-top: 5px; color: #888; font-size: 11px; line-height: 15px; padding: 0 20px; } #footer .copyright a, #footer .copyright a:visited, #footer .licence a, #footer .licence a:visited { color: #418c44; } #footer .copyright a:hover, #footer .licence a:hover { color: #7239b9; } #footer .controls { position: absolute; display: block; bottom: 0; right: 0; width: 130px; height: 100px; padding: 0 25px 0 0; background: url('../images/glass/green/footer.gif') no-repeat bottom right; } /*------------------------------------------------------------------------*/ /* widescreen mode */ /*------------------------------------------------------------------------*/ #body.wide { padding: 10px 0 0 0; } #body.wide #palette { display: none; } #body.wide #header { padding: 0 20px 0 20px; margin: -50px -20px 0 0; } #body.wide #header #logo { display: none; } #body.wide #page { padding: 10px; margin: 0 0 0 0; background-image: none; background-color: white; min-width: 560px; } #body.wide #sidebar { display: none; } #body.wide #content { padding: 0 10px; background: white none; } #body.wide #footer { padding: 0 150px 0px 90px; margin-right: -20px; background-position: bottom right; } #body.wide #footer a.osi { left: 20px; } /*------------------------------------------------------------------------*/ /* controls for showing/hiding the menu */ /*------------------------------------------------------------------------*/ div.controls a.menu { display: block; float: right; margin-right: 5px; width: 40px; height: 30px; background: url('../images/glass/green/hide_menu.gif') no-repeat 0 5px; } div.controls a.hide:hover { background-image: url('../images/glass/green/hide_menu_roll.gif'); } div.controls a.show { background-image: url('../images/glass/green/show_menu.gif'); } div.controls a.show:hover { background-image: url('../images/glass/green/show_menu_roll.gif'); } body div.controls a.hide { display: block; } body div.controls a.show { display: none; } body.wide div.controls a.hide { display: none; } body.wide div.controls a.show { display: block; } /*------------------------------------------------------------------------*/ /* rollover tooltip box for our talking badger */ /*------------------------------------------------------------------------*/ div.controls a span.about, div.controls span span.about { display: none; position: absolute; right: 175px; top: 5px; height: 40px; width: 200px; padding: 10px 37px 13px 10px; font-size: 10px; line-height: 13px; text-align: left; color: #888888; background: url('../images/glass/common/talkbox.gif') no-repeat top right; } div.controls a:hover span.about, div.controls span:hover span.about { display: block; } div.controls span.about h4 { display: block; font-size: 11px; margin: 0; padding: 0 0 1px 0; color: #444444; } /*------------------------------------------------------------------------*/ /* pager for going to the previous/index/next page */ /*------------------------------------------------------------------------*/ div.pager { clear: right; float: right; padding-top: 5px; width: 98px; } div.pager .go { display: block; float: left; height: 18px; padding-top: 18px; width: 32px; font-size: 10px; text-align: center; background: url('../images/arrows/large/blank/dot.gif') no-repeat top center; } div.pager span.go { color: #aaa; } div.pager a.go { color: #39b93f; } div.pager a.go:hover { color: #7239b9; } div.pager a.back { background-image: url('../images/arrows/large/green/left.gif'); } div.pager a.back:hover { background-image: url('../images/arrows/large/purple/left.gif'); } div.pager span.back { background-image: url('../images/arrows/large/blank/left.gif'); } div.pager a.next { background-image: url('../images/arrows/large/green/right.gif'); } div.pager a.next:hover { background-image: url('../images/arrows/large/purple/right.gif'); } div.pager span.next { background-image: url('../images/arrows/large/blank/right.gif'); } div.pager a.up { background-image: url('../images/arrows/large/green/up.gif'); } div.pager a.up:hover { background-image: url('../images/arrows/large/purple/up.gif'); } div.pager span.up { background-image: url('../images/arrows/large/blank/up.gif'); } /*------------------------------------------------------------------------*/ /* pager is repeated in footer, but with text above arrows not below */ /*------------------------------------------------------------------------*/ #footer .pager { padding-top: 0; } #footer .pager .go { height: 42px; padding-top: 0; background-position: bottom center; } #footer a span.about { display: none; position: absolute; right: 28px; width: 200px; top: 58px; height: 25px; padding: 0; font-size: 11px; line-height: 13px; text-align: right; color: #444444; background-image: none; } #footer span span.about { display: none; } #footer a:hover span.about { display: block; } /*------------------------------------------------------------------------*/ /* colour selection palette */ /*------------------------------------------------------------------------*/ #palette { position: absolute; top: 0; right: 60px; height: 20px; margin-top: 0px; width: 144px; background: url('../images/glass/green/palette.gif') no-repeat top right; } #palette ul { display: block; height: 20px; margin: 0 12px 0 0; padding: 0 0 0 12px; background: url('../images/glass/green/palette.gif') no-repeat top left; } #palette li { display: inline; padding: 0; margin: 0; } #palette li a { display: block; float: left; height: 20px; width: 24px; padding: 0; margin: 0; background: url('../images/glass/green/col_grey_in.gif') no-repeat top right; } #palette li a.blue { background-image: url('../images/glass/green/col_blue_in.gif'); } #palette li a.blue:hover { background-image: url('../images/glass/green/col_blue_out.gif'); } #palette li a.orange { background-image: url('../images/glass/green/col_orange_in.gif'); } #palette li a.orange:hover { background-image: url('../images/glass/green/col_orange_out.gif'); } #palette li a.green { background-image: url('../images/glass/green/col_green_out.gif'); } #palette li a.green:hover { background-image: url('../images/glass/green/col_green_out.gif'); } #palette li a.purple { background-image: url('../images/glass/green/col_purple_in.gif'); } #palette li a.purple:hover { background-image: url('../images/glass/green/col_purple_out.gif'); } #palette li a.grey { background-image: url('../images/glass/green/col_grey_in.gif'); } #palette li a.grey:hover { background-image: url('../images/glass/green/col_grey_out.gif'); } /*------------------------------------------------------------------------*/ /* menu styles */ /*------------------------------------------------------------------------*/ ul.menu { list-style: none; margin: 0 20px; padding: 0; } ul.menu li { list-style: none; display: block; margin: 0; padding: 0; } ul.menu li.last { background: url('../images/glass/green/menu_item_foot.gif') no-repeat top left; padding-top: 1px; } ul.menu li a { display: block; margin: 0; padding: 4px 8px; font-size: 13px; line-height: 16px; min-height: 16px; color: #216b25; text-decoration: none; background: url('../images/glass/green/menu_item_body.gif') no-repeat top left; } ul.menu li.first a { background-image: url('../images/glass/green/menu_item_head.gif'); } ul.menu li.last a { background: url('../images/glass/green/menu_item_foot.gif') no-repeat bottom left; } ul.menu li a:hover { color: #7239b9; background-image: url('../images/glass/green/menu_warm_body.gif'); */ } ul.menu li a.warm { font-weight: bold; background-image: url('../images/glass/green/menu_warm_body.gif'); */ } ul.menu li.first a.warm, ul.menu li.first a:hover { background-image: url('../images/glass/green/menu_warm_head.gif'); } ul.menu li.last a.warm, ul.menu li.last a:hover { background: url('../images/glass/green/menu_warm_foot.gif') no-repeat bottom left; } ul.menu li.l1 a { padding: 3px 8px 3px 22px; font-size: 11px; } ul.menu li.l2 a { padding: 3px 8px 3px 36px; font-size: 11px; } ul.menu li.l3 a { padding: 3px 8px 3px 50px; font-size: 11px; } ul.menu li.l4 a { padding: 3px 8px 3px 64px; font-size: 11px; } ul.menu li.l5 a { padding: 3px 8px 3px 78px; font-size: 11px; } ul.menu li.l6 a { padding: 3px 8px 3px 92px; font-size: 11px; } ul.menu li.l7 a { padding: 3px 8px 3px 106px; font-size: 11px; } /*------------------------------------------------------------------------*/ /* Styles for table of contents */ /*------------------------------------------------------------------------*/ ul.toc { margin: 0 0 20px 0; padding: 0; } ul.toc li { list-style: none; margin: 0; font-size: 14px; line-height: 18px; } ul.toc li a { font-size: 14px; line-height: 16px; min-height: 14px; text-decoration: none; margin: 0; padding: 4px 0 1px 18px; background: url('../images/arrows/small/green/dot.gif') 0px 4px no-repeat; color: #39b93f; } * html ul.toc li a { height: 16px; } ul.toc li.sub { margin: 0; line-height: 14px; } ul.toc li.sub a { display: block; margin: 0; padding: 2px 0 1px 34px; font-size: 12px; line-height: 13px; background: url('../images/arrows/small/green/minidot.gif') 20px 3px no-repeat; } ul.toc li.subsub a { display: block; margin: 0; padding: 0 0 0 60px; font-size: 12px; background: url('../images/arrows/small/green/minidot.gif') 40px 2px no-repeat; } ul.toc li a:hover { background-image: url('../images/arrows/small/purple/dot.gif'); color: #7239b9; } ul.toc li.sub a:hover, ul.toc li.subsub a:hover { background-image: url('../images/arrows/small/purple/minidot.gif'); color: #7239b9; } /*------------------------------------------------------------------------*/ /* sections */ /*------------------------------------------------------------------------*/ div.section, div.subsection { padding-left: 20px; clear: right; } div.section div.head, div.subsection div.head { position: relative; margin: 6px 0px 4px 0; min-height: 20px; } div.section > div.head { border-bottom: 1px dashed #bbb; } div.subsection div.head { border-bottom: 1px dashed #ddd; margin-bottom: 2px; } div.section div.head h1 { padding: 0 80px 4px 28px; margin: 0 0 0 -28px; font-size: 18px; line-height: 22px; font-weight: bold; background: url('../images/arrows/large/green/dot.gif') no-repeat top left; } div.section div.head h2 { padding: 0 80px 2px 20px; margin: 0 0 0 -20px; font-size: 16px; line-height: 20px; font-weight: bold; background: url('../images/arrows/small/green/dot.gif') no-repeat 0 3px; } div.section h3 { margin: 0; padding: 5px 0 0 0; font-size: 14px; line-height: 18px; line-height: } div.section.open > div.head h1 { background-image: url('../images/arrows/large/green/dotminus.gif'); } div.section.open > div.head:hover h1 { color: #7239b9; cursor: pointer; background-image: url('../images/arrows/large/purple/dotminus.gif'); } div.section.shut > div.head h1 { background-image: url('../images/arrows/large/green/dotplus.gif'); } div.section.shut > div.head:hover h1 { color: #7239b9; cursor: pointer; background-image: url('../images/arrows/large/purple/dotplus.gif'); } div.subsection.open > div.head h2 { background-image: url('../images/arrows/small/green/dotminus.gif'); } div.subsection.open > div.head:hover h2 { color: #7239b9; cursor: pointer; background-image: url('../images/arrows/small/purple/dotminus.gif'); } div.subsection.shut > div.head h2 { background-image: url('../images/arrows/small/green/dotplus.gif'); } div.subsection.shut > div.head:hover h2 { color: #7239b9; cursor: pointer; background-image: url('../images/arrows/small/purple/dotplus.gif'); } div.section div.head a.top { position: absolute; bottom: 4px; right: 0px; padding: 0px 20px 0px 0; margin: 0px; width: 25px; text-align: right; font-size: 11px; height: 16px; background: url('../images/arrows/small/green/up.gif') no-repeat 28px 3px; } div.section div.head a.top:hover { background-image: url('../images/arrows/small/purple/up.gif'); } div.section div.head a.open, div.section div.head a.shut, div.subsection div.head a.open, div.subsection div.head a.shut { position: absolute; bottom: 4px; right: 45px; margin: 0px; padding: 0px 5px; font-size: 11px; height: 16px; width: 3em; text-align: right; border-right: 1px solid #ddd; display: none; } div.section.shut > div.head a.open, div.subsection.shut div.head a.open { display: block; } div.section.shut > div.head a.shut, div.subsection.shut div.head a.shut { display: none; } div.section.open > div.head a.open, div.subsection.open div.head a.open { display: none; } div.section.open > div.head a.shut, div.subsection.open div.head a.shut { display: block; } div.section div.body { display: block; margin: 0; padding: 0 0 10px 0; } div.subsection div.body { display: block; padding: 0 0 10px 0; } div.section.shut div.body, div.subsection.shut div.body { display: none; } /*------------------------------------------------------------------------*/ /* POD markup */ /*------------------------------------------------------------------------*/ div.pod { } div.pod p { margin: 0px 0px 10px 0px; } div.pod pre { margin: 10px 0 10px 20px; padding: 10px; border: 1px solid #ddd; background-color: #f6f6f6; color: #226; } /*------------------------------------------------------------------------*/ /* Index page list */ /*------------------------------------------------------------------------*/ ul.index { margin: 10px 10px 10px 0; padding: 0px; } ul.index li { list-style: none; margin: 0 0 5px 0; padding: 0; } ul.index li a { text-decoration: none; font-weight: bold; padding: 0 0 0 20px; margin: 0; color: ; background: url('../images/arrows/ff16_blue/right.gif') no-repeat top left; } ul.index li a:hover { color: ; background-image: url('../images/arrows/ff16_orange/right.gif'); } ul.index li p { margin: 0 0 10px 0; padding: 0 0 0 20px; } TT_v224_html_docs/old/css/grey.css000700 000765 000765 00000050401 10627516016 016637 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* default styles */ /*------------------------------------------------------------------------*/ h1, h2, h3, h4, h5, h6 { color: #444444; } h1 { margin: 0px 0 5px 0; } p { color: #333; padding: 8px 0; } p.tight { padding: 4px 0; margin: 0; } pre { line-height: 120%; } code { color: #224; font-weight: bold; } a { text-decoration: none; color: #00AAF0; } a:visited { color: #0059a5; } a:hover { color: #FF7F00; } a:focus { -moz-outline: none; } .alt { display: none; } .sample { display: block; width: 100px; height: 30px; } br.clear { clear: both; } /*------------------------------------------------------------------------*/ /* main body style */ /*------------------------------------------------------------------------*/ body { font: 14px Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #333; margin: 0px; padding: 10px 10px 20px 10px; background: #cccccc url('../images/glass/grey/top_grad.gif') repeat-x top left; } #layout { background: white url('../images/glass/grey/left.gif') repeat-y top left; min-width: 600px; } /*------------------------------------------------------------------------*/ /* header */ /*------------------------------------------------------------------------*/ #header { position: relative; height: 130px; margin: 0px; padding: 0 25px 0 220px; background: url('../images/glass/grey/header.gif') no-repeat top right; } #header #logo { display: block; position: absolute; top: 0; left: 0; width: 220px; height: 130px; background: url('../images/glass/grey/logo_blue.gif') no-repeat top right; } #header #logo:hover { background-image: url('../images/glass/grey/logo_orange.gif'); } #header #trail { height: 40px; margin: 0; padding: 0 0 0 10px; background: url('../images/glass/grey/tab_pre.gif') no-repeat top left; } #header #trail.blank { background-image: none; } #header #trail li { display: block; float: left; background: url('../images/glass/grey/tab_cold.gif') no-repeat top left; padding: 0 0 0 10px; } #header #trail li a { display: block; float: left; font-size: 11px; text-decoration: none; color: #888888; line-height: 14px; height: 30px; min-width: 60px; padding: 10px 15px 0 0; background: url('../images/glass/grey/tab_cold.gif') no-repeat top right; } #header #trail li a:hover { color: #FF7F00; } #header #trail li:hover, #header #trail li:hover a { background-image: url('../images/glass/grey/tab_roll.gif'); } #header #trail li.last { background-image: url('../images/glass/grey/tab_warm.gif'); color: #444444; } #header #trail li.last a { background-image: url('../images/glass/grey/tab_warm.gif'); color: #444444; padding-right: 45px; } #header .headline { font-size: 24px; margin: 8px 0 8px 0; padding: 0 100px 0 0; color: #444444; } #header .subhead { font-size: 16px; line-height: 18px; padding: 0 110px 0 0; margin: 0; color: #444; } #header .controls { position: absolute; display: block; top: 40px; right: 20px; width: 130px; height: 70px; overflow: visible; } /*------------------------------------------------------------------------*/ /* main page content and sidebar */ /*------------------------------------------------------------------------*/ #page { margin-bottom: 0; padding: 0; padding-left: 220px; background: url('../images/glass/grey/right.gif') repeat-y top right; } #sidebar { position: relative; float: left; padding: 0; width: 220px; margin: 0; margin-left: -220px; } #content { position: relative; margin: 0; padding: 10px 40px 10px 15px; } #sidebar #menu { width: 220px; margin: 0; padding: 0; background: url('../images/glass/grey/menu_body.gif') repeat-y top left; } #sidebar #menu div.foot { height: 20px; background: url('../images/glass/grey/menu_foot.gif') no-repeat bottom left; } #page div.pageinfo { text-align: center; font-size: 10px; color: #ccc; } /*------------------------------------------------------------------------*/ /* footer */ /*------------------------------------------------------------------------*/ #footer { clear: both; position: relative; padding: 0 140px 0px 265px; height: 100px; background: url('../images/glass/grey/footer.gif') no-repeat bottom left; } #footer a.osi { position: absolute; display: block; left: 200px; bottom: 30px; width: 70px; height: 50px; cursor: pointer; background: url('../images/glass/grey/osi.gif') no-repeat top left; } #footer .copyright { text-align: center; color: #666; font-size: 12px; padding: 14px 0 0 0; } #footer .licence { text-align: center; padding-top: 5px; color: #888; font-size: 11px; line-height: 15px; padding: 0 20px; } #footer .copyright a, #footer .copyright a:visited, #footer .licence a, #footer .licence a:visited { color: #40698c; } #footer .copyright a:hover, #footer .licence a:hover { color: #FF7F00; } #footer .controls { position: absolute; display: block; bottom: 0; right: 0; width: 130px; height: 100px; padding: 0 25px 0 0; background: url('../images/glass/grey/footer.gif') no-repeat bottom right; } /*------------------------------------------------------------------------*/ /* widescreen mode */ /*------------------------------------------------------------------------*/ #body.wide { padding: 10px 0 0 0; } #body.wide #palette { display: none; } #body.wide #header { padding: 0 20px 0 20px; margin: -50px -20px 0 0; } #body.wide #header #logo { display: none; } #body.wide #page { padding: 10px; margin: 0 0 0 0; background-image: none; background-color: white; min-width: 560px; } #body.wide #sidebar { display: none; } #body.wide #content { padding: 0 10px; background: white none; } #body.wide #footer { padding: 0 150px 0px 90px; margin-right: -20px; background-position: bottom right; } #body.wide #footer a.osi { left: 20px; } /*------------------------------------------------------------------------*/ /* controls for showing/hiding the menu */ /*------------------------------------------------------------------------*/ div.controls a.menu { display: block; float: right; margin-right: 5px; width: 40px; height: 30px; background: url('../images/glass/grey/hide_menu.gif') no-repeat 0 5px; } div.controls a.hide:hover { background-image: url('../images/glass/grey/hide_menu_roll.gif'); } div.controls a.show { background-image: url('../images/glass/grey/show_menu.gif'); } div.controls a.show:hover { background-image: url('../images/glass/grey/show_menu_roll.gif'); } body div.controls a.hide { display: block; } body div.controls a.show { display: none; } body.wide div.controls a.hide { display: none; } body.wide div.controls a.show { display: block; } /*------------------------------------------------------------------------*/ /* rollover tooltip box for our talking badger */ /*------------------------------------------------------------------------*/ div.controls a span.about, div.controls span span.about { display: none; position: absolute; right: 175px; top: 5px; height: 40px; width: 200px; padding: 10px 37px 13px 10px; font-size: 10px; line-height: 13px; text-align: left; color: #888888; background: url('../images/glass/common/talkbox.gif') no-repeat top right; } div.controls a:hover span.about, div.controls span:hover span.about { display: block; } div.controls span.about h4 { display: block; font-size: 11px; margin: 0; padding: 0 0 1px 0; color: #444444; } /*------------------------------------------------------------------------*/ /* pager for going to the previous/index/next page */ /*------------------------------------------------------------------------*/ div.pager { clear: right; float: right; padding-top: 5px; width: 98px; } div.pager .go { display: block; float: left; height: 18px; padding-top: 18px; width: 32px; font-size: 10px; text-align: center; background: url('../images/arrows/large/blank/dot.gif') no-repeat top center; } div.pager span.go { color: #aaa; } div.pager a.go { color: #00AAF0; } div.pager a.go:hover { color: #FF7F00; } div.pager a.back { background-image: url('../images/arrows/large/blue/left.gif'); } div.pager a.back:hover { background-image: url('../images/arrows/large/orange/left.gif'); } div.pager span.back { background-image: url('../images/arrows/large/blank/left.gif'); } div.pager a.next { background-image: url('../images/arrows/large/blue/right.gif'); } div.pager a.next:hover { background-image: url('../images/arrows/large/orange/right.gif'); } div.pager span.next { background-image: url('../images/arrows/large/blank/right.gif'); } div.pager a.up { background-image: url('../images/arrows/large/blue/up.gif'); } div.pager a.up:hover { background-image: url('../images/arrows/large/orange/up.gif'); } div.pager span.up { background-image: url('../images/arrows/large/blank/up.gif'); } /*------------------------------------------------------------------------*/ /* pager is repeated in footer, but with text above arrows not below */ /*------------------------------------------------------------------------*/ #footer .pager { padding-top: 0; } #footer .pager .go { height: 42px; padding-top: 0; background-position: bottom center; } #footer a span.about { display: none; position: absolute; right: 28px; width: 200px; top: 58px; height: 25px; padding: 0; font-size: 11px; line-height: 13px; text-align: right; color: #444444; background-image: none; } #footer span span.about { display: none; } #footer a:hover span.about { display: block; } /*------------------------------------------------------------------------*/ /* colour selection palette */ /*------------------------------------------------------------------------*/ #palette { position: absolute; top: 0; right: 60px; height: 20px; margin-top: 0px; width: 144px; background: url('../images/glass/grey/palette.gif') no-repeat top right; } #palette ul { display: block; height: 20px; margin: 0 12px 0 0; padding: 0 0 0 12px; background: url('../images/glass/grey/palette.gif') no-repeat top left; } #palette li { display: inline; padding: 0; margin: 0; } #palette li a { display: block; float: left; height: 20px; width: 24px; padding: 0; margin: 0; background: url('../images/glass/grey/col_grey_in.gif') no-repeat top right; } #palette li a.blue { background-image: url('../images/glass/grey/col_blue_in.gif'); } #palette li a.blue:hover { background-image: url('../images/glass/grey/col_blue_out.gif'); } #palette li a.orange { background-image: url('../images/glass/grey/col_orange_in.gif'); } #palette li a.orange:hover { background-image: url('../images/glass/grey/col_orange_out.gif'); } #palette li a.green { background-image: url('../images/glass/grey/col_green_in.gif'); } #palette li a.green:hover { background-image: url('../images/glass/grey/col_green_out.gif'); } #palette li a.purple { background-image: url('../images/glass/grey/col_purple_in.gif'); } #palette li a.purple:hover { background-image: url('../images/glass/grey/col_purple_out.gif'); } #palette li a.grey { background-image: url('../images/glass/grey/col_grey_out.gif'); } #palette li a.grey:hover { background-image: url('../images/glass/grey/col_grey_out.gif'); } /*------------------------------------------------------------------------*/ /* menu styles */ /*------------------------------------------------------------------------*/ ul.menu { list-style: none; margin: 0 20px; padding: 0; } ul.menu li { list-style: none; display: block; margin: 0; padding: 0; } ul.menu li.last { background: url('../images/glass/grey/menu_item_foot.gif') no-repeat top left; padding-top: 1px; } ul.menu li a { display: block; margin: 0; padding: 4px 8px; font-size: 13px; line-height: 16px; min-height: 16px; color: #0059a5; text-decoration: none; background: url('../images/glass/grey/menu_item_body.gif') no-repeat top left; } ul.menu li.first a { background-image: url('../images/glass/grey/menu_item_head.gif'); } ul.menu li.last a { background: url('../images/glass/grey/menu_item_foot.gif') no-repeat bottom left; } ul.menu li a:hover { color: #FF7F00; background-image: url('../images/glass/grey/menu_warm_body.gif'); */ } ul.menu li a.warm { font-weight: bold; background-image: url('../images/glass/grey/menu_warm_body.gif'); */ } ul.menu li.first a.warm, ul.menu li.first a:hover { background-image: url('../images/glass/grey/menu_warm_head.gif'); } ul.menu li.last a.warm, ul.menu li.last a:hover { background: url('../images/glass/grey/menu_warm_foot.gif') no-repeat bottom left; } ul.menu li.l1 a { padding: 3px 8px 3px 22px; font-size: 11px; } ul.menu li.l2 a { padding: 3px 8px 3px 36px; font-size: 11px; } ul.menu li.l3 a { padding: 3px 8px 3px 50px; font-size: 11px; } ul.menu li.l4 a { padding: 3px 8px 3px 64px; font-size: 11px; } ul.menu li.l5 a { padding: 3px 8px 3px 78px; font-size: 11px; } ul.menu li.l6 a { padding: 3px 8px 3px 92px; font-size: 11px; } ul.menu li.l7 a { padding: 3px 8px 3px 106px; font-size: 11px; } /*------------------------------------------------------------------------*/ /* Styles for table of contents */ /*------------------------------------------------------------------------*/ ul.toc { margin: 0 0 20px 0; padding: 0; } ul.toc li { list-style: none; margin: 0; font-size: 14px; line-height: 18px; } ul.toc li a { font-size: 14px; line-height: 16px; min-height: 14px; text-decoration: none; margin: 0; padding: 4px 0 1px 18px; background: url('../images/arrows/small/blue/dot.gif') 0px 4px no-repeat; color: #00AAF0; } * html ul.toc li a { height: 16px; } ul.toc li.sub { margin: 0; line-height: 14px; } ul.toc li.sub a { display: block; margin: 0; padding: 2px 0 1px 34px; font-size: 12px; line-height: 13px; background: url('../images/arrows/small/blue/minidot.gif') 20px 3px no-repeat; } ul.toc li.subsub a { display: block; margin: 0; padding: 0 0 0 60px; font-size: 12px; background: url('../images/arrows/small/blue/minidot.gif') 40px 2px no-repeat; } ul.toc li a:hover { background-image: url('../images/arrows/small/orange/dot.gif'); color: #FF7F00; } ul.toc li.sub a:hover, ul.toc li.subsub a:hover { background-image: url('../images/arrows/small/orange/minidot.gif'); color: #FF7F00; } /*------------------------------------------------------------------------*/ /* sections */ /*------------------------------------------------------------------------*/ div.section, div.subsection { padding-left: 20px; clear: right; } div.section div.head, div.subsection div.head { position: relative; margin: 6px 0px 4px 0; min-height: 20px; } div.section > div.head { border-bottom: 1px dashed #bbb; } div.subsection div.head { border-bottom: 1px dashed #ddd; margin-bottom: 2px; } div.section div.head h1 { padding: 0 80px 4px 28px; margin: 0 0 0 -28px; font-size: 18px; line-height: 22px; font-weight: bold; background: url('../images/arrows/large/blue/dot.gif') no-repeat top left; } div.section div.head h2 { padding: 0 80px 2px 20px; margin: 0 0 0 -20px; font-size: 16px; line-height: 20px; font-weight: bold; background: url('../images/arrows/small/blue/dot.gif') no-repeat 0 3px; } div.section h3 { margin: 0; padding: 5px 0 0 0; font-size: 14px; line-height: 18px; line-height: } div.section.open > div.head h1 { background-image: url('../images/arrows/large/blue/dotminus.gif'); } div.section.open > div.head:hover h1 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/large/orange/dotminus.gif'); } div.section.shut > div.head h1 { background-image: url('../images/arrows/large/blue/dotplus.gif'); } div.section.shut > div.head:hover h1 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/large/orange/dotplus.gif'); } div.subsection.open > div.head h2 { background-image: url('../images/arrows/small/blue/dotminus.gif'); } div.subsection.open > div.head:hover h2 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/small/orange/dotminus.gif'); } div.subsection.shut > div.head h2 { background-image: url('../images/arrows/small/blue/dotplus.gif'); } div.subsection.shut > div.head:hover h2 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/small/orange/dotplus.gif'); } div.section div.head a.top { position: absolute; bottom: 4px; right: 0px; padding: 0px 20px 0px 0; margin: 0px; width: 25px; text-align: right; font-size: 11px; height: 16px; background: url('../images/arrows/small/blue/up.gif') no-repeat 28px 3px; } div.section div.head a.top:hover { background-image: url('../images/arrows/small/orange/up.gif'); } div.section div.head a.open, div.section div.head a.shut, div.subsection div.head a.open, div.subsection div.head a.shut { position: absolute; bottom: 4px; right: 45px; margin: 0px; padding: 0px 5px; font-size: 11px; height: 16px; width: 3em; text-align: right; border-right: 1px solid #ddd; display: none; } div.section.shut > div.head a.open, div.subsection.shut div.head a.open { display: block; } div.section.shut > div.head a.shut, div.subsection.shut div.head a.shut { display: none; } div.section.open > div.head a.open, div.subsection.open div.head a.open { display: none; } div.section.open > div.head a.shut, div.subsection.open div.head a.shut { display: block; } div.section div.body { display: block; margin: 0; padding: 0 0 10px 0; } div.subsection div.body { display: block; padding: 0 0 10px 0; } div.section.shut div.body, div.subsection.shut div.body { display: none; } /*------------------------------------------------------------------------*/ /* POD markup */ /*------------------------------------------------------------------------*/ div.pod { } div.pod p { margin: 0px 0px 10px 0px; } div.pod pre { margin: 10px 0 10px 20px; padding: 10px; border: 1px solid #ddd; background-color: #f6f6f6; color: #226; } /*------------------------------------------------------------------------*/ /* Index page list */ /*------------------------------------------------------------------------*/ ul.index { margin: 10px 10px 10px 0; padding: 0px; } ul.index li { list-style: none; margin: 0 0 5px 0; padding: 0; } ul.index li a { text-decoration: none; font-weight: bold; padding: 0 0 0 20px; margin: 0; color: ; background: url('../images/arrows/ff16_blue/right.gif') no-repeat top left; } ul.index li a:hover { color: ; background-image: url('../images/arrows/ff16_orange/right.gif'); } ul.index li p { margin: 0 0 10px 0; padding: 0 0 0 20px; } TT_v224_html_docs/old/css/ie6.css000700 000765 000765 00000000253 10627516136 016357 0ustar00abwabw000000 000000 #sidebar { left: 220px; } ul.menu li a { height: 20px; margin: 0; } div.controls a.menu { margin-right: 3px; } div.ieblowsgoats { display: block; } TT_v224_html_docs/old/css/orange.css000700 000765 000765 00000050531 10627516017 017151 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* default styles */ /*------------------------------------------------------------------------*/ h1, h2, h3, h4, h5, h6 { color: #444444; } h1 { margin: 0px 0 5px 0; } p { color: #333; padding: 8px 0; } p.tight { padding: 4px 0; margin: 0; } pre { line-height: 120%; } code { color: #224; font-weight: bold; } a { text-decoration: none; color: #FF7F00; } a:visited { color: #da3700; } a:hover { color: #00AAF0; } a:focus { -moz-outline: none; } .alt { display: none; } .sample { display: block; width: 100px; height: 30px; } br.clear { clear: both; } /*------------------------------------------------------------------------*/ /* main body style */ /*------------------------------------------------------------------------*/ body { font: 14px Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #333; margin: 0px; padding: 10px 10px 20px 10px; background: #FF7F00 url('../images/glass/orange/top_grad.gif') repeat-x top left; } #layout { background: white url('../images/glass/orange/left.gif') repeat-y top left; min-width: 600px; } /*------------------------------------------------------------------------*/ /* header */ /*------------------------------------------------------------------------*/ #header { position: relative; height: 130px; margin: 0px; padding: 0 25px 0 220px; background: url('../images/glass/orange/header.gif') no-repeat top right; } #header #logo { display: block; position: absolute; top: 0; left: 0; width: 220px; height: 130px; background: url('../images/glass/orange/logo_grey.gif') no-repeat top right; } #header #logo:hover { background-image: url('../images/glass/orange/logo_blue.gif'); } #header #trail { height: 40px; margin: 0; padding: 0 0 0 10px; background: url('../images/glass/orange/tab_pre.gif') no-repeat top left; } #header #trail.blank { background-image: none; } #header #trail li { display: block; float: left; background: url('../images/glass/orange/tab_cold.gif') no-repeat top left; padding: 0 0 0 10px; } #header #trail li a { display: block; float: left; font-size: 11px; text-decoration: none; color: #888888; line-height: 14px; height: 30px; min-width: 60px; padding: 10px 15px 0 0; background: url('../images/glass/orange/tab_cold.gif') no-repeat top right; } #header #trail li a:hover { color: #00AAF0; } #header #trail li:hover, #header #trail li:hover a { background-image: url('../images/glass/orange/tab_roll.gif'); } #header #trail li.last { background-image: url('../images/glass/orange/tab_warm.gif'); color: #444444; } #header #trail li.last a { background-image: url('../images/glass/orange/tab_warm.gif'); color: #444444; padding-right: 45px; } #header .headline { font-size: 24px; margin: 8px 0 8px 0; padding: 0 100px 0 0; color: #444444; } #header .subhead { font-size: 16px; line-height: 18px; padding: 0 110px 0 0; margin: 0; color: #444; } #header .controls { position: absolute; display: block; top: 40px; right: 20px; width: 130px; height: 70px; overflow: visible; } /*------------------------------------------------------------------------*/ /* main page content and sidebar */ /*------------------------------------------------------------------------*/ #page { margin-bottom: 0; padding: 0; padding-left: 220px; background: url('../images/glass/orange/right.gif') repeat-y top right; } #sidebar { position: relative; float: left; padding: 0; width: 220px; margin: 0; margin-left: -220px; } #content { position: relative; margin: 0; padding: 10px 40px 10px 15px; } #sidebar #menu { width: 220px; margin: 0; padding: 0; background: url('../images/glass/orange/menu_body.gif') repeat-y top left; } #sidebar #menu div.foot { height: 20px; background: url('../images/glass/orange/menu_foot.gif') no-repeat bottom left; } #page div.pageinfo { text-align: center; font-size: 10px; color: #ccc; } /*------------------------------------------------------------------------*/ /* footer */ /*------------------------------------------------------------------------*/ #footer { clear: both; position: relative; padding: 0 140px 0px 265px; height: 100px; background: url('../images/glass/orange/footer.gif') no-repeat bottom left; } #footer a.osi { position: absolute; display: block; left: 200px; bottom: 30px; width: 70px; height: 50px; cursor: pointer; background: url('../images/glass/orange/osi.gif') no-repeat top left; } #footer .copyright { text-align: center; color: #666; font-size: 12px; padding: 14px 0 0 0; } #footer .licence { text-align: center; padding-top: 5px; color: #888; font-size: 11px; line-height: 15px; padding: 0 20px; } #footer .copyright a, #footer .copyright a:visited, #footer .licence a, #footer .licence a:visited { color: #da3700; } #footer .copyright a:hover, #footer .licence a:hover { color: #00AAF0; } #footer .controls { position: absolute; display: block; bottom: 0; right: 0; width: 130px; height: 100px; padding: 0 25px 0 0; background: url('../images/glass/orange/footer.gif') no-repeat bottom right; } /*------------------------------------------------------------------------*/ /* widescreen mode */ /*------------------------------------------------------------------------*/ #body.wide { padding: 10px 0 0 0; } #body.wide #palette { display: none; } #body.wide #header { padding: 0 20px 0 20px; margin: -50px -20px 0 0; } #body.wide #header #logo { display: none; } #body.wide #page { padding: 10px; margin: 0 0 0 0; background-image: none; background-color: white; min-width: 560px; } #body.wide #sidebar { display: none; } #body.wide #content { padding: 0 10px; background: white none; } #body.wide #footer { padding: 0 150px 0px 90px; margin-right: -20px; background-position: bottom right; } #body.wide #footer a.osi { left: 20px; } /*------------------------------------------------------------------------*/ /* controls for showing/hiding the menu */ /*------------------------------------------------------------------------*/ div.controls a.menu { display: block; float: right; margin-right: 5px; width: 40px; height: 30px; background: url('../images/glass/orange/hide_menu.gif') no-repeat 0 5px; } div.controls a.hide:hover { background-image: url('../images/glass/orange/hide_menu_roll.gif'); } div.controls a.show { background-image: url('../images/glass/orange/show_menu.gif'); } div.controls a.show:hover { background-image: url('../images/glass/orange/show_menu_roll.gif'); } body div.controls a.hide { display: block; } body div.controls a.show { display: none; } body.wide div.controls a.hide { display: none; } body.wide div.controls a.show { display: block; } /*------------------------------------------------------------------------*/ /* rollover tooltip box for our talking badger */ /*------------------------------------------------------------------------*/ div.controls a span.about, div.controls span span.about { display: none; position: absolute; right: 175px; top: 5px; height: 40px; width: 200px; padding: 10px 37px 13px 10px; font-size: 10px; line-height: 13px; text-align: left; color: #888888; background: url('../images/glass/common/talkbox.gif') no-repeat top right; } div.controls a:hover span.about, div.controls span:hover span.about { display: block; } div.controls span.about h4 { display: block; font-size: 11px; margin: 0; padding: 0 0 1px 0; color: #444444; } /*------------------------------------------------------------------------*/ /* pager for going to the previous/index/next page */ /*------------------------------------------------------------------------*/ div.pager { clear: right; float: right; padding-top: 5px; width: 98px; } div.pager .go { display: block; float: left; height: 18px; padding-top: 18px; width: 32px; font-size: 10px; text-align: center; background: url('../images/arrows/large/blank/dot.gif') no-repeat top center; } div.pager span.go { color: #aaa; } div.pager a.go { color: #FF7F00; } div.pager a.go:hover { color: #00AAF0; } div.pager a.back { background-image: url('../images/arrows/large/orange/left.gif'); } div.pager a.back:hover { background-image: url('../images/arrows/large/blue/left.gif'); } div.pager span.back { background-image: url('../images/arrows/large/blank/left.gif'); } div.pager a.next { background-image: url('../images/arrows/large/orange/right.gif'); } div.pager a.next:hover { background-image: url('../images/arrows/large/blue/right.gif'); } div.pager span.next { background-image: url('../images/arrows/large/blank/right.gif'); } div.pager a.up { background-image: url('../images/arrows/large/orange/up.gif'); } div.pager a.up:hover { background-image: url('../images/arrows/large/blue/up.gif'); } div.pager span.up { background-image: url('../images/arrows/large/blank/up.gif'); } /*------------------------------------------------------------------------*/ /* pager is repeated in footer, but with text above arrows not below */ /*------------------------------------------------------------------------*/ #footer .pager { padding-top: 0; } #footer .pager .go { height: 42px; padding-top: 0; background-position: bottom center; } #footer a span.about { display: none; position: absolute; right: 28px; width: 200px; top: 58px; height: 25px; padding: 0; font-size: 11px; line-height: 13px; text-align: right; color: #444444; background-image: none; } #footer span span.about { display: none; } #footer a:hover span.about { display: block; } /*------------------------------------------------------------------------*/ /* colour selection palette */ /*------------------------------------------------------------------------*/ #palette { position: absolute; top: 0; right: 60px; height: 20px; margin-top: 0px; width: 144px; background: url('../images/glass/orange/palette.gif') no-repeat top right; } #palette ul { display: block; height: 20px; margin: 0 12px 0 0; padding: 0 0 0 12px; background: url('../images/glass/orange/palette.gif') no-repeat top left; } #palette li { display: inline; padding: 0; margin: 0; } #palette li a { display: block; float: left; height: 20px; width: 24px; padding: 0; margin: 0; background: url('../images/glass/orange/col_grey_in.gif') no-repeat top right; } #palette li a.blue { background-image: url('../images/glass/orange/col_blue_in.gif'); } #palette li a.blue:hover { background-image: url('../images/glass/orange/col_blue_out.gif'); } #palette li a.orange { background-image: url('../images/glass/orange/col_orange_out.gif'); } #palette li a.orange:hover { background-image: url('../images/glass/orange/col_orange_out.gif'); } #palette li a.green { background-image: url('../images/glass/orange/col_green_in.gif'); } #palette li a.green:hover { background-image: url('../images/glass/orange/col_green_out.gif'); } #palette li a.purple { background-image: url('../images/glass/orange/col_purple_in.gif'); } #palette li a.purple:hover { background-image: url('../images/glass/orange/col_purple_out.gif'); } #palette li a.grey { background-image: url('../images/glass/orange/col_grey_in.gif'); } #palette li a.grey:hover { background-image: url('../images/glass/orange/col_grey_out.gif'); } /*------------------------------------------------------------------------*/ /* menu styles */ /*------------------------------------------------------------------------*/ ul.menu { list-style: none; margin: 0 20px; padding: 0; } ul.menu li { list-style: none; display: block; margin: 0; padding: 0; } ul.menu li.last { background: url('../images/glass/orange/menu_item_foot.gif') no-repeat top left; padding-top: 1px; } ul.menu li a { display: block; margin: 0; padding: 4px 8px; font-size: 13px; line-height: 16px; min-height: 16px; color: #da3700; text-decoration: none; background: url('../images/glass/orange/menu_item_body.gif') no-repeat top left; } ul.menu li.first a { background-image: url('../images/glass/orange/menu_item_head.gif'); } ul.menu li.last a { background: url('../images/glass/orange/menu_item_foot.gif') no-repeat bottom left; } ul.menu li a:hover { color: #00AAF0; background-image: url('../images/glass/orange/menu_warm_body.gif'); */ } ul.menu li a.warm { font-weight: bold; background-image: url('../images/glass/orange/menu_warm_body.gif'); */ } ul.menu li.first a.warm, ul.menu li.first a:hover { background-image: url('../images/glass/orange/menu_warm_head.gif'); } ul.menu li.last a.warm, ul.menu li.last a:hover { background: url('../images/glass/orange/menu_warm_foot.gif') no-repeat bottom left; } ul.menu li.l1 a { padding: 3px 8px 3px 22px; font-size: 11px; } ul.menu li.l2 a { padding: 3px 8px 3px 36px; font-size: 11px; } ul.menu li.l3 a { padding: 3px 8px 3px 50px; font-size: 11px; } ul.menu li.l4 a { padding: 3px 8px 3px 64px; font-size: 11px; } ul.menu li.l5 a { padding: 3px 8px 3px 78px; font-size: 11px; } ul.menu li.l6 a { padding: 3px 8px 3px 92px; font-size: 11px; } ul.menu li.l7 a { padding: 3px 8px 3px 106px; font-size: 11px; } /*------------------------------------------------------------------------*/ /* Styles for table of contents */ /*------------------------------------------------------------------------*/ ul.toc { margin: 0 0 20px 0; padding: 0; } ul.toc li { list-style: none; margin: 0; font-size: 14px; line-height: 18px; } ul.toc li a { font-size: 14px; line-height: 16px; min-height: 14px; text-decoration: none; margin: 0; padding: 4px 0 1px 18px; background: url('../images/arrows/small/orange/dot.gif') 0px 4px no-repeat; color: #FF7F00; } * html ul.toc li a { height: 16px; } ul.toc li.sub { margin: 0; line-height: 14px; } ul.toc li.sub a { display: block; margin: 0; padding: 2px 0 1px 34px; font-size: 12px; line-height: 13px; background: url('../images/arrows/small/orange/minidot.gif') 20px 3px no-repeat; } ul.toc li.subsub a { display: block; margin: 0; padding: 0 0 0 60px; font-size: 12px; background: url('../images/arrows/small/orange/minidot.gif') 40px 2px no-repeat; } ul.toc li a:hover { background-image: url('../images/arrows/small/blue/dot.gif'); color: #00AAF0; } ul.toc li.sub a:hover, ul.toc li.subsub a:hover { background-image: url('../images/arrows/small/blue/minidot.gif'); color: #00AAF0; } /*------------------------------------------------------------------------*/ /* sections */ /*------------------------------------------------------------------------*/ div.section, div.subsection { padding-left: 20px; clear: right; } div.section div.head, div.subsection div.head { position: relative; margin: 6px 0px 4px 0; min-height: 20px; } div.section > div.head { border-bottom: 1px dashed #bbb; } div.subsection div.head { border-bottom: 1px dashed #ddd; margin-bottom: 2px; } div.section div.head h1 { padding: 0 80px 4px 28px; margin: 0 0 0 -28px; font-size: 18px; line-height: 22px; font-weight: bold; background: url('../images/arrows/large/orange/dot.gif') no-repeat top left; } div.section div.head h2 { padding: 0 80px 2px 20px; margin: 0 0 0 -20px; font-size: 16px; line-height: 20px; font-weight: bold; background: url('../images/arrows/small/orange/dot.gif') no-repeat 0 3px; } div.section h3 { margin: 0; padding: 5px 0 0 0; font-size: 14px; line-height: 18px; line-height: } div.section.open > div.head h1 { background-image: url('../images/arrows/large/orange/dotminus.gif'); } div.section.open > div.head:hover h1 { color: #00AAF0; cursor: pointer; background-image: url('../images/arrows/large/blue/dotminus.gif'); } div.section.shut > div.head h1 { background-image: url('../images/arrows/large/orange/dotplus.gif'); } div.section.shut > div.head:hover h1 { color: #00AAF0; cursor: pointer; background-image: url('../images/arrows/large/blue/dotplus.gif'); } div.subsection.open > div.head h2 { background-image: url('../images/arrows/small/orange/dotminus.gif'); } div.subsection.open > div.head:hover h2 { color: #00AAF0; cursor: pointer; background-image: url('../images/arrows/small/blue/dotminus.gif'); } div.subsection.shut > div.head h2 { background-image: url('../images/arrows/small/orange/dotplus.gif'); } div.subsection.shut > div.head:hover h2 { color: #00AAF0; cursor: pointer; background-image: url('../images/arrows/small/blue/dotplus.gif'); } div.section div.head a.top { position: absolute; bottom: 4px; right: 0px; padding: 0px 20px 0px 0; margin: 0px; width: 25px; text-align: right; font-size: 11px; height: 16px; background: url('../images/arrows/small/orange/up.gif') no-repeat 28px 3px; } div.section div.head a.top:hover { background-image: url('../images/arrows/small/blue/up.gif'); } div.section div.head a.open, div.section div.head a.shut, div.subsection div.head a.open, div.subsection div.head a.shut { position: absolute; bottom: 4px; right: 45px; margin: 0px; padding: 0px 5px; font-size: 11px; height: 16px; width: 3em; text-align: right; border-right: 1px solid #ddd; display: none; } div.section.shut > div.head a.open, div.subsection.shut div.head a.open { display: block; } div.section.shut > div.head a.shut, div.subsection.shut div.head a.shut { display: none; } div.section.open > div.head a.open, div.subsection.open div.head a.open { display: none; } div.section.open > div.head a.shut, div.subsection.open div.head a.shut { display: block; } div.section div.body { display: block; margin: 0; padding: 0 0 10px 0; } div.subsection div.body { display: block; padding: 0 0 10px 0; } div.section.shut div.body, div.subsection.shut div.body { display: none; } /*------------------------------------------------------------------------*/ /* POD markup */ /*------------------------------------------------------------------------*/ div.pod { } div.pod p { margin: 0px 0px 10px 0px; } div.pod pre { margin: 10px 0 10px 20px; padding: 10px; border: 1px solid #ddd; background-color: #f6f6f6; color: #226; } /*------------------------------------------------------------------------*/ /* Index page list */ /*------------------------------------------------------------------------*/ ul.index { margin: 10px 10px 10px 0; padding: 0px; } ul.index li { list-style: none; margin: 0 0 5px 0; padding: 0; } ul.index li a { text-decoration: none; font-weight: bold; padding: 0 0 0 20px; margin: 0; color: ; background: url('../images/arrows/ff16_blue/right.gif') no-repeat top left; } ul.index li a:hover { color: ; background-image: url('../images/arrows/ff16_orange/right.gif'); } ul.index li p { margin: 0 0 10px 0; padding: 0 0 0 20px; } TT_v224_html_docs/old/css/purple.css000700 000765 000765 00000050531 10627516017 017205 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* default styles */ /*------------------------------------------------------------------------*/ h1, h2, h3, h4, h5, h6 { color: #444444; } h1 { margin: 0px 0 5px 0; } p { color: #333; padding: 8px 0; } p.tight { padding: 4px 0; margin: 0; } pre { line-height: 120%; } code { color: #224; font-weight: bold; } a { text-decoration: none; color: #7239b9; } a:visited { color: #582a86; } a:hover { color: #d921d9; } a:focus { -moz-outline: none; } .alt { display: none; } .sample { display: block; width: 100px; height: 30px; } br.clear { clear: both; } /*------------------------------------------------------------------------*/ /* main body style */ /*------------------------------------------------------------------------*/ body { font: 14px Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #333; margin: 0px; padding: 10px 10px 20px 10px; background: #7239b9 url('../images/glass/purple/top_grad.gif') repeat-x top left; } #layout { background: white url('../images/glass/purple/left.gif') repeat-y top left; min-width: 600px; } /*------------------------------------------------------------------------*/ /* header */ /*------------------------------------------------------------------------*/ #header { position: relative; height: 130px; margin: 0px; padding: 0 25px 0 220px; background: url('../images/glass/purple/header.gif') no-repeat top right; } #header #logo { display: block; position: absolute; top: 0; left: 0; width: 220px; height: 130px; background: url('../images/glass/purple/logo_grey.gif') no-repeat top right; } #header #logo:hover { background-image: url('../images/glass/purple/logo_pink.gif'); } #header #trail { height: 40px; margin: 0; padding: 0 0 0 10px; background: url('../images/glass/purple/tab_pre.gif') no-repeat top left; } #header #trail.blank { background-image: none; } #header #trail li { display: block; float: left; background: url('../images/glass/purple/tab_cold.gif') no-repeat top left; padding: 0 0 0 10px; } #header #trail li a { display: block; float: left; font-size: 11px; text-decoration: none; color: #888888; line-height: 14px; height: 30px; min-width: 60px; padding: 10px 15px 0 0; background: url('../images/glass/purple/tab_cold.gif') no-repeat top right; } #header #trail li a:hover { color: #d921d9; } #header #trail li:hover, #header #trail li:hover a { background-image: url('../images/glass/purple/tab_roll.gif'); } #header #trail li.last { background-image: url('../images/glass/purple/tab_warm.gif'); color: #444444; } #header #trail li.last a { background-image: url('../images/glass/purple/tab_warm.gif'); color: #444444; padding-right: 45px; } #header .headline { font-size: 24px; margin: 8px 0 8px 0; padding: 0 100px 0 0; color: #444444; } #header .subhead { font-size: 16px; line-height: 18px; padding: 0 110px 0 0; margin: 0; color: #444; } #header .controls { position: absolute; display: block; top: 40px; right: 20px; width: 130px; height: 70px; overflow: visible; } /*------------------------------------------------------------------------*/ /* main page content and sidebar */ /*------------------------------------------------------------------------*/ #page { margin-bottom: 0; padding: 0; padding-left: 220px; background: url('../images/glass/purple/right.gif') repeat-y top right; } #sidebar { position: relative; float: left; padding: 0; width: 220px; margin: 0; margin-left: -220px; } #content { position: relative; margin: 0; padding: 10px 40px 10px 15px; } #sidebar #menu { width: 220px; margin: 0; padding: 0; background: url('../images/glass/purple/menu_body.gif') repeat-y top left; } #sidebar #menu div.foot { height: 20px; background: url('../images/glass/purple/menu_foot.gif') no-repeat bottom left; } #page div.pageinfo { text-align: center; font-size: 10px; color: #ccc; } /*------------------------------------------------------------------------*/ /* footer */ /*------------------------------------------------------------------------*/ #footer { clear: both; position: relative; padding: 0 140px 0px 265px; height: 100px; background: url('../images/glass/purple/footer.gif') no-repeat bottom left; } #footer a.osi { position: absolute; display: block; left: 200px; bottom: 30px; width: 70px; height: 50px; cursor: pointer; background: url('../images/glass/purple/osi.gif') no-repeat top left; } #footer .copyright { text-align: center; color: #666; font-size: 12px; padding: 14px 0 0 0; } #footer .licence { text-align: center; padding-top: 5px; color: #888; font-size: 11px; line-height: 15px; padding: 0 20px; } #footer .copyright a, #footer .copyright a:visited, #footer .licence a, #footer .licence a:visited { color: #66418c; } #footer .copyright a:hover, #footer .licence a:hover { color: #d921d9; } #footer .controls { position: absolute; display: block; bottom: 0; right: 0; width: 130px; height: 100px; padding: 0 25px 0 0; background: url('../images/glass/purple/footer.gif') no-repeat bottom right; } /*------------------------------------------------------------------------*/ /* widescreen mode */ /*------------------------------------------------------------------------*/ #body.wide { padding: 10px 0 0 0; } #body.wide #palette { display: none; } #body.wide #header { padding: 0 20px 0 20px; margin: -50px -20px 0 0; } #body.wide #header #logo { display: none; } #body.wide #page { padding: 10px; margin: 0 0 0 0; background-image: none; background-color: white; min-width: 560px; } #body.wide #sidebar { display: none; } #body.wide #content { padding: 0 10px; background: white none; } #body.wide #footer { padding: 0 150px 0px 90px; margin-right: -20px; background-position: bottom right; } #body.wide #footer a.osi { left: 20px; } /*------------------------------------------------------------------------*/ /* controls for showing/hiding the menu */ /*------------------------------------------------------------------------*/ div.controls a.menu { display: block; float: right; margin-right: 5px; width: 40px; height: 30px; background: url('../images/glass/purple/hide_menu.gif') no-repeat 0 5px; } div.controls a.hide:hover { background-image: url('../images/glass/purple/hide_menu_roll.gif'); } div.controls a.show { background-image: url('../images/glass/purple/show_menu.gif'); } div.controls a.show:hover { background-image: url('../images/glass/purple/show_menu_roll.gif'); } body div.controls a.hide { display: block; } body div.controls a.show { display: none; } body.wide div.controls a.hide { display: none; } body.wide div.controls a.show { display: block; } /*------------------------------------------------------------------------*/ /* rollover tooltip box for our talking badger */ /*------------------------------------------------------------------------*/ div.controls a span.about, div.controls span span.about { display: none; position: absolute; right: 175px; top: 5px; height: 40px; width: 200px; padding: 10px 37px 13px 10px; font-size: 10px; line-height: 13px; text-align: left; color: #888888; background: url('../images/glass/common/talkbox.gif') no-repeat top right; } div.controls a:hover span.about, div.controls span:hover span.about { display: block; } div.controls span.about h4 { display: block; font-size: 11px; margin: 0; padding: 0 0 1px 0; color: #444444; } /*------------------------------------------------------------------------*/ /* pager for going to the previous/index/next page */ /*------------------------------------------------------------------------*/ div.pager { clear: right; float: right; padding-top: 5px; width: 98px; } div.pager .go { display: block; float: left; height: 18px; padding-top: 18px; width: 32px; font-size: 10px; text-align: center; background: url('../images/arrows/large/blank/dot.gif') no-repeat top center; } div.pager span.go { color: #aaa; } div.pager a.go { color: #7239b9; } div.pager a.go:hover { color: #d921d9; } div.pager a.back { background-image: url('../images/arrows/large/purple/left.gif'); } div.pager a.back:hover { background-image: url('../images/arrows/large/pink/left.gif'); } div.pager span.back { background-image: url('../images/arrows/large/blank/left.gif'); } div.pager a.next { background-image: url('../images/arrows/large/purple/right.gif'); } div.pager a.next:hover { background-image: url('../images/arrows/large/pink/right.gif'); } div.pager span.next { background-image: url('../images/arrows/large/blank/right.gif'); } div.pager a.up { background-image: url('../images/arrows/large/purple/up.gif'); } div.pager a.up:hover { background-image: url('../images/arrows/large/pink/up.gif'); } div.pager span.up { background-image: url('../images/arrows/large/blank/up.gif'); } /*------------------------------------------------------------------------*/ /* pager is repeated in footer, but with text above arrows not below */ /*------------------------------------------------------------------------*/ #footer .pager { padding-top: 0; } #footer .pager .go { height: 42px; padding-top: 0; background-position: bottom center; } #footer a span.about { display: none; position: absolute; right: 28px; width: 200px; top: 58px; height: 25px; padding: 0; font-size: 11px; line-height: 13px; text-align: right; color: #444444; background-image: none; } #footer span span.about { display: none; } #footer a:hover span.about { display: block; } /*------------------------------------------------------------------------*/ /* colour selection palette */ /*------------------------------------------------------------------------*/ #palette { position: absolute; top: 0; right: 60px; height: 20px; margin-top: 0px; width: 144px; background: url('../images/glass/purple/palette.gif') no-repeat top right; } #palette ul { display: block; height: 20px; margin: 0 12px 0 0; padding: 0 0 0 12px; background: url('../images/glass/purple/palette.gif') no-repeat top left; } #palette li { display: inline; padding: 0; margin: 0; } #palette li a { display: block; float: left; height: 20px; width: 24px; padding: 0; margin: 0; background: url('../images/glass/purple/col_grey_in.gif') no-repeat top right; } #palette li a.blue { background-image: url('../images/glass/purple/col_blue_in.gif'); } #palette li a.blue:hover { background-image: url('../images/glass/purple/col_blue_out.gif'); } #palette li a.orange { background-image: url('../images/glass/purple/col_orange_in.gif'); } #palette li a.orange:hover { background-image: url('../images/glass/purple/col_orange_out.gif'); } #palette li a.green { background-image: url('../images/glass/purple/col_green_in.gif'); } #palette li a.green:hover { background-image: url('../images/glass/purple/col_green_out.gif'); } #palette li a.purple { background-image: url('../images/glass/purple/col_purple_out.gif'); } #palette li a.purple:hover { background-image: url('../images/glass/purple/col_purple_out.gif'); } #palette li a.grey { background-image: url('../images/glass/purple/col_grey_in.gif'); } #palette li a.grey:hover { background-image: url('../images/glass/purple/col_grey_out.gif'); } /*------------------------------------------------------------------------*/ /* menu styles */ /*------------------------------------------------------------------------*/ ul.menu { list-style: none; margin: 0 20px; padding: 0; } ul.menu li { list-style: none; display: block; margin: 0; padding: 0; } ul.menu li.last { background: url('../images/glass/purple/menu_item_foot.gif') no-repeat top left; padding-top: 1px; } ul.menu li a { display: block; margin: 0; padding: 4px 8px; font-size: 13px; line-height: 16px; min-height: 16px; color: #46216b; text-decoration: none; background: url('../images/glass/purple/menu_item_body.gif') no-repeat top left; } ul.menu li.first a { background-image: url('../images/glass/purple/menu_item_head.gif'); } ul.menu li.last a { background: url('../images/glass/purple/menu_item_foot.gif') no-repeat bottom left; } ul.menu li a:hover { color: #d921d9; background-image: url('../images/glass/purple/menu_warm_body.gif'); */ } ul.menu li a.warm { font-weight: bold; background-image: url('../images/glass/purple/menu_warm_body.gif'); */ } ul.menu li.first a.warm, ul.menu li.first a:hover { background-image: url('../images/glass/purple/menu_warm_head.gif'); } ul.menu li.last a.warm, ul.menu li.last a:hover { background: url('../images/glass/purple/menu_warm_foot.gif') no-repeat bottom left; } ul.menu li.l1 a { padding: 3px 8px 3px 22px; font-size: 11px; } ul.menu li.l2 a { padding: 3px 8px 3px 36px; font-size: 11px; } ul.menu li.l3 a { padding: 3px 8px 3px 50px; font-size: 11px; } ul.menu li.l4 a { padding: 3px 8px 3px 64px; font-size: 11px; } ul.menu li.l5 a { padding: 3px 8px 3px 78px; font-size: 11px; } ul.menu li.l6 a { padding: 3px 8px 3px 92px; font-size: 11px; } ul.menu li.l7 a { padding: 3px 8px 3px 106px; font-size: 11px; } /*------------------------------------------------------------------------*/ /* Styles for table of contents */ /*------------------------------------------------------------------------*/ ul.toc { margin: 0 0 20px 0; padding: 0; } ul.toc li { list-style: none; margin: 0; font-size: 14px; line-height: 18px; } ul.toc li a { font-size: 14px; line-height: 16px; min-height: 14px; text-decoration: none; margin: 0; padding: 4px 0 1px 18px; background: url('../images/arrows/small/purple/dot.gif') 0px 4px no-repeat; color: #7239b9; } * html ul.toc li a { height: 16px; } ul.toc li.sub { margin: 0; line-height: 14px; } ul.toc li.sub a { display: block; margin: 0; padding: 2px 0 1px 34px; font-size: 12px; line-height: 13px; background: url('../images/arrows/small/purple/minidot.gif') 20px 3px no-repeat; } ul.toc li.subsub a { display: block; margin: 0; padding: 0 0 0 60px; font-size: 12px; background: url('../images/arrows/small/purple/minidot.gif') 40px 2px no-repeat; } ul.toc li a:hover { background-image: url('../images/arrows/small/pink/dot.gif'); color: #d921d9; } ul.toc li.sub a:hover, ul.toc li.subsub a:hover { background-image: url('../images/arrows/small/pink/minidot.gif'); color: #d921d9; } /*------------------------------------------------------------------------*/ /* sections */ /*------------------------------------------------------------------------*/ div.section, div.subsection { padding-left: 20px; clear: right; } div.section div.head, div.subsection div.head { position: relative; margin: 6px 0px 4px 0; min-height: 20px; } div.section > div.head { border-bottom: 1px dashed #bbb; } div.subsection div.head { border-bottom: 1px dashed #ddd; margin-bottom: 2px; } div.section div.head h1 { padding: 0 80px 4px 28px; margin: 0 0 0 -28px; font-size: 18px; line-height: 22px; font-weight: bold; background: url('../images/arrows/large/purple/dot.gif') no-repeat top left; } div.section div.head h2 { padding: 0 80px 2px 20px; margin: 0 0 0 -20px; font-size: 16px; line-height: 20px; font-weight: bold; background: url('../images/arrows/small/purple/dot.gif') no-repeat 0 3px; } div.section h3 { margin: 0; padding: 5px 0 0 0; font-size: 14px; line-height: 18px; line-height: } div.section.open > div.head h1 { background-image: url('../images/arrows/large/purple/dotminus.gif'); } div.section.open > div.head:hover h1 { color: #d921d9; cursor: pointer; background-image: url('../images/arrows/large/pink/dotminus.gif'); } div.section.shut > div.head h1 { background-image: url('../images/arrows/large/purple/dotplus.gif'); } div.section.shut > div.head:hover h1 { color: #d921d9; cursor: pointer; background-image: url('../images/arrows/large/pink/dotplus.gif'); } div.subsection.open > div.head h2 { background-image: url('../images/arrows/small/purple/dotminus.gif'); } div.subsection.open > div.head:hover h2 { color: #d921d9; cursor: pointer; background-image: url('../images/arrows/small/pink/dotminus.gif'); } div.subsection.shut > div.head h2 { background-image: url('../images/arrows/small/purple/dotplus.gif'); } div.subsection.shut > div.head:hover h2 { color: #d921d9; cursor: pointer; background-image: url('../images/arrows/small/pink/dotplus.gif'); } div.section div.head a.top { position: absolute; bottom: 4px; right: 0px; padding: 0px 20px 0px 0; margin: 0px; width: 25px; text-align: right; font-size: 11px; height: 16px; background: url('../images/arrows/small/purple/up.gif') no-repeat 28px 3px; } div.section div.head a.top:hover { background-image: url('../images/arrows/small/pink/up.gif'); } div.section div.head a.open, div.section div.head a.shut, div.subsection div.head a.open, div.subsection div.head a.shut { position: absolute; bottom: 4px; right: 45px; margin: 0px; padding: 0px 5px; font-size: 11px; height: 16px; width: 3em; text-align: right; border-right: 1px solid #ddd; display: none; } div.section.shut > div.head a.open, div.subsection.shut div.head a.open { display: block; } div.section.shut > div.head a.shut, div.subsection.shut div.head a.shut { display: none; } div.section.open > div.head a.open, div.subsection.open div.head a.open { display: none; } div.section.open > div.head a.shut, div.subsection.open div.head a.shut { display: block; } div.section div.body { display: block; margin: 0; padding: 0 0 10px 0; } div.subsection div.body { display: block; padding: 0 0 10px 0; } div.section.shut div.body, div.subsection.shut div.body { display: none; } /*------------------------------------------------------------------------*/ /* POD markup */ /*------------------------------------------------------------------------*/ div.pod { } div.pod p { margin: 0px 0px 10px 0px; } div.pod pre { margin: 10px 0 10px 20px; padding: 10px; border: 1px solid #ddd; background-color: #f6f6f6; color: #226; } /*------------------------------------------------------------------------*/ /* Index page list */ /*------------------------------------------------------------------------*/ ul.index { margin: 10px 10px 10px 0; padding: 0px; } ul.index li { list-style: none; margin: 0 0 5px 0; padding: 0; } ul.index li a { text-decoration: none; font-weight: bold; padding: 0 0 0 20px; margin: 0; color: ; background: url('../images/arrows/ff16_blue/right.gif') no-repeat top left; } ul.index li a:hover { color: ; background-image: url('../images/arrows/ff16_orange/right.gif'); } ul.index li p { margin: 0 0 10px 0; padding: 0 0 0 20px; } TT_v224_html_docs/old/css/tt2.css000700 000765 000765 00000045165 10627516020 016410 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* default styles */ /*------------------------------------------------------------------------*/ h1, h2, h3, h4, h5, h6 { color: ; } h1 { margin: 0px 0 5px 0; } p { color: #333; padding: 8px 0; } p.tight { padding: 4px 0; margin: 0; } pre { line-height: 120%; } code { color: #224; font-weight: bold; } a { text-decoration: none; color: ; } a:visited { color: ; } a:hover { color: ; } a:focus { -moz-outline: none; } .alt { display: none; } .sample { display: block; width: 100px; height: 30px; } br.clear { clear: both; } /*------------------------------------------------------------------------*/ /* main body style */ /*------------------------------------------------------------------------*/ body { font: px ; line-height: 150%; color: #333; margin: 0px; padding: 10px 10px 20px 10px; background: url('/top_grad.gif') repeat-x top left; } #layout { background: white url('/left.gif') repeat-y top left; min-width: 600px; } /*------------------------------------------------------------------------*/ /* header */ /*------------------------------------------------------------------------*/ #header { position: relative; height: 130px; margin: 0px; padding: 0 25px 0 220px; background: url('/header.gif') no-repeat top right; } #header #logo { display: block; position: absolute; top: 0; left: 0; width: 220px; height: 130px; background: url('/logo_.gif') no-repeat top right; } #header #logo:hover { background-image: url('/logo_.gif'); } #header #trail { height: 40px; margin: 0; padding: 0 0 0 10px; background: url('/tab_pre.gif') no-repeat top left; } #header #trail.blank { background-image: none; } #header #trail li { display: block; float: left; background: url('/tab_cold.gif') no-repeat top left; padding: 0 0 0 10px; } #header #trail li a { display: block; float: left; font-size: 11px; text-decoration: none; color: ; line-height: 14px; height: 30px; min-width: 60px; padding: 10px 15px 0 0; background: url('/tab_cold.gif') no-repeat top right; } #header #trail li a:hover { color: ; } #header #trail li:hover, #header #trail li:hover a { background-image: url('/tab_roll.gif'); } #header #trail li.last { background-image: url('/tab_warm.gif'); color: ; } #header #trail li.last a { background-image: url('/tab_warm.gif'); color: ; padding-right: 45px; } #header .headline { font-size: 24px; margin: 8px 0 8px 0; padding: 0 100px 0 0; color: ; } #header .subhead { font-size: 16px; line-height: 18px; padding: 0 110px 0 0; margin: 0; color: #444; } #header .controls { position: absolute; display: block; top: 40px; right: 20px; width: 130px; height: 70px; overflow: visible; } /*------------------------------------------------------------------------*/ /* main page content and sidebar */ /*------------------------------------------------------------------------*/ #page { margin-bottom: 0; padding: 0; padding-left: 220px; background: url('/right.gif') repeat-y top right; } #sidebar { position: relative; float: left; padding: 0; width: 220px; margin: 0; margin-left: -220px; } #content { position: relative; margin: 0; padding: 10px 40px 10px 15px; } #sidebar #menu { width: 220px; margin: 0; padding: 0; background: url('/menu_body.gif') repeat-y top left; } #sidebar #menu div.foot { height: 20px; background: url('/menu_foot.gif') no-repeat bottom left; } #page div.pageinfo { text-align: center; font-size: 10px; color: #ccc; } /*------------------------------------------------------------------------*/ /* footer */ /*------------------------------------------------------------------------*/ #footer { clear: both; position: relative; padding: 0 140px 0px 265px; height: 100px; background: url('/footer.gif') no-repeat bottom left; } #footer a.osi { position: absolute; display: block; left: 200px; bottom: 30px; width: 70px; height: 50px; cursor: pointer; background: url('/osi.gif') no-repeat top left; } #footer .copyright { text-align: center; color: #666; font-size: 12px; padding: 14px 0 0 0; } #footer .licence { text-align: center; padding-top: 5px; color: #888; font-size: 11px; line-height: 15px; padding: 0 20px; } #footer .copyright a, #footer .copyright a:visited, #footer .licence a, #footer .licence a:visited { color: ; } #footer .copyright a:hover, #footer .licence a:hover { color: ; } #footer .controls { position: absolute; display: block; bottom: 0; right: 0; width: 130px; height: 100px; padding: 0 25px 0 0; background: url('/footer.gif') no-repeat bottom right; } /*------------------------------------------------------------------------*/ /* widescreen mode */ /*------------------------------------------------------------------------*/ #body.wide { padding: 10px 0 0 0; } #body.wide #palette { display: none; } #body.wide #header { padding: 0 20px 0 20px; margin: -50px -20px 0 0; } #body.wide #header #logo { display: none; } #body.wide #page { padding: 10px; margin: 0 0 0 0; background-image: none; background-color: white; min-width: 560px; } #body.wide #sidebar { display: none; } #body.wide #content { padding: 0 10px; background: white none; } #body.wide #footer { padding: 0 150px 0px 90px; margin-right: -20px; background-position: bottom right; } #body.wide #footer a.osi { left: 20px; } /*------------------------------------------------------------------------*/ /* controls for showing/hiding the menu */ /*------------------------------------------------------------------------*/ div.controls a.menu { display: block; float: right; margin-right: 5px; width: 40px; height: 30px; background: url('/hide_menu.gif') no-repeat 0 5px; } div.controls a.hide:hover { background-image: url('/hide_menu_roll.gif'); } div.controls a.show { background-image: url('/show_menu.gif'); } div.controls a.show:hover { background-image: url('/show_menu_roll.gif'); } body div.controls a.hide { display: block; } body div.controls a.show { display: none; } body.wide div.controls a.hide { display: none; } body.wide div.controls a.show { display: block; } /*------------------------------------------------------------------------*/ /* rollover tooltip box for our talking badger */ /*------------------------------------------------------------------------*/ div.controls a span.about, div.controls span span.about { display: none; position: absolute; right: 175px; top: 5px; height: 40px; width: 200px; padding: 10px 37px 13px 10px; font-size: 10px; line-height: 13px; text-align: left; color: ; background: url('/talkbox.gif') no-repeat top right; } div.controls a:hover span.about, div.controls span:hover span.about { display: block; } div.controls span.about h4 { display: block; font-size: 11px; margin: 0; padding: 0 0 1px 0; color: ; } /*------------------------------------------------------------------------*/ /* pager for going to the previous/index/next page */ /*------------------------------------------------------------------------*/ div.pager { clear: right; float: right; padding-top: 5px; width: 98px; } div.pager .go { display: block; float: left; height: 18px; padding-top: 18px; width: 32px; font-size: 10px; text-align: center; background: url('/large//dot.gif') no-repeat top center; } div.pager span.go { color: #aaa; } div.pager a.go { color: ; } div.pager a.go:hover { color: ; } div.pager a.back { background-image: url('/large//left.gif'); } div.pager a.back:hover { background-image: url('/large//left.gif'); } div.pager span.back { background-image: url('/large//left.gif'); } div.pager a.next { background-image: url('/large//right.gif'); } div.pager a.next:hover { background-image: url('/large//right.gif'); } div.pager span.next { background-image: url('/large//right.gif'); } div.pager a.up { background-image: url('/large//up.gif'); } div.pager a.up:hover { background-image: url('/large//up.gif'); } div.pager span.up { background-image: url('/large//up.gif'); } /*------------------------------------------------------------------------*/ /* pager is repeated in footer, but with text above arrows not below */ /*------------------------------------------------------------------------*/ #footer .pager { padding-top: 0; } #footer .pager .go { height: 42px; padding-top: 0; background-position: bottom center; } #footer a span.about { display: none; position: absolute; right: 28px; width: 200px; top: 58px; height: 25px; padding: 0; font-size: 11px; line-height: 13px; text-align: right; color: ; background-image: none; } #footer span span.about { display: none; } #footer a:hover span.about { display: block; } /*------------------------------------------------------------------------*/ /* colour selection palette */ /*------------------------------------------------------------------------*/ #palette { position: absolute; top: 0; right: 60px; height: 20px; margin-top: 0px; width: 144px; background: url('/palette.gif') no-repeat top right; } #palette ul { display: block; height: 20px; margin: 0 12px 0 0; padding: 0 0 0 12px; background: url('/palette.gif') no-repeat top left; } #palette li { display: inline; padding: 0; margin: 0; } #palette li a { display: block; float: left; height: 20px; width: 24px; padding: 0; margin: 0; background: url('/col_grey_in.gif') no-repeat top right; } #palette li a.blue { background-image: url('/col_blue_in.gif'); } #palette li a.blue:hover { background-image: url('/col_blue_out.gif'); } #palette li a.orange { background-image: url('/col_orange_in.gif'); } #palette li a.orange:hover { background-image: url('/col_orange_out.gif'); } #palette li a.green { background-image: url('/col_green_in.gif'); } #palette li a.green:hover { background-image: url('/col_green_out.gif'); } #palette li a.purple { background-image: url('/col_purple_in.gif'); } #palette li a.purple:hover { background-image: url('/col_purple_out.gif'); } #palette li a.grey { background-image: url('/col_grey_in.gif'); } #palette li a.grey:hover { background-image: url('/col_grey_out.gif'); } /*------------------------------------------------------------------------*/ /* menu styles */ /*------------------------------------------------------------------------*/ ul.menu { list-style: none; margin: 0 20px; padding: 0; } ul.menu li { list-style: none; display: block; margin: 0; padding: 0; } ul.menu li.last { background: url('/menu_item_foot.gif') no-repeat top left; padding-top: 1px; } ul.menu li a { display: block; margin: 0; padding: 4px 8px; font-size: 13px; line-height: 16px; min-height: 16px; color: ; text-decoration: none; background: url('/menu_item_body.gif') no-repeat top left; } ul.menu li.first a { background-image: url('/menu_item_head.gif'); } ul.menu li.last a { background: url('/menu_item_foot.gif') no-repeat bottom left; } ul.menu li a:hover { color: ; background-image: url('/menu_warm_body.gif'); */ } ul.menu li a.warm { font-weight: bold; background-image: url('/menu_warm_body.gif'); */ } ul.menu li.first a.warm, ul.menu li.first a:hover { background-image: url('/menu_warm_head.gif'); } ul.menu li.last a.warm, ul.menu li.last a:hover { background: url('/menu_warm_foot.gif') no-repeat bottom left; } ul.menu li.l1 a { padding: 3px 8px 3px 22px; font-size: 11px; } ul.menu li.l2 a { padding: 3px 8px 3px 36px; font-size: 11px; } ul.menu li.l3 a { padding: 3px 8px 3px 50px; font-size: 11px; } ul.menu li.l4 a { padding: 3px 8px 3px 64px; font-size: 11px; } ul.menu li.l5 a { padding: 3px 8px 3px 78px; font-size: 11px; } ul.menu li.l6 a { padding: 3px 8px 3px 92px; font-size: 11px; } ul.menu li.l7 a { padding: 3px 8px 3px 106px; font-size: 11px; } /*------------------------------------------------------------------------*/ /* Styles for table of contents */ /*------------------------------------------------------------------------*/ ul.toc { margin: 0 0 20px 0; padding: 0; } ul.toc li { list-style: none; margin: 0; font-size: 14px; line-height: 18px; } ul.toc li a { font-size: 14px; line-height: 16px; min-height: 14px; text-decoration: none; margin: 0; padding: 4px 0 1px 18px; background: url('/small//dot.gif') 0px 4px no-repeat; color: ; } * html ul.toc li a { height: 16px; } ul.toc li.sub { margin: 0; line-height: 14px; } ul.toc li.sub a { display: block; margin: 0; padding: 2px 0 1px 34px; font-size: 12px; line-height: 13px; background: url('/small//minidot.gif') 20px 3px no-repeat; } ul.toc li.subsub a { display: block; margin: 0; padding: 0 0 0 60px; font-size: -2px; background: url('/small//minidot.gif') 40px 2px no-repeat; } ul.toc li a:hover { background-image: url('/small//dot.gif'); color: ; } ul.toc li.sub a:hover, ul.toc li.subsub a:hover { background-image: url('/small//minidot.gif'); color: ; } /*------------------------------------------------------------------------*/ /* sections */ /*------------------------------------------------------------------------*/ div.section, div.subsection { padding-left: 20px; clear: right; } div.section div.head, div.subsection div.head { position: relative; margin: 6px 0px 4px 0; min-height: 20px; } div.section > div.head { border-bottom: 1px dashed #bbb; } div.subsection div.head { border-bottom: 1px dashed #ddd; margin-bottom: 2px; } div.section div.head h1 { padding: 0 80px 4px 28px; margin: 0 0 0 -28px; font-size: 18px; line-height: 22px; font-weight: bold; background: url('/large//dot.gif') no-repeat top left; } div.section div.head h2 { padding: 0 80px 2px 20px; margin: 0 0 0 -20px; font-size: 16px; line-height: 20px; font-weight: bold; background: url('/small//dot.gif') no-repeat 0 3px; } div.section h3 { margin: 0; padding: 5px 0 0 0; font-size: 14px; line-height: 18px; line-height: } div.section.open > div.head h1 { background-image: url('/large//dotminus.gif'); } div.section.open > div.head:hover h1 { color: ; cursor: pointer; background-image: url('/large//dotminus.gif'); } div.section.shut > div.head h1 { background-image: url('/large//dotplus.gif'); } div.section.shut > div.head:hover h1 { color: ; cursor: pointer; background-image: url('/large//dotplus.gif'); } div.subsection.open > div.head h2 { background-image: url('/small//dotminus.gif'); } div.subsection.open > div.head:hover h2 { color: ; cursor: pointer; background-image: url('/small//dotminus.gif'); } div.subsection.shut > div.head h2 { background-image: url('/small//dotplus.gif'); } div.subsection.shut > div.head:hover h2 { color: ; cursor: pointer; background-image: url('/small//dotplus.gif'); } div.section div.head a.top { position: absolute; bottom: 4px; right: 0px; padding: 0px 20px 0px 0; margin: 0px; width: 25px; text-align: right; font-size: 11px; height: 16px; background: url('/small//up.gif') no-repeat 28px 3px; } div.section div.head a.top:hover { background-image: url('/small//up.gif'); } div.section div.head a.open, div.section div.head a.shut, div.subsection div.head a.open, div.subsection div.head a.shut { position: absolute; bottom: 4px; right: 45px; margin: 0px; padding: 0px 5px; font-size: 11px; height: 16px; width: 3em; text-align: right; border-right: 1px solid #ddd; display: none; } div.section.shut > div.head a.open, div.subsection.shut div.head a.open { display: block; } div.section.shut > div.head a.shut, div.subsection.shut div.head a.shut { display: none; } div.section.open > div.head a.open, div.subsection.open div.head a.open { display: none; } div.section.open > div.head a.shut, div.subsection.open div.head a.shut { display: block; } div.section div.body { display: block; margin: 0; padding: 0 0 10px 0; } div.subsection div.body { display: block; padding: 0 0 10px 0; } div.section.shut div.body, div.subsection.shut div.body { display: none; } /*------------------------------------------------------------------------*/ /* POD markup */ /*------------------------------------------------------------------------*/ div.pod { } div.pod p { margin: 0px 0px 10px 0px; } div.pod pre { margin: 10px 0 10px 20px; padding: 10px; border: 1px solid #ddd; background-color: #f6f6f6; color: #226; } /*------------------------------------------------------------------------*/ /* Index page list */ /*------------------------------------------------------------------------*/ ul.index { margin: 10px 10px 10px 0; padding: 0px; } ul.index li { list-style: none; margin: 0 0 5px 0; padding: 0; } ul.index li a { text-decoration: none; font-weight: bold; padding: 0 0 0 20px; margin: 0; color: ; background: url('/arrows/ff16_blue/right.gif') no-repeat top left; } ul.index li a:hover { color: ; background-image: url('/arrows/ff16_orange/right.gif'); } ul.index li p { margin: 0 0 10px 0; padding: 0 0 0 20px; } TT_v224_html_docs/old/css/tt2.old.css000700 000765 000765 00000015470 10626336375 017175 0ustar00abwabw000000 000000 body { font: 14px Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #333; margin: 0px; padding: 0px 10px 0 0; border: 0px; background: #00AAF0 url('/images/layout/topgrad.gif') repeat-x top left; } #header { position: relative; height: 80px; margin: 0px; padding: 0px; margin-bottom: 0px; /* border-bottom: 1px solid grey; */ background: url('/images/layout/logo_panel.gif') no-repeat 10px 0; } #header #logo { position: absolute; top: 15px; left: 30px; width: 180px; height: 60px; background: url('/images/logo/tt2_blue_180x60.gif') no-repeat top left; } #header #logo:hover { background-image: url('/images/logo/tt2_orange_180x60.gif'); } #header .headline { font-size: 24px; padding: 20px 20px 8px 240px; margin: 0; } #header .subhead { font-size: 20px; padding: 0px 20px 0px 240px; margin: 0; } #header #trail { margin: 0; padding: 35px 20px 0px 260px; } #header #trail li { display: inline; } #header #trail li a { display: block; float: left; font-size: 14px; text-decoration: none; color: black; line-height: 16px; height: 16px; padding-left: 14px; padding-right: 10px; background: url('/images/arrows/trail.gif') no-repeat 0 3px; } #header #trail li a:hover { color: white; background-image: url('/images/arrows/trail_roll.gif'); } #body { position: relative; padding-left: 240px; background: url('/images/layout/main_body.gif') repeat-y 230px 0px; } #content { padding: 0px 20px 0px 40px; background: url('/images/layout/main_body.gif') repeat-y top right; } #content div.head { position: relative; min-height: 20px; margin: 0 -20px 0 -50px; padding: 30px 0 0 30px; background: url('/images/layout/main_head.gif') no-repeat top left; } #content div.head div.corner { position: absolute; top: 0; right: 0; width: 20px; height: 20px; background: url('/images/layout/main_head.gif') no-repeat top right; } #content div.foot { position: relative; clear: both; height: 20px; margin: 0 -20px 0 -50px; background: url('/images/layout/main_foot.gif') no-repeat top left; } #content div.foot div.corner { position: absolute; bottom: 0; right: 0; width: 20px; height: 20px; background: url('/images/layout/main_foot.gif') no-repeat bottom right; } #sidebar { position: relative; float: left; width: 220px; margin-left: -230px; padding: 0; } #menu { padding-top: 10px; background: url('/images/layout/menu_body.gif') repeat-y top left; } #menu div.foot { height: 20px; background: url('/images/layout/menu_foot.gif') no-repeat bottom left; } /*------------------------------------------------------------------------*/ /* general styles */ /*------------------------------------------------------------------------*/ h1 { margin: 0px 0 5px 0; } p { color: #333; } pre { line-height: 120%; } code { color: #224; font-weight: bold; } a { text-decoration: none; color: #00AAF0; } a:hover { color: #FF7F00; } /*------------------------------------------------------------------------*/ /* menu */ /*------------------------------------------------------------------------*/ ul.menu { list-style: none; margin: 0 20px; padding: 10px; border: 1px solid #ccc; -moz-border-radius: 5px; background-color: #eee; } ul.menu li { list-style: none; margin: -2px 0 0 0; padding: 0; } ul.menu li.l1 { margin-left: 10px; } ul.menu li.l2 { margin-left: 20px; } ul.menu li.l3 { margin-left: 30px; } ul.menu li.l4 { margin-left: 40px; } ul.menu li.l5 { margin-left: 50px; } ul.menu li.l6 { margin-left: 60px; } ul.menu li.l7 { margin-left: 70px; } ul.menu li a { margin: 0; padding: 0; font-size: 12px; line-height: 12px; color: #204090; text-decoration: none; } ul.menu li a:hover { color: #FF7F00; } ul.menu li a.warm { color: #FF7F00; font-weight: bold; } /*------------------------------------------------------------------------*/ /* POD markup */ /*------------------------------------------------------------------------*/ div.pod { padding-left: 10px; } div.pod h1, div.pod h2 { font-size: 20px; margin-left: -10px; padding-bottom: 10px; } div.pod h1.title { margin: 0px; padding: 0px; margin-left: -10px; padding-bottom: 10px; font-size: 28px; border: 1px solid red; display: none; } div.pod h2.subtitle { margin: 0px; padding: 0px; font-size: 20px; border: 1px solid green; display: none; } div.pod div.section { padding: 10px 0 10px 0; } div.pod div.section h1.title { margin-top: 12px; margin-bottom: 2px; padding: 0px; font-size: 20px; border: 1px solid blue; } div.pod div.section h2 { margin-top: 4px; margin-bottom: 2px; padding: 0px; font-size: 16px; } div.pod p { margin: 0px 0px 10px 0px; } div.pod pre { margin: 10px; padding: 10px; border: 1px solid #ddd; background-color: #f6f6f6; color: #226; } .sample { display: block; width: 100px; height: 30px; } ul.index { margin: 10px 10px 10px 0; padding: 0px; } ul.index li { list-style: none; margin: 0 0 5px 0; padding: 0; } ul.index li a { text-decoration: none; font-weight: bold; padding: 0 0 0 20px; margin: 0; color: #00AAF0; background: url('/images/arrows/ff16_blue/right.gif') no-repeat top left; } ul.index li a:hover { color: #FF7F00; background-image: url('/images/arrows/ff16_orange/right.gif'); } ul.index li p { margin: 0 0 10px 0; padding: 0 0 0 20px; } ul.toc { margin: 0 0 20px 0; padding: 0; } ul.toc li { list-style: none; margin: 0; } ul.toc li a { display: block; font-size: 14px; line-height: 16px; min-height: 14px; text-decoration: none; margin: 0; padding: 2px 0 2px 18px; background: url('/images/arrows/ff16_blue/right.gif') 0px 2px no-repeat; color: #00AAF0; } * html ul.toc li a { height: 16px; } ul.toc li.sub { margin: 0; } ul.toc li.sub a { display: block; margin: 0; padding: 2px 0 2px 40px; font-size: 12px; line-height: 14px; /* background: url('/images/arrows/ff16_blue/right.gif') 20px 2px no-repeat; */ background-image: none; background-position: 20px 2px; } ul.toc li.subsub a { display: block; margin: 0; padding: 0 0 0 60px; font-size: 12px; background: url('/images/arrows/ff16_blue/dot.gif') 40px 2px no-repeat; } ul.toc li a:hover { background-image: url('/images/arrows/ff16_orange/right.gif'); color: #FF7F00; } TT_v224_html_docs/old/css/tt2glass.css000700 000765 000765 00000035341 10626336375 017451 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* default styles */ /*------------------------------------------------------------------------*/ h1, h2, h3, h4, h5, h6 { color: #444444; } h1 { margin: 0px 0 5px 0; } p { color: #333; padding: 8px 0; } p.tight { padding: 4px 0; margin: 0; } pre { line-height: 120%; } code { color: #224; font-weight: bold; } a { text-decoration: none; color: #00AAF0; } a:visited { color: #0059a5; } a:hover { color: #FF7F00; } a:focus { -moz-outline: none; } .sample { display: block; width: 100px; height: 30px; } /*------------------------------------------------------------------------*/ /* general layout */ /*------------------------------------------------------------------------*/ body { font: 14px Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #333; margin: 0px; padding: 10px 10px 20px 10px; background: #00AAF0 url('../images/glass/blue/top_grad.gif') repeat-x top left; } #body { position: relative; margin: 0; padding: 0 0 0 220px; background: url('../images/glass/blue/left.gif') repeat-y top left; min-width: 300px; } #page { position: relative; margin: 0; padding: 0; background: white url('../images/glass/blue/right.gif') repeat-y top right; } #sidebar { position: relative; float: left; width: 220px; margin-left: -220px; padding: 0; background: url('../images/glass/blue/menu_head.gif') no-repeat top left; } #sidebar #logo { display: block; width: 220px; height: 130px; background: url('../images/glass/blue/logo_blue.gif') no-repeat top left; } #sidebar #logo:hover { background-image: url('../images/glass/blue/logo_orange.gif'); } #sidebar #menu { width: 220px; margin: 0; padding: 0; background: url('../images/glass/blue/menu_body.gif') repeat-y top left; } #sidebar #menu div.foot { height: 20px; background: url('../images/glass/blue/menu_foot.gif') no-repeat bottom left; } #header { position: relative; height: 120px; margin: 0px; padding: 0 30px 0 0; background: url('../images/glass/blue/header.gif') no-repeat top right; } #header #nav { height: 40px; } #header #trail { height: 40px; margin: 0 0 0 -10px; padding: 0 0 0 10px; background: url('../images/glass/blue/tab_pre.gif') no-repeat top left; } #header #trail li { display: block; float: left; background: url('../images/glass/blue/tab_cold.gif') no-repeat top left; padding: 0 0 0 10px; } #header #trail li a { display: block; float: left; font-size: 11px; text-decoration: none; color: #888888; line-height: 14px; height: 30px; min-width: 60px; padding: 10px 15px 0 0; background: url('../images/glass/blue/tab_cold.gif') no-repeat top right; } #header #trail li a:hover { color: #FF7F00; } #header #trail li:hover, #header #trail li:hover a { background-image: url('../images/glass/blue/tab_roll.gif'); } #header #trail li.last { background-image: url('../images/glass/blue/tab_warm.gif'); color: #444444; } #header #trail li.last a { background-image: url('../images/glass/blue/tab_warm.gif'); color: #444444; padding-right: 45px; } #header .headline { font-size: 24px; margin: 8px 0 8px 0; padding: 0 100px 0 0; color: #444444; /* border: 1px solid red; */ } #header .subhead { font-size: 16px; line-height: 18px; padding: 0 110px 0 0; margin: 0; color: #444; /* border: 1px solid red; */ } #content { margin-right: 30px; padding: 10px 40px 10px 20px; } #footer { clear: both; position: relative; margin-left: -220px; padding-left: 220px; height: 100px; background: url('../images/glass/blue/footer.gif') no-repeat bottom left; } #footer #br { position: absolute; top: 0; right: 0; width: 150px; height: 100px; background: url('../images/glass/blue/footer.gif') no-repeat bottom right; } #footer a.osi { position: absolute; display: block; left: 200px; top: 20px; width: 70px; height: 50px; cursor: pointer; background: url('../images/glass/blue/osi.gif') no-repeat top left; } #footer .copyright { text-align: center; color: #666; font-size: 12px; padding: 20px 120px 0 60px; } #footer .licence { text-align: center; padding-top: 5px; color: #888; font-size: 11px; line-height: 15px; padding: 0 150px 0 90px; } #footer .copyright a, #footer .copyright a:visited, #footer .licence a, #footer .licence a:visited { color: #40698c; } #footer .copyright a:hover, #footer .licence a:hover { color: #FF7F00; } #header .pager, #footer .pager { position: absolute; display: block; right: 10px; width: 110px; height: 36px; } #header .pager { bottom: 8px; } #footer .pager { top: 0px; height: 42px; } .pager .go { display: block; float: left; width: 32px; font-size: 10px; text-align: center; } #header .pager .go { height: 18px; padding-top: 18px; /* background: url('../images/arrows/ff24_blue/dot.gif') no-repeat top center; */ background-repeat: no-repeat; background-position: top center; } #footer .pager .go { height: 42px; padding-top: 0; background-repeat: no-repeat; background-position: bottom center; /* background: url('../images/arrows/ff24_blue/dot.gif') no-repeat bottom center; */ } .pager a.go { color: #00AAF0; } .pager span.go { color: #aaa; } .pager a.back { background-image: url('../images/arrows/ff24_blue/left.gif'); } .pager a.back:hover { background-image: url('../images/arrows/ff24_orange/left.gif'); } .pager span.back { background-image: url('../images/arrows/ff24_grey/left.gif'); } .pager a.up { background-image: url('../images/arrows/ff24_blue/up.gif'); } .pager a.up:hover { background-image: url('../images/arrows/ff24_orange/up.gif'); } .pager span.up { background-image: url('../images/arrows/ff24_grey/up.gif'); } .pager a.next { background-image: url('../images/arrows/ff24_blue/right.gif'); } .pager a.next:hover { background-image: url('../images/arrows/ff24_orange/right.gif'); } .pager span.next { background-image: url('../images/arrows/ff24_grey/right.gif'); } .pager a .about { display: none; } .pager a:hover span.about { display: block; position: absolute; right: 20px; min-width: 250px; height: 25px; padding: 0; text-align: right; color: #888888; font-size: 11px; line-height: 13px; } #header .pager a:hover span.about { top: 40px; } #footer .pager a:hover span.about { top: 58px; } /*------------------------------------------------------------------------*/ /* menu styles */ /*------------------------------------------------------------------------*/ ul.menu { list-style: none; margin: 0 20px; padding: 0; } ul.menu li { list-style: none; display: block; margin: 0; padding: 0; } ul.menu li.last { background: url('../images/glass/blue/menu_item_foot.gif') no-repeat top left; padding-top: 1px; } ul.menu li a { display: block; margin: 0; padding: 4px 8px; font-size: 13px; line-height: 16px; min-height: 16px; color: #0059a5; text-decoration: none; background: url('../images/glass/blue/menu_item_body.gif') no-repeat top left; } ul.menu li.first a { background-image: url('../images/glass/blue/menu_item_head.gif'); } ul.menu li.last a { background: url('../images/glass/blue/menu_item_foot.gif') no-repeat bottom left; } ul.menu li a:hover { color: #FF7F00; background-image: url('../images/glass/blue/menu_warm_body.gif'); */ } ul.menu li a.warm { font-weight: bold; background-image: url('../images/glass/blue/menu_warm_body.gif'); */ } ul.menu li.first a.warm, ul.menu li.first a:hover { background-image: url('../images/glass/blue/menu_warm_head.gif'); } ul.menu li.last a.warm, ul.menu li.last a:hover { background: url('../images/glass/blue/menu_warm_foot.gif') no-repeat bottom left; } ul.menu li.l1 a { padding: 3px 8px 3px 22px; font-size: 11px; } ul.menu li.l2 a { padding: 3px 8px 3px 36px; font-size: 11px; } ul.menu li.l3 a { padding: 3px 8px 3px 50px; font-size: 11px; } ul.menu li.l4 a { padding: 3px 8px 3px 64px; font-size: 11px; } ul.menu li.l5 a { padding: 3px 8px 3px 78px; font-size: 11px; } ul.menu li.l6 a { padding: 3px 8px 3px 92px; font-size: 11px; } ul.menu li.l7 a { padding: 3px 8px 3px 106px; font-size: 11px; } /*------------------------------------------------------------------------*/ /* Styles for table of contents */ /*------------------------------------------------------------------------*/ ul.toc { margin: 0 0 20px 0; padding: 0; } ul.toc li { list-style: none; margin: 0; font-size: 14px; line-height: 18px; } ul.toc li a { font-size: 14px; line-height: 16px; min-height: 14px; text-decoration: none; margin: 0; padding: 4px 0 1px 18px; background: url('../images/arrows/ff16_blue/dot.gif') 0px 4px no-repeat; color: #00AAF0; } * html ul.toc li a { height: 16px; } ul.toc li.sub { margin: 0; line-height: 14px; } ul.toc li.sub a { display: block; margin: 0; padding: 2px 0 1px 34px; font-size: 12px; line-height: 13px; background: url('../images/arrows/ff16_blue/minidot.gif') 20px 3px no-repeat; } ul.toc li.subsub a { display: block; margin: 0; padding: 0 0 0 60px; font-size: 12px; background: url('../images/arrows/ff16_blue/minidot.gif') 40px 2px no-repeat; } ul.toc li a:hover { background-image: url('../images/arrows/ff16_orange/dot.gif'); color: #FF7F00; } ul.toc li.sub a:hover, ul.toc li.subsub a:hover { background-image: url('../images/arrows/ff16_orange/minidot.gif'); color: #FF7F00; } /*------------------------------------------------------------------------*/ /* sections */ /*------------------------------------------------------------------------*/ div.section, div.subsection { padding-left: 20px; clear: right; } div.section div.head, div.subsection div.head { position: relative; margin: 6px 0px 4px 0; min-height: 20px; } div.section > div.head { border-bottom: 1px dashed #bbb; } div.subsection div.head { border-bottom: 1px dashed #ddd; margin-bottom: 2px; } div.section div.head h1 { padding: 0 80px 4px 28px; margin: 0 0 0 -28px; font-size: 18px; line-height: 22px; font-weight: bold; background: url('../images/arrows/ff24_blue/dot.gif') no-repeat top left; } div.section div.head h2 { padding: 0 80px 2px 20px; margin: 0 0 0 -20px; font-size: 16px; line-height: 20px; font-weight: bold; background: url('../images/arrows/ff16_blue/dot.gif') no-repeat 0 3px; } div.section h3 { margin: 0; padding: 5px 0 0 0; font-size: 14px; line-height: 18px; line-height: } div.section.open > div.head h1 { background-image: url('../images/arrows/ff24_blue/dotminus.gif'); } div.section.open > div.head:hover h1 { color: ; cursor: pointer; background-image: url('../images/arrows/ff24_orange/dotminus.gif'); } div.section.shut > div.head h1 { background-image: url('../images/arrows/ff24_blue/dotplus.gif'); } div.section.shut > div.head:hover h1 { color: ; cursor: pointer; background-image: url('../images/arrows/ff24_orange/dotplus.gif'); } div.subsection.open > div.head h2 { background-image: url('../images/arrows/ff16_blue/dotminus.gif'); } div.subsection.open > div.head:hover h2 { color: ; cursor: pointer; background-image: url('../images/arrows/ff16_orange/dotminus.gif'); } div.subsection.shut > div.head h2 { background-image: url('../images/arrows/ff16_blue/dotplus.gif'); } div.subsection.shut > div.head:hover h2 { color: ; cursor: pointer; background-image: url('../images/arrows/ff16_orange/dotplus.gif'); } div.section div.head a.top { position: absolute; bottom: 4px; right: 0px; padding: 0px 20px 0px 0; margin: 0px; width: 25px; text-align: right; font-size: 11px; height: 16px; background: url('../images/arrows/ff16_blue/up.gif') no-repeat 28px 3px; } div.section div.head a.top:hover { background-image: url('../images/arrows/ff16_orange/up.gif'); } div.section div.head a.open, div.section div.head a.shut, div.subsection div.head a.open, div.subsection div.head a.shut { position: absolute; bottom: 4px; right: 45px; margin: 0px; padding: 0px 5px; font-size: 11px; height: 16px; width: 3em; text-align: right; border-right: 1px solid #ddd; display: none; } div.section.shut > div.head a.open, div.subsection.shut div.head a.open { display: block; } div.section.shut > div.head a.shut, div.subsection.shut div.head a.shut { display: none; } div.section.open > div.head a.open, div.subsection.open div.head a.open { display: none; } div.section.open > div.head a.shut, div.subsection.open div.head a.shut { display: block; } div.section div.body { display: block; margin: 0; padding: 0 0 10px 0; } div.subsection div.body { display: block; padding: 0 0 10px 0; } div.section.shut div.body, div.subsection.shut div.body { display: none; } /*------------------------------------------------------------------------*/ /* Index page list */ /*------------------------------------------------------------------------*/ ul.index { margin: 10px 10px 10px 0; padding: 0px; } ul.index li { list-style: none; margin: 0 0 5px 0; padding: 0; } ul.index li a { text-decoration: none; font-weight: bold; padding: 0 0 0 20px; margin: 0; color: ; background: url('../images/arrows/ff16_blue/right.gif') no-repeat top left; } ul.index li a:hover { color: ; background-image: url('../images/arrows/ff16_orange/right.gif'); } ul.index li p { margin: 0 0 10px 0; padding: 0 0 0 20px; } /*------------------------------------------------------------------------*/ /* POD markup */ /*------------------------------------------------------------------------*/ div.pod { } div.pod p { margin: 0px 0px 10px 0px; } div.pod pre { margin: 10px 0 10px 20px; padding: 10px; border: 1px solid #ddd; background-color: #f6f6f6; color: #226; } TT_v224_html_docs/modules/index.html000700 000765 000765 00000060732 11756705105 017271 0ustar00abwabw000000 000000 Template::Modules

Template Toolkit Modules

Top

This documentation provides an overview of the different modules that comprise the Template Toolkit.

Template

Top

The Template module is the front-end to the Template Toolkit for Perl programmers.

use Template;
my $tt = Template->new();
$tt->process('hello.html', message => 'Hello World');

Template::Base

Top

The Template::Base module implements a base class from which the other Template Toolkit modules are derived. It implements common functionality for creating objects, error reporting, debugging, and so on.

Template::Config

Top

The Template::Config module defines the configuration of the Template Toolkit for your system. It is an example of a factory module which is responsible for instantiating the various other modules used in the Template Toolkit.

For example, the Template::Config module defines the $STASH package variable which indicates which version of the Template::Stash you are using by default. If you elected to use the faster XS stash when you installed the Template Toolkit, then this will be set as:

$STASH = 'Template::Stash::XS';

Otherwise you'll get the regular Perl stash:

$STASH = 'Template::Stash';

This approach means that other parts of the Template Toolkit don't have to worry about which stash you're using. They just ask the Template::Config module to create a stash of the right kind.

Template::Constants

Top

The Template::Constants defines a number of constants that are used by the Template Toolkit.

For example, the :chomp tagset defines the CHOMP_??? constants that can be used with the PRE_CHOMP and POST_CHOMP configuration options.

use Template::Constants ':chomp';
my $tt = Template->new({
    PRE_CHOMP => CHOMP_COLLAPSE,
});

Template::Context

Top

The Template::Context module defines a runtime context in which templates are processed. A context keeps track of all the templates, variables, plugins, and other resources that are available (either directly or through delegate objects) and provides methods to fetch, store, and perform various operations on them.

Template::Document

Top

The Template::Document module implements a compiled template document object. This is generated by the Template::Parser module.

Template::Exception

Top

The Template::Exception module implements an exception object which is used for runtime error reporting.

Template::Filters

Top

The Template::Filters module implements a filter provider. It includes the core collection of filters that can be used via the FILTER directive.

Template::Iterator

Top

The Template::Iterator module implements a data iterator which steps through each item in a list in turn. It is used by the FOREACH directive. Within a FOREACH block, the loop variable always references the current iterator object.

[%  FOREACH item IN list;
      IF loop.first;
         # first item in loop
      ELSIF loop.last;
         # last item in loop
      ELSE;
         # any other item in loop
      END;
    END
%]

Template::Namespace::Constants

Top

The Template::Namespace::Constants module is used internally to represent constants. These can be resolved immediately at the point that a template is compiled.

Template::Parser

Top

The Template::Parser module is used to parse a source template and turn it into Perl code which can be executed.

Template::Plugin

Top

The Template::Plugin module is a base class for Template Toolkit plugins that can be loaded on demand from within a template using the USE directive.

Template::Plugins

Top

The Template::Plugins module is the plugins provider. It loads and prepares plugins as and when they are requested from within a template.

Template::Provider

Top

The Template::Provider module is responsible for loading, compiling and caching templates.

Template::Service

Top

The Template::Service module implements a service layer that sits just behind the Template module, and just in front of a Template::Context. It handles each request to process a template (forwarded from the Template module). It adds any headers and/or footers (specified via the PRE_PROCESS and POST_PROCESS options), applies any wrapper (the WRAPPER option) and catches any errors returned (the ERRORS option).

Template::Stash

Top

The Template::Stash module is used to fetch and store template variables. It implements all of the magic associated with the dot operator.

Template::Stash::XS

Top

The Template::Stash::XS module is a high-speed implementation of Template::Stash written in C.

Template::Test

Top

The Template::Test module is used to automate the Template Toolkit test scripts.


TT_v224_html_docs/modules/Template/000700 000765 000765 00000000000 11756705152 017036 5ustar00abwabw000000 000000 TT_v224_html_docs/modules/Template.html000700 000765 000765 00000203305 11756705113 017727 0ustar00abwabw000000 000000 Template

SYNOPSIS

Top
use Template;

# some useful options (see below for full list)
my $config = {
    INCLUDE_PATH => '/search/path',  # or list ref
    INTERPOLATE  => 1,               # expand "$var" in plain text
    POST_CHOMP   => 1,               # cleanup whitespace
    PRE_PROCESS  => 'header',        # prefix each template
    EVAL_PERL    => 1,               # evaluate Perl code blocks
};

# create Template object
my $template = Template->new($config);

# define template variables for replacement
my $vars = {
    var1  => $value,
    var2  => \%hash,
    var3  => \@list,
    var4  => \&code,
    var5  => $object,
};

# specify input filename, or file handle, text reference, etc.
my $input = 'myfile.html';

# process input template, substituting variables
$template->process($input, $vars)
    || die $template->error();

DESCRIPTION

Top

This documentation describes the Template module which is the direct Perl interface into the Template Toolkit. It covers the use of the module and gives a brief summary of configuration options and template directives. Please see Template::Manual for the complete reference manual which goes into much greater depth about the features and use of the Template Toolkit. The Template::Tutorial is also available as an introductory guide to using the Template Toolkit.

METHODS

Top

new(\%config)

Top

The new() constructor method (implemented by the Template::Base base class) instantiates a new Template object. A reference to a hash array of configuration items may be passed as a parameter.

my $tt = Template->new({
    INCLUDE_PATH => '/usr/local/templates',
    EVAL_PERL    => 1,
}) || die $Template::ERROR, "\n";

A reference to a new Template object is returned, or undef on error. In the latter case, the error message can be retrieved by calling error() as a class method or by examining the $Template::ERROR package variable directly.

my $tt = Template->new(\%config)
    || die Template->error(), "\n";

my $tt = Template->new(\%config)
    || die $Template::ERROR, "\n";

For convenience, configuration items may also be specified as a list of items instead of a hash array reference. These are automatically folded into a hash array by the constructor.

my $tt = Template->new(INCLUDE_PATH => '/tmp', POST_CHOMP => 1)
    || die $Template::ERROR, "\n";

process($template, \%vars, $output, %options)

Top

The process() method is called to process a template. The first parameter indicates the input template as one of: a filename relative to INCLUDE_PATH, if defined; a reference to a text string containing the template text; or a file handle reference (e.g. IO::Handle or sub-class) or GLOB (e.g. \*STDIN), from which the template can be read. A reference to a hash array may be passed as the second parameter, containing definitions of template variables.

# filename
$tt->process('welcome.tt2')
    || die $tt->error(), "\n";

# text reference
$text = "[% INCLUDE header %]\nHello world!\n[% INCLUDE footer %]";
$tt->process(\$text)
    || die $tt->error(), "\n";

# file handle (GLOB)
$tt->process(\*DATA)
    || die $tt->error(), "\n";

__END__
[% INCLUDE header %]
This is a template defined in the __END__ section which is
accessible via the DATA "file handle".
[% INCLUDE footer %]

By default, the processed template output is printed to STDOUT. The process() method then returns 1 to indicate success. A third parameter may be passed to the process() method to specify a different output location. This value may be one of: a plain string indicating a filename which will be opened (relative to OUTPUT_PATH, if defined) and the output written to; a file GLOB opened ready for output; a reference to a scalar (e.g. a text string) to which output/error is appended; a reference to a subroutine which is called, passing the output as a parameter; or any object reference which implements a print() method (e.g. IO::Handle, Apache::Request, etc.) which will be called, passing the generated output as a parameter.

Examples:

# output filename
$tt->process('welcome.tt2', $vars, 'welcome.html')
    || die $tt->error(), "\n";

# reference to output subroutine
sub myout {
    my $output = shift;
    ...
}
$tt->process('welcome.tt2', $vars, \&myout)
    || die $tt->error(), "\n";

# reference to output text string
my $output = '';
$tt->process('welcome.tt2', $vars, \$output)
    || die $tt->error(), "\n";

print "output: $output\n";

In an Apache/mod_perl handler:

sub handler {
    my $req = shift;

    # ...your code here...

    # direct output to Apache::Request via $req->print($output)
    $tt->process($file, $vars, $req) || do {
        $req->log_reason($tt->error());
        return SERVER_ERROR;
    };
    return OK;
}

After the optional third output argument can come an optional reference to a hash or a list of (name, value) pairs providing further options for the output. The only option currently supported is binmode which, when set to any true value will ensure that files created (but not any existing file handles passed) will be set to binary mode.

# either: hash reference of options
$tt->process($infile, $vars, $outfile, { binmode => 1 })
    || die $tt->error(), "\n";

# or: list of name, value pairs
$tt->process($infile, $vars, $outfile, binmode => 1)
    || die $tt->error(), "\n";

Alternately, the binmode argument can specify a particular IO layer such as :utf8.

$tt->process($infile, $vars, $outfile, binmode => ':utf8')
    || die $tt->error(), "\n";

The OUTPUT configuration item can be used to specify a default output location other than \*STDOUT. The OUTPUT_PATH specifies a directory which should be prefixed to all output locations specified as filenames.

my $tt = Template->new({
    OUTPUT      => sub { ... },       # default
    OUTPUT_PATH => '/tmp',
...
}) || die Template->error(), "\n";

# use default OUTPUT (sub is called)
$tt->process('welcome.tt2', $vars)
    || die $tt->error(), "\n";

# write file to '/tmp/welcome.html'
$tt->process('welcome.tt2', $vars, 'welcome.html')
    || die $tt->error(), "\n";

The process() method returns 1 on success or undef on error. The error message generated in the latter case can be retrieved by calling the error() method. See also CONFIGURATION SUMMARY which describes how error handling may be further customised.

error()

Top

When called as a class method, it returns the value of the $ERROR package variable. Thus, the following are equivalent.

my $tt = Template->new()
    || die Template->error(), "\n";

my $tt = Template->new()
    || die $Template::ERROR, "\n";

When called as an object method, it returns the value of the internal _ERROR variable, as set by an error condition in a previous call to process().

$tt->process('welcome.tt2')
    || die $tt->error(), "\n";

Errors are represented in the Template Toolkit by objects of the Template::Exception class. If the process() method returns a false value then the error() method can be called to return an object of this class. The type() and info() methods can called on the object to retrieve the error type and information string, respectively. The as_string() method can be called to return a string of the form $type - $info. This method is also overloaded onto the stringification operator allowing the object reference itself to be printed to return the formatted error string.

$tt->process('somefile') || do {
    my $error = $tt->error();
    print "error type: ", $error->type(), "\n";
    print "error info: ", $error->info(), "\n";
    print $error, "\n";
};

service()

Top

The Template module delegates most of the effort of processing templates to an underlying Template::Service object. This method returns a reference to that object.

context()

Top

The Template::Service module uses a core Template::Context object for runtime processing of templates. This method returns a reference to that object and is equivalent to $template->service->context().

template($name)

Top

This method is a simple wrapper around the Template::Context method of the same name. It returns a compiled template for the source provided as an argument.

CONFIGURATION SUMMARY

Top

The following list gives a short summary of each Template Toolkit configuration option. See Template::Manual::Config for full details.

Template Style and Parsing Options

Top

START_TAG, END_TAG

Define tokens that indicate start and end of directives (default: '[%' and '%]').

TAG_STYLE

Set START_TAG and END_TAG according to a pre-defined style (default: 'template', as above).

PRE_CHOMP, POST_CHOMP

Removes whitespace before/after directives (default: 0/0).

TRIM

Remove leading and trailing whitespace from template output (default: 0).

INTERPOLATE

Interpolate variables embedded like $this or ${this} (default: 0).

ANYCASE

Allow directive keywords in lower case (default: 0 - UPPER only).

Template Files and Blocks

Top

INCLUDE_PATH

One or more directories to search for templates.

DELIMITER

Delimiter for separating paths in INCLUDE_PATH (default: ':').

ABSOLUTE

Allow absolute file names, e.g. /foo/bar.html (default: 0).

RELATIVE

Allow relative filenames, e.g. ../foo/bar.html (default: 0).

DEFAULT

Default template to use when another not found.

BLOCKS

Hash array pre-defining template blocks.

AUTO_RESET

Enabled by default causing BLOCK definitions to be reset each time a template is processed. Disable to allow BLOCK definitions to persist.

RECURSION

Flag to permit recursion into templates (default: 0).

Template Variables

Top

VARIABLES

Hash array of variables and values to pre-define in the stash.

Runtime Processing Options

Top

EVAL_PERL

Flag to indicate if PERL/RAWPERL blocks should be processed (default: 0).

PRE_PROCESS, POST_PROCESS

Name of template(s) to process before/after main template.

PROCESS

Name of template(s) to process instead of main template.

ERROR

Name of error template or reference to hash array mapping error types to templates.

OUTPUT

Default output location or handler.

OUTPUT_PATH

Directory into which output files can be written.

DEBUG

Enable debugging messages.

Caching and Compiling Options

Top

CACHE_SIZE

Maximum number of compiled templates to cache in memory (default: undef - cache all)

COMPILE_EXT

Filename extension for compiled template files (default: undef - don't compile).

COMPILE_DIR

Root of directory in which compiled template files should be written (default: undef - don't compile).

Plugins and Filters

Top

PLUGINS

Reference to a hash array mapping plugin names to Perl packages.

PLUGIN_BASE

One or more base classes under which plugins may be found.

LOAD_PERL

Flag to indicate regular Perl modules should be loaded if a named plugin can't be found (default: 0).

FILTERS

Hash array mapping filter names to filter subroutines or factories.

Customisation and Extension

Top

LOAD_TEMPLATES

List of template providers.

LOAD_PLUGINS

List of plugin providers.

LOAD_FILTERS

List of filter providers.

TOLERANT

Set providers to tolerate errors as declinations (default: 0).

SERVICE

Reference to a custom service object (default: Template::Service).

CONTEXT

Reference to a custom context object (default: Template::Context).

STASH

Reference to a custom stash object (default: Template::Stash).

PARSER

Reference to a custom parser object (default: Template::Parser).

GRAMMAR

Reference to a custom grammar object (default: Template::Grammar).

DIRECTIVE SUMMARY

Top

The following list gives a short summary of each Template Toolkit directive. See Template::Manual::Directives for full details.

GET

Top

Evaluate and print a variable or value.

[%   GET variable %]    # 'GET' keyword is optional
[%       variable %]
[%       hash.key %]
[%         list.n %]
[%     code(args) %]
[% obj.meth(args) %]
[%  "value: $var" %]

CALL

Top

As per GET but without printing result (e.g. call code)

[%  CALL variable %]

SET

Top

Assign a values to variables.

[% SET variable = value %]    # 'SET' also optional
[%     variable = other_variable
       variable = 'literal text @ $100'
       variable = "interpolated text: $var"
       list     = [ val, val, val, val, ... ]
       list     = [ val..val ]
       hash     = { var => val, var => val, ... }
%]

DEFAULT

Top

Like SET, but variables are only set if currently unset (i.e. have no true value).

[% DEFAULT variable = value %]

INSERT

Top

Insert a file without any processing performed on the contents.

[% INSERT legalese.txt %]

PROCESS

Top

Process another template file or block and insert the generated output. Any template BLOCKs or variables defined or updated in the PROCESSed template will thereafter be defined in the calling template.

[% PROCESS template %]
[% PROCESS template  var = val, ... %]

INCLUDE

Top

Similar to PROCESS, but using a local copy of the current variables. Any template BLOCKs or variables defined in the INCLUDEd template remain local to it.

[% INCLUDE template %]
[% INCLUDE template  var = val, ... %]

WRAPPER

Top

The content between the WRAPPER and correspondng END directives is first evaluated, with the output generated being stored in the content variable. The named template is then process as per INCLUDE.

[% WRAPPER layout %]
   Some template markup [% blah %]...
[% END %]

A simple layout template might look something like this:

Your header here...
[% content %]
Your footer here...

BLOCK

Top

Define a named template block for INCLUDE, PROCESS and WRAPPER to use.

[% BLOCK hello %]
   Hello World
[% END %]

[% INCLUDE hello %]

FOREACH

Top

Repeat the enclosed FOREACH ... END block for each value in the list.

[% FOREACH variable IN [ val, val, val ] %]    # either
[% FOREACH variable IN list %]                 # or
   The variable is set to [% variable %]
[% END %]

WHILE

Top

The block enclosed between WHILE and END block is processed while the specified condition is true.

[% WHILE condition %]
   content
[% END %]

IF / UNLESS / ELSIF / ELSE

Top

The enclosed block is processed if the condition is true / false.

[% IF condition %]
   content
[% ELSIF condition %]
 content
[% ELSE %]
 content
[% END %]

[% UNLESS condition %]
   content
[% # ELSIF/ELSE as per IF, above %]
   content
[% END %]

SWITCH / CASE

Top

Multi-way switch/case statement.

[% SWITCH variable %]
[%   CASE val1 %]
       content
[%   CASE [ val2, val3 ] %]
       content
[%   CASE %]         # or [% CASE DEFAULT %]
       content
[% END %]

MACRO

Top

Define a named macro.

[% MACRO name <directive> %]
[% MACRO name(arg1, arg2) <directive> %]
...
[% name %]
[% name(val1, val2) %]

FILTER

Top

Process enclosed FILTER ... END block then pipe through a filter.

[% FILTER name %]                       # either
[% FILTER name( params ) %]             # or
[% FILTER alias = name( params ) %]     # or
   content
[% END %]

USE

Top

Load a plugin module (see Template::<Manual::Plugins), or any regular Perl module when the LOAD_PERL option is set.

[% USE name %]                      # either
[% USE name( params ) %]            # or
[% USE var = name( params ) %]      # or
...
[% name.method %]
[% var.method %]

PERL / RAWPERL

Top

Evaluate enclosed blocks as Perl code (requires the EVAL_PERL option to be set).

[% PERL %]
 # perl code goes here
 $stash->set('foo', 10);
 print "set 'foo' to ", $stash->get('foo'), "\n";
 print $context->include('footer', { var => $val });
[% END %]

[% RAWPERL %]
   # raw perl code goes here, no magic but fast.
   $output .= 'some output';
[% END %]

TRY / THROW / CATCH / FINAL

Top

Exception handling.

[% TRY %]
 content
   [% THROW type info %]
[% CATCH type %]
 catch content
   [% error.type %] [% error.info %]
[% CATCH %] # or [% CATCH DEFAULT %]
 content
[% FINAL %]
   this block is always processed
[% END %]

NEXT

Top

Jump straight to the next item in a FOREACH or WHILE loop.

[% NEXT %]

LAST

Top

Break out of FOREACH or WHILE loop.

[% LAST %]

RETURN

Top

Stop processing current template and return to including templates.

[% RETURN %]

STOP

Top

Stop processing all templates and return to caller.

[% STOP %]

TAGS

Top

Define new tag style or characters (default: [% %]).

[% TAGS html %]
[% TAGS <!-- --> %]

COMMENTS

Top

Ignored and deleted.

[% # this is a comment to the end of line
   foo = 'bar'
%]

[%# placing the '#' immediately inside the directive
    tag comments out the entire directive
%]

SOURCE CODE REPOSITORY

Top

The source code for the Template Toolkit is held in a public git repository on Github: https://github.com/abw/Template2

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

VERSION

Top

Template Toolkit version 2.24, released February 2012.

COPYRIGHT

Top

Copyright (C) 1996-2012 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Base.html000700 000765 000765 00000043577 11756705105 020617 0ustar00abwabw000000 000000 Template::Base

SYNOPSIS

Top
package My::Module;
use base qw( Template::Base );

sub _init {
    my ($self, $config) = @_;
    $self->{ doodah } = $config->{ doodah }
        || return $self->error("No 'doodah' specified");
    return $self;
}

package main;

my $object = My::Module->new({ doodah => 'foobar' })
    || die My::Module->error();

DESCRIPTION

Top

Base class module which implements a constructor and error reporting functionality for various Template Toolkit modules.

PUBLIC METHODS

Top

new(\%config)

Top

Constructor method which accepts a reference to a hash array or a list of name => value parameters which are folded into a hash. The _init() method is then called, passing the configuration hash and should return true/false to indicate success or failure. A new object reference is returned, or undef on error. Any error message raised can be examined via the error() class method or directly via the $ERROR package variable in the derived class.

my $module = My::Module->new({ ... })
    || die My::Module->error(), "\n";

my $module = My::Module->new({ ... })
    || die "constructor error: $My::Module::ERROR\n";

error($msg, ...)

Top

May be called as an object method to get/set the internal _ERROR member or as a class method to get/set the $ERROR variable in the derived class's package.

my $module = My::Module->new({ ... })
    || die My::Module->error(), "\n";

$module->do_something() 
    || die $module->error(), "\n";

When called with parameters (multiple params are concatenated), this method will set the relevant variable and return undef. This is most often used within object methods to report errors to the caller.

package My::Module;

sub foobar {
    my $self = shift;

    # some other code...

    return $self->error('some kind of error...')
        if $some_condition;
}

debug($msg, ...)

Top

Generates a debugging message by concatenating all arguments passed into a string and printing it to STDERR. A prefix is added to indicate the module of the caller.

package My::Module;

sub foobar {
    my $self = shift;

    $self->debug('called foobar()');

    # some other code...
}

When the foobar() method is called, the following message is sent to STDERR:

[My::Module] called foobar()

Objects can set an internal DEBUG value which the debug() method will examine. If this value sets the relevant bits to indicate DEBUG_CALLER then the file and line number of the caller will be appened to the message.

use Template::Constants qw( :debug );

my $module = My::Module->new({
    DEBUG => DEBUG_SERVICE | DEBUG_CONTEXT | DEBUG_CALLER,
});

$module->foobar();

This generates an error message such as:

[My::Module] called foobar() at My/Module.pm line 6

module_version()

Top

Returns the version number for a module, as defined by the $VERSION package variable.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

TT_v224_html_docs/modules/Template/Config.html000700 000765 000765 00000057661 11756705105 021151 0ustar00abwabw000000 000000 Template::Config

SYNOPSIS

Top
use Template::Config;

DESCRIPTION

Top

This module implements various methods for loading and instantiating other modules that comprise the Template Toolkit. It provides a consistent way to create toolkit components and allows custom modules to be used in place of the regular ones.

Package variables such as $STASH, $SERVICE, $CONTEXT, etc., contain the default module/package name for each component (Template::Stash, Template::Service and Template::Context, respectively) and are used by the various factory methods (stash(), service() and context()) to load the appropriate module. Changing these package variables will cause subsequent calls to the relevant factory method to load and instantiate an object from the new class.

PUBLIC METHODS

Top

load($module)

Top

Load a module using Perl's require(). Any occurences of '::' in the module name are be converted to '/', and '.pm' is appended. Returns 1 on success or undef on error. Use $class->error() to examine the error string.

preload()

Top

This method preloads all the other Template::* modules that are likely to be used. It is called automatically by the Template module when running under mod_perl ($ENV{MOD_PERL} is set).

parser(\%config)

Top

Instantiate a new parser object of the class whose name is denoted by the package variable $PARSER (default: Template::Parser). Returns a reference to a newly instantiated parser object or undef on error.

provider(\%config)

Top

Instantiate a new template provider object (default: Template::Provider). Returns an object reference or undef on error, as above.

plugins(\%config)

Top

Instantiate a new plugins provider object (default: Template::Plugins). Returns an object reference or undef on error, as above.

filters(\%config)

Top

Instantiate a new filter provider object (default: Template::Filters). Returns an object reference or undef on error, as above.

stash(\%vars)

Top

Instantiate a new stash object (Template::Stash or Template::Stash::XS depending on the default set at installation time) using the contents of the optional hash array passed by parameter as initial variable definitions. Returns an object reference or undef on error, as above.

context(\%config)

Top

Instantiate a new template context object (default: Template::Context). Returns an object reference or undef on error, as above.

service(\%config)

Top

Instantiate a new template service object (default: Template::Service). Returns an object reference or undef on error, as above.

iterator(\%config)

Top

Instantiate a new template iterator object (default: Template::Iterator). Returns an object reference or undef on error, as above.

constants(\%config)

Top

Instantiate a new namespace handler for compile time constant folding (default: Template::Namespace::Constants). Returns an object reference or undef on error, as above.

instdir($dir)

Top

Returns the root directory of the Template Toolkit installation under which optional components are installed. Any relative directory specified as an argument will be appended to the returned directory.

# e.g. returns '/usr/local/tt2'
my $ttroot = Template::Config->instdir()
    || die "$Template::Config::ERROR\n";

# e.g. returns '/usr/local/tt2/templates'
my $template = Template::Config->instdir('templates')
    || die "$Template::Config::ERROR\n";

Returns undef and sets $Template::Config::ERROR appropriately if the optional components of the Template Toolkit have not been installed.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

TT_v224_html_docs/modules/Template/Constants.html000700 000765 000765 00000036446 11756705105 021716 0ustar00abwabw000000 000000 Template::Constants

SYNOPSIS

Top
use Template::Constants qw( :status :error :all );

DESCRIPTION

Top

The Template::Constants modules defines, and optionally exports into the caller's namespace, a number of constants used by the Template package.

Constants may be used by specifying the Template::Constants package explicitly:

use Template::Constants;
print Template::Constants::STATUS_DECLINED;

Constants may be imported into the caller's namespace by naming them as options to the use Template::Constants statement:

use Template::Constants qw( STATUS_DECLINED );
print STATUS_DECLINED;

Alternatively, one of the following tagset identifiers may be specified to import sets of constants: ':status', ':error', ':all'.

use Template::Constants qw( :status );
print STATUS_DECLINED;

Consult the documentation for the Exporter module for more information on exporting variables.

EXPORTABLE TAG SETS

Top

The following tag sets and associated constants are defined:

:status
    STATUS_OK             # no problem, continue
    STATUS_RETURN         # ended current block then continue (ok)
    STATUS_STOP           # controlled stop (ok) 
    STATUS_DONE           # iterator is all done (ok)
    STATUS_DECLINED       # provider declined to service request (ok)
    STATUS_ERROR          # general error condition (not ok)

:error
    ERROR_RETURN          # return a status code (e.g. 'stop')
    ERROR_FILE            # file error: I/O, parse, recursion
    ERROR_UNDEF           # undefined variable value used
    ERROR_PERL            # error in [% PERL %] block
    ERROR_FILTER          # filter error
    ERROR_PLUGIN          # plugin error

:chomp                  # for PRE_CHOMP and POST_CHOMP
    CHOMP_NONE            # do not remove whitespace
    CHOMP_ONE             # remove whitespace to newline
    CHOMP_ALL             # old name for CHOMP_ONE (deprecated)
    CHOMP_COLLAPSE        # collapse whitespace to a single space
    CHOMP_GREEDY          # remove all whitespace including newlines

:debug
    DEBUG_OFF             # do nothing
    DEBUG_ON              # basic debugging flag
    DEBUG_UNDEF           # throw undef on undefined variables
    DEBUG_VARS            # general variable debugging
    DEBUG_DIRS            # directive debugging
    DEBUG_STASH           # general stash debugging
    DEBUG_CONTEXT         # context debugging
    DEBUG_PARSER          # parser debugging
    DEBUG_PROVIDER        # provider debugging
    DEBUG_PLUGINS         # plugins debugging
    DEBUG_FILTERS         # filters debugging
    DEBUG_SERVICE         # context debugging
    DEBUG_ALL             # everything
    DEBUG_CALLER          # add caller file/line info
    DEBUG_FLAGS           # bitmap used internally

:all
    All the above constants.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

Template, Exporter


TT_v224_html_docs/modules/Template/Context.html000700 000765 000765 00000157452 11756705105 021367 0ustar00abwabw000000 000000 Template::Context

SYNOPSIS

Top
use Template::Context;

# constructor
$context = Template::Context->new(\%config)
    || die $Template::Context::ERROR;

# fetch (load and compile) a template
$template = $context->template($template_name);

# fetch (load and instantiate) a plugin object
$plugin = $context->plugin($name, \@args);

# fetch (return or create) a filter subroutine
$filter = $context->filter($name, \@args, $alias);

# process/include a template, errors are thrown via die()
$output = $context->process($template, \%vars);
$output = $context->include($template, \%vars);

# raise an exception via die()
$context->throw($error_type, $error_message, \$output_buffer);

# catch an exception, clean it up and fix output buffer
$exception = $context->catch($exception, \$output_buffer);

# save/restore the stash to effect variable localisation
$new_stash = $context->localise(\%vars);
$old_stash = $context->delocalise();

# add new BLOCK or FILTER definitions
$context->define_block($name, $block);
$context->define_filter($name, \&filtersub, $is_dynamic);

# reset context, clearing any imported BLOCK definitions
$context->reset();

# methods for accessing internal items
$stash     = $context->stash();
$tflag     = $context->trim();
$epflag    = $context->eval_perl();
$providers = $context->templates();
$providers = $context->plugins();
$providers = $context->filters();
...

DESCRIPTION

Top

The Template::Context module defines an object class for representing a runtime context in which templates are processed. It provides an interface to the fundamental operations of the Template Toolkit processing engine through which compiled templates (i.e. Perl code constructed from the template source) can process templates, load plugins and filters, raise exceptions and so on.

A default Template::Context object is created by the Template module. Any Template::Context options may be passed to the Template new() constructor method and will be forwarded to the Template::Context constructor.

use Template;

my $template = Template->new({
    TRIM      => 1,
    EVAL_PERL => 1,
    BLOCKS    => {
        header => 'This is the header',
        footer => 'This is the footer',
    },
});

Similarly, the Template::Context constructor will forward all configuration parameters onto other default objects (e.g. Template::Provider, Template::Plugins, Template::Filters, etc.) that it may need to instantiate.

$context = Template::Context->new({
    INCLUDE_PATH => '/home/abw/templates', # provider option
    TAG_STYLE    => 'html',                # parser option
});

A Template::Context object (or subclass) can be explicitly instantiated and passed to the Template new() constructor method as the CONTEXT configuration item.

use Template;
use Template::Context;

my $context  = Template::Context->new({ TRIM => 1 });
my $template = Template->new({ CONTEXT => $context });

The Template module uses the Template::Config context() factory method to create a default context object when required. The $Template::Config::CONTEXT package variable may be set to specify an alternate context module. This will be loaded automatically and its new() constructor method called by the context() factory method when a default context object is required.

use Template;

$Template::Config::CONTEXT = 'MyOrg::Template::Context';

my $template = Template->new({
    EVAL_PERL   => 1,
    EXTRA_MAGIC => 'red hot',  # your extra config items
    ...
});

METHODS

Top

new(\%params)

Top

The new() constructor method is called to instantiate a Template::Context object. Configuration parameters may be specified as a HASH reference or as a list of name => value pairs.

my $context = Template::Context->new({
    INCLUDE_PATH => 'header',
    POST_PROCESS => 'footer',
});

my $context = Template::Context->new( EVAL_PERL => 1 );

The new() method returns a Template::Context object or undef on error. In the latter case, a relevant error message can be retrieved by the error() class method or directly from the $Template::Context::ERROR package variable.

my $context = Template::Context->new(\%config)
    || die Template::Context->error();

my $context = Template::Context->new(\%config)
    || die $Template::Context::ERROR;

The following configuration items may be specified. Please see Template::Manual::Config for further details.

VARIABLES

The VARIABLES option can be used to specify a hash array of template variables.

my $context = Template::Context->new({
    VARIABLES => {
        title   => 'A Demo Page',
        author  => 'Joe Random Hacker',
        version => 3.14,
    },
};

BLOCKS

The BLOCKS option can be used to pre-define a default set of template blocks.

my $context = Template::Context->new({
    BLOCKS => {
        header  => 'The Header.  [% title %]',
        footer  => sub { return $some_output_text },
        another => Template::Document->new({ ... }),
    },
});

VIEWS

The VIEWS option can be used to pre-define one or more Template::View objects.

my $context = Template::Context->new({
    VIEWS => [
        bottom => { prefix => 'bottom/' },
        middle => { prefix => 'middle/', base => 'bottom' },
        top    => { prefix => 'top/',    base => 'middle' },
    ],
});

TRIM

The TRIM option can be set to have any leading and trailing whitespace automatically removed from the output of all template files and BLOCKs.

example:

[% BLOCK foo %]

Line 1 of foo

[% END %]

before 
[% INCLUDE foo %]
after

output:

before
Line 1 of foo
after

EVAL_PERL

The EVAL_PERL is used to indicate if PERL and/or RAWPERL blocks should be evaluated. It is disabled by default.

RECURSION

The RECURSION can be set to allow templates to recursively process themselves, either directly (e.g. template foo calls INCLUDE foo) or indirectly (e.g. foo calls INCLUDE bar which calls INCLUDE foo).

LOAD_TEMPLATES

The LOAD_TEMPLATES option can be used to provide a reference to a list of Template::Provider objects or sub-classes thereof which will take responsibility for loading and compiling templates.

my $context = Template::Context->new({
    LOAD_TEMPLATES => [
        MyOrg::Template::Provider->new({ ... }),
        Template::Provider->new({ ... }),
    ],
});

LOAD_PLUGINS

The LOAD_PLUGINS options can be used to specify a list of provider objects responsible for loading and instantiating template plugin objects.

my $context = Template::Context->new({
    LOAD_PLUGINS => [
        MyOrg::Template::Plugins->new({ ... }),
        Template::Plugins->new({ ... }),
    ],
});

LOAD_FILTERS

The LOAD_FILTERS option can be used to specify a list of provider objects for returning and/or creating filter subroutines.

my $context = Template::Context->new({
    LOAD_FILTERS => [
        MyTemplate::Filters->new(),
        Template::Filters->new(),
    ],
});

STASH

The STASH option can be used to specify a Template::Stash object or sub-class which will take responsibility for managing template variables.

my $stash = MyOrg::Template::Stash->new({ ... });
my $context = Template::Context->new({
    STASH => $stash,
});

DEBUG

The DEBUG option can be used to enable various debugging features of the Template::Context module.

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_CONTEXT | DEBUG_DIRS,
});

template($name)

Top

Returns a compiled template by querying each of the LOAD_TEMPLATES providers (instances of Template::Provider, or sub-class) in turn.

$template = $context->template('header');

On error, a Template::Exception object of type 'file' is thrown via die(). This can be caught by enclosing the call to template() in an eval block and examining $@.

eval { $template = $context->template('header') };
if ($@) {
    print "failed to fetch template: $@\n";
}

plugin($name, \@args)

Top

Instantiates a plugin object by querying each of the LOAD_PLUGINS providers. The default LOAD_PLUGINS provider is a Template::Plugins object which attempts to load plugin modules, according the various configuration items such as PLUGIN_BASE, LOAD_PERL, etc., and then instantiate an object via new(). A reference to a list of constructor arguments may be passed as the second parameter. These are forwarded to the plugin constructor.

Returns a reference to a plugin (which is generally an object, but doesn't have to be). Errors are thrown as Template::Exception objects with the type set to 'plugin'.

$plugin = $context->plugin('DBI', 'dbi:msql:mydbname');

filter($name, \@args, $alias)

Top

Instantiates a filter subroutine by querying the LOAD_FILTERS providers. The default LOAD_FILTERS provider is a Template::Filters object.

Additional arguments may be passed by list reference along with an optional alias under which the filter will be cached for subsequent use. The filter is cached under its own $name if $alias is undefined. Subsequent calls to filter($name) will return the cached entry, if defined. Specifying arguments bypasses the caching mechanism and always creates a new filter. Errors are thrown as Template::Exception objects with the type set to 'filter'.

# static filter (no args)
$filter = $context->filter('html');

# dynamic filter (args) aliased to 'padright'
$filter = $context->filter('format', '%60s', 'padright');

# retrieve previous filter via 'padright' alias
$filter = $context->filter('padright');

process($template, \%vars)

Top

Processes a template named or referenced by the first parameter and returns the output generated. An optional reference to a hash array may be passed as the second parameter, containing variable definitions which will be set before the template is processed. The template is processed in the current context, with no localisation of variables performed. Errors are thrown as Template::Exception objects via die().

$output = $context->process('header', { title => 'Hello World' });

include($template, \%vars)

Top

Similar to process(), but using localised variables. Changes made to any variables will only persist until the include() method completes.

$output = $context->include('header', { title => 'Hello World' });

insert($template)

Top

This method returns the source content of a template file without performing any evaluation. It is used to implement the INSERT directive.

throw($error_type, $error_message, \$output)

Top

Raises an exception in the form of a Template::Exception object by calling die(). This method may be passed a reference to an existing Template::Exception object; a single value containing an error message which is used to instantiate a Template::Exception of type 'undef'; or a pair of values representing the exception type and info from which a Template::Exception object is instantiated. e.g.

$context->throw($exception);
$context->throw("I'm sorry Dave, I can't do that");
$context->throw('denied', "I'm sorry Dave, I can't do that");

The optional third parameter may be a reference to the current output buffer. This is then stored in the exception object when created, allowing the catcher to examine and use the output up to the point at which the exception was raised.

$output .= 'blah blah blah';
$output .= 'more rhubarb';
$context->throw('yack', 'Too much yacking', \$output);

catch($exception, \$output)

Top

Catches an exception thrown, either as a reference to a Template::Exception object or some other value. In the latter case, the error string is promoted to a Template::Exception object of 'undef' type. This method also accepts a reference to the current output buffer which is passed to the Template::Exception constructor, or is appended to the output buffer stored in an existing Template::Exception object, if unique (i.e. not the same reference). By this process, the correct state of the output buffer can be reconstructed for simple or nested throws.

define_block($name, $block)

Top

Adds a new block definition to the internal BLOCKS cache. The first argument should contain the name of the block and the second a reference to a Template::Document object or template sub-routine, or template text which is automatically compiled into a template sub-routine.

Returns a true value (the sub-routine or Template::Document reference) on success or undef on failure. The relevant error message can be retrieved by calling the error() method.

define_filter($name, \&filter, $is_dynamic)

Top

Adds a new filter definition by calling the store() method on each of the LOAD_FILTERS providers until accepted (in the usual case, this is accepted straight away by the one and only Template::Filters provider). The first argument should contain the name of the filter and the second a reference to a filter subroutine. The optional third argument can be set to any true value to indicate that the subroutine is a dynamic filter factory.

Returns a true value or throws a 'filter' exception on error.

define_vmethod($type, $name, $code)

Top

This method is a wrapper around the Template::Stash define_vmethod() method. It can be used to define new virtual methods.

# define a new scalar (item) virtual method
$context->define_vmethod(
    item => ucfirst => sub {
        my $text = shift;
        return ucfirst $text;
    }
)

define_view($name, \%params)

Top

This method allows you to define a named view.

$context->define_view( 
    my_view => { 
        prefix => 'my_templates/' 
    } 
);

The view is then accessible as a template variable.

[% my_view.print(some_data) %]

define_views($views)

Top

This method allows you to define multiple named views. A reference to a hash array or list reference should be passed as an argument.

$context->define_view({     # hash reference
    my_view_one => { 
        prefix => 'my_templates_one/' 
    },
    my_view_two => { 
        prefix => 'my_templates_two/' 
    } 
});

If you're defining multiple views of which one or more are based on other views in the same definition then you should pass them as a list reference. This ensures that they get created in the right order (Perl does not preserve the order of items defined in a hash reference so you can't guarantee that your base class view will be defined before your subclass view).

$context->define_view([     # list referenence
    my_view_one => {
        prefix => 'my_templates_one/' 
    },
    my_view_two => { 
        prefix => 'my_templates_two/' ,
        base   => 'my_view_one',
    } 
]);

The views are then accessible as template variables.

[% my_view_one.print(some_data) %]
[% my_view_two.print(some_data) %]

See also the VIEWS option.

stash()

Top

This method returns the Template::Stash object used internally to manage template variables.

localise(\%vars)

Top

Clones the stash to create a context with localised variables. Returns a reference to the newly cloned stash object which is also stored internally.

$stash = $context->localise();

delocalise()

Top

Restore the stash to its state prior to localisation.

$stash = $context->delocalise();

visit(\%blocks)

Top

This method is called by Template::Document objects immediately before they process their content. It is called to register any local BLOCK definitions with the context object so that they may be subsequently delivered on request.

leave()

Top

Compliment to the visit() method. Called by Template::Document objects immediately after they process their content.

view()

Top

This method creates a Template::View object bound to the context.

reset()

Top

Clears the local BLOCKS cache of any BLOCK definitions. Any initial set of BLOCKS specified as a configuration item to the constructor will be reinstated.

debugging($flag, @args)

Top

This method is used to control debugging output. It is used to implement the DEBUG directive.

The first argument can be on or off to enable or disable debugging respectively. The numerical values 0 and 1 can also be used if you prefer.

$context->debugging('on');

Alternately, the first argument can be format to define a new debug message format. The second argument should be the format string which can contain any of the $file, $line or $text symbols to indicate where the relevant values should be inserted.

# note single quotes to prevent interpolated of variables
$context->debugging( format => '## $file line $line: $text' );

The final use of this method is to generate debugging messages themselves. The first argument should be msg, followed by a reference to a hash array of value to insert into the debugging format string.

$context->debugging( 
    msg => {
        line => 20,
        file => 'example.tt',
        text => 'Trampoline! Trampoline!',
    }
);

AUTOLOAD

Top

An AUTOLOAD method provides access to context configuration items.

$stash     = $context->stash();
$tflag     = $context->trim();
$epflag    = $context->eval_perl();
...

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2012 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Directive.html000700 000765 000765 00000027432 11756705105 021653 0ustar00abwabw000000 000000 Template::Directive

SYNOPSIS

Top
# no user serviceable parts inside

DESCRIPTION

Top

The Template::Directive module defines a number of methods that generate Perl code for the runtime representation of the various Template Toolkit directives.

It is used internally by the Template::Parser module.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Document.html000700 000765 000765 00000067714 11756705106 021523 0ustar00abwabw000000 000000 Template::Document

SYNOPSIS

Top
use Template::Document;

$doc = Template::Document->new({
    BLOCK => sub { # some perl code; return $some_text },
    DEFBLOCKS => {
        header => sub { # more perl code; return $some_text },
        footer => sub { # blah blah blah; return $some_text },
    },
    METADATA => {
        author  => 'Andy Wardley',
        version => 3.14,
    }
}) || die $Template::Document::ERROR;

print $doc->process($context);

DESCRIPTION

Top

This module defines an object class whose instances represent compiled template documents. The Template::Parser module creates a Template::Document instance to encapsulate a template as it is compiled into Perl code.

The constructor method, new(), expects a reference to a hash array containing the BLOCK, DEFBLOCKS and METADATA items.

The BLOCK item should contain a reference to a Perl subroutine or a textual representation of Perl code, as generated by the Template::Parser module. This is then evaluated into a subroutine reference using eval().

The DEFLOCKS item should reference a hash array containing further named BLOCKs which may be defined in the template. The keys represent BLOCK names and the values should be subroutine references or text strings of Perl code as per the main BLOCK item.

The METADATA item should reference a hash array of metadata items relevant to the document.

The process() method can then be called on the instantiated Template::Document object, passing a reference to a Template::Context object as the first parameter. This will install any locally defined blocks (DEFBLOCKS) in the BLOCKS cache in the context (via a call to visit()) so that they may be subsequently resolved by the context. The main BLOCK subroutine is then executed, passing the context reference on as a parameter. The text returned from the template subroutine is then returned by the process() method, after calling the context leave() method to permit cleanup and de-registration of named BLOCKS previously installed.

An AUTOLOAD method provides access to the METADATA items for the document. The Template::Service module installs a reference to the main Template::Document object in the stash as the template variable. This allows metadata items to be accessed from within templates, including PRE_PROCESS templates.

header:

<html>
<head>
<title>[% template.title %]
</head>
...

Template::Document objects are usually created by the Template::Parser but can be manually instantiated or sub-classed to provide custom template components.

METHODS

Top

new(\%config)

Top

Constructor method which accept a reference to a hash array containing the structure as shown in this example:

$doc = Template::Document->new({
    BLOCK => sub { # some perl code; return $some_text },
    DEFBLOCKS => {
        header => sub { # more perl code; return $some_text },
        footer => sub { # blah blah blah; return $some_text },
    },
    METADATA => {
        author  => 'Andy Wardley',
        version => 3.14,
    }
}) || die $Template::Document::ERROR;

BLOCK and DEFBLOCKS items may be expressed as references to Perl subroutines or as text strings containing Perl subroutine definitions, as is generated by the Template::Parser module. These are evaluated into subroutine references using eval().

Returns a new Template::Document object or undef on error. The error() class method can be called, or the $ERROR package variable inspected to retrieve the relevant error message.

process($context)

Top

Main processing routine for the compiled template document. A reference to a Template::Context object should be passed as the first parameter. The method installs any locally defined blocks via a call to the context visit() method, processes its own template, (passing the context reference as a parameter) and then calls leave() in the context to allow cleanup.

print $doc->process($context);

Returns a text string representing the generated output for the template. Errors are thrown via die().

block()

Top

Returns a reference to the main BLOCK subroutine.

blocks()

Top

Returns a reference to the hash array of named DEFBLOCKS subroutines.

variables()

Top

Returns a reference to a hash of variables used in the template. This requires the TRACE_VARS option to be enabled.

AUTOLOAD

Top

An autoload method returns METADATA items.

print $doc->author();

CLASS METHODS

Top

These methods are used internally.

as_perl($content)

Top

This method generate a Perl representation of the template.

my $perl = Template::Document->as_perl({
    BLOCK     => $main_block,
    DEFBLOCKS => {
        foo   => $foo_block,
        bar   => $bar_block,
    },
    METADATA  => {
        name  => 'my_template',
    }
});

write_perl_file(\%config)

Top

This method is used to write compiled Perl templates to disk. If the COMPILE_EXT option (to indicate a file extension for saving compiled templates) then the Template::Parser module calls this subroutine before calling the new() constructor. At this stage, the parser has a representation of the template as text strings containing Perl code. We can write that to a file, enclosed in a small wrapper which will allow us to susequently require() the file and have Perl parse and compile it into a Template::Document. Thus we have persistence of compiled templates.

INTERNAL FUNCTIONS

Top

catch_warnings()

Top

This is a simple handler used to catch any errors that arise when the compiled Perl template is first evaluated (that is, evaluated by Perl to create a template subroutine at compile, rather than the template being processed at runtime).

is_utf8()

Top

This is mapped to utf8::is_utf8 for versions of Perl that have it (> 5.008) or to Encode::is_utf8 for Perl 5.008. Earlier versions of Perl are not supported.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2012 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Exception.html000700 000765 000765 00000037234 11756705106 021675 0ustar00abwabw000000 000000 Template::Exception

SYNOPSIS

Top
use Template::Exception;

my $exception = Template::Exception->new($type, $info);
$type = $exception->type;
$info = $exception->info;
($type, $info) = $exception->type_info;

print $exception->as_string();

$handler = $exception->select_handler(\@candidates);

DESCRIPTION

Top

The Template::Exception module defines an object class for representing exceptions within the template processing life cycle. Exceptions can be raised by modules within the Template Toolkit, or can be generated and returned by user code bound to template variables.

Exceptions can be raised in a template using the THROW directive,

[% THROW user.login 'no user id: please login' %]

or by calling the throw() method on the current Template::Context object,

$context->throw('user.passwd', 'Incorrect Password');
$context->throw('Incorrect Password');    # type 'undef'

or from Perl code by calling die() with a Template::Exception object,

die (Template::Exception->new('user.denied', 'Invalid User ID'));

or by simply calling die() with an error string. This is automagically caught and converted to an exception of 'undef' type (that's the literal string 'undef' rather than Perl's undefined value) which can then be handled in the usual way.

die "I'm sorry Dave, I can't do that";

Each exception is defined by its type and a information component (e.g. error message). The type can be any identifying string and may contain dotted components (e.g. 'foo', 'foo.bar', 'foo.bar.baz'). Exception types are considered to be hierarchical such that 'foo.bar' would be a specific type of the more general 'foo' type.

METHODS

Top

type()

Top

Returns the exception type.

info()

Top

Returns the exception information.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Filters.html000700 000765 000765 00000055537 11756705106 021355 0ustar00abwabw000000 000000 Template::Filters

SYNOPSIS

Top
use Template::Filters;

$filters = Template::Filters->new(\%config);

($filter, $error) = $filters->fetch($name, \@args, $context);

if ($filter) {
    print &$filter("some text");
}
else {
    print "Could not fetch $name filter: $error\n";
}

DESCRIPTION

Top

The Template::Filters module implements a provider for creating subroutines that implement the standard filters. Additional custom filters may be provided via the FILTERS configuration option.

METHODS

Top

new(\%params)

Top

Constructor method which instantiates and returns a reference to a Template::Filters object. A reference to a hash array of configuration items may be passed as a parameter. These are described below.

my $filters = Template::Filters->new({
    FILTERS => { ... },
});

my $template = Template->new({
    LOAD_FILTERS => [ $filters ],
});

A default Template::Filters module is created by the Template module if the LOAD_FILTERS option isn't specified. All configuration parameters are forwarded to the constructor.

$template = Template->new({
    FILTERS => { ... },
});

fetch($name, \@args, $context)

Top

Called to request that a filter of a given name be provided. The name of the filter should be specified as the first parameter. This should be one of the standard filters or one specified in the FILTERS configuration hash. The second argument should be a reference to an array containing configuration parameters for the filter. This may be specified as 0, or undef where no parameters are provided. The third argument should be a reference to the current Template::Context object.

The method returns a reference to a filter sub-routine on success. It may also return (undef, STATUS_DECLINE) to decline the request, to allow delegation onto other filter providers in the LOAD_FILTERS chain of responsibility. On error, ($error, STATUS_ERROR) is returned where $error is an error message or Template::Exception object indicating the error that occurred.

When the TOLERANT option is set, errors are automatically downgraded to a STATUS_DECLINE response.

use_html_entities()

Top

This class method can be called to configure the html_entity filter to use the HTML::Entities module. An error will be raised if it is not installed on your system.

use Template::Filters;
Template::Filters->use_html_entities();

use_apache_util()

Top

This class method can be called to configure the html_entity filter to use the Apache::Util module. An error will be raised if it is not installed on your system.

use Template::Filters;
Template::Filters->use_apache_util();

CONFIGURATION OPTIONS

Top

The following list summarises the configuration options that can be provided to the Template::Filters new() constructor. Please see Template::Manual::Config for further information about each option.

FILTERS

Top

The FILTERS option can be used to specify custom filters which can then be used with the FILTER directive like any other. These are added to the standard filters which are available by default.

$filters = Template::Filters->new({
    FILTERS => {
        'sfilt1' =>   \&static_filter,
        'dfilt1' => [ \&dyanamic_filter_factory, 1 ],
    },
});

TOLERANT

Top

The TOLERANT flag can be set to indicate that the Template::Filters module should ignore any errors and instead return STATUS_DECLINED.

DEBUG

Top

The DEBUG option can be used to enable debugging messages for the Template::Filters module by setting it to include the DEBUG_FILTERS value.

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_FILTERS | DEBUG_PLUGINS,
});

STANDARD FILTERS

Top

Please see Template::Manual::Filters for a list of the filters provided with the Template Toolkit, complete with examples of use.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Grammar.html000700 000765 000765 00000030142 11756705106 021314 0ustar00abwabw000000 000000 Template::Grammar

SYNOPSIS

Top
# no user serviceable parts inside

DESCRIPTION

Top

This module defines the state and rule tables that the Template::Parser module uses to parse templates. It is generated from a YACC-like grammar using the Parse::Yapp module. The parser sub-directory of the Template Toolkit source distribution contains the grammar and other files required to generate this module.

But you don't need to worry about any of that unless you're planning to modify the Template Toolkit language.

AUTHOR

Top

Andy Wardley <abw@wardley.org>

http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/index.html000700 000765 000765 00000026226 11756705106 021045 0ustar00abwabw000000 000000 Template::* Modules

Section Index

Top

This section contains the documentation for the Template::* modules.


TT_v224_html_docs/modules/Template/Iterator.html000700 000765 000765 00000071046 11756705106 021527 0ustar00abwabw000000 000000 Template::Iterator

SYNOPSIS

Top
my $iter = Template::Iterator->new(\@data, \%options);

DESCRIPTION

Top

The Template::Iterator module defines a generic data iterator for use by the FOREACH directive.

It may be used as the base class for custom iterators.

PUBLIC METHODS

Top

new($data)

Top

Constructor method. A reference to a list of values is passed as the first parameter. Subsequent calls to get_first() and get_next() calls will return each element from the list.

my $iter = Template::Iterator->new([ 'foo', 'bar', 'baz' ]);

The constructor will also accept a reference to a hash array and will expand it into a list in which each entry is a hash array containing a 'key' and 'value' item, sorted according to the hash keys.

my $iter = Template::Iterator->new({ 
    foo => 'Foo Item',
    bar => 'Bar Item',
});

This is equivalent to:

my $iter = Template::Iterator->new([
    { key => 'bar', value => 'Bar Item' },
    { key => 'foo', value => 'Foo Item' },
]);

When passed a single item which is not an array reference, the constructor will automatically create a list containing that single item.

my $iter = Template::Iterator->new('foo');

This is equivalent to:

my $iter = Template::Iterator->new([ 'foo' ]);

Note that a single item which is an object based on a blessed ARRAY references will NOT be treated as an array and will be folded into a list containing that one object reference.

my $list = bless [ 'foo', 'bar' ], 'MyListClass';
my $iter = Template::Iterator->new($list);

equivalent to:

my $iter = Template::Iterator->new([ $list ]);

If the object provides an as_list() method then the Template::Iterator constructor will call that method to return the list of data. For example:

package MyListObject;

sub new {
    my $class = shift;
    bless [ @_ ], $class;
}

package main;

my $list = MyListObject->new('foo', 'bar');
my $iter = Template::Iterator->new($list);

This is then functionally equivalent to:

my $iter = Template::Iterator->new([ $list ]);

The iterator will return only one item, a reference to the MyListObject object, $list.

By adding an as_list() method to the MyListObject class, we can force the Template::Iterator constructor to treat the object as a list and use the data contained within.

package MyListObject;

...

sub as_list {
    my $self = shift;
    return $self;
}

package main;

my $list = MyListObject->new('foo', 'bar');
my $iter = Template::Iterator->new($list);

The iterator will now return the two items, 'foo' and 'bar', which the MyObjectList encapsulates.

get_first()

Top

Returns a ($value, $error) pair for the first item in the iterator set. The $error returned may be zero or undefined to indicate a valid datum was successfully returned. Returns an error of STATUS_DONE if the list is empty.

get_next()

Top

Returns a ($value, $error) pair for the next item in the iterator set. Returns an error of STATUS_DONE if all items in the list have been visited.

get_all()

Top

Returns a (\@values, $error) pair for all remaining items in the iterator set. Returns an error of STATUS_DONE if all items in the list have been visited.

size()

Top

Returns the size of the data set or undef if unknown.

max()

Top

Returns the maximum index number (i.e. the index of the last element) which is equivalent to size() - 1.

index()

Top

Returns the current index number which is in the range 0 to max().

count()

Top

Returns the current iteration count in the range 1 to size(). This is equivalent to index() + 1.

first()

Top

Returns a boolean value to indicate if the iterator is currently on the first iteration of the set.

last()

Top

Returns a boolean value to indicate if the iterator is currently on the last iteration of the set.

prev()

Top

Returns the previous item in the data set, or undef if the iterator is on the first item.

next()

Top

Returns the next item in the data set or undef if the iterator is on the last item.

parity()

Top

Returns the text string even or odd to indicate the parity of the current iteration count (starting at 1). This is typically used to create striped zebra tables.

<table>
[% FOREACH name IN ['Arthur', 'Ford', 'Trillian'] -%]
  <tr class="[% loop.parity %]">
    <td>[% name %]</td>
  </tr>
[% END %]
</table>

This will produce the following output:

<table>
  <tr class="odd">
    <td>Arthur</td>
  </tr>
  <tr class="even">
    <td>Ford</td>
  </tr>
  <tr class="odd">
    <td>Trillian</td>
  </tr>
</table>

You can then style the tr.odd and tr.even elements using CSS:

tr.odd td {
    background-color: black;
    color: white;
}

tr.even td {
    background-color: white;
    color: black;
}

odd()

Top

Returns a boolean (0/1) value to indicate if the current iterator count (starting at 1) is an odd number. In other words, this will return a true value for the first iterator, the third, fifth, and so on.

even()

Top

Returns a boolean (0/1) value to indicate if the current iterator count (starting at 1) is an even number. In other words, this will return a true value for the second iteration, the fourth, sixth, and so on.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

TT_v224_html_docs/modules/Template/Namespace/000700 000765 000765 00000000000 11756705152 020732 5ustar00abwabw000000 000000 TT_v224_html_docs/modules/Template/Parser.html000700 000765 000765 00000060430 11756705107 021166 0ustar00abwabw000000 000000 Template::Parser

SYNOPSIS

Top
use Template::Parser;

$parser   = Template::Parser->new(\%config);
$template = $parser->parse($text)
    || die $parser->error(), "\n";

DESCRIPTION

Top

The Template::Parser module implements a LALR(1) parser and associated methods for parsing template documents into Perl code.

PUBLIC METHODS

Top

new(\%params)

Top

The new() constructor creates and returns a reference to a new Template::Parser object.

A reference to a hash may be supplied as a parameter to provide configuration values. See CONFIGURATION OPTIONS below for a summary of these options and Template::Manual::Config for full details.

my $parser = Template::Parser->new({
    START_TAG => quotemeta('<+'),
    END_TAG   => quotemeta('+>'),
});

parse($text)

Top

The parse() method parses the text passed in the first parameter and returns a reference to a hash array of data defining the compiled representation of the template text, suitable for passing to the Template::Document new() constructor method. On error, undef is returned.

$data = $parser->parse($text)
    || die $parser->error();

The $data hash reference returned contains a BLOCK item containing the compiled Perl code for the template, a DEFBLOCKS item containing a reference to a hash array of sub-template BLOCKs defined within in the template, and a METADATA item containing a reference to a hash array of metadata values defined in META tags.

CONFIGURATION OPTIONS

Top

The Template::Parser module accepts the following configuration options. Please see Template::Manual::Config for futher details on each option.

START_TAG, END_TAG

Top

The START_TAG and END_TAG options are used to specify character sequences or regular expressions that mark the start and end of a template directive.

my $parser = Template::Parser->new({ 
    START_TAG => quotemeta('<+'),
    END_TAG   => quotemeta('+>'),
});

TAG_STYLE

Top

The TAG_STYLE option can be used to set both START_TAG and END_TAG according to pre-defined tag styles.

my $parser = Template::Parser->new({ 
    TAG_STYLE => 'star',     # [* ... *]
});

PRE_CHOMP, POST_CHOMP

Top

The PRE_CHOMP and POST_CHOMP can be set to remove any whitespace before or after a directive tag, respectively.

my $parser = Template::Parser-E<gt>new({
    PRE_CHOMP  => 1,
    POST_CHOMP => 1,
});

INTERPOLATE

Top

The INTERPOLATE flag can be set to allow variables to be embedded in plain text blocks.

my $parser = Template::Parser->new({ 
    INTERPOLATE => 1,
});

Variables should be prefixed by a $ to identify them, using curly braces to explicitly scope the variable name where necessary.

Hello ${name},

The day today is ${day.today}.

ANYCASE

Top

The ANYCASE option can be set to allow directive keywords to be specified in any case.

# with ANYCASE set to 1
[% INCLUDE foobar %]    # OK
[% include foobar %]    # OK
[% include = 10   %]    # ERROR, 'include' is a reserved word

GRAMMAR

Top

The GRAMMAR configuration item can be used to specify an alternate grammar for the parser. This allows a modified or entirely new template language to be constructed and used by the Template Toolkit.

use MyOrg::Template::Grammar;

my $parser = Template::Parser->new({ 
    GRAMMAR = MyOrg::Template::Grammar->new();
});

By default, an instance of the default Template::Grammar will be created and used automatically if a GRAMMAR item isn't specified.

DEBUG

Top

The DEBUG option can be used to enable various debugging features of the Template::Parser module.

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_PARSER | DEBUG_DIRS,
});

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

The main parsing loop of the Template::Parser module was derived from a standalone parser generated by version 0.16 of the Parse::Yapp module. The following copyright notice appears in the Parse::Yapp documentation.

The Parse::Yapp module and its related modules and shell
scripts are copyright (c) 1998 Francois Desarmenien,
France. All rights reserved.

You may use and distribute them under the terms of either
the GNU General Public License or the Artistic License, as
specified in the Perl README file.

TT_v224_html_docs/modules/Template/Plugin/000700 000765 000765 00000000000 11756705152 020274 5ustar00abwabw000000 000000 TT_v224_html_docs/modules/Template/Plugin.html000700 000765 000765 00000053063 11756705112 021170 0ustar00abwabw000000 000000 Template::Plugin

SYNOPSIS

Top
package MyOrg::Template::Plugin::MyPlugin;
use base qw( Template::Plugin );
use Template::Plugin;
use MyModule;

sub new {
    my $class   = shift;
    my $context = shift;
    bless {
        ...
    }, $class;
}

DESCRIPTION

Top

A "plugin" for the Template Toolkit is simply a Perl module which exists in a known package location (e.g. Template::Plugin::*) and conforms to a regular standard, allowing it to be loaded and used automatically.

The Template::Plugin module defines a base class from which other plugin modules can be derived. A plugin does not have to be derived from Template::Plugin but should at least conform to its object-oriented interface.

It is recommended that you create plugins in your own package namespace to avoid conflict with toolkit plugins. e.g.

package MyOrg::Template::Plugin::FooBar;

Use the PLUGIN_BASE option to specify the namespace that you use. e.g.

use Template;
my $template = Template->new({ 
    PLUGIN_BASE => 'MyOrg::Template::Plugin',
});

METHODS

Top

The following methods form the basic interface between the Template Toolkit and plugin modules.

load($context)

Top

This method is called by the Template Toolkit when the plugin module is first loaded. It is called as a package method and thus implicitly receives the package name as the first parameter. A reference to the Template::Context object loading the plugin is also passed. The default behaviour for the load() method is to simply return the class name. The calling context then uses this class name to call the new() package method.

package MyPlugin;

sub load {               # called as MyPlugin->load($context)
    my ($class, $context) = @_;
    return $class;       # returns 'MyPlugin'
}

new($context, @params)

Top

This method is called to instantiate a new plugin object for the USE directive. It is called as a package method against the class name returned by load(). A reference to the Template::Context object creating the plugin is passed, along with any additional parameters specified in the USE directive.

sub new {                # called as MyPlugin->new($context)
    my ($class, $context, @params) = @_;
    bless {
        _CONTEXT => $context,
    }, $class;           # returns blessed MyPlugin object
}

error($error)

Top

This method, inherited from the Template::Base module, is used for reporting and returning errors. It can be called as a package method to set/return the $ERROR package variable, or as an object method to set/return the object _ERROR member. When called with an argument, it sets the relevant variable and returns undef. When called without an argument, it returns the value of the variable.

package MyPlugin;
use base 'Template::Plugin';

sub new {
    my ($class, $context, $dsn) = @_;

    return $class->error('No data source specified')
        unless $dsn;

    bless {
        _DSN => $dsn,
    }, $class;
}

package main;

my $something = MyPlugin->new()
    || die MyPlugin->error(), "\n";

$something->do_something()
    || die $something->error(), "\n";

DEEPER MAGIC

Top

The Template::Context object that handles the loading and use of plugins calls the new() and error() methods against the package name returned by the load() method. In pseudo-code terms looks something like this:

$class  = MyPlugin->load($context);       # returns 'MyPlugin'

$object = $class->new($context, @params)  # MyPlugin->new(...)
    || die $class->error();               # MyPlugin->error()

The load() method may alterately return a blessed reference to an object instance. In this case, new() and error() are then called as object methods against that prototype instance.

package YourPlugin;

sub load {
    my ($class, $context) = @_;
    bless {
        _CONTEXT => $context,
    }, $class;
}

sub new {
    my ($self, $context, @params) = @_;
    return $self;
}

In this example, we have implemented a 'Singleton' plugin. One object gets created when load() is called and this simply returns itself for each call to new().

Another implementation might require individual objects to be created for every call to new(), but with each object sharing a reference to some other object to maintain cached data, database handles, etc. This pseudo-code example demonstrates the principle.

package MyServer;

sub load {
    my ($class, $context) = @_;
    bless {
        _CONTEXT => $context,
        _CACHE   => { },
    }, $class;
}

sub new {
    my ($self, $context, @params) = @_;
    MyClient->new($self, @params);
}

sub add_to_cache   { ... }

sub get_from_cache { ... }

package MyClient;

sub new {
    my ($class, $server, $blah) = @_;
    bless {
        _SERVER => $server,
        _BLAH   => $blah,
    }, $class;
}

sub get {
    my $self = shift;
    $self->{ _SERVER }->get_from_cache(@_);
}

sub put {
    my $self = shift;
    $self->{ _SERVER }->add_to_cache(@_);
}

When the plugin is loaded, a MyServer instance is created. The new() method is called against this object which instantiates and returns a MyClient object, primed to communicate with the creating MyServer.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugins.html000700 000765 000765 00000057041 11756705112 021353 0ustar00abwabw000000 000000 Template::Plugins

SYNOPSIS

Top
use Template::Plugins;

$plugin_provider = Template::Plugins->new(\%options);

($plugin, $error) = $plugin_provider->fetch($name, @args);

DESCRIPTION

Top

The Template::Plugins module defines a provider class which can be used to load and instantiate Template Toolkit plugin modules.

METHODS

Top

new(\%params)

Top

Constructor method which instantiates and returns a reference to a Template::Plugins object. A reference to a hash array of configuration items may be passed as a parameter. These are described below.

Note that the Template front-end module creates a Template::Plugins provider, passing all configuration items. Thus, the examples shown below in the form:

$plugprov = Template::Plugins->new({
    PLUGIN_BASE => 'MyTemplate::Plugin',
    LOAD_PERL   => 1,
    ...
});

can also be used via the Template module as:

$ttengine = Template->new({
    PLUGIN_BASE => 'MyTemplate::Plugin',
    LOAD_PERL   => 1,
    ...
});

as well as the more explicit form of:

$plugprov = Template::Plugins->new({
    PLUGIN_BASE => 'MyTemplate::Plugin',
    LOAD_PERL   => 1,
    ...
});

$ttengine = Template->new({
    LOAD_PLUGINS => [ $plugprov ],
});

fetch($name, @args)

Top

Called to request that a plugin of a given name be provided. The relevant module is first loaded (if necessary) and the load() class method called to return the factory class name (usually the same package name) or a factory object (a prototype). The new() method is then called as a class or object method against the factory, passing all remaining parameters.

Returns a reference to a new plugin object or ($error, STATUS_ERROR) on error. May also return (undef, STATUS_DECLINED) to decline to serve the request. If TOLERANT is set then all errors will be returned as declines.

CONFIGURATION OPTIONS

Top

The following list summarises the configuration options that can be provided to the Template::Plugins new() constructor. Please consult Template::Manual::Config for further details and examples of each configuration option in use.

PLUGINS

Top

The PLUGINS option can be used to provide a reference to a hash array that maps plugin names to Perl module names.

my $plugins = Template::Plugins->new({
    PLUGINS => {
        cgi => 'MyOrg::Template::Plugin::CGI',
        foo => 'MyOrg::Template::Plugin::Foo',
        bar => 'MyOrg::Template::Plugin::Bar',
    },  
});

PLUGIN_BASE

Top

If a plugin is not defined in the PLUGINS hash then the PLUGIN_BASE is used to attempt to construct a correct Perl module name which can be successfully loaded.

# single value PLUGIN_BASE
my $plugins = Template::Plugins->new({
    PLUGIN_BASE => 'MyOrg::Template::Plugin',
});

# multiple value PLUGIN_BASE
my $plugins = Template::Plugins->new({
    PLUGIN_BASE => [   'MyOrg::Template::Plugin',
                       'YourOrg::Template::Plugin'  ],
});

LOAD_PERL

Top

The LOAD_PERL option can be set to allow you to load regular Perl modules (i.e. those that don't reside in the Template::Plugin or another user-defined namespace) as plugins.

If a plugin cannot be loaded using the PLUGINS or PLUGIN_BASE approaches then, if the LOAD_PERL is set, the provider will make a final attempt to load the module without prepending any prefix to the module path.

Unlike regular plugins, modules loaded using LOAD_PERL do not receive a Template::Context reference as the first argument to the new() constructor method.

TOLERANT

Top

The TOLERANT flag can be set to indicate that the Template::Plugins module should ignore any errors encountered while loading a plugin and instead return STATUS_DECLINED.

DEBUG

Top

The DEBUG option can be used to enable debugging messages for the Template::Plugins module by setting it to include the DEBUG_PLUGINS value.

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_FILTERS | DEBUG_PLUGINS,
});

TEMPLATE TOOLKIT PLUGINS

Top

Please see Template::Manual::Plugins For a complete list of all the plugin modules distributed with the Template Toolkit.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Provider.html000700 000765 000765 00000112413 11756705112 021517 0ustar00abwabw000000 000000 Template::Provider

SYNOPSIS

Top
$provider = Template::Provider->new(\%options);

($template, $error) = $provider->fetch($name);

DESCRIPTION

Top

The Template::Provider is used to load, parse, compile and cache template documents. This object may be sub-classed to provide more specific facilities for loading, or otherwise providing access to templates.

The Template::Context objects maintain a list of Template::Provider objects which are polled in turn (via fetch()) to return a requested template. Each may return a compiled template, raise an error, or decline to serve the request, giving subsequent providers a chance to do so.

The Template::Provider can also be subclassed to provide templates from a different source, e.g. a database. See SUBCLASSING below.

This documentation needs work.

PUBLIC METHODS

Top

new(\%options)

Top

Constructor method which instantiates and returns a new Template::Provider object. A reference to a hash array of configuration options may be passed.

See CONFIGURATION OPTIONS below for a summary of configuration options and Template::Manual::Config for full details.

fetch($name)

Top

Returns a compiled template for the name specified. If the template cannot be found then (undef, STATUS_DECLINED) is returned. If an error occurs (e.g. read error, parse error) then ($error, STATUS_ERROR) is returned, where $error is the error message generated. If the TOLERANT option is set the the method returns (undef, STATUS_DECLINED) instead of returning an error.

load($name)

Top

Loads a template without parsing or compiling it. This is used by the the INSERT directive.

store($name, $template)

Top

Stores the compiled template, $template, in the cache under the name, $name. Susbequent calls to fetch($name) will return this template in preference to any disk-based file.

include_path(\@newpath)

Top

Accessor method for the INCLUDE_PATH setting. If called with an argument, this method will replace the existing INCLUDE_PATH with the new value.

paths()

Top

This method generates a copy of the INCLUDE_PATH list. Any elements in the list which are dynamic generators (e.g. references to subroutines or objects implementing a paths() method) will be called and the list of directories returned merged into the output list.

It is possible to provide a generator which returns itself, thus sending this method into an infinite loop. To detect and prevent this from happening, the $MAX_DIRS package variable, set to 64 by default, limits the maximum number of paths that can be added to, or generated for the output list. If this number is exceeded then the method will immediately return an error reporting as much.

CONFIGURATION OPTIONS

Top

The following list summarises the configuration options that can be provided to the Template::Provider new() constructor. Please consult Template::Manual::Config for further details and examples of each configuration option in use.

INCLUDE_PATH

Top

The INCLUDE_PATH option is used to specify one or more directories in which template files are located.

# single path
my $provider = Template::Provider->new({
    INCLUDE_PATH => '/usr/local/templates',
});

# multiple paths
my $provider = Template::Provider->new({
    INCLUDE_PATH => [ '/usr/local/templates', 
                      '/tmp/my/templates' ],
});

ABSOLUTE

Top

The ABSOLUTE flag is used to indicate if templates specified with absolute filenames (e.g. '/foo/bar') should be processed. It is disabled by default and any attempt to load a template by such a name will cause a 'file' exception to be raised.

my $provider = Template::Provider->new({
    ABSOLUTE => 1,
});

RELATIVE

Top

The RELATIVE flag is used to indicate if templates specified with filenames relative to the current directory (e.g. ./foo/bar or ../../some/where/else) should be loaded. It is also disabled by default, and will raise a file error if such template names are encountered.

my $provider = Template::Provider->new({
    RELATIVE => 1,
});

DEFAULT

Top

The DEFAULT option can be used to specify a default template which should be used whenever a specified template can't be found in the INCLUDE_PATH.

my $provider = Template::Provider->new({
    DEFAULT => 'notfound.html',
});

If a non-existant template is requested through the Template process() method, or by an INCLUDE, PROCESS or WRAPPER directive, then the DEFAULT template will instead be processed, if defined. Note that the DEFAULT template is not used when templates are specified with absolute or relative filenames, or as a reference to a input file handle or text string.

ENCODING

Top

The Template Toolkit will automatically decode Unicode templates that have a Byte Order Marker (BOM) at the start of the file. This option can be used to set the default encoding for templates that don't define a BOM.

my $provider = Template::Provider->new({
    ENCODING => 'utf8',
});

See Encode for further information.

CACHE_SIZE

Top

The CACHE_SIZE option can be used to limit the number of compiled templates that the module should cache. By default, the CACHE_SIZE is undefined and all compiled templates are cached.

my $provider = Template::Provider->new({
    CACHE_SIZE => 64,   # only cache 64 compiled templates
});

STAT_TTL

Top

The STAT_TTL value can be set to control how long the Template::Provider will keep a template cached in memory before checking to see if the source template has changed.

my $provider = Template::Provider->new({
    STAT_TTL => 60,  # one minute
});

COMPILE_EXT

Top

The COMPILE_EXT option can be provided to specify a filename extension for compiled template files. It is undefined by default and no attempt will be made to read or write any compiled template files.

my $provider = Template::Provider->new({
    COMPILE_EXT => '.ttc',
});

COMPILE_DIR

Top

The COMPILE_DIR option is used to specify an alternate directory root under which compiled template files should be saved.

my $provider = Template::Provider->new({
    COMPILE_DIR => '/tmp/ttc',
});

TOLERANT

Top

The TOLERANT flag can be set to indicate that the Template::Provider module should ignore any errors encountered while loading a template and instead return STATUS_DECLINED.

PARSER

Top

The PARSER option can be used to define a parser module other than the default of Template::Parser.

my $provider = Template::Provider->new({
    PARSER => MyOrg::Template::Parser->new({ ... }),
});

DEBUG

Top

The DEBUG option can be used to enable debugging messages from the Template::Provider module by setting it to include the DEBUG_PROVIDER value.

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_PROVIDER,
});

SUBCLASSING

Top

The Template::Provider module can be subclassed to provide templates from a different source (e.g. a database). In most cases you'll just need to provide custom implementations of the _template_modified() and _template_content() methods. If your provider requires and custom initialisation then you'll also need to implement a new _init() method.

Caching in memory and on disk will still be applied (if enabled) when overriding these methods.

_template_modified($path)

Top

Returns a timestamp of the $path passed in by calling stat(). This can be overridden, for example, to return a last modified value from a database. The value returned should be a timestamp value (as returned by time(), although a sequence number should work as well.

_template_content($path)

Top

This method returns the content of the template for all INCLUDE, PROCESS, and INSERT directives.

When called in scalar context, the method returns the content of the template located at $path, or undef if $path is not found.

When called in list context it returns ($content, $error, $mtime), where $content is the template content, $error is an error string (e.g. "$path: File not found"), and $mtime is the template modification time.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Service.html000700 000765 000765 00000075012 11756705112 021330 0ustar00abwabw000000 000000 Template::Service

SYNOPSIS

Top
use Template::Service;

my $service = Template::Service->new({
    PRE_PROCESS  => [ 'config', 'header' ],
    POST_PROCESS => 'footer',
    ERROR        => {
        user     => 'user/index.html', 
        dbi      => 'error/database',
        default  => 'error/default',
    },
});

my $output = $service->process($template_name, \%replace)
    || die $service->error(), "\n";

DESCRIPTION

Top

The Template::Service module implements an object class for providing a consistent template processing service.

Standard header (PRE_PROCESS) and footer (POST_PROCESS) templates may be specified which are prepended and appended to all templates processed by the service (but not any other templates or blocks INCLUDEd or PROCESSed from within). An ERROR hash may be specified which redirects the service to an alternate template file in the case of uncaught exceptions being thrown. This allows errors to be automatically handled by the service and a guaranteed valid response to be generated regardless of any processing problems encountered.

A default Template::Service object is created by the Template module. Any Template::Service options may be passed to the Template new() constructor method and will be forwarded to the Template::Service constructor.

use Template;

my $template = Template->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
});

Similarly, the Template::Service constructor will forward all configuration parameters onto other default objects (e.g. Template::Context) that it may need to instantiate.

A Template::Service object (or subclass) can be explicitly instantiated and passed to the Template new() constructor method as the SERVICE item.

use Template;
use Template::Service;

my $service = Template::Service->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
});

my $template = Template->new({
    SERVICE => $service,
});

The Template::Service module can be sub-classed to create custom service handlers.

use Template;
use MyOrg::Template::Service;

my $service = MyOrg::Template::Service->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
    COOL_OPTION  => 'enabled in spades',
});

my $template = Template->new({
    SERVICE => $service,
});

The Template module uses the Template::Config service() factory method to create a default service object when required. The $Template::Config::SERVICE package variable may be set to specify an alternate service module. This will be loaded automatically and its new() constructor method called by the service() factory method when a default service object is required. Thus the previous example could be written as:

use Template;

$Template::Config::SERVICE = 'MyOrg::Template::Service';

my $template = Template->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
    COOL_OPTION  => 'enabled in spades',
});

METHODS

Top

new(\%config)

Top

The new() constructor method is called to instantiate a Template::Service object. Configuration parameters may be specified as a HASH reference or as a list of name => value pairs.

my $service1 = Template::Service->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
});

my $service2 = Template::Service->new( ERROR => 'error.html' );

The new() method returns a Template::Service object or undef on error. In the latter case, a relevant error message can be retrieved by the error() class method or directly from the $Template::Service::ERROR package variable.

my $service = Template::Service->new(\%config)
    || die Template::Service->error();

my $service = Template::Service->new(\%config)
    || die $Template::Service::ERROR;

process($input, \%replace)

Top

The process() method is called to process a template specified as the first parameter, $input. This may be a file name, file handle (e.g. GLOB or IO::Handle) or a reference to a text string containing the template text. An additional hash reference may be passed containing template variable definitions.

The method processes the template, adding any PRE_PROCESS or POST_PROCESS templates defined, and returns the output text. An uncaught exception thrown by the template will be handled by a relevant ERROR handler if defined. Errors that occur in the PRE_PROCESS or POST_PROCESS templates, or those that occur in the main input template and aren't handled, cause the method to return undef to indicate failure. The appropriate error message can be retrieved via the error() method.

$service->process('myfile.html', { title => 'My Test File' })
    || die $service->error();

context()

Top

Returns a reference to the internal context object which is, by default, an instance of the Template::Context class.

CONFIGURATION OPTIONS

Top

The following list summarises the configuration options that can be provided to the Template::Service new() constructor. Please consult Template::Manual::Config for further details and examples of each configuration option in use.

PRE_PROCESS, POST_PROCESS

Top

The PRE_PROCESS and POST_PROCESS options may be set to contain the name(s) of template files which should be processed immediately before and/or after each template. These do not get added to templates processed into a document via directives such as INCLUDE PROCESS, WRAPPER, etc.

my $service = Template::Service->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
};

Multiple templates may be specified as a reference to a list. Each is processed in the order defined.

my $service = Template::Service->new({
    PRE_PROCESS  => [ 'config', 'header' ],
    POST_PROCESS => 'footer',
};

PROCESS

Top

The PROCESS option may be set to contain the name(s) of template files which should be processed instead of the main template passed to the Template::Service process() method. This can be used to apply consistent wrappers around all templates, similar to the use of PRE_PROCESS and POST_PROCESS templates.

my $service = Template::Service->new({
    PROCESS  => 'content',
};

# processes 'content' instead of 'foo.html'
$service->process('foo.html');

A reference to the original template is available in the template variable. Metadata items can be inspected and the template can be processed by specifying it as a variable reference (i.e. prefixed by '$') to an INCLUDE, PROCESS or WRAPPER directive.

Example PROCESS template:

<html>
  <head>
    <title>[% template.title %]</title>
  </head>
  <body>
  [% PROCESS $template %]
  </body>
</html>

ERROR

Top

The ERROR (or ERRORS if you prefer) configuration item can be used to name a single template or specify a hash array mapping exception types to templates which should be used for error handling. If an uncaught exception is raised from within a template then the appropriate error template will instead be processed.

If specified as a single value then that template will be processed for all uncaught exceptions.

my $service = Template::Service->new({
    ERROR => 'error.html'
});

If the ERROR/ERRORS item is a hash reference the keys are assumed to be exception types and the relevant template for a given exception will be selected. A default template may be provided for the general case.

my $service = Template::Service->new({
    ERRORS => {
        user     => 'user/index.html',
        dbi      => 'error/database',
        default  => 'error/default',
    },
});

AUTO_RESET

Top

The AUTO_RESET option is set by default and causes the local BLOCKS cache for the Template::Context object to be reset on each call to the Template process() method. This ensures that any BLOCKs defined within a template will only persist until that template is finished processing.

DEBUG

Top

The DEBUG option can be used to enable debugging messages from the Template::Service module by setting it to include the DEBUG_SERVICE value.

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_SERVICE,
});

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Stash/000700 000765 000765 00000000000 11756705152 020120 5ustar00abwabw000000 000000 TT_v224_html_docs/modules/Template/Stash.html000700 000765 000765 00000065144 11756705113 021020 0ustar00abwabw000000 000000 Template::Stash

SYNOPSIS

Top
use Template::Stash;

my $stash = Template::Stash->new(\%vars);

# get variable values
$value = $stash->get($variable);
$value = $stash->get(\@compound);

# set variable value
$stash->set($variable, $value);
$stash->set(\@compound, $value);

# default variable value
$stash->set($variable, $value, 1);
$stash->set(\@compound, $value, 1);

# set variable values en masse
$stash->update(\%new_vars)

# methods for (de-)localising variables
$stash = $stash->clone(\%new_vars);
$stash = $stash->declone();

DESCRIPTION

Top

The Template::Stash module defines an object class which is used to store variable values for the runtime use of the template processor. Variable values are stored internally in a hash reference (which itself is blessed to create the object) and are accessible via the get() and set() methods.

Variables may reference hash arrays, lists, subroutines and objects as well as simple values. The stash automatically performs the right magic when dealing with variables, calling code or object methods, indexing into lists, hashes, etc.

The stash has clone() and declone() methods which are used by the template processor to make temporary copies of the stash for localising changes made to variables.

PUBLIC METHODS

Top

new(\%params)

Top

The new() constructor method creates and returns a reference to a new Template::Stash object.

my $stash = Template::Stash->new();

A hash reference may be passed to provide variables and values which should be used to initialise the stash.

my $stash = Template::Stash->new({ var1 => 'value1', 
                                   var2 => 'value2' });

get($variable)

Top

The get() method retrieves the variable named by the first parameter.

$value = $stash->get('var1');

Dotted compound variables can be retrieved by specifying the variable elements by reference to a list. Each node in the variable occupies two entries in the list. The first gives the name of the variable element, the second is a reference to a list of arguments for that element, or 0 if none.

[% foo.bar(10).baz(20) %]

$stash->get([ 'foo', 0, 'bar', [ 10 ], 'baz', [ 20 ] ]);

set($variable, $value, $default)

Top

The set() method sets the variable name in the first parameter to the value specified in the second.

$stash->set('var1', 'value1');

If the third parameter evaluates to a true value, the variable is set only if it did not have a true value before.

$stash->set('var2', 'default_value', 1);

Dotted compound variables may be specified as per get() above.

[% foo.bar = 30 %]

$stash->set([ 'foo', 0, 'bar', 0 ], 30);

The magical variable 'IMPORT' can be specified whose corresponding value should be a hash reference. The contents of the hash array are copied (i.e. imported) into the current namespace.

# foo.bar = baz, foo.wiz = waz
$stash->set('foo', { 'bar' => 'baz', 'wiz' => 'waz' });

# import 'foo' into main namespace: bar = baz, wiz = waz
$stash->set('IMPORT', $stash->get('foo'));

update($variables)

Top

This method can be used to set or update several variables in one go.

$stash->update({
    foo => 10,
    bar => 20,
});

getref($variable)

Top

This undocumented feature returns a closure which can be called to get the value of a variable. It is used to implement variable references which are evlauted lazily.

[% x = \foo.bar.baz %]          # x is a reference to foo.bar.baz
[% x %]                         # evalautes foo.bar.baz

clone(\%params)

Top

The clone() method creates and returns a new Template::Stash object which represents a localised copy of the parent stash. Variables can be freely updated in the cloned stash and when declone() is called, the original stash is returned with all its members intact and in the same state as they were before clone() was called.

For convenience, a hash of parameters may be passed into clone() which is used to update any simple variable (i.e. those that don't contain any namespace elements like foo and bar but not foo.bar) variables while cloning the stash. For adding and updating complex variables, the set() method should be used after calling clone(). This will correctly resolve and/or create any necessary namespace hashes.

A cloned stash maintains a reference to the stash that it was copied from in its _PARENT member.

declone()

Top

The declone() method returns the _PARENT reference and can be used to restore the state of a stash as described above.

define_vmethod($type, $name, $code)

Top

This method can be used to define new virtual methods. The first argument should be either scalar or item to define scalar virtual method, hash to define hash virtual methods, or either array or list for list virtual methods. The second argument should be the name of the new method. The third argument should be a reference to a subroutine implementing the method. The data item on which the virtual method is called is passed to the subroutine as the first argument.

$stash->define_vmethod(
    item => ucfirst => sub {
        my $text = shift;
        return ucfirst $text
    }
);

INTERNAL METHODS

Top

dotop($root, $item, \@args, $lvalue)

Top

This is the core dot operation method which evaluates elements of variables against their root.

undefined($ident, $args)

Top

This method is called when get() encounters an undefined value. If the STRICT|Template::Manual::Config#STRICT option is in effect then it will throw an exception indicating the use of an undefined value. Otherwise it will silently return an empty string.

The method can be redefined in a subclass to implement alternate handling of undefined values.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2012 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Test.html000700 000765 000765 00000075072 11756705113 020656 0ustar00abwabw000000 000000 Template::Test

SYNOPSIS

Top
use Template::Test;

$Template::Test::DEBUG = 0;   # set this true to see each test running
$Template::Test::EXTRA = 2;   # 2 extra tests follow test_expect()...

# ok() can be called any number of times before test_expect
ok( $true_or_false )

# test_expect() splits $input into individual tests, processes each 
# and compares generated output against expected output
test_expect($input, $template, \%replace );

# $input is text or filehandle (e.g. DATA section after __END__)
test_expect( $text );
test_expect( \*DATA );

# $template is a Template object or configuration hash
my $template_cfg = { ... };
test_expect( $input, $template_cfg );
my $template_obj = Template->new($template_cfg);
test_expect( $input, $template_obj );

# $replace is a hash reference of template variables
my $replace = {
    a => 'alpha',
    b => 'bravo'
};
test_expect( $input, $template, $replace );

# ok() called after test_expect should be declared in $EXTRA (2)
ok( $true_or_false )   
ok( $true_or_false )

DESCRIPTION

Top

The Template::Test module defines the test_expect() and other related subroutines which can be used to automate test scripts for the Template Toolkit. See the numerous tests in the t sub-directory of the distribution for examples of use.

PACKAGE SUBROUTINES

Top

text_expect()

Top

The test_expect() subroutine splits an input document into a number of separate tests, processes each one using the Template Toolkit and then compares the generated output against an expected output, also specified in the input document. It generates the familiar ok/not ok output compatible with Test::Harness.

The test input should be specified as a text string or a reference to a filehandle (e.g. GLOB or IO::Handle) from which it can be read. In particular, this allows the test input to be placed after the __END__ marker and read via the DATA filehandle.

use Template::Test;

test_expect(\*DATA);

__END__
# this is the first test (this is a comment)
-- test --
blah blah blah [% foo %]
-- expect --
blah blah blah value_of_foo

# here's the second test (no surprise, so is this)
-- test --
more blah blah [% bar %]
-- expect --
more blah blah value_of_bar

Blank lines between test sections are generally ignored. Any line starting with # is treated as a comment and is ignored.

The second and third parameters to test_expect() are optional. The second may be either a reference to a Template object which should be used to process the template fragments, or a reference to a hash array containing configuration values which should be used to instantiate a new Template object.

# pass reference to config hash
my $config = {
    INCLUDE_PATH => '/here/there:/every/where',
    POST_CHOMP   => 1,
};
test_expect(\*DATA, $config);

# or create Template object explicitly
my $template = Template->new($config);
test_expect(\*DATA, $template);

The third parameter may be used to reference a hash array of template variable which should be defined when processing the tests. This is passed to the Template process() method.

my $replace = {
    a => 'alpha',
    b => 'bravo',
};

test_expect(\*DATA, $config, $replace);

The second parameter may be left undefined to specify a default Template configuration.

test_expect(\*DATA, undef, $replace);

For testing the output of different Template configurations, a reference to a list of named Template objects also may be passed as the second parameter.

my $tt1 = Template->new({ ... });
my $tt2 = Template->new({ ... });
my @tts = [ one => $tt1, two => $tt1 ];

The first object in the list is used by default. Other objects may be switched in with a '-- use $name --' marker. This should immediately follow a '-- test --' line. That object will then be used for the rest of the test, or until a different object is selected.

-- test --
-- use one --
[% blah %]
-- expect --
blah, blah

-- test --
still using one...
-- expect --
...

-- test --
-- use two --
[% blah %]
-- expect --
blah, blah, more blah

The test_expect() sub counts the number of tests, and then calls ntests() to generate the familiar "1..$ntests\n" test harness line. Each test defined generates two test numbers. The first indicates that the input was processed without error, and the second that the output matches that expected.

Additional test may be run before test_expect() by calling ok(). These test results are cached until ntests() is called and the final number of tests can be calculated. Then, the "1..$ntests" line is output, along with "ok $n" / "not ok $n" lines for each of the cached test result. Subsequent calls to ok() then generate an output line immediately.

my $something = SomeObject->new();
ok( $something );

my $other = AnotherThing->new();
ok( $other );

test_expect(\*DATA);

If any tests are to follow after test_expect() is called then these should be pre-declared by setting the $EXTRA package variable. This value (default: 0) is added to the grand total calculated by ntests(). The results of the additional tests are also registered by calling ok().

$Template::Test::EXTRA = 2;

# can call ok() any number of times before test_expect()
ok( $did_that_work );             
ok( $make_sure );
ok( $dead_certain ); 

# <some> number of tests...
test_expect(\*DATA, $config, $replace);

# here's those $EXTRA tests
ok( defined $some_result && ref $some_result eq 'ARRAY' );
ok( $some_result->[0] eq 'some expected value' );

If you don't want to call test_expect() at all then you can call ntests($n) to declare the number of tests and generate the test header line. After that, simply call ok() for each test passing a true or false values to indicate that the test passed or failed.

ntests(2);
ok(1);
ok(0);

If you're really lazy, you can just call ok() and not bother declaring the number of tests at all. All tests results will be cached until the end of the script and then printed in one go before the program exits.

ok( $x );
ok( $y );

You can identify only a specific part of the input file for testing using the '-- start --' and '-- stop --' markers. Anything before the first '-- start --' is ignored, along with anything after the next '-- stop --' marker.

-- test --
this is test 1 (not performed)
-- expect --
this is test 1 (not performed)

-- start --

-- test --
this is test 2
-- expect --
this is test 2

-- stop --

...

ntests()

Top

Subroutine used to specify how many tests you're expecting to run.

ok($test)

Top

Generates an "ok $n" or "not ok $n" message if $test is true or false.

not_ok($test)

Top

The logical inverse of ok(). Prints an "ok $n" message is $test is false and vice-versa.

callsign()

Top

For historical reasons and general utility, the module also defines a callsign() subroutine which returns a hash mapping the letters a to z to their phonetic alphabet equivalent (e.g. radio callsigns). This is used by many of the test scripts as a known source of variable values.

test_expect(\*DATA, $config, callsign());

banner()

Top

This subroutine prints a simple banner including any text passed as parameters. The $DEBUG variable must be set for it to generate any output.

banner('Testing something-or-other');

example output:

#------------------------------------------------------------
# Testing something-or-other (27 tests completed)
#------------------------------------------------------------

PACKAGE VARIABLES

Top

$DEBUG

Top

The $DEBUG package variable can be set to enable debugging mode.

$PRESERVE

Top

The $PRESERVE package variable can be set to stop the test_expect() from converting newlines in the output and expected output into the literal strings '\n'.

HISTORY

Top

This module started its butt-ugly life as the t/texpect.pl script. It was cleaned up to became the Template::Test module some time around version 0.29. It underwent further cosmetic surgery for version 2.00 but still retains some remarkable rear-end resemblances.

Since then the Test::More and related modules have appeared on CPAN making this module mostly, but not entirely, redundant.

BUGS / KNOWN "FEATURES"

Top

Imports all methods by default. This is generally a Bad Thing, but this module is only used in test scripts (i.e. at build time) so a) we don't really care and b) it saves typing.

The line splitter may be a bit dumb, especially if it sees lines like -- this -- that aren't supposed to be special markers. So don't do that.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

TT_v224_html_docs/modules/Template/View.html000700 000765 000765 00000057634 11756705113 020655 0ustar00abwabw000000 000000 Template::View

SYNOPSIS

Top
# define a view
[% VIEW view
        # some standard args
        prefix        => 'my_', 
        suffix        => '.tt2',
        notfound      => 'no_such_file'
        ...

        # any other data
        title         => 'My View title'
        other_item    => 'Joe Random Data'
        ...
%]
   # add new data definitions, via 'my' self reference
   [% my.author = "$abw.name <$abw.email>" %]
   [% my.copy   = "&copy; Copyright 2000 $my.author" %]

   # define a local block
   [% BLOCK header %]
   This is the header block, title: [% title or my.title %]
   [% END %]

[% END %]

# access data items for view
[% view.title %]
[% view.other_item %]

# access blocks directly ('include_naked' option, set by default)
[% view.header %]
[% view.header(title => 'New Title') %]

# non-local templates have prefix/suffix attached
[% view.footer %]           # => [% INCLUDE my_footer.tt2 %]

# more verbose form of block access
[% view.include( 'header', title => 'The Header Title' ) %]
[% view.include_header( title => 'The Header Title' ) %]

# very short form of above ('include_naked' option, set by default)
[% view.header( title => 'The Header Title' ) %]

# non-local templates have prefix/suffix attached
[% view.footer %]           # => [% INCLUDE my_footer.tt2 %]

# fallback on the 'notfound' template ('my_no_such_file.tt2')
# if template not found 
[% view.include('missing') %]
[% view.include_missing %]
[% view.missing %]

# print() includes a template relevant to argument type
[% view.print("some text") %]     # type=TEXT, template='text'

[% BLOCK my_text.tt2 %]           # 'text' with prefix/suffix
   Text: [% item %]
[% END %]

# now print() a hash ref, mapped to 'hash' template
[% view.print(some_hash_ref) %]   # type=HASH, template='hash'

[% BLOCK my_hash.tt2 %]           # 'hash' with prefix/suffix
   hash keys: [% item.keys.sort.join(', ')
[% END %]

# now print() a list ref, mapped to 'list' template
[% view.print(my_list_ref) %]     # type=ARRAY, template='list'

[% BLOCK my_list.tt2 %]           # 'list' with prefix/suffix
   list: [% item.join(', ') %]
[% END %]

# print() maps 'My::Object' to 'My_Object'
[% view.print(myobj) %]

[% BLOCK my_My_Object.tt2 %]
   [% item.this %], [% item.that %]
[% END %]

# update mapping table
[% view.map.ARRAY = 'my_list_template' %]
[% view.map.TEXT  = 'my_text_block'    %]


# change prefix, suffix, item name, etc.
[% view.prefix = 'your_' %]
[% view.default = 'anyobj' %]
...

DESCRIPTION

Top

TODO

METHODS

Top

new($context, \%config)

Top

Creates a new Template::View presenting a custom view of the specified $context object.

A reference to a hash array of configuration options may be passed as the second argument.

  • prefix

    Prefix added to all template names.

    [% USE view(prefix => 'my_') %]
    [% view.view('foo', a => 20) %]     # => my_foo
  • suffix

    Suffix added to all template names.

    [% USE view(suffix => '.tt2') %]
    [% view.view('foo', a => 20) %]     # => foo.tt2
  • map

    Hash array mapping reference types to template names. The print() method uses this to determine which template to use to present any particular item. The TEXT, HASH and ARRAY items default to 'test', 'hash' and 'list' appropriately.

    [% USE view(map => { ARRAY   => 'my_list', 
                         HASH    => 'your_hash',
                         My::Foo => 'my_foo', } ) %]
    
    [% view.print(some_text) %]         # => text
    [% view.print(a_list) %]            # => my_list
    [% view.print(a_hash) %]            # => your_hash
    [% view.print(a_foo) %]             # => my_foo
    
    [% BLOCK text %]
       Text: [% item %]
    [% END %]
    
    [% BLOCK my_list %]
       list: [% item.join(', ') %]
    [% END %]
    
    [% BLOCK your_hash %]
       hash keys: [% item.keys.sort.join(', ')
    [% END %]
    
    [% BLOCK my_foo %] 
       Foo: [% item.this %], [% item.that %]
    [% END %]
  • method

    Name of a method which objects passed to print() may provide for presenting themselves to the view. If a specific map entry can't be found for an object reference and it supports the method (default: 'present') then the method will be called, passing the view as an argument. The object can then make callbacks against the view to present itself.

    package Foo;
    
    sub present {
        my ($self, $view) = @_;
        return "a regular view of a Foo\n";
    }
    
    sub debug {
        my ($self, $view) = @_;
        return "a debug view of a Foo\n";
    }

    In a template:

    [% USE view %]
    [% view.print(my_foo_object) %]     # a regular view of a Foo
    
    [% USE view(method => 'debug') %]
    [% view.print(my_foo_object) %]     # a debug view of a Foo
  • default

    Default template to use if no specific map entry is found for an item.

    [% USE view(default => 'my_object') %]
    
    [% view.print(objref) %]            # => my_object

    If no map entry or default is provided then the view will attempt to construct a template name from the object class, substituting any sequence of non-word characters to single underscores, e.g.

    # 'fubar' is an object of class Foo::Bar
    [% view.print(fubar) %]             # => Foo_Bar

    Any current prefix and suffix will be added to both the default template name and any name constructed from the object class.

  • notfound

    Fallback template to use if any other isn't found.

  • item

    Name of the template variable to which the print() method assigns the current item. Defaults to 'item'.

    [% USE view %]
    [% BLOCK list %] 
       [% item.join(', ') %] 
    [% END %]
    [% view.print(a_list) %]
    
    [% USE view(item => 'thing') %]
    [% BLOCK list %] 
       [% thing.join(', ') %] 
    [% END %]
    [% view.print(a_list) %]
  • view_prefix

    Prefix of methods which should be mapped to view() by AUTOLOAD. Defaults to 'view_'.

    [% USE view %]
    [% view.view_header() %]                    # => view('header')
    
    [% USE view(view_prefix => 'show_me_the_' %]
    [% view.show_me_the_header() %]             # => view('header')
  • view_naked

    Flag to indcate if any attempt should be made to map method names to template names where they don't match the view_prefix. Defaults to 0.

    [% USE view(view_naked => 1) %]
    
    [% view.header() %]                 # => view('header')

print( $obj1, $obj2, ... \%config)

Top

TODO

view( $template, \%vars, \%config );

Top

TODO

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 2000-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/VMethods.html000700 000765 000765 00000026345 11756705113 021467 0ustar00abwabw000000 000000 Template::VMethods

DESCRIPTION

Top

The Template::VMethods module implements the virtual methods that can be applied to variables.

Please see Template::Manual::VMethods for further information.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Stash/Context.html000700 000765 000765 00000037430 11756705112 022440 0ustar00abwabw000000 000000 Template::Stash::Context

SYNOPSIS

Top
use Template;
use Template::Stash::Context;

my $stash = Template::Stash::Context->new(\%vars);
my $tt2   = Template->new({ STASH => $stash });

DESCRIPTION

Top

This is an alternate stash object which includes a patch from Craig Barratt to implement various new virtual methods to allow dotted template variable to denote if object methods and subroutines should be called in scalar or list context. It adds a little overhead to each stash call and I'm a little wary of applying that to the core default stash without investigating the effects first. So for now, it's implemented as a separate stash module which will allow us to test it out, benchmark it and switch it in or out as we require.

This is what Craig has to say about it:

Here's a better set of features for the core. Attached is a new version of Stash.pm (based on TT2.02) that:

* supports the special op "scalar" that forces scalar context on function calls, eg:

cgi.param("foo").scalar

calls cgi.param("foo") in scalar context (unlike my wimpy scalar op from last night). Array context is the default.

With non-function operands, scalar behaves like the perl version (eg: no-op for scalar, size for arrays, etc).

* supports the special op "ref" that behaves like the perl ref. If applied to a function the function is not called. Eg:

cgi.param("foo").ref

does *not* call cgi.param and evaluates to "CODE". Similarly, HASH.ref, ARRAY.ref return what you expect.

* adds a new scalar and list op called "array" that is a no-op for arrays and promotes scalars to one-element arrays.

* allows scalar ops to be applied to arrays and hashes in place, eg: ARRAY.repeat(3) repeats each element in place.

* allows list ops to be applied to scalars by promoting the scalars to one-element arrays (like an implicit "array"). So you can do things like SCALAR.size, SCALAR.join and get a useful result.

This also means you can now use x.0 to safely get the first element whether x is an array or scalar.

The new Stash.pm passes the TT2.02 test suite. But I haven't tested the new features very much. One nagging implementation problem is that the "scalar" and "ref" ops have higher precedence than user variable names.

AUTHOR

Top

Andy Wardley <abw@wardley.org>

http://wardley.org/

VERSION

Top

1.63, distributed as part of the Template Toolkit version 2.19, released on 27 April 2007.

COPYRIGHT

Top
Copyright (C) 1996-2007 Andy Wardley.  All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

TT_v224_html_docs/modules/Template/Stash/index.html000700 000765 000765 00000022137 11756705112 022121 0ustar00abwabw000000 000000 Template::Stash::* Modules

Section Index

Top

This section contains the documentation for the Template::Stash modules.


TT_v224_html_docs/modules/Template/Stash/XS.html000700 000765 000765 00000035660 11756705113 021352 0ustar00abwabw000000 000000 Template::Stash::XS

SYNOPSIS

Top
use Template;
use Template::Stash::XS;

my $stash = Template::Stash::XS->new(\%vars);
my $tt2   = Template->new({ STASH => $stash });

DESCRIPTION

Top

The Template:Stash::XS module is an implementation of the Template::Stash written in C. The "XS" in the name refers to Perl's XS extension system for interfacing Perl to C code. It works just like the regular Perl implementation of Template::Stash but runs about twice as fast.

The easiest way to use the XS stash is to configure the Template Toolkit to use it by default. You can do this at installation time (when you run perl Makefile.PL) by answering 'y' to the questions:

Do you want to build the XS Stash module?      y
Do you want to use the XS Stash by default?    y

See the INSTALL file distributed with the Template Toolkit for further details on installation.

If you don't elect to use the XS stash by default then you should use the STASH configuration item when you create a new Template object. This should reference an XS stash object that you have created manually.

use Template;
use Template::Stash::XS;

my $stash = Template::Stash::XS->new(\%vars);
my $tt2   = Template->new({ STASH => $stash });

Alternately, you can set the $Template::Config::STASH package variable like so:

use Template;
use Template::Config;

$Template::Config::STASH = 'Template::Stash::XS';

my $tt2 = Template->new();

The XS stash will then be automatically used.

If you want to use the XS stash by default and don't want to re-install the Template Toolkit, then you can manually modify the Template/Config.pm module near line 42 to read:

$STASH = 'Template::Stash::XS';

BUGS

Top

Please report bugs to the Template Toolkit mailing list templates@template-toolkit.org

AUTHORS

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

Doug Steinwand <dsteinwand@citysearch.com>

COPYRIGHT

Top

Copyright (C) 1996-2012 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

TT_v224_html_docs/modules/Template/Plugin/Assert.html000700 000765 000765 00000035700 11756705107 022433 0ustar00abwabw000000 000000 Template::Plugin::Assert

SYNOPSIS

Top
[% USE assert %]

# throws error if any undefined values are returned
[% object.assert.method %]
[% hash.assert.key %]
[% list.assert.item %]

DESCRIPTION

Top

This plugin defines the assert virtual method that can be used to automatically throw errors when undefined values are used.

For example, consider this dotop:

[% user.name %]

If user.name is an undefined value then TT will silently ignore the fact and print nothing. If you USE the assert plugin then you can add the assert vmethod between the user and name elements, like so:

[% user.assert.name %]

Now, if user.name is an undefined value, an exception will be thrown:

assert error - undefined value for name

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 2008 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/Autoformat.html000700 000765 000765 00000046416 11756705107 023321 0ustar00abwabw000000 000000 Template Toolkit Documentation

SYNOPSIS

Top
[% USE autoformat(options) %]

[% autoformat(text, more_text, ..., options) %]

[% FILTER autoformat(options) %]
   a block of text
[% END %]

EXAMPLES

Top
# define some text for the examples
[% text = BLOCK %]
   Be not afeard.  The isle is full of noises, sounds and sweet 
   airs that give delight but hurt not.
[% END %]
# pass options to constructor...
[% USE autoformat(case => 'upper') %]
[% autoformat(text) %]

# and/or pass options to the autoformat subroutine itself
[% USE autoformat %]
[% autoformat(text, case => 'upper') %]

# using the autoformat filter
[% USE autoformat(left => 10, right => 30) %]
[% FILTER autoformat %]
   Be not afeard.  The isle is full of noises, sounds and sweet 
   airs that give delight but hurt not.
[% END %]
# another filter example with configuration options
[% USE autoformat %]
[% FILTER autoformat(left => 20) %]
   Be not afeard.  The isle is full of noises, sounds and sweet 
   airs that give delight but hurt not.
[% END %]
# another FILTER example, defining a 'poetry' filter alias
[% USE autoformat %]
[% text FILTER poetry = autoformat(left => 20, right => 40) %]

# reuse the 'poetry' filter alias
[% text FILTER poetry %]
# shorthand form ('|' is an alias for 'FILTER')
[% text | autoformat %]
# using forms
[% USE autoformat(form => '>>>>.<<<', numeric => 'AllPlaces') %]
[% autoformat(10, 20.32, 11.35) %]

DESCRIPTION

Top

The autoformat plugin is an interface to Damian Conway's Text::Autoformat Perl module which provides advanced text wrapping and formatting.

Configuration options may be passed to the plugin constructor via the USE directive.

[% USE autoformat(right => 30) %]

The autoformat subroutine can then be called, passing in text items which will be wrapped and formatted according to the current configuration.

[% autoformat('The cat sat on the mat') %]

Additional configuration items can be passed to the autoformat subroutine and will be merged with any existing configuration specified via the constructor.

[% autoformat(text, left => 20) %]

Configuration options are passed directly to the Text::Autoformat plugin. At the time of writing, the basic configuration items are:

left        left margin (default: 1)
right       right margin (default 72)
justify     justification as one of 'left', 'right', 'full'
            or 'centre' (default: left)
case        case conversion as one of 'lower', 'upper',
            'sentence', 'title', or 'highlight' (default: none)
squeeze     squeeze whitespace (default: enabled)

The plugin also accepts a form item which can be used to define a format string. When a form is defined, the plugin will call the underlying form() subroutine in preference to autoformat().

[% USE autoformat(form => '>>>>.<<') %]
[% autoformat(123.45, 666, 3.14) %]

Additional configuration items relevant to forms can also be specified.

[% USE autoformat(form => '>>>>.<<', numeric => 'AllPlaces') %]
[% autoformat(123.45, 666, 3.14) %]

These can also be passed directly to the autoformat subroutine.

[% USE autoformat %]
[% autoformat( 123.45, 666, 3.14,
               form    => '>>>>.<<', 
               numeric => 'AllPlaces' )
%]

See Text::Autoformat for further details.

AUTHORS

Top

Robert McArthur wrote the original plugin code, with some modifications and additions from Andy Wardley.

Damian Conway wrote the Text::Autoformat module which does all the clever stuff.

COPYRIGHT

Top

Copyright (C) 2000-2007 Robert McArthur & Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/CGI.html000700 000765 000765 00000042204 11756705107 021571 0ustar00abwabw000000 000000 Template::Plugin::CGI

SYNOPSIS

Top
[% USE CGI %]
[% CGI.param('parameter') %]

[% USE things = CGI %]
[% things.param('name') %]

# see CGI docs for other methods provided by the CGI object

DESCRIPTION

Top

This is a very simple Template Toolkit Plugin interface to the CGI module. A CGI object will be instantiated via the following directive:

[% USE CGI %]

CGI methods may then be called as follows:

[% CGI.header %]
[% CGI.param('parameter') %]

An alias can be used to provide an alternate name by which the object should be identified.

[% USE mycgi = CGI %]
[% mycgi.start_form %]
[% mycgi.popup_menu({ Name   => 'Color'
                      Values => [ 'Green' 'Black' 'Brown' ] }) %]

Parenthesised parameters to the USE directive will be passed to the plugin constructor:

[% USE cgiprm = CGI('uid=abw&name=Andy+Wardley') %]
[% cgiprm.param('uid') %]

METHODS

Top

In addition to all the methods supported by the CGI module, this plugin defines the following.

params()

Top

This method returns a reference to a hash of all the CGI parameters. Any parameters that have multiple values will be returned as lists.

[% USE CGI('user=abw&item=foo&item=bar') %]
[% CGI.params.user %]            # abw
[% CGI.params.item.join(', ') %] # foo, bar

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/Datafile.html000700 000765 000765 00000042121 11756705107 022676 0ustar00abwabw000000 000000 Template::Plugin::Datafile

SYNOPSIS

Top
[% USE mydata = datafile('/path/to/datafile') %]
[% USE mydata = datafile('/path/to/datafile', delim = '|') %]

[% FOREACH record = mydata %]
   [% record.this %]  [% record.that %]
[% END %]

DESCRIPTION

Top

This plugin provides a simple facility to construct a list of hash references, each of which represents a data record of known structure, from a data file.

[% USE datafile(filename) %]

A absolute filename must be specified (for this initial implementation at least - in a future version it might also use the INCLUDE_PATH). An optional delim parameter may also be provided to specify an alternate delimiter character.

[% USE userlist = datafile('/path/to/file/users')     %]
[% USE things   = datafile('items', delim = '|') %]

The format of the file is intentionally simple. The first line defines the field names, delimited by colons with optional surrounding whitespace. Subsequent lines then defines records containing data items, also delimited by colons. e.g.

id : name : email : tel
abw : Andy Wardley : abw@tt2.org : 555-1234
sam : Simon Matthews : sam@tt2.org : 555-9876

Each line is read, split into composite fields, and then used to initialise a hash array containing the field names as relevant keys. The plugin returns a blessed list reference containing the hash references in the order as defined in the file.

[% FOREACH user = userlist %]
   [% user.id %]: [% user.name %]
[% END %]

The first line of the file must contain the field definitions. After the first line, blank lines will be ignored, along with comment line which start with a '#'.

BUGS

Top

Should handle file names relative to INCLUDE_PATH. Doesn't permit use of ':' in a field. Some escaping mechanism is required.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/Date.html000700 000765 000765 00000051274 11756705107 022053 0ustar00abwabw000000 000000 Template::Plugin::Date

SYNOPSIS

Top
[% USE date %]

# use current time and default format
[% date.format %]

# specify time as seconds since epoch
# or as a 'h:m:s d-m-y' or 'y-m-d h:m:s' string
[% date.format(960973980) %]
[% date.format('4:20:36 21/12/2000') %]
[% date.format('2000/12/21 4:20:36') %]

# specify format
[% date.format(mytime, '%H:%M:%S') %]

# specify locale
[% date.format(date.now, '%a %d %b %y', 'en_GB') %]

# named parameters 
[% date.format(mytime, format = '%H:%M:%S') %]
[% date.format(locale = 'en_GB') %]
[% date.format(time   = date.now, 
               format = '%H:%M:%S', 
               locale = 'en_GB) %]

# specify default format to plugin
[% USE date(format = '%H:%M:%S', locale = 'de_DE') %]

[% date.format %]
...

DESCRIPTION

Top

The Date plugin provides an easy way to generate formatted time and date strings by delegating to the POSIX strftime() routine.

The plugin can be loaded via the familiar USE directive.

[% USE date %]

This creates a plugin object with the default name of 'date'. An alternate name can be specified as such:

[% USE myname = date %]

The plugin provides the format() method which accepts a time value, a format string and a locale name. All of these parameters are optional with the current system time, default format ('%H:%M:%S %d-%b-%Y') and current locale being used respectively, if undefined. Default values for the time, format and/or locale may be specified as named parameters in the USE directive.

[% USE date(format = '%a %d-%b-%Y', locale = 'fr_FR') %]

When called without any parameters, the format() method returns a string representing the current system time, formatted by strftime() according to the default format and for the default locale (which may not be the current one, if locale is set in the USE directive).

[% date.format %]

The plugin allows a time/date to be specified as seconds since the epoch, as is returned by time().

File last modified: [% date.format(filemod_time) %]

The time/date can also be specified as a string of the form h:m:s d/m/y or y/m/d h:m:s. Any of the characters : / - or space may be used to delimit fields.

[% USE day = date(format => '%A', locale => 'en_GB') %]
[% day.format('4:20:00 9-13-2000') %]

Output:

Tuesday

A format string can also be passed to the format() method, and a locale specification may follow that.

[% date.format(filemod, '%d-%b-%Y') %]
[% date.format(filemod, '%d-%b-%Y', 'en_GB') %]

A fourth parameter allows you to force output in GMT, in the case of seconds-since-the-epoch input:

[% date.format(filemod, '%d-%b-%Y', 'en_GB', 1) %]

Note that in this case, if the local time is not GMT, then also specifying '%Z' (time zone) in the format parameter will lead to an extremely misleading result.

Any or all of these parameters may be named. Positional parameters should always be in the order ($time, $format, $locale).

[% date.format(format => '%H:%M:%S') %]
[% date.format(time => filemod, format => '%H:%M:%S') %]
[% date.format(mytime, format => '%H:%M:%S') %]
[% date.format(mytime, format => '%H:%M:%S', locale => 'fr_FR') %]
[% date.format(mytime, format => '%H:%M:%S', gmt => 1) %]
...etc...

The now() method returns the current system time in seconds since the epoch.

[% date.format(date.now, '%A') %]

The calc() method can be used to create an interface to the Date::Calc module (if installed on your system).

[% calc = date.calc %]
[% calc.Monday_of_Week(22, 2001).join('/') %]

The manip() method can be used to create an interface to the Date::Manip module (if installed on your system).

[% manip = date.manip %]
[% manip.UnixDate("Noon Yesterday","%Y %b %d %H:%M") %]

AUTHORS

Top

Thierry-Michel Barral wrote the original plugin.

Andy Wardley provided some minor fixups/enhancements, a test script and documentation.

Mark D. Mills cloned Date::Manip from the Date::Calc sub-plugin.

COPYRIGHT

Top

Copyright (C) 2000-2007 Thierry-Michel Barral, Andy Wardley.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/Directory.html000700 000765 000765 00000061204 11756705107 023134 0ustar00abwabw000000 000000 Template::Plugin::Directory

SYNOPSIS

Top
[% USE dir = Directory(dirpath) %]

# files returns list of regular files
[% FOREACH file = dir.files %]
   [% file.name %] [% file.path %] ...
[% END %]

# dirs returns list of sub-directories
[% FOREACH subdir = dir.dirs %]
   [% subdir.name %] [% subdir.path %] ...
[% END %]

# list returns both interleaved in order
[% FOREACH item = dir.list %]
   [% IF item.isdir %]
      Directory: [% item.name %]
   [% ELSE %]
      File: [% item.name %]
   [% END %]
[% END %]

# define a VIEW to display dirs/files
[% VIEW myview %]
   [% BLOCK file %]
   File: [% item.name %]
   [% END %]

   [% BLOCK directory %]
   Directory: [% item.name %] 
   [% item.content(myview) | indent -%]
   [% END %]
[% END %]

# display directory content using view
[% myview.print(dir) %]

DESCRIPTION

Top

This Template Toolkit plugin provides a simple interface to directory listings. It is derived from the Template::Plugin::File module and uses Template::Plugin::File object instances to represent files within a directory. Sub-directories within a directory are represented by further Template::Plugin::Directory instances.

The constructor expects a directory name as an argument.

[% USE dir = Directory('/tmp') %]

It then provides access to the files and sub-directories contained within the directory.

# regular files (not directories)
[% FOREACH file IN dir.files %]
   [% file.name %]
[% END %]

# directories only
[% FOREACH file IN dir.dirs %]
   [% file.name %]
[% END %]

# files and/or directories
[% FOREACH file IN dir.list %]
   [% file.name %] ([% file.isdir ? 'directory' : 'file' %])
[% END %]

The plugin constructor will throw a Directory error if the specified path does not exist, is not a directory or fails to stat() (see Template::Plugin::File). Otherwise, it will scan the directory and create lists named 'files' containing files, 'dirs' containing directories and 'list' containing both files and directories combined. The nostat option can be set to disable all file/directory checks and directory scanning.

Each file in the directory will be represented by a Template::Plugin::File object instance, and each directory by another Template::Plugin::Directory. If the recurse flag is set, then those directories will contain further nested entries, and so on. With the recurse flag unset, as it is by default, then each is just a place marker for the directory and does not contain any further content unless its scan() method is explicitly called. The isdir flag can be tested against files and/or directories, returning true if the item is a directory or false if it is a regular file.

[% FOREACH file = dir.list %]
   [% IF file.isdir %]
      * Directory: [% file.name %]
   [% ELSE %]
      * File: [% file.name %]
   [% END %]
[% END %]

This example shows how you might walk down a directory tree, displaying content as you go. With the recurse flag disabled, as is the default, we need to explicitly call the scan() method on each directory, to force it to lookup files and further sub-directories contained within.

[% USE dir = Directory(dirpath) %]
* [% dir.path %]
[% INCLUDE showdir %]

[% BLOCK showdir -%]
  [% FOREACH file = dir.list -%]
    [% IF file.isdir -%]
    * [% file.name %]
      [% file.scan -%]
      [% INCLUDE showdir dir=file FILTER indent(4) -%]
    [% ELSE -%]
    - [% f.name %]
    [% END -%]
  [% END -%]
 [% END %]

This example is adapted (with some re-formatting for clarity) from a test in t/directry.t which produces the following output:

* test/dir
    - file1
    - file2
    * sub_one
        - bar
        - foo
    * sub_two
        - waz.html
        - wiz.html
    - xyzfile

The recurse flag can be set (disabled by default) to cause the constructor to automatically recurse down into all sub-directories, creating a new Template::Plugin::Directory object for each one and filling it with any further content. In this case there is no need to explicitly call the scan() method.

[% USE dir = Directory(dirpath, recurse=1) %]
   ...

    [% IF file.isdir -%]
    * [% file.name %]
      [% INCLUDE showdir dir=file FILTER indent(4) -%]
    [% ELSE -%]
       ...

The directory plugin also provides support for views. A view can be defined as a VIEW ... END block and should contain BLOCK definitions for files ('file') and directories ('directory').

[% VIEW myview %]
[% BLOCK file %]
   - [% item.name %]
[% END %]

[% BLOCK directory %]
   * [% item.name %]
     [% item.content(myview) FILTER indent %]
[% END %]
[% END %]

The view print() method can then be called, passing the Directory object as an argument.

[% USE dir = Directory(dirpath, recurse=1) %]
[% myview.print(dir) %]

When a directory is presented to a view, either as [% myview.print(dir) %] or [% dir.present(view) %], then the directory BLOCK within the myview VIEW is processed. The item variable will be set to alias the Directory object.

[% BLOCK directory %]
   * [% item.name %]
     [% item.content(myview) FILTER indent %]
[% END %]

In this example, the directory name is first printed and the content(view) method is then called to present each item within the directory to the view. Further directories will be mapped to the directory block, and files will be mapped to the file block.

With the recurse option disabled, as it is by default, the directory block should explicitly call a scan() on each directory.

[% VIEW myview %]
[% BLOCK file %]
   - [% item.name %]
[% END %]

[% BLOCK directory %]
   * [% item.name %]
     [% item.scan %]
     [% item.content(myview) FILTER indent %]
[% END %]
[% END %]

[% USE dir = Directory(dirpath) %]
[% myview.print(dir) %]

AUTHORS

Top

Michael Stevens wrote the original Directory plugin on which this is based. Andy Wardley split it into separate File and Directory plugins, added some extra code and documentation for VIEW support, and made a few other minor tweaks.

COPYRIGHT

Top

Copyright (C) 2000-2007 Michael Stevens, Andy Wardley.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/Dumper.html000700 000765 000765 00000043520 11756705107 022425 0ustar00abwabw000000 000000 Template::Plugin::Dumper

SYNOPSIS

Top
[% USE Dumper %]

[% Dumper.dump(variable) %]
[% Dumper.dump_html(variable) %]

DESCRIPTION

Top

This is a very simple Template Toolkit Plugin Interface to the Data::Dumper module. A Dumper object will be instantiated via the following directive:

[% USE Dumper %]

As a standard plugin, you can also specify its name in lower case:

[% USE dumper %]

The Data::Dumper Pad, Indent and Varname options are supported as constructor arguments to affect the output generated. See Data::Dumper for further details.

[% USE dumper(Indent=0, Pad="<br>") %]

These options can also be specified in lower case.

[% USE dumper(indent=0, pad="<br>") %]

METHODS

Top

There are two methods supported by the Dumper object. Each will output into the template the contents of the variables passed to the object method.

dump()

Top

Generates a raw text dump of the data structure(s) passed

[% USE Dumper %]
[% Dumper.dump(myvar) %]
[% Dumper.dump(myvar, yourvar) %]

dump_html()

Top

Generates a dump of the data structures, as per dump(), but with the characters <, > and & converted to their equivalent HTML entities and newlines converted to <br>.

[% USE Dumper %]
[% Dumper.dump_html(myvar) %]

AUTHOR

Top

Simon Matthews <sam@tt2.org>

COPYRIGHT

Top

Copyright (C) 2000 Simon Matthews. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/File.html000700 000765 000765 00000074150 11756705110 022045 0ustar00abwabw000000 000000 Template::Plugin::File

SYNOPSIS

Top
[% USE File(filepath) %]
[% File.path %]         # full path
[% File.name %]         # filename
[% File.dir %]          # directory

DESCRIPTION

Top

This plugin provides an abstraction of a file. It can be used to fetch details about files from the file system, or to represent abstract files (e.g. when creating an index page) that may or may not exist on a file system.

A file name or path should be specified as a constructor argument. e.g.

[% USE File('foo.html') %]
[% USE File('foo/bar/baz.html') %]
[% USE File('/foo/bar/baz.html') %]

The file should exist on the current file system (unless nostat option set, see below) as an absolute file when specified with as leading '/' as per '/foo/bar/baz.html', or otherwise as one relative to the current working directory. The constructor performs a stat() on the file and makes the 13 elements returned available as the plugin items:

dev ino mode nlink uid gid rdev size 
atime mtime ctime blksize blocks

e.g.

[% USE File('/foo/bar/baz.html') %]

[% File.mtime %]
[% File.mode %]
...

In addition, the user and group items are set to contain the user and group names as returned by calls to getpwuid() and getgrgid() for the file uid and gid elements, respectively. On Win32 platforms on which getpwuid() and getgrid() are not available, these values are undefined.

[% USE File('/tmp/foo.html') %]
[% File.uid %]      # e.g. 500
[% File.user %]     # e.g. abw

This user/group lookup can be disabled by setting the noid option.

[% USE File('/tmp/foo.html', noid=1) %]
[% File.uid %]      # e.g. 500
[% File.user %]     # nothing

The isdir flag will be set if the file is a directory.

[% USE File('/tmp') %]
[% File.isdir %]    # 1

If the stat() on the file fails (e.g. file doesn't exists, bad permission, etc) then the constructor will throw a File exception. This can be caught within a TRY...CATCH block.

[% TRY %]
   [% USE File('/tmp/myfile') %]
   File exists!
[% CATCH File %]
   File error: [% error.info %]
[% END %]

Note the capitalisation of the exception type, 'File', to indicate an error thrown by the File plugin, to distinguish it from a regular file exception thrown by the Template Toolkit.

Note that the File plugin can also be referenced by the lower case name 'file'. However, exceptions are always thrown of the File type, regardless of the capitalisation of the plugin named used.

[% USE file('foo.html') %]
[% file.mtime %]

As with any other Template Toolkit plugin, an alternate name can be specified for the object created.

[% USE foo = file('foo.html') %]
[% foo.mtime %]

The nostat option can be specified to prevent the plugin constructor from performing a stat() on the file specified. In this case, the file does not have to exist in the file system, no attempt will be made to verify that it does, and no error will be thrown if it doesn't. The entries for the items usually returned by stat() will be set empty.

[% USE file('/some/where/over/the/rainbow.html', nostat=1) 
[% file.mtime %]     # nothing

METHODS

Top

All File plugins, regardless of the nostat option, have set a number of items relating to the original path specified.

path

Top

The full, original file path specified to the constructor.

[% USE file('/foo/bar.html') %]
[% file.path %]     # /foo/bar.html

name

Top

The name of the file without any leading directories.

[% USE file('/foo/bar.html') %]
[% file.name %]     # bar.html

dir

Top

The directory element of the path with the filename removed.

[% USE file('/foo/bar.html') %]
[% file.name %]     # /foo

ext

Top

The file extension, if any, appearing at the end of the path following a '.' (not included in the extension).

[% USE file('/foo/bar.html') %]
[% file.ext %]      # html

home

Top

This contains a string of the form '../..' to represent the upward path from a file to its root directory.

[% USE file('bar.html') %]
[% file.home %]     # nothing

[% USE file('foo/bar.html') %]
[% file.home %]     # ..

[% USE file('foo/bar/baz.html') %]
[% file.home %]     # ../..

root

Top

The root item can be specified as a constructor argument, indicating a root directory in which the named file resides. This is otherwise set empty.

[% USE file('foo/bar.html', root='/tmp') %]
[% file.root %]     # /tmp

abs

Top

This returns the absolute file path by constructing a path from the root and path options.

[% USE file('foo/bar.html', root='/tmp') %]
[% file.path %]     # foo/bar.html
[% file.root %]     # /tmp
[% file.abs %]      # /tmp/foo/bar.html

rel(path)

Top

This returns a relative path from the current file to another path specified as an argument. It is constructed by appending the path to the 'home' item.

[% USE file('foo/bar/baz.html') %]
[% file.rel('wiz/waz.html') %]      # ../../wiz/waz.html

EXAMPLES

Top
[% USE file('/foo/bar/baz.html') %]

[% file.path  %]      # /foo/bar/baz.html
[% file.dir   %]      # /foo/bar
[% file.name  %]      # baz.html
[% file.home  %]      # ../..
[% file.root  %]      # ''
[% file.abs   %]      # /foo/bar/baz.html
[% file.ext   %]      # html
[% file.mtime %]      # 987654321
[% file.atime %]      # 987654321
[% file.uid   %]      # 500
[% file.user  %]      # abw

[% USE file('foo.html') %]

[% file.path %]           # foo.html
[% file.dir  %]       # ''
[% file.name %]           # foo.html
[% file.root %]       # ''
[% file.home %]       # ''
[% file.abs  %]       # foo.html

[% USE file('foo/bar/baz.html') %]

[% file.path %]           # foo/bar/baz.html
[% file.dir  %]       # foo/bar
[% file.name %]           # baz.html
[% file.root %]       # ''
[% file.home %]       # ../..
[% file.abs  %]       # foo/bar/baz.html

[% USE file('foo/bar/baz.html', root='/tmp') %]

[% file.path %]           # foo/bar/baz.html
[% file.dir  %]       # foo/bar
[% file.name %]           # baz.html
[% file.root %]       # /tmp
[% file.home %]       # ../..
[% file.abs  %]       # /tmp/foo/bar/baz.html

# calculate other file paths relative to this file and its root
[% USE file('foo/bar/baz.html', root => '/tmp/tt2') %]

[% file.path('baz/qux.html') %]         # ../../baz/qux.html
[% file.dir('wiz/woz.html')  %]     # ../../wiz/woz.html

AUTHORS

Top

Michael Stevens wrote the original Directory plugin on which this is based. Andy Wardley split it into separate File and Directory plugins, added some extra code and documentation for VIEW support, and made a few other minor tweaks.

COPYRIGHT

Top

Copyright 2000-2007 Michael Stevens, Andy Wardley.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/Filter.html000700 000765 000765 00000061143 11756705110 022411 0ustar00abwabw000000 000000 Template::Plugin::Filter

SYNOPSIS

Top
package MyOrg::Template::Plugin::MyFilter;

use Template::Plugin::Filter;
use base qw( Template::Plugin::Filter );

sub filter {
    my ($self, $text) = @_;

    # ...mungify $text...

    return $text;
}

# now load it...
[% USE MyFilter %]

# ...and use the returned object as a filter
[% FILTER $MyFilter %]
  ...
[% END %]

DESCRIPTION

Top

This module implements a base class for plugin filters. It hides the underlying complexity involved in creating and using filters that get defined and made available by loading a plugin.

To use the module, simply create your own plugin module that is inherited from the Template::Plugin::Filter class.

package MyOrg::Template::Plugin::MyFilter;

use Template::Plugin::Filter;
use base qw( Template::Plugin::Filter );

Then simply define your filter() method. When called, you get passed a reference to your plugin object ($self) and the text to be filtered.

sub filter {
    my ($self, $text) = @_;

    # ...mungify $text...

    return $text;
}

To use your custom plugin, you have to make sure that the Template Toolkit knows about your plugin namespace.

my $tt2 = Template->new({
    PLUGIN_BASE => 'MyOrg::Template::Plugin',
});

Or for individual plugins you can do it like this:

my $tt2 = Template->new({
    PLUGINS => {
        MyFilter => 'MyOrg::Template::Plugin::MyFilter',
    },
});

Then you USE your plugin in the normal way.

[% USE MyFilter %]

The object returned is stored in the variable of the same name, 'MyFilter'. When you come to use it as a FILTER, you should add a dollar prefix. This indicates that you want to use the filter stored in the variable 'MyFilter' rather than the filter named 'MyFilter', which is an entirely different thing (see later for information on defining filters by name).

[% FILTER $MyFilter %]
   ...text to be filtered...
[% END %]

You can, of course, assign it to a different variable.

[% USE blat = MyFilter %]

[% FILTER $blat %]
   ...text to be filtered...
[% END %]

Any configuration parameters passed to the plugin constructor from the USE directive are stored internally in the object for inspection by the filter() method (or indeed any other method). Positional arguments are stored as a reference to a list in the _ARGS item while named configuration parameters are stored as a reference to a hash array in the _CONFIG item.

For example, loading a plugin as shown here:

[% USE blat = MyFilter 'foo' 'bar' baz = 'blam' %]

would allow the filter() method to do something like this:

sub filter {
    my ($self, $text) = @_;

    my $args = $self->{ _ARGS   };  # [ 'foo', 'bar' ]
    my $conf = $self->{ _CONFIG };  # { baz => 'blam' }

    # ...munge $text...

    return $text;
}

By default, plugins derived from this module will create static filters. A static filter is created once when the plugin gets loaded via the USE directive and re-used for all subsequent FILTER operations. That means that any argument specified with the FILTER directive are ignored.

Dynamic filters, on the other hand, are re-created each time they are used by a FILTER directive. This allows them to act on any parameters passed from the FILTER directive and modify their behaviour accordingly.

There are two ways to create a dynamic filter. The first is to define a $DYNAMIC class variable set to a true value.

package MyOrg::Template::Plugin::MyFilter;
use base 'Template::Plugin::Filter';
our $DYNAMIC = 1;

The other way is to set the internal _DYNAMIC value within the init() method which gets called by the new() constructor.

sub init {
    my $self = shift;
    $self->{ _DYNAMIC } = 1;
    return $self;
}

When this is set to a true value, the plugin will automatically create a dynamic filter. The outcome is that the filter() method will now also get passed a reference to an array of postional arguments and a reference to a hash array of named parameters.

So, using a plugin filter like this:

[% FILTER $blat 'foo' 'bar' baz = 'blam' %]

would allow the filter() method to work like this:

sub filter {
    my ($self, $text, $args, $conf) = @_;

    # $args = [ 'foo', 'bar' ]
    # $conf = { baz => 'blam' }
}

In this case can pass parameters to both the USE and FILTER directives, so your filter() method should probably take that into account.

[% USE MyFilter 'foo' wiz => 'waz' %]

[% FILTER $MyFilter 'bar' biz => 'baz' %]
   ...
[% END %]

You can use the merge_args() and merge_config() methods to do a quick and easy job of merging the local (e.g. FILTER) parameters with the internal (e.g. USE) values and returning new sets of conglomerated data.

sub filter {
    my ($self, $text, $args, $conf) = @_;

    $args = $self->merge_args($args); 
    $conf = $self->merge_config($conf);

    # $args = [ 'foo', 'bar' ]      
    # $conf = { wiz => 'waz', biz => 'baz' }        
    ...
}

You can also have your plugin install itself as a named filter by calling the install_filter() method from the init() method. You should provide a name for the filter, something that you might like to make a configuration option.

sub init {
    my $self = shift;
    my $name = $self->{ _CONFIG }->{ name } || 'myfilter';
    $self->install_filter($name);
    return $self;
}

This allows the plugin filter to be used as follows:

[% USE MyFilter %]

[% FILTER myfilter %] 
   ... 
[% END %]

or

[% USE MyFilter name = 'swipe' %]

[% FILTER swipe %] 
   ... 
[% END %]

Alternately, you can allow a filter name to be specified as the first positional argument.

sub init {
    my $self = shift;
    my $name = $self->{ _ARGS }->[0] || 'myfilter';
    $self->install_filter($name);
    return $self;
}

[% USE MyFilter 'swipe' %]

[% FILTER swipe %]
   ...
[% END %]

EXAMPLE

Top

Here's a complete example of a plugin filter module.

package My::Template::Plugin::Change;
use Template::Plugin::Filter;
use base qw( Template::Plugin::Filter );

sub init {
    my $self = shift;

    $self->{ _DYNAMIC } = 1;

    # first arg can specify filter name
    $self->install_filter($self->{ _ARGS }->[0] || 'change');

    return $self;
}

sub filter {
    my ($self, $text, $args, $config) = @_;

    $config = $self->merge_config($config);
    my $regex = join('|', keys %$config);

    $text =~ s/($regex)/$config->{ $1 }/ge;

    return $text;
}

1;

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/Format.html000700 000765 000765 00000034376 11756705110 022424 0ustar00abwabw000000 000000 Template::Plugin::Format

SYNOPSIS

Top
[% USE format %]
[% commented = format('# %s') %]
[% commented('The cat sat on the mat') %]

[% USE bold = format('<b>%s</b>') %]
[% bold('Hello') %]

DESCRIPTION

Top

The format plugin constructs sub-routines which format text according to a printf()-like format string.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/HTML.html000700 000765 000765 00000045603 11756705110 021733 0ustar00abwabw000000 000000 Template::Plugin::HTML

SYNOPSIS

Top
[% USE HTML %]

[% HTML.escape("if (a < b && c > d) ..." %]

[% HTML.element(table => { border => 1, cellpadding => 2 }) %]

[% HTML.attributes(border => 1, cellpadding => 2) %]

DESCRIPTION

Top

The HTML plugin is a very basic plugin, implementing a few useful methods for generating HTML.

METHODS

Top

escape(text)

Top

Returns the source text with any HTML reserved characters such as <, >, etc., correctly esacped to their entity equivalents.

attributes(hash)

Top

Returns the elements of the hash array passed by reference correctly formatted (e.g. values quoted and correctly escaped) as attributes for an HTML element.

element(type, attributes)

Top

Generates an HTML element of the specified type and with the attributes provided as an optional hash array reference as the second argument or as named arguments.

[% HTML.element(table => { border => 1, cellpadding => 2 }) %]
[% HTML.element('table', border=1, cellpadding=2) %]
[% HTML.element(table => attribs) %]

DEBUGGING

Top

The HTML plugin accepts a sorted option as a constructor argument which, when set to any true value, causes the attributes generated by the attributes() method (either directly or via element()) to be returned in sorted order. Order of attributes isn't important in HTML, but this is provided mainly for the purposes of debugging where it is useful to have attributes generated in a deterministic order rather than whatever order the hash happened to feel like returning the keys in.

[% USE HTML(sorted=1) %]
[% HTML.element( foo => { charlie => 1, bravo => 2, alpha => 3 } ) %]

generates:

<foo alpha="3" bravo="2" charlie="1">

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/Image.html000700 000765 000765 00000075333 11756705110 022214 0ustar00abwabw000000 000000 Template::Plugin::Image

SYNOPSIS

Top
[% USE Image(filename) %]
[% Image.width %]
[% Image.height %]
[% Image.size.join(', ') %]
[% Image.attr %]
[% Image.tag %]

DESCRIPTION

Top

This plugin provides an interface to the Image::Info or Image::Size modules for determining the size of image files.

You can specify the plugin name as either 'Image' or 'image'. The plugin object created will then have the same name. The file name of the image should be specified as a positional or named argument.

[% # all these are valid, take your pick %]
[% USE Image('foo.gif') %]
[% USE image('bar.gif') %]
[% USE Image 'ping.gif' %]
[% USE image(name='baz.gif') %]
[% USE Image name='pong.gif' %]

A root parameter can be used to specify the location of the image file:

[% USE Image(root='/path/to/root', name='images/home.png') %]
# image path: /path/to/root/images/home.png
# img src: images/home.png

In cases where the image path and image url do not match up, specify the file name directly:

[% USE Image(file='/path/to/home.png', name='/images/home.png') %]

The alt parameter can be used to specify an alternate name for the image, for use in constructing an XHTML element (see the tag() method below).

[% USE Image('home.png', alt="Home") %]

You can also provide an alternate name for an Image plugin object.

[% USE img1 = image 'foo.gif' %]
[% USE img2 = image 'bar.gif' %]

The name method returns the image file name.

[% img1.name %]     # foo.gif

The width and height methods return the width and height of the image, respectively. The size method returns a reference to a 2 element list containing the width and height.

[% USE image 'foo.gif' %]
width: [% image.width %]
height: [% image.height %]
size: [% image.size.join(', ') %]

The modtime method returns the modification time of the file in question, suitable for use with the Date plugin, for example:

[% USE image 'foo.gif' %]
[% USE date %]
[% date.format(image.modtime, "%B, %e %Y") %]

The attr method returns the height and width as HTML/XML attributes.

[% USE image 'foo.gif' %]
[% image.attr %]

Typical output:

width="60" height="20"

The tag method returns a complete XHTML tag referencing the image.

[% USE image 'foo.gif' %]
[% image.tag %]

Typical output:

<img src="foo.gif" width="60" height="20" alt="" />

You can provide any additional attributes that should be added to the XHTML tag.

[% USE image 'foo.gif' %]
[% image.tag(class="logo" alt="Logo") %]

Typical output:

<img src="foo.gif" width="60" height="20" alt="Logo" class="logo" />

Note that the alt attribute is mandatory in a strict XHTML img element (even if it's empty) so it is always added even if you don't explicitly provide a value for it. You can do so as an argument to the tag method, as shown in the previous example, or as an argument

[% USE image('foo.gif', alt='Logo') %]

CATCHING ERRORS

Top

If the image file cannot be found then the above methods will throw an Image error. You can enclose calls to these methods in a TRY...CATCH block to catch any potential errors.

[% TRY;
     image.width;
   CATCH;
     error;      # print error
   END
%]

USING Image::Info

Top

At run time, the plugin tries to load Image::Info in preference to Image::Size. If Image::Info is found, then some additional methods are available, in addition to size, width, height, attr, and tag. These additional methods are named after the elements that Image::Info retrieves from the image itself. The types of methods available depend on the type of image (see Image::Info for more details). These additional methods will always include the following:

file_media_type

Top

This is the MIME type that is appropriate for the given file format. The corresponding value is a string like: "image/png" or "image/jpeg".

file_ext

Top

The is the suggested file name extention for a file of the given file format. The value is a 3 letter, lowercase string like "png", "jpg".

color_type

Top

The value is a short string describing what kind of values the pixels encode. The value can be one of the following:

Gray
GrayA
RGB
RGBA
CMYK
YCbCr
CIELab

These names can also be prefixed by "Indexed-" if the image is composed of indexes into a palette. Of these, only "Indexed-RGB" is likely to occur.

(It is similar to the TIFF field PhotometricInterpretation, but this name was found to be too long, so we used the PNG inpired term instead.)

resolution

Top

The value of this field normally gives the physical size of the image on screen or paper. When the unit specifier is missing then this field denotes the squareness of pixels in the image.

The syntax of this field is:

<res> <unit>
<xres> "/" <yres> <unit>
<xres> "/" <yres>

The <res>, <xres> and <yres> fields are numbers. The <unit> is a string like dpi, dpm or dpcm (denoting "dots per inch/cm/meter).

SamplesPerPixel

Top

This says how many channels there are in the image. For some image formats this number might be higher than the number implied from the color_type.

BitsPerSample

Top

This says how many bits are used to encode each of samples. The value is a reference to an array containing numbers. The number of elements in the array should be the same as SamplesPerPixel.

Comment

Top

Textual comments found in the file. The value is a reference to an array if there are multiple comments found.

Interlace

Top

If the image is interlaced, then this returns the interlace type.

Compression

Top

This returns the name of the compression algorithm is used.

Gamma

Top

A number indicating the gamma curve of the image (e.g. 2.2)

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/index.html000700 000765 000765 00000033617 11756705110 022300 0ustar00abwabw000000 000000 Template::Plugin::* Modules

Section Index

Top

This section contains the documentation for the Template::Plugin::* modules.


TT_v224_html_docs/modules/Template/Plugin/Iterator.html000700 000765 000765 00000035233 11756705110 022756 0ustar00abwabw000000 000000 Template::Plugin::Iterator

SYNOPSIS

Top
[% USE iterator(list, args) %]

[% FOREACH item = iterator %]
   [% '<ul>' IF iterator.first %]
   <li>[% item %]
   [% '</ul>' IF iterator.last %]
[% END %]

DESCRIPTION

Top

The iterator plugin provides a way to create a Template::Iterator object to iterate over a data set. An iterator is implicitly automatically by the FOREACH directive. This plugin allows the iterator to be explicitly created with a given name.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/Math.html000700 000765 000765 00000046234 11756705111 022062 0ustar00abwabw000000 000000 Template::Plugin::Math

SYNOPSIS

Top
[% USE Math %]

[% Math.sqrt(9) %]

DESCRIPTION

Top

The Math plugin provides numerous mathematical functions for use within templates.

METHODS

Top

Template::Plugin::Math makes available the following functions from the Perl core:

  • abs
  • atan2
  • cos
  • exp
  • hex
  • int
  • log
  • oct
  • rand
  • sin
  • sqrt
  • srand

In addition, if the Math::Trig module can be loaded, the following functions are also available:

  • pi
  • tan
  • csc
  • cosec
  • sec
  • cot
  • cotan
  • asin
  • acos
  • atan
  • acsc
  • acosec
  • asec
  • acot
  • acotan
  • sinh
  • cosh
  • tanh
  • csch
  • cosech
  • sech
  • coth
  • cotanh
  • asinh
  • acosh
  • atanh
  • acsch
  • acosech
  • asech
  • acoth
  • acotanh
  • rad2deg
  • rad2grad
  • deg2rad
  • deg2grad
  • grad2rad
  • grad2deg

If the Math::TrulyRandom module is available, and you've got the time to wait, the truly_random_number method is available:

[% Math.truly_random_number %]

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/Pod.html000700 000765 000765 00000034371 11756705111 021712 0ustar00abwabw000000 000000 Template::Plugin::Pod

SYNOPSIS

Top
[% USE Pod(podfile) %]

[% FOREACH head1 = Pod.head1;
     FOREACH head2 = head1/head2;
       ...
     END;
   END
%]

DESCRIPTION

Top

This plugin is an interface to the Pod::POM module.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/Procedural.html000700 000765 000765 00000036443 11756705111 023272 0ustar00abwabw000000 000000 Template::Plugin::Procedural

SYNOPSIS

Top
package Template::Plugin::LWPSimple;
use base qw(Template::Plugin::Procedural);
use LWP::Simple;  # exports 'get'
1;

[% USE LWPSimple %]
[% LWPSimple.get("http://www.tt2.org/") %]

DESCRIPTION

Top

Template::Plugin::Procedural is a base class for Template Toolkit plugins that causes defined subroutines to be called directly rather than as a method. Essentially this means that subroutines will not receive the class name or object as its first argument.

This is most useful when creating plugins for modules that normally work by exporting subroutines that do not expect such additional arguments.

Despite the fact that subroutines will not be called in an OO manner, inheritance still function as normal. A class that uses Template::Plugin::Procedural can be subclassed and both subroutines defined in the subclass and subroutines defined in the original class will be available to the Template Toolkit and will be called without the class/object argument.

AUTHOR

Top

Mark Fowler <mark@twoshortplanks.com> http://www.twoshortplanks.com

COPYRIGHT

Top

Copyright (C) 2002 Mark Fowler <mark@twoshortplanks.com>

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/Scalar.html000700 000765 000765 00000034701 11756705111 022372 0ustar00abwabw000000 000000 Template::Plugin::Scalar

SYNOPSIS

Top
[% USE scalar %]

# TT2 calls object methods in array context by default
[% object.method %]

# force it to use scalar context
[% object.scalar.method %]

# also works with subroutine references
[% scalar.my_sub_ref %]

DESCRIPTION

Top

The Template Toolkit calls user-defined subroutines and object methods using Perl's array context by default. This plugin module provides a way for you to call subroutines and methods in scalar context.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 2008 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/String.html000700 000765 000765 00000132317 11756705111 022435 0ustar00abwabw000000 000000 Template::Plugin::String

SYNOPSIS

Top
# create String objects via USE directive
[% USE String %]
[% USE String 'initial text' %]
[% USE String text => 'initial text' %]

# or from an existing String via new()
[% newstring = String.new %]
[% newstring = String.new('newstring text') %]
[% newstring = String.new( text => 'newstring text' ) %]

# or from an existing String via copy()
[% newstring = String.copy %]

# append text to string
[% String.append('text to append') %]

# format left, right or center/centre padded
[% String.left(20) %]
[% String.right(20) %]
[% String.center(20) %]   # American spelling
[% String.centre(20) %]   # European spelling

# and various other methods...

DESCRIPTION

Top

This module implements a String class for doing stringy things to text in an object-oriented way.

You can create a String object via the USE directive, adding any initial text value as an argument or as the named parameter text.

[% USE String %]
[% USE String 'initial text' %]
[% USE String text='initial text' %]

The object created will be referenced as String by default, but you can provide a different variable name for the object to be assigned to:

[% USE greeting = String 'Hello World' %]

Once you've got a String object, you can use it as a prototype to create other String objects with the new() method.

[% USE String %]
[% greeting = String.new('Hello World') %]

The new() method also accepts an initial text string as an argument or the named parameter text.

[% greeting = String.new( text => 'Hello World' ) %]

You can also call copy() to create a new String as a copy of the original.

[% greet2 = greeting.copy %]

The String object has a text() method to return the content of the string.

[% greeting.text %]

However, it is sufficient to simply print the string and let the overloaded stringification operator call the text() method automatically for you.

[% greeting %]

Thus, you can treat String objects pretty much like any regular piece of text, interpolating it into other strings, for example:

[% msg = "It printed '$greeting' and then dumped core\n" %]

You also have the benefit of numerous other methods for manipulating the string.

[% msg.append("PS  Don't eat the yellow snow") %]

Note that all methods operate on and mutate the contents of the string itself. If you want to operate on a copy of the string then simply take a copy first:

[% msg.copy.append("PS  Don't eat the yellow snow") %]

These methods return a reference to the String object itself. This allows you to chain multiple methods together.

[% msg.copy.append('foo').right(72) %]

It also means that in the above examples, the String is returned which causes the text() method to be called, which results in the new value of the string being printed. To suppress printing of the string, you can use the CALL directive.

[% foo = String.new('foo') %]

[% foo.append('bar') %]         # prints "foobar"

[% CALL foo.append('bar') %]    # nothing

CONSTRUCTOR METHODS

Top

These methods are used to create new String objects.

new()

Top

Creates a new string using an initial value passed as a positional argument or the named parameter text.

[% USE String %]
[% msg = String.new('Hello World') %]
[% msg = String.new( text => 'Hello World' ) %]

copy()

Top

Creates a new String object which contains a copy of the original string.

[% msg2 = msg.copy %]

INSPECTOR METHODS

Top

These methods are used to examine the string.

text()

Top

Returns the internal text value of the string. The stringification operator is overloaded to call this method. Thus the following are equivalent:

[% msg.text %]
[% msg %]

length()

Top

Returns the length of the string.

[% USE String("foo") %]
[% String.length %]   # => 3
Top

Searches the string for the regular expression specified in $pattern returning true if found or false otherwise.

[% item = String.new('foo bar baz wiz waz woz') %]
[% item.search('wiz') ? 'WIZZY! :-)' : 'not wizzy :-(' %]

split($pattern, $limit)

Top

Splits the string based on the delimiter $pattern and optional $limit. Delegates to Perl's internal split() so the parameters are exactly the same.

[% FOREACH item.split %]
     ...
[% END %]

[% FOREACH item.split('baz|waz') %]
     ...
[% END %]

MUTATOR METHODS

Top

These methods modify the internal value of the string. For example:

[% USE str=String('foobar') %]
[% str.append('.html') %]   # str => 'foobar.html'

The value of str is now 'foobar.html'. If you don't want to modify the string then simply take a copy first.

[% str.copy.append('.html') %]

These methods all return a reference to the String object itself. This has two important benefits. The first is that when used as above, the String object 'str' returned by the append() method will be stringified with a call to its text() method. This will return the newly modified string content. In other words, a directive like:

[% str.append('.html') %]

will update the string and also print the new value. If you just want to update the string but not print the new value then use CALL.

[% CALL str.append('.html') %]

The other benefit of these methods returning a reference to the String is that you can chain as many different method calls together as you like. For example:

[% String.append('.html').trim.format(href) %]

Here are the methods:

push($suffix, ...) / append($suffix, ...)

Top

Appends all arguments to the end of the string. The append() method is provided as an alias for push().

[% msg.push('foo', 'bar') %]
[% msg.append('foo', 'bar') %]

pop($suffix)

Top

Removes the suffix passed as an argument from the end of the String.

[% USE String 'foo bar' %]
[% String.pop(' bar')   %]   # => 'foo'

unshift($prefix, ...) / prepend($prefix, ...)

Top

Prepends all arguments to the beginning of the string. The prepend() method is provided as an alias for unshift().

[% msg.unshift('foo ', 'bar ') %]
[% msg.prepend('foo ', 'bar ') %]

shift($prefix)

Top

Removes the prefix passed as an argument from the start of the String.

[% USE String 'foo bar' %]
[% String.shift('foo ') %]   # => 'bar'

left($pad)

Top

If the length of the string is less than $pad then the string is left formatted and padded with spaces to $pad length.

[% msg.left(20) %]

right($pad)

Top

As per left() but right padding the String to a length of $pad.

[% msg.right(20) %]

center($pad) / centre($pad)

Top

As per left() and right() but formatting the String to be centered within a space padded string of length $pad. The centre() method is provided as an alias for center().

[% msg.center(20) %]    # American spelling
[% msg.centre(20) %]    # European spelling

format($format)

Top

Apply a format in the style of sprintf() to the string.

[% USE String("world") %]
[% String.format("Hello %s\n") %]  # => "Hello World\n"

upper()

Top

Converts the string to upper case.

[% USE String("foo") %]
[% String.upper %]  # => 'FOO'

lower()

Top

Converts the string to lower case

[% USE String("FOO") %]
[% String.lower %]  # => 'foo'

capital()

Top

Converts the first character of the string to upper case.

[% USE String("foo") %]
[% String.capital %]  # => 'Foo'

The remainder of the string is left untouched. To force the string to be all lower case with only the first letter capitalised, you can do something like this:

[% USE String("FOO") %]
[% String.lower.capital %]  # => 'Foo'

chop()

Top

Removes the last character from the string.

[% USE String("foop") %]
[% String.chop %]   # => 'foo'

chomp()

Top

Removes the trailing newline from the string.

[% USE String("foo\n") %]
[% String.chomp %]  # => 'foo'

trim()

Top

Removes all leading and trailing whitespace from the string

[% USE String("   foo   \n\n ") %]
[% String.trim %]   # => 'foo'

collapse()

Top

Removes all leading and trailing whitespace and collapses any sequences of multiple whitespace to a single space.

[% USE String(" \n\r  \t  foo   \n \n bar  \n") %]
[% String.collapse %]   # => "foo bar"

truncate($length, $suffix)

Top

Truncates the string to $length characters.

[% USE String('long string') %]
[% String.truncate(4) %]  # => 'long'

If $suffix is specified then it will be appended to the truncated string. In this case, the string will be further shortened by the length of the suffix to ensure that the newly constructed string complete with suffix is exactly $length characters long.

[% USE msg = String('Hello World') %]
[% msg.truncate(8, '...') %]   # => 'Hello...'

replace($search, $replace)

Top

Replaces all occurences of $search in the string with $replace.

[% USE String('foo bar foo baz') %]
[% String.replace('foo', 'wiz')  %]  # => 'wiz bar wiz baz'

remove($search)

Top

Remove all occurences of $search in the string.

[% USE String('foo bar foo baz') %]
[% String.remove('foo ')  %]  # => 'bar baz'

repeat($count)

Top

Repeats the string $count times.

[% USE String('foo ') %]
[% String.repeat(3)  %]  # => 'foo foo foo '

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/Table.html000700 000765 000765 00000056617 11756705111 022226 0ustar00abwabw000000 000000 Template::Plugin::Table

SYNOPSIS

Top
[% USE table(list, rows=n, cols=n, overlap=n, pad=0) %]

[% FOREACH item IN table.row(n) %]
   [% item %]
[% END %]

[% FOREACH item IN table.col(n) %]
   [% item %]
[% END %]

[% FOREACH row IN table.rows %]
   [% FOREACH item IN row %]
      [% item %]
   [% END %]
[% END %]

[% FOREACH col IN table.cols %]
   [% col.first %] - [% col.last %] ([% col.size %] entries)
[% END %]

DESCRIPTION

Top

The Table plugin allows you to format a list of data items into a virtual table. When you create a Table plugin via the USE directive, simply pass a list reference as the first parameter and then specify a fixed number of rows or columns.

[% USE Table(list, rows=5) %]
[% USE table(list, cols=5) %]

The Table plugin name can also be specified in lower case as shown in the second example above. You can also specify an alternative variable name for the plugin as per regular Template Toolkit syntax.

[% USE mydata = table(list, rows=5) %]

The plugin then presents a table based view on the data set. The data isn't actually reorganised in any way but is available via the row(), col(), rows() and cols() as if formatted into a simple two dimensional table of n rows x n columns.

So if we had a sample alphabet list contained the letters 'a' to 'z', the above USE directives would create plugins that represented the following views of the alphabet.

[% USE table(alphabet, ... %]

rows=5                  cols=5
a  f  k  p  u  z        a  g  m  s  y
b  g  l  q  v           b  h  n  t  z
c  h  m  r  w           c  i  o  u
d  i  n  s  x           d  j  p  v
e  j  o  t  y           e  k  q  w
                        f  l  r  x

We can request a particular row or column using the row() and col() methods.

[% USE table(alphabet, rows=5) %]
[% FOREACH item = table.row(0) %]
   # [% item %] set to each of [ a f k p u z ] in turn
[% END %]

[% FOREACH item = table.col(2) %]
   # [% item %] set to each of [ m n o p q r ] in turn
[% END %]

Data in rows is returned from left to right, columns from top to bottom. The first row/column is 0. By default, rows or columns that contain empty values will be padded with the undefined value to fill it to the same size as all other rows or columns.

For example, the last row (row 4) in the first example would contain the values [ e j o t y undef ]. The Template Toolkit will safely accept these undefined values and print a empty string. You can also use the IF directive to test if the value is set.

 [% FOREACH item = table.row(4) %]
[% IF item %]
   Item: [% item %]
[% END %]
 [% END %]

You can explicitly disable the pad option when creating the plugin to returned shortened rows/columns where the data is empty.

 [% USE table(alphabet, cols=5, pad=0) %]
 [% FOREACH item = table.col(4) %]
# [% item %] set to each of 'y z'
 [% END %]

The rows() method returns all rows/columns in the table as a reference to a list of rows (themselves list references). The row() methods when called without any arguments calls rows() to return all rows in the table.

Ditto for cols() and col().

[% USE table(alphabet, cols=5) %]
[% FOREACH row = table.rows %]
   [% FOREACH item = row %]
      [% item %]
   [% END %]
[% END %]

The Template Toolkit provides the first, last and size virtual methods that can be called on list references to return the first/last entry or the number of entries in a list. The following example shows how we might use this to provide an alphabetical index split into 3 even parts.

[% USE table(alphabet, cols=3, pad=0) %]
[% FOREACH group = table.col %]
   [ [% group.first %] - [% group.last %] ([% group.size %] letters) ]
[% END %]

This produces the following output:

[ a - i (9 letters) ]
[ j - r (9 letters) ]
[ s - z (8 letters) ]

We can also use the general purpose join virtual method which joins the items of the list using the connecting string specified.

[% USE table(alphabet, cols=5) %]
[% FOREACH row = table.rows %]
   [% row.join(' - ') %]
[% END %]

Data in the table is ordered downwards rather than across but can easily be transformed on output. For example, to format our data in 5 columns with data ordered across rather than down, we specify rows=5 to order the data as such:

a  f  .  .
b  g  .
c  h
d  i
e  j

and then iterate down through each column (a-e, f-j, etc.) printing the data across.

a  b  c  d  e
f  g  h  i  j
.  .
.

Example code to do so would be much like the following:

[% USE table(alphabet, rows=3) %]
[% FOREACH cols = table.cols %]
  [% FOREACH item = cols %]
    [% item %]
  [% END %]
[% END %]

Output:

a  b  c
d  e  f
g  h  i
j  .  .
.

In addition to a list reference, the Table plugin constructor may be passed a reference to a Template::Iterator object or subclass thereof. The Template::Iterator get_all() method is first called on the iterator to return all remaining items. These are then available via the usual Table interface.

[% USE DBI(dsn,user,pass) -%]

# query() returns an iterator
[% results = DBI.query('SELECT * FROM alphabet ORDER BY letter') %]

# pass into Table plugin
[% USE table(results, rows=8 overlap=1 pad=0) -%]

[% FOREACH row = table.cols -%]
   [% row.first.letter %] - [% row.last.letter %]:
      [% row.join(', ') %]
[% END %]

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/URL.html000700 000765 000765 00000045000 11756705111 021621 0ustar00abwabw000000 000000 Template::Plugin::URL

SYNOPSIS

Top
[% USE url('/cgi-bin/foo.pl') %]

[% url(debug = 1, id = 123) %]
   # ==> /cgi/bin/foo.pl?debug=1&amp;id=123

[% USE mycgi = url('/cgi-bin/bar.pl', mode='browse', debug=1) %]

[% mycgi %]
   # ==> /cgi/bin/bar.pl?mode=browse&amp;debug=1

[% mycgi(mode='submit') %]
   # ==> /cgi/bin/bar.pl?mode=submit&amp;debug=1

[% mycgi(debug='d2 p0', id='D4-2k[4]') %]
   # ==> /cgi-bin/bar.pl?mode=browse&amp;debug=d2%20p0&amp;id=D4-2k%5B4%5D

DESCRIPTION

Top

The URL plugin can be used to construct complex URLs from a base stem and a hash array of additional query parameters.

The constructor should be passed a base URL and optionally, a hash array reference of default parameters and values. Used from with a template, it would look something like the following:

[% USE url('http://www.somewhere.com/cgi-bin/foo.pl') %]
[% USE url('/cgi-bin/bar.pl', mode='browse') %]
[% USE url('/cgi-bin/baz.pl', mode='browse', debug=1) %]

When the plugin is then called without any arguments, the default base and parameters are returned as a formatted query string.

[% url %]

For the above three examples, these will produce the following outputs:

http://www.somewhere.com/cgi-bin/foo.pl
/cgi-bin/bar.pl?mode=browse
/cgi-bin/baz.pl?mode=browse&amp;debug=1

Note that additional parameters are separated by '&amp;' rather than simply '&'. This is the correct behaviour for HTML pages but is, unfortunately, incorrect when creating URLs that do not need to be encoded safely for HTML. This is likely to be corrected in a future version of the plugin (most probably with TT3). In the mean time, you can set $Template::Plugin::URL::JOINT to & to get the correct behaviour.

Additional parameters may be also be specified to the URL:

[% url(mode='submit', id='wiz') %]

Which, for the same three examples, produces:

http://www.somewhere.com/cgi-bin/foo.pl?mode=submit&amp;id=wiz
/cgi-bin/bar.pl?mode=browse&amp;id=wiz
/cgi-bin/baz.pl?mode=browse&amp;debug=1&amp;id=wiz

A new base URL may also be specified as the first option:

[% url('/cgi-bin/waz.pl', test=1) %]

producing

/cgi-bin/waz.pl?test=1
/cgi-bin/waz.pl?mode=browse&amp;test=1
/cgi-bin/waz.pl?mode=browse&amp;debug=1&amp;test=1

The ordering of the parameters is non-deterministic due to fact that Perl's hashes themselves are unordered. This isn't a problem as the ordering of CGI parameters is insignificant (to the best of my knowledge). All values will be properly escaped thanks to some code borrowed from Lincoln Stein's CGI module. e.g.

[% USE url('/cgi-bin/woz.pl') %]
[% url(name="Elrich von Benjy d'Weiro") %]

Here the spaces and "'" character are escaped in the output:

/cgi-bin/woz.pl?name=Elrich%20von%20Benjy%20d%27Weiro

An alternate name may be provided for the plugin at construction time as per regular Template Toolkit syntax.

[% USE mycgi = url('cgi-bin/min.pl') %]
[% mycgi(debug=1) %]

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/View.html000700 000765 000765 00000035767 11756705111 022114 0ustar00abwabw000000 000000 Template::Plugin::View

SYNOPSIS

Top
[% USE view(
        prefix = 'splash/'          # template prefix/suffix
        suffix = '.tt2'             
        bgcol  = '#ffffff'          # and any other variables you 
        style  = 'Fancy HTML'       # care to define as view metadata,
        items  = [ foo, bar.baz ]   # including complex data and
        foo    = bar ? baz : x.y.z  # expressions
%]

[% view.title %]                    # access view metadata

[% view.header(title = 'Foo!') %]   # view "methods" process blocks or
[% view.footer %]                   # templates with prefix/suffix added

DESCRIPTION

Top

This plugin module creates Template::View objects. Views are an experimental feature and are subject to change in the near future. In the mean time, please consult Template::View for further info.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Plugin/Wrap.html000700 000765 000765 00000040747 11756705112 022106 0ustar00abwabw000000 000000 Template::Plugin::Wrap

SYNOPSIS

Top
[% USE wrap %]

# call wrap subroutine
[% wrap(mytext, width, initial_tab,  subsequent_tab) %]

# or use wrap FILTER
[% mytext FILTER wrap(width, initital_tab, subsequent_tab) %]

DESCRIPTION

Top

This plugin provides an interface to the Text::Wrap module which provides simple paragraph formatting.

It defines a wrap subroutine which can be called, passing the input text and further optional parameters to specify the page width (default: 72), and tab characters for the first and subsequent lines (no defaults).

[% USE wrap %]

[% text = BLOCK %]
First, attach the transmutex multiplier to the cross-wired 
quantum homogeniser.
[% END %]

[% wrap(text, 40, '* ', '  ') %]

Output:

* First, attach the transmutex
  multiplier to the cross-wired quantum
  homogeniser.

It also registers a wrap filter which accepts the same three optional arguments but takes the input text directly via the filter input.

Example 1:

[% FILTER bullet = wrap(40, '* ', '  ') -%]
First, attach the transmutex multiplier to the cross-wired quantum
homogeniser.
[%- END %]

Output:

* First, attach the transmutex
  multiplier to the cross-wired quantum
  homogeniser.

Example 2:

[% FILTER bullet -%]
Then remodulate the shield to match the harmonic frequency, taking 
care to correct the phase difference.
[% END %]

Output:

* Then remodulate the shield to match
  the harmonic frequency, taking 
  care to correct the phase difference.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

The Text::Wrap module was written by David Muir Sharnoff with help from Tim Pierce and many others.

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Namespace/Constants.html000700 000765 000765 00000034741 11756705106 023607 0ustar00abwabw000000 000000 Template::Namespace::Constants

SYNOPSIS

Top
# easy way to define constants
use Template;

my $tt = Template->new({
    CONSTANTS => {
        pi => 3.14,
        e  => 2.718,
    },
});

# nitty-gritty, hands-dirty way
use Template::Namespace::Constants;

my $tt = Template->new({
    NAMESPACE => {
        constants => Template::Namespace::Constants->new({
            pi => 3.14,
            e  => 2.718,
        },
    },
});

DESCRIPTION

Top

The Template::Namespace::Constants module implements a namespace handler which is plugged into the Template::Directive compiler module. This then performs compile time constant folding of variables in a particular namespace.

METHODS

Top

new(\%constants)

Top

The new() constructor method creates and returns a reference to a new Template::Namespace::Constants object. This creates an internal stash to store the constant variable definitions passed as arguments.

my $handler = Template::Namespace::Constants->new({
    pi => 3.14,
    e  => 2.718,
});

ident(\@ident)

Top

Method called to resolve a variable identifier into a compiled form. In this case, the method fetches the corresponding constant value from its internal stash and returns it.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


TT_v224_html_docs/modules/Template/Namespace/index.html000700 000765 000765 00000021657 11756705106 022744 0ustar00abwabw000000 000000 Template::Namespace::* Modules

Section Index

Top

This section contains the documentation for the Template::Namespace::* modules.


TT_v224_html_docs/misc/FAQ.html000700 000765 000765 00000071653 10627764406 016065 0ustar00abwabw000000 000000 Template::FAQ

DESCRIPTION

Top

Template Toolkit Language

Top

Why doesn't [% a = b IF c %] work as expected?

Top

Because the parser interprets it as

[% a = (b IF c) %]

Do this instead:

[% SET a = b IF c %]

If I'm using TT to write out a TT template, is there a good way to escape [% and %]?

Top

You can do this: [% stag = "[\%" etag = "%\]" %] and then: [% stag; 'hello'; etag %]

Or something like:

[% TAGS [- -] %]
[- INCLUDE foo -]   # is a directive
[% INCLUDE foo %]   # not a directive, just plain text, passed through

How do I iterate over a hash?

Top

This is covered in the Template::Manual::VMethods section of the manual page. A list of all the keys that are in the hash can be obtained with the 'keys' virtual method. You can then iterate over that list and by looking up each key in turn get the value.

[% FOREACH key = product.keys %]
   [% key %] => [% product.$key %]
[% END %]

Plugins

Top

How do I get the Table plugin to order data across rather than down?

Top

Order the data into rows:

 Steve     Karen     Jeff
 Brooklyn  Nantucket Fairfax
 NY        MA        VA

[% USE table(data, rows=3) %]

Then ask for each column

[% FOREACH column = table.cols %]

And then print each item in the column going across the output rows

[% FOREACH item = column %]
<td>[% item %]</td>
[% END %]

Accessing Cookies

Top

Jeff Boes <jboes@nexcerpt.com> asks:

Does anyone have a quick-n-dirty approach to accessing 
cookies from templates? 

Jonas Liljegren answers:

[% USE CGI %]

<p>The value is [% CGI.cookie('cookie_name') | html %]

Extending the Template Toolkit

Top

Can I serve templates from a database?

Top

Short answer: yes, Chris Nandor has done this for Slash. You need to subclass Template::Provider. See the mailing list archives for further info.

Can I fetch templates via http?

Top

To do the job properly, you should sublcass Template::Provider to Template::Provider::HTTP and use a PREFIX_MAP option to bind the 'http' template prefix to that particular provider (you may want to go digging around in the Changes file around version 2.01 for more info on PREFIX_MAP - it may not be properly documented anywhere else...yet!). e.g. (untested due to lack of existing HTTP Provider - patches welcome!).

use Template::Provider::HTTP;
my $file = Template::Provider( INCLUDE_PATH => [...] );
my $http = Template::Provider::HTTP->new(...);
my $tt2  = Template->new({
LOAD_TEMPLATES => [ $file, $http ],
PREFIX_MAP => {
    file    => '0',    # file:foo.html
    http    => '1',    # http:foo.html
    default => '0',    # foo.html => file:foo.html
}
});

Now a template specified as:

[% INCLUDE foo %]

will be served by the 'file' provider (the default). Otherwise you can explicitly add a prefix:

[% INCLUDE file:foo.html %]
[% INCLUDE http:foo.html %]
[% INCLUDE http://www.xyz.com/tt2/header.tt2 %]

This same principal can be used to create a DBI template provider. e.g.

[% INCLUDE dbi:foo.html %]

But similarly, alas, we don't yet have a DBI provider as part of the Template Toolkit. There has been some talk on the mailing list about efforts to develop DBI and/or HTTP providers but as yet no-one has stepped forward to take up the challenge...

In the mean time, Craig's post from the mailing list has some useful pointers on how to acheive this using existing modules:

To: Adam Theo <adamtheo@theoretic.com> 
From: Craig Barratt <craig@arraycomm.com>
Date: Fri, 18 May 2001 17:06:59 -0700

> i was wondering if there is anyway to fetch a file using http:// or
> ftp:// and include that?

Here's one way.  Set the LOAD_PERL option:

    use Template;

    my $template = Template->new({  
        LOAD_PERL => 1
    });  
    $template->process("example.tt", { stdout => *STDOUT })
                     || die $template->error();

and then use LWP::UserAgent and HTTP::Request:

    [% 
        USE ua = LWP.UserAgent; 
        ua.proxy("http", "http://your_proxy/");
        USE req = HTTP.Request("GET", "http://www.cpan.org");
        ua.request(req).content;
    -%]

For FTP use Net::FTP:

    [%   
        USE ftp = Net.FTP("ftp.cpan.org");
        x = ftp.login("anonymous", "me@here.there");
        x = ftp.cwd("/");
        x = ftp.get("welcome.msg", stdout);
        x = ftp.quit;
    -%]

Normally ftp.get would write the file into the current directory.
Instead we pass stdout as a second argument so that it is written
to stdout.  We set stdout to STDOUT in the variables we pass to
process. 

Craig

Miscellaneous

Top

How can I find out the name of the main template being processed?

Top

The template variable contains a reference to the Template::Document object for the main template you're processing (i.e. the one provided as the first argument to the Template process() method). The name method returns its name.

[% template.name %]     # e.g. index.html

How can I find out the name of the current template being processed?

Top

The template variable always references the main template being processed. So even if you call [% INCLUDE header %], and that calls [% INCLUDE menu %], the template variable will be unchanged.

index.html:

[% template.name  %]     # index.html
[% INCLUDE header %]

header:

[% template.name  %]     # index.html
[% INCLUDE menu   %]

menu:

[% template.name  %]     # index.html

In constrast, the component variable always references the current template being processed.

index.html

[% component.name %]     # index.html
[% INCLUDE header %]

header:

[% component.name %]     # header
[% INCLUDE menu   %]

menu:

[% component.name  %]     # menu

How do I print the modification time of the template or component?

Top

The template and component variables reference the main template and the current template being processed (see previous questions). The modtime method returns the modification time of the corresponding template file as a number of seconds since the Unix epoch (00:00:00 GMT 1st January 1970).

This number doesn't mean much to anyone (except perhaps serious Unix geeks) so you'll probably want to use the Date plugin to format it for human consumption.

[% USE Date %]
[% template.name %] last modified [% Date.format(template.modtime) %]

How can I configure variables on a per-request basis?

Top

One easy way to acheive this is to define a single PRE_PROCESS template which loads in other configuration files based on variables defined or other conditions.

For example, my setup usually looks something like this:

PRE_PROCESS => 'config/main'

config/main:

[%  DEFAULT  style   = 'text'
             section =  template.section or 'home';
    PROCESS  config/site
          +  config/urls
          +  config/macros
          + "config/style/$style"
          + "config/section/$section"
          + ...
%]

This allows me to set a single 'style' variable to control which config file gets pre-processed to set my various style options (colours, img paths, etc). For example:

config/style/basic:

[%  style = {
    name = style    # save existing 'style' var as 'style.name'
# define various other style variables....
    col = {
    back => '#ffffff'
    text => '#000000'
    # ...etc...
}
logo = {
    # ...etc...
}
    # ...etc...
}
%]

Each source template can declare which section it's in via a META directive:

[% META
 title   = 'General Information'
 section = 'info'
%]
...

This controls which section configuration file gets loaded to set various other variables for defining the section title, menu, etc.

config/section/info:

[%  section = {
        name   = section  # save 'section' var as 'section.name'
        title  = 'Information'
        menu   = [ ... ]
        # ...etc...
    }
%]

This illustrates the basic principal but you can extend it to perform pretty much any kind of per-document initialisation that you require.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


/misc/FAQ.html last modified 10:38:14 01-Jun-2007
TT_v224_html_docs/manual/Config.html000700 000765 000765 00000424032 11756705103 017167 0ustar00abwabw000000 000000 Template::Manual::Config

Template Style and Parsing Options

Top

START_TAG, END_TAG

Top

The START_TAG and END_TAG options are used to specify character sequences or regular expressions that mark the start and end of a template directive. The default values for START_TAG and END_TAG are '[%' and '%]' respectively, giving us the familiar directive style:

[% example %]

Any Perl regex characters can be used and therefore should be escaped (or use the Perl quotemeta function) if they are intended to represent literal characters.

my $template = Template->new({ 
    START_TAG => quotemeta('<+'),
    END_TAG   => quotemeta('+>'),
});

Example:

<+ INCLUDE foobar +>

The TAGS directive can also be used to set the START_TAG and END_TAG values on a per-template file basis.

[% TAGS <+ +> %]

TAG_STYLE

Top

The TAG_STYLE option can be used to set both START_TAG and END_TAG according to pre-defined tag styles.

my $template = Template->new({ 
    TAG_STYLE => 'star',
});

Available styles are:

template    [% ... %]               (default)
template1   [% ... %] or %% ... %%  (TT version 1)
metatext    %% ... %%               (Text::MetaText)
star        [* ... *]               (TT alternate)
php         <? ... ?>               (PHP)
asp         <% ... %>               (ASP)
mason       <% ...  >               (HTML::Mason)
html        <!-- ... -->            (HTML comments)

Any values specified for START_TAG and/or END_TAG will override those defined by a TAG_STYLE.

The TAGS directive may also be used to set a TAG_STYLE

[% TAGS html %]
<!-- INCLUDE header -->

PRE_CHOMP, POST_CHOMP

Top

Anything outside a directive tag is considered plain text and is generally passed through unaltered (but see the INTERPOLATE option). This includes all whitespace and newlines characters surrounding directive tags. Directives that don't generate any output will leave gaps in the output document.

Example:

Foo
[% a = 10 %]
Bar

Output:

Foo

Bar

The PRE_CHOMP and POST_CHOMP options can help to clean up some of this extraneous whitespace. Both are disabled by default.

my $template = Template-E<gt>new({
    PRE_CHOMP  => 1,
    POST_CHOMP => 1,
});

With PRE_CHOMP set to 1, the newline and whitespace preceding a directive at the start of a line will be deleted. This has the effect of concatenating a line that starts with a directive onto the end of the previous line.

    Foo <----------.
                   |
,---(PRE_CHOMP)----'
|
`-- [% a = 10 %] --.
                   |
,---(POST_CHOMP)---'
|
`-> Bar

With POST_CHOMP set to 1, any whitespace after a directive up to and including the newline will be deleted. This has the effect of joining a line that ends with a directive onto the start of the next line.

If PRE_CHOMP or POST_CHOMP is set to 2, all whitespace including any number of newline will be removed and replaced with a single space. This is useful for HTML, where (usually) a contiguous block of whitespace is rendered the same as a single space.

With PRE_CHOMP or POST_CHOMP set to 3, all adjacent whitespace (including newlines) will be removed entirely.

These values are defined as CHOMP_NONE, CHOMP_ONE, CHOMP_COLLAPSE and CHOMP_GREEDY constants in the Template::Constants module. CHOMP_ALL is also defined as an alias for CHOMP_ONE to provide backwards compatability with earlier version of the Template Toolkit.

Additionally the chomp tag modifiers listed below may also be used for the PRE_CHOMP and POST_CHOMP configuration.

my $template = Template->new({
   PRE_CHOMP  => '~',
   POST_CHOMP => '-',
});

PRE_CHOMP and POST_CHOMP can be activated for individual directives by placing a '-' immediately at the start and/or end of the directive.

[% FOREACH user IN userlist %]
   [%- user -%]
[% END %]

This has the same effect as CHOMP_ONE in removing all whitespace before or after the directive up to and including the newline. The template will be processed as if written:

[% FOREACH user IN userlist %][% user %][% END %]

To remove all whitespace including any number of newlines, use the '~' character instead.

[% FOREACH user IN userlist %]

   [%~ user ~%]

[% END %]

To collapse all whitespace to a single space, use the '=' character.

[% FOREACH user IN userlist %]

   [%= user =%]

[% END %]

Here the template is processed as if written:

[% FOREACH user IN userlist %] [% user %] [% END %]

If you have PRE_CHOMP or POST_CHOMP set as configuration options then you can use '+' to disable any chomping options (i.e. leave the whitespace intact) on a per-directive basis.

[% FOREACH user IN userlist %]
User: [% user +%]
[% END %]

With POST_CHOMP set to CHOMP_ONE, the above example would be parsed as if written:

[% FOREACH user IN userlist %]User: [% user %]
[% END %]

For reference, the PRE_CHOMP and POST_CHOMP configuration options may be set to any of the following:

Constant      Value   Tag Modifier
----------------------------------
CHOMP_NONE      0          +
CHOMP_ONE       1          -
CHOMP_COLLAPSE  2          =
CHOMP_GREEDY    3          ~

TRIM

Top

The TRIM option can be set to have any leading and trailing whitespace automatically removed from the output of all template files and BLOCKs.

By example, the following BLOCK definition

[% BLOCK foo %]
Line 1 of foo
[% END %]

will be processed is as "\nLine 1 of foo\n". When INCLUDEd, the surrounding newlines will also be introduced.

before 
[% INCLUDE foo %]
after

Generated output:

before

Line 1 of foo

after

With the TRIM option set to any true value, the leading and trailing newlines (which count as whitespace) will be removed from the output of the BLOCK.

before
Line 1 of foo
after

The TRIM option is disabled (0) by default.

INTERPOLATE

Top

The INTERPOLATE flag, when set to any true value will cause variable references in plain text (i.e. not surrounded by START_TAG and END_TAG) to be recognised and interpolated accordingly.

my $template = Template->new({ 
    INTERPOLATE => 1,
});

Variables should be prefixed by a '$' to identify them. Curly braces can be used in the familiar Perl/shell style to explicitly scope the variable name where required.

# INTERPOLATE => 0
<a href="http://[% server %]/[% help %]">
<img src="[% images %]/help.gif"></a>
[% myorg.name %]

# INTERPOLATE => 1
<a href="http://$server/$help">
<img src="$images/help.gif"></a>
$myorg.name

# explicit scoping with {  }
<img src="$images/${icon.next}.gif">

Note that a limitation in Perl's regex engine restricts the maximum length of an interpolated template to around 32 kilobytes or possibly less. Files that exceed this limit in size will typically cause Perl to dump core with a segmentation fault. If you routinely process templates of this size then you should disable INTERPOLATE or split the templates in several smaller files or blocks which can then be joined backed together via PROCESS or INCLUDE.

ANYCASE

Top

By default, directive keywords should be expressed in UPPER CASE. The ANYCASE option can be set to allow directive keywords to be specified in any case.

# ANYCASE => 0 (default)
[% INCLUDE foobar %]        # OK
[% include foobar %]        # ERROR
[% include = 10   %]        # OK, 'include' is a variable

# ANYCASE => 1
[% INCLUDE foobar %]        # OK
[% include foobar %]        # OK
[% include = 10   %]        # ERROR, 'include' is reserved word

One side-effect of enabling ANYCASE is that you cannot use a variable of the same name as a reserved word, regardless of case. The reserved words are currently:

GET CALL SET DEFAULT INSERT INCLUDE PROCESS WRAPPER 
IF UNLESS ELSE ELSIF FOR FOREACH WHILE SWITCH CASE
USE PLUGIN FILTER MACRO PERL RAWPERL BLOCK META
TRY THROW CATCH FINAL NEXT LAST BREAK RETURN STOP 
CLEAR TO STEP AND OR NOT MOD DIV END

The only lower case reserved words that cannot be used for variables, regardless of the ANYCASE option, are the operators:

and or not mod div

Template Files and Blocks

Top

INCLUDE_PATH

Top

The INCLUDE_PATH is used to specify one or more directories in which template files are located. When a template is requested that isn't defined locally as a BLOCK, each of the INCLUDE_PATH directories is searched in turn to locate the template file. Multiple directories can be specified as a reference to a list or as a single string where each directory is delimited by ':'.

my $template = Template->new({
    INCLUDE_PATH => '/usr/local/templates',
});

my $template = Template->new({
    INCLUDE_PATH => '/usr/local/templates:/tmp/my/templates',
});

my $template = Template->new({
    INCLUDE_PATH => [ '/usr/local/templates', 
                      '/tmp/my/templates' ],
});

On Win32 systems, a little extra magic is invoked, ignoring delimiters that have ':' followed by a '/' or '\'. This avoids confusion when using directory names like 'C:\Blah Blah'.

When specified as a list, the INCLUDE_PATH path can contain elements which dynamically generate a list of INCLUDE_PATH directories. These generator elements can be specified as a reference to a subroutine or an object which implements a paths() method.

my $template = Template->new({
    INCLUDE_PATH => [ '/usr/local/templates', 
                      \&incpath_generator, 
                      My::IncPath::Generator->new( ... ) ],
});

Each time a template is requested and the INCLUDE_PATH examined, the subroutine or object method will be called. A reference to a list of directories should be returned. Generator subroutines should report errors using die(). Generator objects should return undef and make an error available via its error() method.

For example:

sub incpath_generator {
    # ...some code...

    if ($all_is_well) {
        return \@list_of_directories;
    }
    else {
        die "cannot generate INCLUDE_PATH...\n";
    }
}

or:

package My::IncPath::Generator;

# Template::Base (or Class::Base) provides error() method
use Template::Base;
use base qw( Template::Base );

sub paths {
    my $self = shift;

    # ...some code...

    if ($all_is_well) {
        return \@list_of_directories;
    }
    else {
        return $self->error("cannot generate INCLUDE_PATH...\n");
    }
}

1;

DELIMITER

Top

Used to provide an alternative delimiter character sequence for separating paths specified in the INCLUDE_PATH. The default value for DELIMITER is ':'.

my $template = Template->new({
    DELIMITER    => '; ',
    INCLUDE_PATH => 'C:/HERE/NOW; D:/THERE/THEN',
});

On Win32 systems, the default delimiter is a little more intelligent, splitting paths only on ':' characters that aren't followed by a '/'. This means that the following should work as planned, splitting the INCLUDE_PATH into 2 separate directories, C:/foo and C:/bar.

# on Win32 only
my $template = Template->new({
    INCLUDE_PATH => 'C:/Foo:C:/Bar'
});

However, if you're using Win32 then it's recommended that you explicitly set the DELIMITER character to something else (e.g. ';') rather than rely on this subtle magic.

ABSOLUTE

Top

The ABSOLUTE flag is used to indicate if templates specified with absolute filenames (e.g. '/foo/bar') should be processed. It is disabled by default and any attempt to load a template by such a name will cause a 'file' exception to be raised.

my $template = Template->new({
    ABSOLUTE => 1,
});

# this is why it's disabled by default
[% INSERT /etc/passwd %]

On Win32 systems, the regular expression for matching absolute pathnames is tweaked slightly to also detect filenames that start with a driver letter and colon, such as:

C:/Foo/Bar

RELATIVE

Top

The RELATIVE flag is used to indicate if templates specified with filenames relative to the current directory (e.g. './foo/bar' or '../../some/where/else') should be loaded. It is also disabled by default, and will raise a 'file' error if such template names are encountered.

my $template = Template->new({
    RELATIVE => 1,
});

[% INCLUDE ../logs/error.log %]

DEFAULT

Top

The DEFAULT option can be used to specify a default template which should be used whenever a specified template can't be found in the INCLUDE_PATH.

my $template = Template->new({
    DEFAULT => 'notfound.html',
});

If a non-existant template is requested through the Template process() method, or by an INCLUDE, PROCESS or WRAPPER directive, then the DEFAULT template will instead be processed, if defined. Note that the DEFAULT template is not used when templates are specified with absolute or relative filenames, or as a reference to a input file handle or text string.

BLOCKS

Top

The BLOCKS option can be used to pre-define a default set of template blocks. These should be specified as a reference to a hash array mapping template names to template text, subroutines or Template::Document objects.

my $template = Template->new({
    BLOCKS => {
        header  => 'The Header.  [% title %]',
        footer  => sub { return $some_output_text },
        another => Template::Document->new({ ... }),
    },
});

VIEWS

Top

The VIEWS option can be used to define one or more Template::View objects. They can be specified as a reference to a hash array or list reference.

my $template = Template->new({
    VIEWS => {
        my_view => { prefix => 'my_templates/' },
    },
});

Be aware of the fact that Perl's hash array are unordered, so if you want to specify multiple views of which one or more are based on other views, then you should use a list reference to preserve the order of definition.

my $template = Template->new({
    VIEWS => [
        bottom => { prefix => 'bottom/' },
        middle => { prefix => 'middle/', base => 'bottom' },
        top    => { prefix => 'top/',    base => 'middle' },
    ],
});

AUTO_RESET

Top

The AUTO_RESET option is set by default and causes the local BLOCKS cache for the Template::Context object to be reset on each call to the Template process() method. This ensures that any BLOCKs defined within a template will only persist until that template is finished processing. This prevents BLOCKs defined in one processing request from interfering with other independent requests subsequently processed by the same context object.

The BLOCKS item may be used to specify a default set of block definitions for the Template::Context object. Subsequent BLOCK definitions in templates will over-ride these but they will be reinstated on each reset if AUTO_RESET is enabled (default), or if the Template::Context reset() method is called.

RECURSION

Top

The template processor will raise a file exception if it detects direct or indirect recursion into a template. Setting this option to any true value will allow templates to include each other recursively.

Template Variables

Top

VARIABLES

Top

The VARIABLES option (or PRE_DEFINE - they're equivalent) can be used to specify a hash array of template variables that should be used to pre-initialise the stash when it is created. These items are ignored if the STASH item is defined.

my $template = Template->new({
    VARIABLES => {
        title   => 'A Demo Page',
        author  => 'Joe Random Hacker',
        version => 3.14,
    },
};

or

my $template = Template->new({
    PRE_DEFINE => {
        title   => 'A Demo Page',
        author  => 'Joe Random Hacker',
        version => 3.14,
    },
};

CONSTANTS

Top

The CONSTANTS option can be used to specify a hash array of template variables that are compile-time constants. These variables are resolved once when the template is compiled, and thus don't require further resolution at runtime. This results in significantly faster processing of the compiled templates and can be used for variables that don't change from one request to the next.

my $template = Template->new({
    CONSTANTS => {
        title   => 'A Demo Page',
        author  => 'Joe Random Hacker',
        version => 3.14,
    },
};

CONSTANT_NAMESPACE

Top

Constant variables are accessed via the constants namespace by default.

[% constants.title %]

The CONSTANTS_NAMESPACE option can be set to specify an alternate namespace.

my $template = Template->new({
    CONSTANTS => {
        title   => 'A Demo Page',
        # ...etc...
    },
    CONSTANTS_NAMESPACE => 'const',
};

In this case the constants would then be accessed as:

[% const.title %]

NAMESPACE

Top

The constant folding mechanism described above is an example of a namespace handler. Namespace handlers can be defined to provide alternate parsing mechanisms for variables in different namespaces.

Under the hood, the Template module converts a constructor configuration such as:

my $template = Template->new({
    CONSTANTS => {
        title   => 'A Demo Page',
        # ...etc...
    },
    CONSTANTS_NAMESPACE => 'const',
};

into one like:

my $template = Template->new({
    NAMESPACE => {
        const => Template:::Namespace::Constants->new({
            title   => 'A Demo Page',
            # ...etc...
        }),
    },
};

You can use this mechanism to define multiple constant namespaces, or to install custom handlers of your own.

my $template = Template->new({
    NAMESPACE => {
        site => Template:::Namespace::Constants->new({
            title   => "Wardley's Widgets",
            version => 2.718,
        }),
        author => Template:::Namespace::Constants->new({
            name  => 'Andy Wardley',
            email => 'abw@andywardley.com',
        }),
        voodoo => My::Namespace::Handler->new( ... ),
    },
};

Now you have two constant namespaces, for example:

[% site.title %]
[% author.name %]

as well as your own custom namespace handler installed for the 'voodoo' namespace.

[% voodoo.magic %]

See Template::Namespace::Constants for an example of what a namespace handler looks like on the inside.

Template Processing Options

Top

The following options are used to specify any additional templates that should be processed before, after, around or instead of the template passed as the first argument to the Template process() method. These options can be perform various useful tasks such as adding standard headers or footers to all pages, wrapping page output in other templates, pre-defining variables or performing initialisation or cleanup tasks, automatically generating page summary information, navigation elements, and so on.

The task of processing the template is delegated internally to the Template::Service module which, unsurprisingly, also has a process() method. Any templates defined by the PRE_PROCESS option are processed first and any output generated is added to the output buffer. Then the main template is processed, or if one or more PROCESS templates are defined then they are instead processed in turn. In this case, one of the PROCESS templates is responsible for processing the main template, by a directive such as:

[% PROCESS $template %]

The output of processing the main template or the PROCESS template(s) is then wrapped in any WRAPPER templates, if defined. WRAPPER templates don't need to worry about explicitly processing the template because it will have been done for them already. Instead WRAPPER templates access the content they are wrapping via the content variable.

wrapper before
[% content %]
wrapper after

This output generated from processing the main template, and/or any PROCESS or WRAPPER templates is added to the output buffer. Finally, any POST_PROCESS templates are processed and their output is also added to the output buffer which is then returned.

If the main template throws an exception during processing then any relevant template(s) defined via the ERROR option will be processed instead. If defined and successfully processed, the output from the error template will be added to the output buffer in place of the template that generated the error and processing will continue, applying any WRAPPER and POST_PROCESS templates. If no relevant ERROR option is defined, or if the error occurs in one of the PRE_PROCESS, WRAPPER or POST_PROCESS templates, then the process will terminate immediately and the error will be returned.

PRE_PROCESS, POST_PROCESS

Top

These values may be set to contain the name(s) of template files (relative to INCLUDE_PATH) which should be processed immediately before and/or after each template. These do not get added to templates processed into a document via directives such as INCLUDE, PROCESS, WRAPPER etc.

my $template = Template->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
};

Multiple templates may be specified as a reference to a list. Each is processed in the order defined.

my $template = Template->new({
    PRE_PROCESS  => [ 'config', 'header' ],
    POST_PROCESS => 'footer',
};

Alternately, multiple template may be specified as a single string, delimited by ':'. This delimiter string can be changed via the DELIMITER option.

my $template = Template->new({
    PRE_PROCESS  => 'config:header',
    POST_PROCESS => 'footer',
};

The PRE_PROCESS and POST_PROCESS templates are evaluated in the same variable context as the main document and may define or update variables for subsequent use.

config:

[% # set some site-wide variables
   bgcolor = '#ffffff'
   version = 2.718
%]

header:

[% DEFAULT title = 'My Funky Web Site' %]
<html>
  <head>
    <title>[% title %]</title>
  </head>
  <body bgcolor="[% bgcolor %]">

footer:

    <hr>
    Version [% version %]
  </body>
</html>

The Template::Document object representing the main template being processed is available within PRE_PROCESS and POST_PROCESS templates as the template variable. Metadata items defined via the META directive may be accessed accordingly.

$template->process('mydoc.html', $vars);

mydoc.html:

[% META title = 'My Document Title' %]
blah blah blah
...

header:

<html>
  <head>
    <title>[% template.title %]</title>
  </head>
  <body bgcolor="[% bgcolor %]">

PROCESS

Top

The PROCESS option may be set to contain the name(s) of template files (relative to INCLUDE_PATH) which should be processed instead of the main template passed to the Template process() method. This can be used to apply consistent wrappers around all templates, similar to the use of PRE_PROCESS and POST_PROCESS templates.

my $template = Template->new({
    PROCESS  => 'content',
};

# processes 'content' instead of 'foo.html'
$template->process('foo.html');

A reference to the original template is available in the template variable. Metadata items can be inspected and the template can be processed by specifying it as a variable reference (i.e. prefixed by $) to an INCLUDE, PROCESS or WRAPPER directive.

content:

<html>
  <head>
    <title>[% template.title %]</title>
  </head>
  <body>
<!-- begin content -->
[% PROCESS $template %]
<!-- end content -->
    <hr>
    &copy; Copyright [% template.copyright %]
  </body>
</html>

foo.html:

[% META 
   title     = 'The Foo Page'
   author    = 'Fred Foo'
   copyright = '2000 Fred Foo'
%]
<h1>[% template.title %]</h1>
Welcome to the Foo Page, blah blah blah

output:

<html>
  <head>
    <title>The Foo Page</title>
  </head>
  <body>
<!-- begin content -->
<h1>The Foo Page</h1>
Welcome to the Foo Page, blah blah blah
<!-- end content -->
    <hr>
    &copy; Copyright 2000 Fred Foo
  </body>
</html>

WRAPPER

Top

The WRAPPER option can be used to specify one or more templates which should be used to wrap around the output of the main page template. The main template is processed first (or any PROCESS template(s)) and the output generated is then passed as the content variable to the WRAPPER template(s) as they are processed.

my $template = Template->new({
    WRAPPER => 'wrapper',
};

# process 'foo' then wrap in 'wrapper'
$template->process('foo', { message => 'Hello World!' });

wrapper:

<wrapper>
[% content %]
</wrapper>

foo:

This is the foo file!
Message: [% message %]

The output generated from this example is:

<wrapper>
This is the foo file!
Message: Hello World!
</wrapper>

You can specify more than one WRAPPER template by setting the value to be a reference to a list of templates. The WRAPPER templates will be processed in reverse order with the output of each being passed to the next (or previous, depending on how you look at it) as the 'content' variable. It sounds complicated, but the end result is that it just "Does The Right Thing" to make wrapper templates nest in the order you specify.

my $template = Template->new({
    WRAPPER => [ 'outer', 'inner' ],
};

# process 'foo' then wrap in 'inner', then in 'outer'
$template->process('foo', { message => 'Hello World!' });

outer:

<outer>
[% content %]
</outer>

inner:

<inner>
[% content %]
</inner>

The output generated is then:

<outer>
<inner>
This is the foo file!
Message: Hello World!
</inner>
</outer>

One side-effect of the "inside-out" processing of the WRAPPER configuration item (and also the WRAPPER directive) is that any variables set in the template being wrapped will be visible to the template doing the wrapping, but not the other way around.

You can use this to good effect in allowing page templates to set pre-defined values which are then used in the wrapper templates. For example, our main page template 'foo' might look like this:

foo:

[% page = {
       title    = 'Foo Page'
       subtitle = 'Everything There is to Know About Foo'
       author   = 'Frank Oliver Octagon'
   }
%]

<p>
Welcome to the page that tells you everything about foo
blah blah blah...
</p>

The foo template is processed before the wrapper template meaning that the page data structure will be defined for use in the wrapper template.

wrapper:

<html>
  <head>
    <title>[% page.title %]</title>
  </head>
  <body>
    <h1>[% page.title %]</h1>
    <h2>[% page.subtitle %]</h1>
    <h3>by [% page.author %]</h3>
    [% content %]
  </body>
</html>

It achieves the same effect as defining META items which are then accessed via the template variable (which you are still free to use within WRAPPER templates), but gives you more flexibility in the type and complexity of data that you can define.

ERROR

Top

The ERROR (or ERRORS if you prefer) configuration item can be used to name a single template or specify a hash array mapping exception types to templates which should be used for error handling. If an uncaught exception is raised from within a template then the appropriate error template will instead be processed.

If specified as a single value then that template will be processed for all uncaught exceptions.

my $template = Template->new({
    ERROR => 'error.html'
});

If the ERROR item is a hash reference the keys are assumed to be exception types and the relevant template for a given exception will be selected. A default template may be provided for the general case. Note that ERROR can be pluralised to ERRORS if you find it more appropriate in this case.

my $template = Template->new({
    ERRORS => {
        user     => 'user/index.html',
        dbi      => 'error/database',
        default  => 'error/default',
    },
});

In this example, any user exceptions thrown will cause the user/index.html template to be processed, dbi errors are handled by error/database and all others by the error/default template. Any PRE_PROCESS and/or POST_PROCESS templates will also be applied to these error templates.

Note that exception types are hierarchical and a foo handler will catch all foo.* errors (e.g. foo.bar, foo.bar.baz) if a more specific handler isn't defined. Be sure to quote any exception types that contain periods to prevent Perl concatenating them into a single string (i.e. user.passwd is parsed as 'user'.'passwd').

my $template = Template->new({
    ERROR => {
        'user.login'  => 'user/login.html',
        'user.passwd' => 'user/badpasswd.html',
        'user'        => 'user/index.html',
        'default'     => 'error/default',
    },
});

In this example, any template processed by the $template object, or other templates or code called from within, can raise a user.login exception and have the service redirect to the user/login.html template. Similarly, a user.passwd exception has a specific handling template, user/badpasswd.html, while all other user or user.* exceptions cause a redirection to the user/index.html page. All other exception types are handled by error/default.

Exceptions can be raised in a template using the THROW directive,

[% THROW user.login 'no user id: please login' %]

or by calling the throw() method on the current Template::Context object,

$context->throw('user.passwd', 'Incorrect Password');
$context->throw('Incorrect Password');    # type 'undef'

or from Perl code by calling die() with a Template::Exception object,

die (Template::Exception->new('user.denied', 'Invalid User ID'));

or by simply calling die() with an error string. This is automagically caught and converted to an exception of 'undef' type which can then be handled in the usual way.

die "I'm sorry Dave, I can't do that";

Note that the 'undef' we're talking about here is a literal string rather than Perl's undef used to represent undefined values.

Template Runtime Options

Top

EVAL_PERL

Top

This flag is used to indicate if PERL and/or RAWPERL blocks should be evaluated. It is disabled by default and any PERL or RAWPERL blocks encountered will raise exceptions of type 'perl' with the message 'EVAL_PERL not set'. Note however that any RAWPERL blocks should always contain valid Perl code, regardless of the EVAL_PERL flag. The parser will fail to compile templates that contain invalid Perl code in RAWPERL blocks and will throw a 'file' exception.

When using compiled templates (see Caching and Compiling Options), the EVAL_PERL has an affect when the template is compiled, and again when the templates is subsequently processed, possibly in a different context to the one that compiled it.

If the EVAL_PERL is set when a template is compiled, then all PERL and RAWPERL blocks will be included in the compiled template. If the EVAL_PERL option isn't set, then Perl code will be generated which always throws a 'perl' exception with the message 'EVAL_PERL not set' whenever the compiled template code is run.

Thus, you must have EVAL_PERL set if you want your compiled templates to include PERL and RAWPERL blocks.

At some point in the future, using a different invocation of the Template Toolkit, you may come to process such a pre-compiled template. Assuming the EVAL_PERL option was set at the time the template was compiled, then the output of any RAWPERL blocks will be included in the compiled template and will get executed when the template is processed. This will happen regardless of the runtime EVAL_PERL status.

Regular PERL blocks are a little more cautious, however. If the EVAL_PERL flag isn't set for the current context, that is, the one which is trying to process it, then it will throw the familiar 'perl' exception with the message, 'EVAL_PERL not set'.

Thus you can compile templates to include PERL blocks, but optionally disable them when you process them later. Note however that it is possible for a PERL block to contain a Perl "BEGIN { # some code }" block which will always get run regardless of the runtime EVAL_PERL status. Thus, if you set EVAL_PERL when compiling templates, it is assumed that you trust the templates to Do The Right Thing. Otherwise you must accept the fact that there's no bulletproof way to prevent any included code from trampling around in the living room of the runtime environment, making a real nuisance of itself if it really wants to. If you don't like the idea of such uninvited guests causing a bother, then you can accept the default and keep EVAL_PERL disabled.

OUTPUT

Top

Default output location or handler. This may be specified as one of: a file name (relative to OUTPUT_PATH, if defined, or the current working directory if not specified absolutely); a file handle (e.g. GLOB or IO::Handle) opened for writing; a reference to a text string to which the output is appended (the string isn't cleared); a reference to a subroutine which is called, passing the output text as an argument; as a reference to an array, onto which the content will be push()ed; or as a reference to any object that supports the print() method. This latter option includes the Apache::Request object which is passed as the argument to Apache/mod_perl handlers.

example 1 (file name):

my $template = Template->new({
    OUTPUT => "/tmp/foo",
});

example 2 (text string):

my $output   = '';
my $template = Template->new({
    OUTPUT => \$output,
});

example 3 (file handle):

open (TOUT, "> $file") || die "$file: $!\n";
my $template = Template->new({
    OUTPUT => \*TOUT,
});

example 4 (subroutine):

sub output { my $out = shift; print "OUTPUT: $out" }
my $template = Template->new({
    OUTPUT => \&output,
});

example 5 (array reference):

my $template = Template->new({
    OUTPUT => \@output,
})

example 6 (Apache/mod_perl handler):

sub handler {
    my $r = shift;
    my $t = Template->new({
        OUTPUT => $r,
    });
    ...
}

The default OUTPUT location be overridden by passing a third parameter to the Template process() method. This can be specified as any of the above argument types.

$t->process($file, $vars, "/tmp/foo");
$t->process($file, $vars, \$output);
$t->process($file, $vars, \*MYGLOB);
$t->process($file, $vars, \@output); 
$t->process($file, $vars, $r);  # Apache::Request
...

OUTPUT_PATH

Top

The OUTPUT_PATH allows a directory to be specified into which output files should be written. An output file can be specified by the OUTPUT option, or passed by name as the third parameter to the Template process() method.

my $template = Template->new({
    INCLUDE_PATH => "/tmp/src",
    OUTPUT_PATH  => "/tmp/dest",
});

my $vars = {
    ...
};

foreach my $file ('foo.html', 'bar.html') {
    $template->process($file, $vars, $file)
        || die $template->error();  
}

This example will read the input files /tmp/src/foo.html and /tmp/src/bar.html and write the processed output to /tmp/dest/foo.html and /tmp/dest/bar.html, respectively.

STRICT

Top

By default the Template Toolkit will silently ignore the use of undefined variables (a bad design decision that I regret).

When the STRICT option is set, the use of any undefined variables or values will cause an exception to be throw. The exception will have a type of var.undefined and a message of the form "undefined variable: xxx".

my $template = Template->new(
    STRICT => 1
);

DEBUG

Top

The DEBUG option can be used to enable debugging within the various different modules that comprise the Template Toolkit. The Template::Constants module defines a set of DEBUG_XXXX constants which can be combined using the logical OR operator, '|'.

use Template::Constants qw( :debug );

my $template = Template->new({
    DEBUG => DEBUG_PARSER | DEBUG_PROVIDER,
});

For convenience, you can also provide a string containing a list of lower case debug options, separated by any non-word characters.

my $template = Template->new({
    DEBUG => 'parser, provider',
});

The following DEBUG_XXXX flags can be used:

  • DEBUG_SERVICE

    Enables general debugging messages for the Template::Service module.

  • DEBUG_CONTEXT

    Enables general debugging messages for the Template::Context module.

  • DEBUG_PROVIDER

    Enables general debugging messages for the Template::Provider module.

  • DEBUG_PLUGINS

    Enables general debugging messages for the Template::Plugins module.

  • DEBUG_FILTERS

    Enables general debugging messages for the Template::Filters module.

  • DEBUG_PARSER

    This flag causes the Template::Parser to generate debugging messages that show the Perl code generated by parsing and compiling each template.

  • DEBUG_UNDEF

    This option causes the Template Toolkit to throw an 'undef' error whenever it encounters an undefined variable value.

  • DEBUG_DIRS

    This option causes the Template Toolkit to generate comments indicating the source file, line and original text of each directive in the template. These comments are embedded in the template output using the format defined in the DEBUG_FORMAT configuration item, or a simple default format if unspecified.

    For example, the following template fragment:

    Hello World

    would generate this output:

    ## input text line 1 :  ##
    Hello 
    ## input text line 2 : World ##
    World
  • DEBUG_ALL

    Enables all debugging messages.

  • DEBUG_CALLER

    This option causes all debug messages that aren't newline terminated to have the file name and line number of the caller appended to them.

DEBUG_FORMAT

Top

The DEBUG_FORMAT option can be used to specify a format string for the debugging messages generated via the DEBUG_DIRS option described above. Any occurances of $file, $line or $text will be replaced with the current file name, line or directive text, respectively. Notice how the format is single quoted to prevent Perl from interpolating those tokens as variables.

my $template = Template->new({
    DEBUG => 'dirs',
    DEBUG_FORMAT => '<!-- $file line $line : [% $text %] -->',
});

The following template fragment:

[% foo = 'World' %]
Hello [% foo %]

would then generate this output:

<!-- input text line 2 : [% foo = 'World' %] -->
Hello <!-- input text line 3 : [% foo %] -->World

The DEBUG directive can also be used to set a debug format within a template.

[% DEBUG format '<!-- $file line $line : [% $text %] -->' %]

Caching and Compiling Options

Top

CACHE_SIZE

Top

The Template::Provider module caches compiled templates to avoid the need to re-parse template files or blocks each time they are used. The CACHE_SIZE option is used to limit the number of compiled templates that the module should cache.

By default, the CACHE_SIZE is undefined and all compiled templates are cached. When set to any positive value, the cache will be limited to storing no more than that number of compiled templates. When a new template is loaded and compiled and the cache is full (i.e. the number of entries == CACHE_SIZE), the least recently used compiled template is discarded to make room for the new one.

The CACHE_SIZE can be set to 0 to disable caching altogether.

my $template = Template->new({
    CACHE_SIZE => 64,   # only cache 64 compiled templates
});

my $template = Template->new({
    CACHE_SIZE => 0,   # don't cache any compiled templates
});

As well as caching templates as they are found, the Template::Provider also implements negative caching to keep track of templates that are not found. This allows the provider to quickly decline a request for a template that it has previously failed to locate, saving the effort of going to look for it again. This is useful when an INCLUDE_PATH includes multiple providers, ensuring that the request is passed down through the providers as quickly as possible.

STAT_TTL

Top

This value can be set to control how long the Template::Provider will keep a template cached in memory before checking to see if the source template has changed.

my $provider = Template::Provider->new({
    STAT_TTL => 60,  # one minute
});

The default value is 1 (second). You'll probably want to set this to a higher value if you're running the Template Toolkit inside a persistent web server application (e.g. mod_perl). For example, set it to 60 and the provider will only look for changes to templates once a minute at most. However, during development (or any time you're making frequent changes to templates) you'll probably want to keep it set to a low value so that you don't have to wait for the provider to notice that your templates have changed.

COMPILE_EXT

Top

From version 2 onwards, the Template Toolkit has the ability to compile templates to Perl code and save them to disk for subsequent use (i.e. cache persistence). The COMPILE_EXT option may be provided to specify a filename extension for compiled template files. It is undefined by default and no attempt will be made to read or write any compiled template files.

my $template = Template->new({
    COMPILE_EXT => '.ttc',
});

If COMPILE_EXT is defined (and COMPILE_DIR isn't, see below) then compiled template files with the COMPILE_EXT extension will be written to the same directory from which the source template files were loaded.

Compiling and subsequent reuse of templates happens automatically whenever the COMPILE_EXT or COMPILE_DIR options are set. The Template Toolkit will automatically reload and reuse compiled files when it finds them on disk. If the corresponding source file has been modified since the compiled version as written, then it will load and re-compile the source and write a new compiled version to disk.

This form of cache persistence offers significant benefits in terms of time and resources required to reload templates. Compiled templates can be reloaded by a simple call to Perl's require(), leaving Perl to handle all the parsing and compilation. This is a Good Thing.

COMPILE_DIR

Top

The COMPILE_DIR option is used to specify an alternate directory root under which compiled template files should be saved.

my $template = Template->new({
    COMPILE_DIR => '/tmp/ttc',
});

The COMPILE_EXT option may also be specified to have a consistent file extension added to these files.

my $template1 = Template->new({
    COMPILE_DIR => '/tmp/ttc',
    COMPILE_EXT => '.ttc1',
});

my $template2 = Template->new({
    COMPILE_DIR => '/tmp/ttc',
    COMPILE_EXT => '.ttc2',
});

When COMPILE_EXT is undefined, the compiled template files have the same name as the original template files, but reside in a different directory tree.

Each directory in the INCLUDE_PATH is replicated in full beneath the COMPILE_DIR directory. This example:

my $template = Template->new({
    COMPILE_DIR  => '/tmp/ttc',
    INCLUDE_PATH => '/home/abw/templates:/usr/share/templates',
});

would create the following directory structure:

/tmp/ttc/home/abw/templates/
/tmp/ttc/usr/share/templates/

Files loaded from different INCLUDE_PATH directories will have their compiled forms save in the relevant COMPILE_DIR directory.

On Win32 platforms a filename may by prefixed by a drive letter and colon. e.g.

C:/My Templates/header

The colon will be silently stripped from the filename when it is added to the COMPILE_DIR value(s) to prevent illegal filename being generated. Any colon in COMPILE_DIR elements will be left intact. For example:

# Win32 only
my $template = Template->new({
    DELIMITER    => ';',
    COMPILE_DIR  => 'C:/TT2/Cache',
    INCLUDE_PATH => 'C:/TT2/Templates;D:/My Templates',
});

This would create the following cache directories:

C:/TT2/Cache/C/TT2/Templates
C:/TT2/Cache/D/My Templates

Plugins and Filters

Top

PLUGINS

Top

The PLUGINS options can be used to provide a reference to a hash array that maps plugin names to Perl module names. A number of standard plugins are defined (e.g. table, format, cgi, etc.) which map to their corresponding Template::Plugin::* counterparts. These can be redefined by values in the PLUGINS hash.

my $template = Template->new({
    PLUGINS => {
        cgi => 'MyOrg::Template::Plugin::CGI',
        foo => 'MyOrg::Template::Plugin::Foo',
        bar => 'MyOrg::Template::Plugin::Bar',
    },  
});

The recommended convention is to specify these plugin names in lower case. The Template Toolkit first looks for an exact case-sensitive match and then tries the lower case conversion of the name specified.

[% USE Foo %]      # look for 'Foo' then 'foo'

If you define all your PLUGINS with lower case names then they will be located regardless of how the user specifies the name in the USE directive. If, on the other hand, you define your PLUGINS with upper or mixed case names then the name specified in the USE directive must match the case exactly.

The USE directive is used to create plugin objects and does so by calling the plugin() method on the current Template::Context object. If the plugin name is defined in the PLUGINS hash then the corresponding Perl module is loaded via require(). The context then calls the load() class method which should return the class name (default and general case) or a prototype object against which the new() method can be called to instantiate individual plugin objects.

If the plugin name is not defined in the PLUGINS hash then the PLUGIN_BASE and/or LOAD_PERL options come into effect.

PLUGIN_BASE

Top

If a plugin is not defined in the PLUGINS hash then the PLUGIN_BASE is used to attempt to construct a correct Perl module name which can be successfully loaded.

The PLUGIN_BASE can be specified as a reference to an array of module namespaces, or as a single value which is automatically converted to a list. The default PLUGIN_BASE value (Template::Plugin) is then added to the end of this list.

example 1:

my $template = Template->new({
    PLUGIN_BASE => 'MyOrg::Template::Plugin',
});

[% USE Foo %]    # => MyOrg::Template::Plugin::Foo
                   or        Template::Plugin::Foo

example 2:

my $template = Template->new({
    PLUGIN_BASE => [   'MyOrg::Template::Plugin',
                       'YourOrg::Template::Plugin'  ],
});

template:

[% USE Foo %]    # =>   MyOrg::Template::Plugin::Foo
                   or YourOrg::Template::Plugin::Foo 
                   or          Template::Plugin::Foo

If you don't want the default Template::Plugin namespace added to the end of the PLUGIN_BASE, then set the $Template::Plugins::PLUGIN_BASE variable to a false value before calling the new() Template#new() constructor method. This is shown in the example below where the Foo plugin is located as My::Plugin::Foo or Your::Plugin::Foo but not as Template::Plugin::Foo.

example 3:

use Template::Plugins;
$Template::Plugins::PLUGIN_BASE = '';

my $template = Template->new({
    PLUGIN_BASE => [   'My::Plugin',
                       'Your::Plugin'  ],
});

template:

[% USE Foo %]    # =>   My::Plugin::Foo
                   or Your::Plugin::Foo

LOAD_PERL

Top

If a plugin cannot be loaded using the PLUGINS or PLUGIN_BASE approaches then the provider can make a final attempt to load the module without prepending any prefix to the module path. This allows regular Perl modules (i.e. those that don't reside in the Template::Plugin or some other such namespace) to be loaded and used as plugins.

By default, the LOAD_PERL option is set to 0 and no attempt will be made to load any Perl modules that aren't named explicitly in the PLUGINS hash or reside in a package as named by one of the PLUGIN_BASE components.

Plugins loaded using the PLUGINS or PLUGIN_BASE receive a reference to the current context object as the first argument to the new() constructor. Modules loaded using LOAD_PERL are assumed to not conform to the plugin interface. They must provide a new() class method for instantiating objects but it will not receive a reference to the context as the first argument.

Plugin modules should provide a load() class method (or inherit the default one from the Template::Plugin base class) which is called the first time the plugin is loaded. Regular Perl modules need not. In all other respects, regular Perl objects and Template Toolkit plugins are identical.

If a particular Perl module does not conform to the common, but not unilateral, new() constructor convention then a simple plugin wrapper can be written to interface to it.

FILTERS

Top

The FILTERS option can be used to specify custom filters which can then be used with the FILTER directive like any other. These are added to the standard filters which are available by default. Filters specified via this option will mask any standard filters of the same name.

The FILTERS option should be specified as a reference to a hash array in which each key represents the name of a filter. The corresponding value should contain a reference to an array containing a subroutine reference and a flag which indicates if the filter is static (0) or dynamic (1). A filter may also be specified as a solitary subroutine reference and is assumed to be static.

$template = Template->new({
    FILTERS => {
        'sfilt1' =>   \&static_filter,      # static
        'sfilt2' => [ \&static_filter, 0 ], # same as above
        'dfilt1' => [ \&dyanamic_filter_factory, 1 ],
    },
});

Additional filters can be specified at any time by calling the define_filter() method on the current Template::Context object. The method accepts a filter name, a reference to a filter subroutine and an optional flag to indicate if the filter is dynamic.

my $context = $template->context();
$context->define_filter('new_html', \&new_html);
$context->define_filter('new_repeat', \&new_repeat, 1);

Static filters are those where a single subroutine reference is used for all invocations of a particular filter. Filters that don't accept any configuration parameters (e.g. html) can be implemented statically. The subroutine reference is simply returned when that particular filter is requested. The subroutine is called to filter the output of a template block which is passed as the only argument. The subroutine should return the modified text.

sub static_filter {
    my $text = shift;
    # do something to modify $text...
    return $text;
}

The following template fragment:

[% FILTER sfilt1 %]
Blah blah blah.
[% END %]

is approximately equivalent to:

&static_filter("\nBlah blah blah.\n");

Filters that can accept parameters (e.g. truncate) should be implemented dynamically. In this case, the subroutine is taken to be a filter 'factory' that is called to create a unique filter subroutine each time one is requested. A reference to the current Template::Context object is passed as the first parameter, followed by any additional parameters specified. The subroutine should return another subroutine reference (usually a closure) which implements the filter.

sub dynamic_filter_factory {
    my ($context, @args) = @_;

    return sub {
        my $text = shift;
        # do something to modify $text...
        return $text;           
    }
}

The following template fragment:

[% FILTER dfilt1(123, 456) %] 
Blah blah blah
[% END %]

is approximately equivalent to:

my $filter = &dynamic_filter_factory($context, 123, 456);
&$filter("\nBlah blah blah.\n");

See the FILTER directive for further examples.

Customisation and Extension

Top

LOAD_TEMPLATES

Top

The LOAD_TEMPLATES option can be used to provide a reference to a list of Template::Provider objects or sub-classes thereof which will take responsibility for loading and compiling templates.

my $template = Template->new({
    LOAD_TEMPLATES => [
        MyOrg::Template::Provider->new({ ... }),
        Template::Provider->new({ ... }),
    ],
});

When a PROCESS, INCLUDE or WRAPPER directive is encountered, the named template may refer to a locally defined BLOCK or a file relative to the INCLUDE_PATH (or an absolute or relative path if the appropriate ABSOLUTE or RELATIVE options are set). If a BLOCK definition can't be found (see the Template::Context template() method for a discussion of BLOCK locality) then each of the LOAD_TEMPLATES provider objects is queried in turn via the fetch() method to see if it can supply the required template.

Each provider can return a compiled template, an error, or decline to service the request in which case the responsibility is passed to the next provider. If none of the providers can service the request then a 'not found' error is returned. The same basic provider mechanism is also used for the INSERT directive but it bypasses any BLOCK definitions and doesn't attempt is to parse or process the contents of the template file.

If LOAD_TEMPLATES is undefined, a single default provider will be instantiated using the current configuration parameters. For example, the Template::Provider INCLUDE_PATH option can be specified in the Template configuration and will be correctly passed to the provider's constructor method.

my $template = Template->new({
    INCLUDE_PATH => '/here:/there',
});

LOAD_PLUGINS

Top

The LOAD_PLUGINS options can be used to specify a list of provider objects (i.e. they implement the fetch() method) which are responsible for loading and instantiating template plugin objects. The Template::Context plugin() method queries each provider in turn in a "Chain of Responsibility" as per the template() and filter() methods.

my $template = Template->new({
    LOAD_PLUGINS => [
        MyOrg::Template::Plugins->new({ ... }),
        Template::Plugins->new({ ... }),
    ],
});

By default, a single Template::Plugins object is created using the current configuration hash. Configuration items destined for the Template::Plugins constructor may be added to the Template constructor.

my $template = Template->new({
    PLUGIN_BASE => 'MyOrg::Template::Plugins',
    LOAD_PERL   => 1,
});

LOAD_FILTERS

Top

The LOAD_FILTERS option can be used to specify a list of provider objects (i.e. they implement the fetch() method) which are responsible for returning and/or creating filter subroutines. The Template::Context filter() method queries each provider in turn in a "Chain of Responsibility" as per the template() and plugin() methods.

my $template = Template->new({
    LOAD_FILTERS => [
        MyTemplate::Filters->new(),
        Template::Filters->new(),
    ],
});

By default, a single Template::Filters object is created for the LOAD_FILTERS list.

TOLERANT

Top

The TOLERANT flag is used by the various Template Toolkit provider modules (Template::Provider, Template::Plugins, Template::Filters) to control their behaviour when errors are encountered. By default, any errors are reported as such, with the request for the particular resource (template, plugin, filter) being denied and an exception raised.

When the TOLERANT flag is set to any true values, errors will be silently ignored and the provider will instead return STATUS_DECLINED. This allows a subsequent provider to take responsibility for providing the resource, rather than failing the request outright. If all providers decline to service the request, either through tolerated failure or a genuine disinclination to comply, then a '<resource> not found' exception is raised.

SERVICE

Top

A reference to a Template::Service object, or sub-class thereof, to which the Template module should delegate. If unspecified, a Template::Service object is automatically created using the current configuration hash.

my $template = Template->new({
    SERVICE => MyOrg::Template::Service->new({ ... }),
});

CONTEXT

Top

A reference to a Template::Context object which is used to define a specific environment in which template are processed. A Template::Context object is passed as the only parameter to the Perl subroutines that represent "compiled" template documents. Template subroutines make callbacks into the context object to access Template Toolkit functionality, for example, to to INCLUDE or PROCESS another template (include() and process() methods, respectively), to USE a plugin (plugin()) or instantiate a filter (filter()) or to access the stash (stash()) which manages variable definitions via the get() and set() methods.

my $template = Template->new({
    CONTEXT => MyOrg::Template::Context->new({ ... }),
});

STASH

Top

A reference to a Template::Stash object or sub-class which will take responsibility for managing template variables.

my $stash = MyOrg::Template::Stash->new({ ... });
my $template = Template->new({
    STASH => $stash,
});

If unspecified, a default stash object is created using the VARIABLES configuration item to initialise the stash variables.

my $template = Template->new({
    VARIABLES => {
        id    => 'abw',
        name  => 'Andy Wardley',
    },
};

PARSER

Top

The Template::Parser module implements a parser object for compiling templates into Perl code which can then be executed. A default object of this class is created automatically and then used by the Template::Provider whenever a template is loaded and requires compilation. The PARSER option can be used to provide a reference to an alternate parser object.

my $template = Template->new({
    PARSER => MyOrg::Template::Parser->new({ ... }),
});

GRAMMAR

Top

The GRAMMAR configuration item can be used to specify an alternate grammar for the parser. This allows a modified or entirely new template language to be constructed and used by the Template Toolkit.

Source templates are compiled to Perl code by the Template::Parser using the Template::Grammar (by default) to define the language structure and semantics. Compiled templates are thus inherently "compatible" with each other and there is nothing to prevent any number of different template languages being compiled and used within the same Template Toolkit processing environment (other than the usual time and memory constraints).

The Template::Grammar file is constructed from a YACC like grammar (using Parse::YAPP) and a skeleton module template. These files are provided, along with a small script to rebuild the grammar, in the parser sub-directory of the distribution.

You don't have to know or worry about these unless you want to hack on the template language or define your own variant. There is a README file in the same directory which provides some small guidance but it is assumed that you know what you're doing if you venture herein. If you grok LALR parsers, then you should find it comfortably familiar.

By default, an instance of the default Template::Grammar will be created and used automatically if a GRAMMAR item isn't specified.

use MyOrg::Template::Grammar;

my $template = Template->new({ 
    GRAMMAR = MyOrg::Template::Grammar->new();
});

TT_v224_html_docs/manual/Credits.html000700 000765 000765 00000034216 11756705103 017360 0ustar00abwabw000000 000000 Template::Manual::Credits

HISTORY

Top

The Template Toolkit began its life as the Text::MetaText module, originally released to CPAN around 1996. This itself was the public manifestation of an earlier template processing system I developed while working at Peritas (now Knowledge Pool - http://www.knowledgepool.com/)

Text::MetaText was the prototype - the one we always planned to throw away. It did the job well, showing us what worked and what didn't, what was good and what was bad, and gave us some ideas about what could be done better, given the chance to start again from scratch.

Some time late in 1998 I threw away the prototype and started work on the Template Toolkit. By then I was working at Canon Research Centre Europe Ltd. (CRE), involved in a general research programme related to web publishing and dynamic content generation. The first alpha release was in June 1999, followed by numerous more alpha and beta releases culminating in 1.00 being released on 2nd December 1999.

A month or so later, work had begun on version 2.00. The plan was to get the template language relatively stable in version 1.00 and not worry too much about performance or other internal matters. Then, version 2.00 would follow to improve performance, clean up the architecture and fix anything that, with the benefit of hindsight, we thought could be improved. As it happens, me starting work on version 2.00 coincided with Doug Steinwand sending me his parser variant which compiled templates to Perl code, giving a major performance boost. As well as the speedups, there are a whole host of significant new features in version 2.00, and a greatly improved internal architecture. Apart from a few minor "fixups" the template directives and language have remained the same as in version 1.00

Version 2.00 was available in beta release form in July 2000, just in time for the 4th Perl Conference where version 1.00 was awarded "Best New Perl Module". After another extended beta release period, version 2.00 was released on 1st December 2000.

Version 3 has been in development ever since.

AUTHOR

Top

Andy Wardley <abw@wardley.org> http://wardley.org/

COPYRIGHT

Top

Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.

The Template Toolkit is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

CONTRIBUTORS

Top

Many people have contributed ideas, inspiration, fixes and features to the Template Toolkit. Their efforts continue to be very much appreciated. Please let me know if you think anyone is missing from this list.

Chuck Adams, Stephen Adkins, Ivan Adzhubey, Mark Anderson, Bradley Baetz, Thierry-Michel Barral, Craig Barratt, Stas Bekman, Robin Berjon, Tony Bowden, Neil Bowers, Leon Brocard, Lyle Brooks, Norbert Buchmüller, Dave Cash, Piers Cawley, Darren Chamberlain, Timmy Chan, Eric Cholet, Nik Clayton, Tosh Cooey, Dave Cross, Chris Dean, Francois Desarmenien, Horst Dumcke, Mark Fowler, Michael Fowler, Kenny Gatdula, Axel Gerstmair, Dylan William Hardison, Perrin Harkins, Bryce Harrington, Dave Hodgkinson, Lubomir Host, Dave Howorth, Harald Joerg, Colin Johnson, Adam Kennedy, Vivek Khera, Alexey A. Kiritchun, Rafael Kitover, Ivan Kurmanov, Denis F. Latypoff, Hans von Lengerke, Jonas Liljegren, Simon Luff, Andy Maas, Paul Makepeace, Gervase Markham, Sergey Martynoff, Simon Matthews, Robert McArthur, Craig McLane, Myk Melez, Eugene Miretskiy, Tatsuhiko Miyagawa, Bill Moseley, Keith G. Murphy, Chris Nandor, John Napiorkowski, Breno G. de Oliveira, Leslie Michael Orchard, Paul Orrock, Jonathon Padfield, Steve Peters, Briac Pilpré, Yuri Pimenov, Martin Portman, Marc Remy, Slaven Rezic, Jess Robinson, Josh Rosenbaum, Christian Schaffner, Mike Schilli, Randal L. Schwartz, Paul Seamons, Paul Sharpe, Ville Skyttä, Barrie Slaymaker, Doug Steinwand, Michael Stevens, Autrijus Tang, Drew Taylor, Rod Taylor, Swen Thuemmler, Richard Tietjen, Ben Tilly, Stathy G. Touloumis, Jim Vaughan, Simon Wilcox, Chris Winters


TT_v224_html_docs/manual/Directives.html000700 000765 000765 00000403022 11756705103 020057 0ustar00abwabw000000 000000 Template::Manual::Directives

Accessing and Updating Template Variables

Top

GET

Top

The GET directive retrieves and outputs the value of the named variable.

[% GET foo %]

The GET keyword is optional. A variable can be specified in a directive tag by itself.

[% foo %]

The variable can have an unlimited number of elements, each separated by a dot. Each element can have arguments specified within parentheses.

[% foo %]
[% bar.baz %]
[% biz.baz(10) %]
...etc...

See Template::Manual::Variables for a full discussion on template variables.

You can also specify expressions using the logical (and, or, not, ?, :) and mathematic operators (+, -, *, /, %, mod, div).

[% template.title or default.title %]

[% score * 100 %]

[% order.nitems ? checkout(order.total) : 'no items' %]

The div operator returns the integer result of division. Both % and mod return the modulus (i.e. remainder) of division.

[% 15 / 6 %]            # 2.5
[% 15 div 6 %]          # 2
[% 15 mod 6 %]          # 3

CALL

Top

The CALL directive is similar to GET in evaluating the variable named, but doesn't print the result returned. This can be useful when a variable is bound to a sub-routine or object method which you want to call but aren't interested in the value returned.

[% CALL dbi.disconnect %]

[% CALL inc_page_counter(page_count) %]

SET

Top

The SET directive allows you to assign new values to existing variables or create new temporary variables.

[% SET title = 'Hello World' %]

The SET keyword is also optional.

[% title = 'Hello World' %]

Variables may be assigned the values of other variables, unquoted numbers (2.718), literal text ('single quotes') or quoted text ("double quotes"). In the latter case, any variable references within the text will be interpolated when the string is evaluated. Variables should be prefixed by $, using curly braces to explicitly scope the variable name where necessary.

[% foo  = 'Foo'  %]               # literal value 'Foo'
[% bar  =  foo   %]               # value of variable 'foo'
[% cost = '$100' %]               # literal value '$100'
[% item = "$bar: ${cost}.00" %]   # value "Foo: $100.00"

Multiple variables may be assigned in the same directive and are evaluated in the order specified. Thus, the above could have been written:

[% foo  = 'Foo'
   bar  = foo
   cost = '$100'
   item = "$bar: ${cost}.00"
%]

Simple expressions can also be used, as per GET.

[% ten    = 10 
   twenty = 20
   thirty = twenty + ten
   forty  = 2 * twenty 
   fifty  = 100 div 2
   six    = twenty mod 7
%]

You can concatenate strings together using the ' _ ' operator. In Perl 5, the . is used for string concatenation, but in Perl 6, as in the Template Toolkit, the . will be used as the method calling operator and ' _ ' will be used for string concatenation. Note that the operator must be specified with surrounding whitespace which, as Larry says, is construed as a feature:

[% copyright = '(C) Copyright' _ year _ ' ' _ author %]

You can, of course, achieve a similar effect with double quoted string interpolation.

[% copyright = "(C) Copyright $year $author" %]

DEFAULT

Top

The DEFAULT directive is similar to SET but only updates variables that are currently undefined or have no "true" value (in the Perl sense).

[% DEFAULT
    name = 'John Doe'
    id   = 'jdoe'
%]

This can be particularly useful in common template components to ensure that some sensible default are provided for otherwise undefined variables.

[% DEFAULT 
   title = 'Hello World'
   bgcol = '#ffffff'
%]
<html>
  <head>
    <title>[% title %]</title>
  </head>
  <body bgcolor="[% bgcol %]">
    ...etc...

Processing Template Files and Blocks

Top

INSERT

Top

The INSERT directive is used to insert the contents of an external file at the current position.

[% INSERT myfile %]

No attempt to parse or process the file is made. The contents, possibly including any embedded template directives, are inserted intact.

The filename specified should be relative to one of the INCLUDE_PATH directories. Absolute (i.e. starting with /) and relative (i.e. starting with .) filenames may be used if the ABSOLUTE and RELATIVE options are set, respectively. Both these options are disabled by default.

my $template = Template->new({
    INCLUDE_PATH => '/here:/there',
});

$template->process('myfile');

myfile:

[% INSERT foo %]            # looks for /here/foo then /there/foo
[% INSERT /etc/passwd %]    # file error: ABSOLUTE not set
[% INSERT ../secret %]      # file error: RELATIVE not set

For convenience, the filename does not need to be quoted as long as it contains only alphanumeric characters, underscores, dots or forward slashes. Names containing any other characters should be quoted.

[% INSERT misc/legalese.txt            %]
[% INSERT 'dos98/Program Files/stupid' %]

To evaluate a variable to specify a filename, you should explicitly prefix it with a $ or use double-quoted string interpolation.

[% language = 'en'
   legalese = 'misc/legalese.txt' 
%]

[% INSERT $legalese %]              # misc/legalese.txt
[% INSERT "$language/$legalese" %]  # en/misc/legalese.txt

Multiple files can be specified using + as a delimiter. All files should be unquoted names or quoted strings. Any variables should be interpolated into double-quoted strings.

[% INSERT legalese.txt + warning.txt %]
[% INSERT  "$legalese" + warning.txt %]  # requires quoting

INCLUDE

Top

The INCLUDE directive is used to process and include the output of another template file or block.

[% INCLUDE header %]

If a BLOCK of the specified name is defined in the same file, or in a file from which the current template has been called (i.e. a parent template) then it will be used in preference to any file of the same name.

[% INCLUDE table %]     # uses BLOCK defined below

[% BLOCK table %]
   <table>
     ...
   </table>
[% END %]

If a BLOCK definition is not currently visible then the template name should be a file relative to one of the INCLUDE_PATH directories, or an absolute or relative file name if the ABSOLUTE/RELATIVE options are appropriately enabled. The INCLUDE directive automatically quotes the filename specified, as per INSERT described above. When a variable contains the name of the template for the INCLUDE directive, it should be explicitly prefixed by $ or double-quoted

[% myheader = 'my/misc/header' %]
[% INCLUDE   myheader  %]           # 'myheader'
[% INCLUDE  $myheader  %]           # 'my/misc/header'
[% INCLUDE "$myheader" %]           # 'my/misc/header'

Any template directives embedded within the file will be processed accordingly. All variables currently defined will be visible and accessible from within the included template.

[% title = 'Hello World' %]
[% INCLUDE header %]
<body>
...

header:

<html>
<title>[% title %]</title>

output:

<html>
<title>Hello World</title>
<body>
...

Local variable definitions may be specified after the template name, temporarily masking any existing variables. Insignificant whitespace is ignored within directives so you can add variable definitions on the same line, the next line or split across several line with comments interspersed, if you prefer.

[% INCLUDE table %]

[% INCLUDE table title="Active Projects" %]

[% INCLUDE table 
     title   = "Active Projects" 
     bgcolor = "#80ff00"    # chartreuse
     border  = 2
%]

The INCLUDE directive localises (i.e. copies) all variables before processing the template. Any changes made within the included template will not affect variables in the including template.

[% foo = 10 %]

foo is originally [% foo %]
[% INCLUDE bar %]
foo is still [% foo %]

[% BLOCK bar %]
   foo was [% foo %]
   [% foo = 20 %]
   foo is now [% foo %]
[% END %]

output:

foo is originally 10
   foo was 10
   foo is now 20
foo is still 10

Technical Note: the localisation of the stash (that is, the process by which variables are copied before an INCLUDE to prevent being overwritten) is only skin deep. The top-level variable namespace (hash) is copied, but no attempt is made to perform a deep-copy of other structures (hashes, arrays, objects, etc.) Therefore, a foo variable referencing a hash will be copied to create a new foo variable but which points to the same hash array. Thus, if you update compound variables (e.g. foo.bar) then you will change the original copy, regardless of any stash localisation. If you're not worried about preserving variable values, or you trust the templates you're including then you might prefer to use the PROCESS directive which is faster by virtue of not performing any localisation.

You can specify dotted variables as "local" variables to an INCLUDE directive. However, be aware that because of the localisation issues explained above (if you skipped the previous Technical Note above then you might want to go back and read it or skip this section too), the variables might not actualy be "local". If the first element of the variable name already references a hash array then the variable update will affect the original variable.

[% foo = {
       bar = 'Baz'
   }
%]

[% INCLUDE somefile foo.bar='Boz' %]

[% foo.bar %]           # Boz

This behaviour can be a little unpredictable (and may well be improved upon in a future version). If you know what you're doing with it and you're sure that the variables in question are defined (nor not) as you expect them to be, then you can rely on this feature to implement some powerful "global" data sharing techniques. Otherwise, you might prefer to steer well clear and always pass simple (undotted) variables as parameters to INCLUDE and other similar directives.

If you want to process several templates in one go then you can specify each of their names (quoted or unquoted names only, no unquoted $variables) joined together by +. The INCLUDE directive will then process them in order.

[% INCLUDE html/header + "site/$header" + site/menu
     title = "My Groovy Web Site"
%]

The variable stash is localised once and then the templates specified are processed in order, all within that same variable context. This makes it slightly faster than specifying several separate INCLUDE directives (because you only clone the variable stash once instead of n times), but not quite as "safe" because any variable changes in the first file will be visible in the second, third and so on. This might be what you want, of course, but then again, it might not.

PROCESS

Top

The PROCESS directive is similar to INCLUDE but does not perform any localisation of variables before processing the template. Any changes made to variables within the included template will be visible in the including template.

[% foo = 10 %]

foo is [% foo %]
[% PROCESS bar %]
foo is [% foo %]

[% BLOCK bar %]
   [% foo = 20 %]
   changed foo to [% foo %]
[% END %]

output:

foo is 10
   changed foo to 20
foo is 20

Parameters may be specified in the PROCESS directive, but these too will become visible changes to current variable values.

[% foo = 10 %]
foo is [% foo %]
[% PROCESS bar
   foo = 20 
%]
foo is [% foo %]

[% BLOCK bar %]
   this is bar, foo is [% foo %]
[% END %]

output:

foo is 10
   this is bar, foo is 20
foo is 20

The PROCESS directive is slightly faster than INCLUDE because it avoids the need to localise (i.e. copy) the variable stash before processing the template. As with INSERT and INCLUDE, the first parameter does not need to be quoted as long as it contains only alphanumeric characters, underscores, periods or forward slashes. A $ prefix can be used to explicitly indicate a variable which should be interpolated to provide the template name:

[% myheader = 'my/misc/header' %]
[% PROCESS  myheader %]              # 'myheader'
[% PROCESS $myheader %]              # 'my/misc/header'

As with INCLUDE, multiple templates can be specified, delimited by +, and are processed in order.

[% PROCESS html/header + my/header %]

WRAPPER

Top

It's not unusual to find yourself adding common headers and footers to pages or sub-sections within a page. Something like this:

[% INCLUDE section/header
   title = 'Quantum Mechanics'
%]
   Quantum mechanics is a very interesting subject wish 
   should prove easy for the layman to fully comprehend.
[% INCLUDE section/footer %]

[% INCLUDE section/header
   title = 'Desktop Nuclear Fusion for under $50'
%]
   This describes a simple device which generates significant 
   sustainable electrical power from common tap water by process 
   of nuclear fusion.
[% INCLUDE section/footer %]

The individual template components being included might look like these:

section/header:

<p>
<h2>[% title %]</h2>

section/footer:

</p>

The WRAPPER directive provides a way of simplifying this a little. It encloses a block up to a matching END directive, which is first processed to generate some output. This is then passed to the named template file or BLOCK as the content variable.

[% WRAPPER section
   title = 'Quantum Mechanics'
%]
   Quantum mechanics is a very interesting subject wish 
   should prove easy for the layman to fully comprehend.
[% END %]

[% WRAPPER section
   title = 'Desktop Nuclear Fusion for under $50'
%]
   This describes a simple device which generates significant 
   sustainable electrical power from common tap water by process 
   of nuclear fusion.
[% END %]

The single 'section' template can then be defined as:

<h2>[% title %]</h2>
<p>
  [% content %]
</p>

Like other block directives, it can be used in side-effect notation:

[% INSERT legalese.txt WRAPPER big_bold_table %]

It's also possible to specify multiple templates to a WRAPPER directive. The specification order indicates outermost to innermost wrapper templates. For example, given the following template block definitions:

[% BLOCK bold   %]<b>[% content %]</b>[% END %]
[% BLOCK italic %]<i>[% content %]</i>[% END %]

the directive

[% WRAPPER bold+italic %]Hello World[% END %]

would generate the following output:

<b><i>Hello World</i></b>

BLOCK

Top

The BLOCK...END construct can be used to define template component blocks which can be processed with the INCLUDE, PROCESS and WRAPPER directives.

[% BLOCK tabrow %]
<tr>
  <td>[% name %]<td>
  <td>[% email %]</td>
</tr>
[% END %]

<table>
  [% PROCESS tabrow  name='Fred'  email='fred@nowhere.com' %]
  [% PROCESS tabrow  name='Alan'  email='alan@nowhere.com' %]
</table>

A BLOCK definition can be used before it is defined, as long as the definition resides in the same file. The block definition itself does not generate any output.

[% PROCESS tmpblk %]

[% BLOCK tmpblk %] This is OK [% END %]

You can use an anonymous BLOCK to capture the output of a template fragment.

[% julius = BLOCK %]
   And Caesar's spirit, ranging for revenge,
   With Ate by his side come hot from hell,
   Shall in these confines with a monarch's voice
   Cry  'Havoc', and let slip the dogs of war;
   That this foul deed shall smell above the earth
   With carrion men, groaning for burial.
[% END %]

Like a named block, it can contain any other template directives which are processed when the block is defined. The output generated by the block is then assigned to the variable julius.

Anonymous BLOCKs can also be used to define block macros. The enclosing block is processed each time the macro is called.

[% MACRO locate BLOCK %]
   The [% animal %] sat on the [% place %].
[% END %]

[% locate(animal='cat', place='mat') %]    # The cat sat on the mat
[% locate(animal='dog', place='log') %]    # The dog sat on the log

Conditional Processing

Top

IF / UNLESS / ELSIF / ELSE

Top

The IF and UNLESS directives can be used to process or ignore a block based on some run-time condition.

[% IF frames %]
   [% INCLUDE frameset %]
[% END %]

[% UNLESS text_mode %]
   [% INCLUDE biglogo %]
[% END %]

Multiple conditions may be joined with ELSIF and/or ELSE blocks.

[% IF age < 10 %]
   Hello [% name %], does your mother know you're 
   using her AOL account?
[% ELSIF age < 18 %]
   Sorry, you're not old enough to enter 
   (and too dumb to lie about your age)
[% ELSE %]
   Welcome [% name %].
[% END %]

The following conditional and boolean operators may be used:

== != < <= > >= && || ! and or not

Conditions may be arbitrarily complex and are evaluated with the same precedence as in Perl. Parenthesis may be used to explicitly determine evaluation order.

# ridiculously contrived complex example
[% IF (name == 'admin' || uid <= 0) && mode == 'debug' %]
   I'm confused.
[% ELSIF more > less %]
   That's more or less correct.
[% END %]

The and, or and not operator are provided as aliases for &&, || and !, respectively. Unlike Perl, which treats and, or and not as separate, lower-precedence versions of the other operators, the Template Toolkit performs a straightforward substitution of and for &&, and so on. That means that and, or and not have the same operator precedence as &&, || and !.

SWITCH / CASE

Top

The SWITCH / CASE construct can be used to perform a multi-way conditional test. The SWITCH directive expects an expression which is first evaluated and then compared against each CASE statement in turn. Each CASE directive should contain a single value or a list of values which should match. CASE may also be left blank or written as [% CASE DEFAULT %] to specify a default match. Only one CASE matches, there is no drop-through between CASE statements.

[% SWITCH myvar %]
[%   CASE 'value1' %]
       ...
[%   CASE ['value2', 'value3'] %]   # multiple values
       ...
[%   CASE myhash.keys %]            # ditto
       ...
[%   CASE %]                        # default
       ...
[% END %]

Loop Processing

Top

FOREACH

Top

The FOREACH directive will iterate through the items in a list, processing the enclosed block for each one.

[% foo   = 'Foo'
   items = [ 'one', 'two', 'three' ]
%]

Things:
[% FOREACH thing IN [ foo 'Bar' "$foo Baz" ] %]
   * [% thing %]
[% END %]

Items:
[% FOREACH i IN items %]
   * [% i %]
[% END %]

Stuff:
[% stuff = [ foo "$foo Bar" ] %]
[% FOREACH s IN stuff %]
   * [% s %]
[% END %]

output:

Things:
  * Foo
  * Bar
  * Foo Baz

Items:
  * one
  * two
  * three

Stuff:
  * Foo
  * Foo Bar

You can use also use = instead of IN if you prefer.

[% FOREACH i = items %]

When the FOREACH directive is used without specifying a target variable, any iterated values which are hash references will be automatically imported.

[% userlist = [
    { id => 'tom',   name => 'Thomas'  },
    { id => 'dick',  name => 'Richard'  },
    { id => 'larry', name => 'Lawrence' },
   ]
%]

[% FOREACH user IN userlist %]
   [% user.id %] [% user.name %]
[% END %]

short form:

[% FOREACH userlist %]
   [% id %] [% name %]
[% END %]

Note that this particular usage creates a localised variable context to prevent the imported hash keys from overwriting any existing variables. The imported definitions and any other variables defined in such a FOREACH loop will be lost at the end of the loop, when the previous context and variable values are restored.

However, under normal operation, the loop variable remains in scope after the FOREACH loop has ended (caveat: overwriting any variable previously in scope). This is useful as the loop variable is secretly an iterator object (see below) and can be used to analyse the last entry processed by the loop.

The FOREACH directive can also be used to iterate through the entries in a hash array. Each entry in the hash is returned in sorted order (based on the key) as a hash array containing 'key' and 'value' items.

[% users = {
     tom   => 'Thomas',
     dick  => 'Richard',
     larry => 'Lawrence',
   }
%]

[% FOREACH u IN users %]
   * [% u.key %] : [% u.value %]
[% END %]

Output:

* dick : Richard
* larry : Lawrence
* tom : Thomas

The NEXT directive starts the next iteration in the FOREACH loop.

[% FOREACH user IN userlist %]
   [% NEXT IF user.isguest %]
   Name: [% user.name %]    Email: [% user.email %]
[% END %]

The LAST directive can be used to prematurely exit the loop. BREAK is also provided as an alias for LAST.

[% FOREACH match IN results.nsort('score').reverse %]
   [% LAST IF match.score < 50 %]
   [% match.score %] : [% match.url %]
[% END %]

The FOREACH directive is implemented using the Template::Iterator module. A reference to the iterator object for a FOREACH directive is implicitly available in the loop variable. The following methods can be called on the loop iterator.

size()      number of elements in the list
max()       index number of last element (size - 1)
index()     index of current iteration from 0 to max()
count()     iteration counter from 1 to size() (i.e. index() + 1)
first()     true if the current iteration is the first
last()      true if the current iteration is the last
prev()      return the previous item in the list
next()      return the next item in the list

See Template::Iterator for further details.

Example:

[% FOREACH item IN [ 'foo', 'bar', 'baz' ] -%]
   [%- "<ul>\n" IF loop.first %]
   <li>[% loop.count %]/[% loop.size %]: [% item %]
   [%- "</ul>\n" IF loop.last %]
[% END %]

Output:

<ul>
<li>1/3: foo
<li>2/3: bar
<li>3/3: baz
</ul>

Nested loops will work as expected, with the loop variable correctly referencing the innermost loop and being restored to any previous value (i.e. an outer loop) at the end of the loop.

[% FOREACH group IN grouplist;
     # loop => group iterator
     "Groups:\n" IF loop.first;

     FOREACH user IN group.userlist;
        # loop => user iterator
        "$loop.count: $user.name\n";
     END;

     # loop => group iterator
     "End of Groups\n" IF loop.last;
   END 
%]

The iterator plugin can also be used to explicitly create an iterator object. This can be useful within nested loops where you need to keep a reference to the outer iterator within the inner loop. The iterator plugin effectively allows you to create an iterator by a name other than loop. See Template::Plugin::Iterator for further details.

[% USE giter = iterator(grouplist) %]

[% FOREACH group IN giter %]
   [% FOREACH user IN group.userlist %]
         user #[% loop.count %] in
         group [% giter.count %] is
         named [% user.name %]
   [% END %]
[% END %]

WHILE

Top

The WHILE directive can be used to repeatedly process a template block while a conditional expression evaluates true. The expression may be arbitrarily complex as per IF / UNLESS.

[% WHILE total < 100 %]
   ...
   [% total = calculate_new_total %]
[% END %]

An assignment can be enclosed in parenthesis to evaluate the assigned value.

[% WHILE (user = get_next_user_record) %]
   [% user.name %]
[% END %]

The NEXT directive can be used to start the next iteration of a WHILE loop and BREAK can be used to exit the loop, both as per FOREACH.

The Template Toolkit uses a failsafe counter to prevent runaway WHILE loops which would otherwise never terminate. If the loop exceeds 1000 iterations then an undef exception will be thrown, reporting the error:

WHILE loop terminated (> 1000 iterations)

The $Template::Directive::WHILE_MAX variable controls this behaviour and can be set to a higher value if necessary.

Filters, Plugins, Macros and Perl

Top

FILTER

Top

The FILTER directive can be used to post-process the output of a block. A number of standard filters are provided with the Template Toolkit. The html filter, for example, escapes the '<', '>' and '&' characters to prevent them from being interpreted as HTML tags or entity reference markers.

[% FILTER html %]
   HTML text may have < and > characters embedded
   which you want converted to the correct HTML entities.
[% END %]

output:

HTML text may have &lt; and &gt; characters embedded
which you want converted to the correct HTML entities.

The FILTER directive can also follow various other non-block directives. For example:

[% INCLUDE mytext FILTER html %]

The | character can also be used as an alias for FILTER.

[% INCLUDE mytext | html %]

Multiple filters can be chained together and will be called in sequence.

[% INCLUDE mytext FILTER html FILTER html_para %]

or

[% INCLUDE mytext | html | html_para %]

Filters come in two flavours, known as 'static' or 'dynamic'. A static filter is a simple subroutine which accepts a text string as the only argument and returns the modified text. The html filter is an example of a static filter, implemented as:

sub html_filter {
    my $text = shift;
    for ($text) {
        s/&/&amp;/g;
        s/</&lt;/g;
        s/>/&gt;/g;
    }
    return $text;
}

Dynamic filters can accept arguments which are specified when the filter is called from a template. The repeat filter is such an example, accepting a numerical argument which specifies the number of times that the input text should be repeated.

[% FILTER repeat(3) %]blah [% END %]

output:

blah blah blah

These are implemented as filter 'factories'. The factory subroutine is passed a reference to the current Template::Context object along with any additional arguments specified. It should then return a subroutine reference (e.g. a closure) which implements the filter. The repeat filter factory is implemented like this:

sub repeat_filter_factory {
    my ($context, $iter) = @_;
    $iter = 1 unless defined $iter;

    return sub {
        my $text = shift;
        $text = '' unless defined $text;
        return join('\n', $text) x $iter;
    }
}

The FILTERS option, described in Template::Manual::Config, allows custom filters to be defined when a Template object is instantiated. The define_filter() method allows further filters to be defined at any time.

When using a filter, it is possible to assign an alias to it for further use. This is most useful for dynamic filters that you want to re-use with the same configuration.

[% FILTER echo = repeat(2) %]
Is there anybody out there?
[% END %]

[% FILTER echo %]
Mother, should I build a wall?
[% END %]

Output:

Is there anybody out there?
Is there anybody out there?

Mother, should I build a wall?
Mother, should I build a wall?

The FILTER directive automatically quotes the name of the filter. As with INCLUDE et al, you can use a variable to provide the name of the filter, prefixed by $.

[% myfilter = 'html' %]
[% FILTER $myfilter %]      # same as [% FILTER html %]
   ...
[% END %]

A template variable can also be used to define a static filter subroutine. However, the Template Toolkit will automatically call any subroutine bound to a variable and use the value returned. Thus, the above example could be implemented as:

my $vars = {
    myfilter => sub { return 'html' },
};

template:

[% FILTER $myfilter %]      # same as [% FILTER html %]
   ...
[% END %]

To define a template variable that evaluates to a subroutine reference that can be used by the FILTER directive, you should create a subroutine that, when called automatically by the Template Toolkit, returns another subroutine reference which can then be used to perform the filter operation. Note that only static filters can be implemented in this way.

my $vars = {
    myfilter => sub { \&my_filter_sub },
};

sub my_filter_sub {
    my $text = shift;
    # do something
    return $text;
}

template:

[% FILTER $myfilter %]
   ...
[% END %]

Alternately, you can bless a subroutine reference into a class (any class will do) to fool the Template Toolkit into thinking it's an object rather than a subroutine. This will then bypass the automatic "call-a-subroutine-to-return-a-value" magic.

my $vars = {
    myfilter => bless(\&my_filter_sub, 'anything_you_like'),
};

template:

[% FILTER $myfilter %]          
   ...
[% END %]

Filters bound to template variables remain local to the variable context in which they are defined. That is, if you define a filter in a PERL block within a template that is loaded via INCLUDE, then the filter definition will only exist until the end of that template when the stash is delocalised, restoring the previous variable state. If you want to define a filter which persists for the lifetime of the processor, or define additional dynamic filter factories, then you can call the define_filter() method on the current Template::Context object.

See Template::Manual::Filters for a complete list of available filters, their descriptions and examples of use.

USE

Top

The USE directive can be used to load and initialise "plugin" extension modules.

[% USE myplugin %]

A plugin is a regular Perl module that conforms to a particular object-oriented interface, allowing it to be loaded into and used automatically by the Template Toolkit. For details of this interface and information on writing plugins, consult Template::Plugin.

A number of standard plugins are included with the Template Toolkit (see below and Template::Manual::Plugins). The names of these standard plugins are case insensitive.

[% USE CGI   %]        # => Template::Plugin::CGI
[% USE Cgi   %]        # => Template::Plugin::CGI
[% USE cgi   %]        # => Template::Plugin::CGI

You can also define further plugins using the PLUGINS option.

my $tt = Template->new({
    PLUGINS => {
        foo => 'My::Plugin::Foo',
        bar => 'My::Plugin::Bar',
    },
});

The recommended convention is to specify these plugin names in lower case. The Template Toolkit first looks for an exact case-sensitive match and then tries the lower case conversion of the name specified.

[% USE Foo %]      # look for 'Foo' then 'foo'

If you define all your PLUGINS with lower case names then they will be located regardless of how the user specifies the name in the USE directive. If, on the other hand, you define your PLUGINS with upper or mixed case names then the name specified in the USE directive must match the case exactly.

If the plugin isn't defined in either the standard plugins ($Template::Plugins::STD_PLUGINS) or via the PLUGINS option, then the PLUGIN_BASE is searched.

In this case the plugin name is case-sensitive. It is appended to each of the PLUGIN_BASE module namespaces in turn (default: Template::Plugin) to construct a full module name which it attempts to locate and load. Any periods, '.', in the name will be converted to '::'.

[% USE MyPlugin %]     #  => Template::Plugin::MyPlugin
[% USE Foo.Bar  %]     #  => Template::Plugin::Foo::Bar

The LOAD_PERL option (disabled by default) provides a further way by which external Perl modules may be loaded. If a regular Perl module (i.e. not a Template::Plugin::* or other module relative to some PLUGIN_BASE) supports an object-oriented interface and a new() constructor then it can be loaded and instantiated automatically. The following trivial example shows how the IO::File module might be used.

[% USE file = IO.File('/tmp/mydata') %]

[% WHILE (line = file.getline) %]
   <!-- [% line %] -->
[% END %]

Any additional parameters supplied in parenthesis after the plugin name will be also be passed to the new() constructor. A reference to the current Template::Context object is passed as the first parameter.

[% USE MyPlugin('foo', 123) %]

equivalent to:

Template::Plugin::MyPlugin->new($context, 'foo', 123);

The only exception to this is when a module is loaded via the LOAD_PERL option. In this case the $context reference is not passed to the new() constructor. This is based on the assumption that the module is a regular Perl module rather than a Template Toolkit plugin so isn't expecting a context reference and wouldn't know what to do with it anyway.

Named parameters may also be specified. These are collated into a hash which is passed by reference as the last parameter to the constructor, as per the general code calling interface.

[% USE url('/cgi-bin/foo', mode='submit', debug=1) %]

equivalent to:

Template::Plugin::URL->new(
    $context, 
    '/cgi-bin/foo'
    { mode => 'submit', debug => 1 }
);

The plugin may represent any data type; a simple variable, hash, list or code reference, but in the general case it will be an object reference. Methods can be called on the object (or the relevant members of the specific data type) in the usual way:

[% USE table(mydata, rows=3) %]

[% FOREACH row IN table.rows %]
   <tr>    
   [% FOREACH item IN row %]
    <td>[% item %]</td>
   [% END %]
   </tr>
[% END %]

An alternative name may be provided for the plugin by which it can be referenced:

[% USE scores = table(myscores, cols=5) %]

[% FOREACH row IN scores.rows %]
   ...
[% END %]

You can use this approach to create multiple plugin objects with different configurations. This example shows how the format plugin is used to create sub-routines bound to variables for formatting text as per printf().

[% USE bold = format('<b>%s</b>') %]
[% USE ital = format('<i>%s</i>') %]
[% bold('This is bold')   %]
[% ital('This is italic') %]

Output:

<b>This is bold</b>
<i>This is italic</i>

This next example shows how the URL plugin can be used to build dynamic URLs from a base part and optional query parameters.

[% USE mycgi = URL('/cgi-bin/foo.pl', debug=1) %]
<a href="[% mycgi %]">...
<a href="[% mycgi(mode='submit') %]"...

Output:

<a href="/cgi-bin/foo.pl?debug=1">...
<a href="/cgi-bin/foo.pl?mode=submit&debug=1">...

The CGI plugin is an example of one which delegates to another Perl module. In this this case, to Lincoln Stein's CGI module. All of the methods provided by the CGI module are available via the plugin.

[% USE CGI;
   CGI.start_form;
   CGI.checkbox_group( name   = 'colours', 
                       values = [ 'red' 'green' 'blue' ] );
   CGI.popup_menu( name   = 'items', 
                   values = [ 'foo' 'bar' 'baz' ] );
   CGI.end_form 
%]

See Template::Manual::Plugins for more information on the plugins distributed with the toolkit or available from CPAN.

MACRO

Top

The MACRO directive allows you to define a directive or directive block which is then evaluated each time the macro is called.

[% MACRO header INCLUDE header %]

Calling the macro as:

[% header %]

is then equivalent to:

[% INCLUDE header %]

Macros can be passed named parameters when called. These values remain local to the macro.

[% header(title='Hello World') %]

equivalent to:

[% INCLUDE header title='Hello World' %]

A MACRO definition may include parameter names. Values passed to the macros are then mapped to these local variables. Other named parameters may follow these.

[% MACRO header(title) INCLUDE header %]
[% header('Hello World') %]
[% header('Hello World', bgcol='#123456') %]

equivalent to:

[% INCLUDE header title='Hello World' %]
[% INCLUDE header title='Hello World' bgcol='#123456' %]

Here's another example, defining a macro for display numbers in comma-delimited groups of 3, using the chunk and join virtual method.

[% MACRO number(n) GET n.chunk(-3).join(',') %]
[% number(1234567) %]    # 1,234,567

A MACRO may precede any directive and must conform to the structure of the directive.

[% MACRO header IF frames %]
   [% INCLUDE frames/header %]
[% ELSE %]
   [% INCLUDE header %]
[% END %]

[% header %]

A MACRO may also be defined as an anonymous BLOCK. The block will be evaluated each time the macro is called.

[% MACRO header BLOCK %]
   ...content...
[% END %]

[% header %]

If you've got the EVAL_PERL option set, then you can even define a MACRO as a PERL block (see below):

[% MACRO triple(n) PERL %]
     my $n = $stash->get('n');
     print $n * 3;
[% END -%]

PERL

Top

(for the advanced reader)

The PERL directive is used to mark the start of a block which contains Perl code for evaluation. The EVAL_PERL option must be enabled for Perl code to be evaluated or a perl exception will be thrown with the message 'EVAL_PERL not set'.

Perl code is evaluated in the Template::Perl package. The $context package variable contains a reference to the current Template::Context object. This can be used to access the functionality of the Template Toolkit to process other templates, load plugins, filters, etc. See Template::Context for further details.

[% PERL %]
   print $context->include('myfile');
[% END %]

The $stash variable contains a reference to the top-level stash object which manages template variables. Through this, variable values can be retrieved and updated. See Template::Stash for further details.

[% PERL %]
   $stash->set(foo => 'bar');
   print "foo value: ", $stash->get('foo');
[% END %]

Output:

foo value: bar

Output is generated from the PERL block by calling print(). Note that the Template::Perl::PERLOUT handle is selected (tied to an output buffer) instead of STDOUT.

[% PERL %]
   print "foo\n";                           # OK
   print PERLOUT "bar\n";                   # OK, same as above
   print Template::Perl::PERLOUT "baz\n";   # OK, same as above
   print STDOUT "qux\n";                    # WRONG!
[% END %]

The PERL block may contain other template directives. These are processed before the Perl code is evaluated.

[% name = 'Fred Smith' %]

[% PERL %]
   print "[% name %]\n";
[% END %]

Thus, the Perl code in the above example is evaluated as:

print "Fred Smith\n";

Exceptions may be thrown from within PERL blocks using die(). They will be correctly caught by enclosing TRY blocks.

[% TRY %]
   [% PERL %]
      die "nothing to live for\n";
   [% END %]
[% CATCH %]
   error: [% error.info %]
[% END %]

output: error: nothing to live for

RAWPERL

Top

(for the very advanced reader)

The Template Toolkit parser reads a source template and generates the text of a Perl subroutine as output. It then uses eval() to evaluate it into a subroutine reference. This subroutine is then called to process the template, passing a reference to the current Template::Context object through which the functionality of the Template Toolkit can be accessed. The subroutine reference can be cached, allowing the template to be processed repeatedly without requiring any further parsing.

For example, a template such as:

[% PROCESS header %]
The [% animal %] sat on the [% location %]
[% PROCESS footer %]

is converted into the following Perl subroutine definition:

sub {
    my $context = shift;
    my $stash   = $context->stash;
    my $output  = '';
    my $error;

    eval { BLOCK: {
        $output .=  $context->process('header');
        $output .=  "The ";
        $output .=  $stash->get('animal');
        $output .=  " sat on the ";
        $output .=  $stash->get('location');
        $output .=  $context->process('footer');
        $output .=  "\n";
    } };
    if ($@) {
        $error = $context->catch($@, \$output);
        die $error unless $error->type eq 'return';
    }

    return $output;
}

To examine the Perl code generated, such as in the above example, set the $Template::Parser::DEBUG package variable to any true value. You can also set the $Template::Directive::PRETTY variable true to have the code formatted in a readable manner for human consumption. The source code for each generated template subroutine will be printed to STDERR on compilation (i.e. the first time a template is used).

$Template::Parser::DEBUG = 1;
$Template::Directive::PRETTY = 1;

$template->process($file, $vars)
    || die $template->error(), "\n";

The PERL ... END construct allows Perl code to be embedded into a template when the EVAL_PERL option is set. It is evaluated at "runtime" using eval() each time the template subroutine is called. This is inherently flexible, but not as efficient as it could be, especially in a persistent server environment where a template may be processed many times.

The RAWPERL directive allows you to write Perl code that is integrated directly into the generated Perl subroutine text. It is evaluated once at compile time and is stored in cached form as part of the compiled template subroutine. This makes RAWPERL blocks more efficient than PERL blocks.

The downside is that you must code much closer to the metal. For example, in a PERL block you can call print() to generate some output. RAWPERL blocks don't afford such luxury. The code is inserted directly into the generated subroutine text and should conform to the convention of appending to the $output variable.

[% PROCESS  header %]

[% RAWPERL %]
   $output .= "Some output\n";
   ...
   $output .= "Some more output\n";
[% END %]

The critical section of the generated subroutine for this example would then look something like:

...
eval { BLOCK: {
    $output .=  $context->process('header');
    $output .=  "\n";
    $output .= "Some output\n";
    ...
    $output .= "Some more output\n";
    $output .=  "\n";
} };
...

As with PERL blocks, the $context and $stash references are pre-defined and available for use within RAWPERL code.

Exception Handling and Flow Control

Top

TRY / THROW / CATCH / FINAL

Top

(more advanced material)

The Template Toolkit supports fully functional, nested exception handling. The TRY directive introduces an exception handling scope which continues until the matching END directive. Any errors that occur within that block will be caught and can be handled by one of the CATCH blocks defined.

[% TRY %]
   ...blah...blah...
   [% CALL somecode %]
   ...etc...
   [% INCLUDE someblock %]
   ...and so on...
[% CATCH %]
   An error occurred!
[% END %]

Errors are raised as exceptions (objects of the Template::Exception class) which contain two fields: type and info. The exception type is used to indicate the kind of error that occurred. It is a simple text string which can contain letters, numbers, '_' or '.'. The info field contains an error message indicating what actually went wrong. Within a catch block, the exception object is aliased to the error variable. You can access the type and info fields directly.

[% mydsn = 'dbi:MySQL:foobar' %]
...

[% TRY %]
   [% USE DBI(mydsn) %]
[% CATCH %]
   ERROR! Type: [% error.type %]
          Info: [% error.info %]
[% END %]

output (assuming a non-existant database called 'foobar'):

ERROR!  Type: DBI
        Info: Unknown database "foobar"

The error variable can also be specified by itself and will return a string of the form "$type error - $info".

...
[% CATCH %]
ERROR: [% error %]
[% END %]

Output:

ERROR: DBI error - Unknown database "foobar"

Each CATCH block may be specified with a particular exception type denoting the kind of error that it should catch. Multiple CATCH blocks can be provided to handle different types of exception that may be thrown in the TRY block. A CATCH block specified without any type, as in the previous example, is a default handler which will catch any otherwise uncaught exceptions. This can also be specified as [% CATCH DEFAULT %].

[% TRY %]
   [% INCLUDE myfile %]
   [% USE DBI(mydsn) %]
   [% CALL somecode %]
[% CATCH file %]
   File Error! [% error.info %]
[% CATCH DBI %]
   [% INCLUDE database/error.html %]
[% CATCH %]
   [% error %]
[% END %]

Remember that you can specify multiple directives within a single tag, each delimited by ';'. So the above example can be written more concisely as:

[% TRY;
       INCLUDE myfile;
       USE DBI(mydsn);
       CALL somecode;
   CATCH file;
       "File Error! $error.info";
   CATCH DBI;
       INCLUDE database/error.html;
   CATCH;
       error;
   END 
%]

The DBI plugin throws exceptions of the DBI type (in case that wasn't already obvious). The other specific exception caught here is of the file type.

A file exception is automatically thrown by the Template Toolkit when it can't find a file, or fails to load, parse or process a file that has been requested by an INCLUDE, PROCESS, INSERT or WRAPPER directive. If myfile can't be found in the example above, the [% INCLUDE myfile %] directive will raise a file exception which is then caught by the [% CATCH file %] block. The output generated would be:

File Error! myfile: not found

Note that the DEFAULT option (disabled by default) allows you to specify a default file to be used any time a template file can't be found. This will prevent file exceptions from ever being raised when a non-existant file is requested (unless, of course, the DEFAULT file your specify doesn't exist). Errors encountered once the file has been found (i.e. read error, parse error) will be raised as file exceptions as per usual.

Uncaught exceptions (i.e. if the TRY block doesn't have a type specific or default CATCH handler) may be caught by enclosing TRY blocks which can be nested indefinitely across multiple templates. If the error isn't caught at any level then processing will stop and the Template process() method will return a false value to the caller. The relevant Template::Exception object can be retrieved by calling the error() method.

[% TRY %]
   ...
   [% TRY %]
      [% INCLUDE $user.header %]
   [% CATCH file %]
      [% INCLUDE header %]
   [% END %]
   ...
[% CATCH DBI %]
   [% INCLUDE database/error.html %]
[% END %]

In this example, the inner TRY block is used to ensure that the first INCLUDE directive works as expected. We're using a variable to provide the name of the template we want to include, user.header, and it's possible this contains the name of a non-existant template, or perhaps one containing invalid template directives. If the INCLUDE fails with a file error then we CATCH it in the inner block and INCLUDE the default header file instead. Any DBI errors that occur within the scope of the outer TRY block will be caught in the relevant CATCH block, causing the database/error.html template to be processed. Note that included templates inherit all currently defined template variable so these error files can quite happily access the <error> variable to retrieve information about the currently caught exception. For example, the database/error.html template might look like this:

<h2>Database Error</h2>
A database error has occurred: [% error.info %]

You can also specify a FINAL block. This is always processed regardless of the outcome of the TRY and/or CATCH blocks. If an exception is uncaught then the FINAL block is processed before jumping to the enclosing block or returning to the caller.

[% TRY %]
   ...
[% CATCH this %] 
   ...
[% CATCH that %] 
   ...
[% FINAL %]
   All done!
[% END %]

The output from the TRY block is left intact up to the point where an exception occurs. For example, this template:

[% TRY %]
   This gets printed 
   [% THROW food 'carrots' %]
   This doesn't
[% CATCH food %]
   culinary delights: [% error.info %]
[% END %]

generates the following output:

This gets printed
culinary delights: carrots

The CLEAR directive can be used in a CATCH or FINAL block to clear any output created in the TRY block.

[% TRY %]
   This gets printed 
   [% THROW food 'carrots' %]
   This doesn't
[% CATCH food %]
   [% CLEAR %]
   culinary delights: [% error.info %]
[% END %]

Output:

culinary delights: carrots

Exception types are hierarchical, with each level being separated by the familiar dot operator. A DBI.connect exception is a more specific kind of DBI error. Similarly, an example.error.barf is a more specific kind of example.error type which itself is also a example error.

A CATCH handler that specifies a general exception type (such as DBI or example.error) will also catch more specific types that have the same prefix as long as a more specific handler isn't defined. Note that the order in which CATCH handlers are defined is irrelevant; a more specific handler will always catch an exception in preference to a more generic or default one.

[% TRY %]
   ...
[% CATCH DBI ;
     INCLUDE database/error.html ;
   CATCH DBI.connect ;
     INCLUDE database/connect.html ;
   CATCH ; 
     INCLUDE error.html ;
   END
%]

In this example, a DBI.connect error has it's own handler, a more general DBI block is used for all other DBI or DBI.* errors and a default handler catches everything else.

Exceptions can be raised in a template using the THROW directive. The first parameter is the exception type which doesn't need to be quoted (but can be, it's the same as INCLUDE) followed by the relevant error message which can be any regular value such as a quoted string, variable, etc.

[% THROW food "Missing ingredients: $recipe.error" %]
[% THROW user.login 'no user id: please login' %]
[% THROW $myerror.type "My Error: $myerror.info" %]

It's also possible to specify additional positional or named parameters to the THROW directive if you want to pass more than just a simple message back as the error info field.

[% THROW food 'eggs' 'flour' msg='Missing Ingredients' %]

In this case, the error info field will be a hash array containing the named arguments and an args item which contains a list of the positional arguments.

type => 'food',
info => {
    msg  => 'Missing Ingredients',
    args => ['eggs', 'flour'],
}

In addition to specifying individual positional arguments as [% error.info.args.n %], the info hash contains keys directly pointing to the positional arguments, as a convenient shortcut.

[% error.info.0 %]   # same as [% error.info.args.0 %]

Exceptions can also be thrown from Perl code which you've bound to template variables, or defined as a plugin or other extension. To raise an exception, call die() passing a reference to a Template::Exception object as the argument. This will then be caught by any enclosing TRY blocks from where the code was called.

use Template::Exception;
...
my $vars = {
    foo => sub {
        # ... do something ...
        die Template::Exception->new('myerr.naughty',
                                     'Bad, bad error');
    },
};

Template:

[% TRY %]
   [% foo %]
[% CATCH myerr ;
     "Error: $error" ;
   END
%]

Output:

Error: myerr.naughty error - Bad, bad error

The info field can also be a reference to another object or data structure, if required.

die Template::Exception->new('myerror', { 
    module => 'foo.pl', 
    errors => [ 'bad permissions', 'naughty boy' ],
});

Later, in a template:

[% TRY %]
   ...
[% CATCH myerror %]
   [% error.info.errors.size or 'no';
      error.info.errors.size == 1 ? ' error' : ' errors' %]
   in [% error.info.module %]: 
      [% error.info.errors.join(', ') %].
[% END %]

Generating the output:

2 errors in foo.pl:
   bad permissions, naughty boy.

You can also call die() with a single string, as is common in much existing Perl code. This will automatically be converted to an exception of the 'undef' type (that's the literal string 'undef', not the undefined value). If the string isn't terminated with a newline then Perl will append the familiar " at $file line $line" message.

sub foo {
    # ... do something ...
    die "I'm sorry, Dave, I can't do that\n";
}

If you're writing a plugin, or some extension code that has the current Template::Context in scope (you can safely skip this section if this means nothing to you) then you can also raise an exception by calling the context throw() method. You can pass it an Template::Exception object reference, a pair of ($type, $info) parameters or just an $info string to create an exception of 'undef' type.

$context->throw($e);            # exception object
$context->throw('Denied');      # 'undef' type
$context->throw('user.passwd', 'Bad Password');

NEXT

Top

The NEXT directive can be used to start the next iteration of a FOREACH or WHILE loop.

[% FOREACH user IN users %]
   [% NEXT IF user.isguest %]
   Name: [% user.name %]    Email: [% user.email %]
[% END %]

LAST

Top

The LAST directive can be used to prematurely exit a FOREACH or WHILE loop.

[% FOREACH user IN users %]
   Name: [% user.name %]    Email: [% user.email %]
   [% LAST IF some.condition %]
[% END %]

BREAK can also be used as an alias for LAST.

RETURN

Top

The RETURN directive can be used to stop processing the current template and return to the template from which it was called, resuming processing at the point immediately after the INCLUDE, PROCESS or WRAPPER directive. If there is no enclosing template then the Template process() method will return to the calling code with a true value.

Before
[% INCLUDE half_wit %]
After

[% BLOCK half_wit %]
This is just half...
[% RETURN %]
...a complete block
[% END %]

Output:

Before
This is just half...
After

STOP

Top

The STOP directive can be used to indicate that the processor should stop gracefully without processing any more of the template document. This is a planned stop and the Template process() method will return a true value to the caller. This indicates that the template was processed successfully according to the directives within it.

[% IF something.terrible.happened %]
   [% INCLUDE fatal/error.html %]
   [% STOP %]
[% END %]

[% TRY %]
   [% USE DBI(mydsn) %]
   ...
[% CATCH DBI.connect %]
   <h1>Cannot connect to the database: [% error.info %]</h1>
   <p>
     We apologise for the inconvenience.
   </p>
   [% INCLUDE footer %]
   [% STOP %]
[% END %]

CLEAR

Top

The CLEAR directive can be used to clear the output buffer for the current enclosing block. It is most commonly used to clear the output generated from a TRY block up to the point where the error occurred.

[% TRY %]
   blah blah blah            # this is normally left intact
   [% THROW some 'error' %]  # up to the point of error
   ...
[% CATCH %]
   [% CLEAR %]               # clear the TRY output
   [% error %]               # print error string
[% END %]

Miscellaneous

Top

META

Top

The META directive allows simple metadata items to be defined within a template. These are evaluated when the template is parsed and as such may only contain simple values (e.g. it's not possible to interpolate other variables values into META variables).

[% META
   title   = 'The Cat in the Hat'
   author  = 'Dr. Seuss'
   version = 1.23 
%]

The template variable contains a reference to the main template being processed. These metadata items may be retrieved as attributes of the template.

<h1>[% template.title %]</h1>
<h2>[% template.author %]</h2>

The name and modtime metadata items are automatically defined for each template to contain its name and modification time in seconds since the epoch.

[% USE date %]              # use Date plugin to format time
...
[% template.name %] last modified
at [% date.format(template.modtime) %]

The PRE_PROCESS and POST_PROCESS options allow common headers and footers to be added to all templates. The template reference is correctly defined when these templates are processed, allowing headers and footers to reference metadata items from the main template.

$template = Template->new({
    PRE_PROCESS  => 'header',
    POST_PROCESS => 'footer',
});

$template->process('cat_in_hat');

header:

<html>
  <head>
    <title>[% template.title %]</title>
  </head>
  <body>

cat_in_hat:

[% META
     title   = 'The Cat in the Hat'
     author  = 'Dr. Seuss'
     version = 1.23 
     year    = 2000
%]

    The cat in the hat sat on the mat.

footer:

    <hr>
    &copy; [% template.year %] [% template.author %]
  </body>
</html>

The output generated from the above example is:

<html>
  <head>
    <title>The Cat in the Hat</title>
  </head>
  <body>
    The cat in the hat sat on the mat.
    <hr>
    &copy; 2000 Dr. Seuss
  </body>
</html>

TAGS

Top

The TAGS directive can be used to set the START_TAG and END_TAG values on a per-template file basis.

[% TAGS <+ +> %]

<+ INCLUDE header +>

The TAGS directive may also be used to set a named TAG_STYLE

[% TAGS html %]
<!-- INCLUDE header -->

See the TAGS and TAG_STYLE configuration options for further details.

DEBUG

Top

The DEBUG directive can be used to enable or disable directive debug messages within a template. The DEBUG configuration option must be set to include DEBUG_DIRS for the DEBUG directives to have any effect. If DEBUG_DIRS is not set then the parser will automatically ignore and remove any DEBUG directives.

The DEBUG directive can be used with an on or off parameter to enable or disable directive debugging messages from that point forward. When enabled, the output of each directive in the generated output will be prefixed by a comment indicate the file, line and original directive text.

[% DEBUG on %]
directive debugging is on (assuming DEBUG option is set true)
[% DEBUG off %]
directive debugging is off

The format parameter can be used to change the format of the debugging message.

[% DEBUG format '<!-- $file line $line : [% $text %] -->' %]

TT_v224_html_docs/manual/Filters.html000700 000765 000765 00000121333 11756705103 017370 0ustar00abwabw000000 000000 Template::Manual::Filters

format(format)

Top

The format filter takes a format string as a parameter (as per printf()) and formats each line of text accordingly.

[% FILTER format('<!-- %-40s -->') %]
This is a block of text filtered 
through the above format.
[% END %]

Output:

<!-- This is a block of text filtered        -->
<!-- through the above format.               -->

upper

Top

Folds the input to UPPER CASE.

[% "hello world" FILTER upper %]

Output:

HELLO WORLD

lower

Top

Folds the input to lower case.

[% "Hello World" FILTER lower %]

Output:

hello world

ucfirst

Top

Folds the first character of the input to UPPER CASE.

[% "hello" FILTER ucfirst %]

Output:

Hello

lcfirst

Top

Folds the first character of the input to lower case.

[% "HELLO" FILTER lcfirst %]

Output:

hELLO

trim

Top

Trims any leading or trailing whitespace from the input text. Particularly useful in conjunction with INCLUDE, PROCESS, etc., having the same effect as the TRIM configuration option.

[% INCLUDE myfile | trim %]

collapse

Top

Collapse any whitespace sequences in the input text into a single space. Leading and trailing whitespace (which would be reduced to a single space) is removed, as per trim.

[% FILTER collapse %]

   The   cat

   sat    on

   the   mat

[% END %]

Output:

The cat sat on the mat

html

Top

Converts the characters <, >, & and " to &lt;, &gt;, &amp;, and &quot; respectively, protecting them from being interpreted as representing HTML tags or entities.

[% FILTER html %]
Binary "<=>" returns -1, 0, or 1 depending on...
[% END %]

Output:

Binary "&lt;=&gt;" returns -1, 0, or 1 depending on...

html_entity

Top

The html filter is fast and simple but it doesn't encode the full range of HTML entities that your text may contain. The html_entity filter uses either the Apache::Util module (which is written in C and is therefore faster) or the HTML::Entities module (written in Perl but equally as comprehensive) to perform the encoding.

If one or other of these modules are installed on your system then the text will be encoded (via the escape_html() or encode_entities() subroutines respectively) to convert all extended characters into their appropriate HTML entities (e.g. converting 'é' to '&eacute;'). If neither module is available on your system then an 'html_entity' exception will be thrown reporting an appropriate message.

If you want to force TT to use one of the above modules in preference to the other, then call either of the Template::Filters class methods: use_html_entities() or use_apache_util().

use Template::Filters;
Template::Filters->use_html_entities;

For further information on HTML entity encoding, see http://www.w3.org/TR/REC-html40/sgml/entities.html.

xml

Top

Same as the html filter, but adds &apos; which is the fifth XML built-in entity.

html_para

Top

This filter formats a block of text into HTML paragraphs. A sequence of two or more newlines is used as the delimiter for paragraphs which are then wrapped in HTML <p>...</p> tags.

[% FILTER html_para %]
The cat sat on the mat.

Mary had a little lamb.
[% END %]

Output:

<p>
The cat sat on the mat.
</p>

<p>
Mary had a little lamb.
</p>

html_break / html_para_break

Top

Similar to the html_para filter described above, but uses the HTML tag sequence <br><br> to join paragraphs.

[% FILTER html_break %]
The cat sat on the mat.

Mary had a little lamb.
[% END %]

Output:

The cat sat on the mat.
<br>
<br>
Mary had a little lamb.

html_line_break

Top

This filter replaces any newlines with <br> HTML tags, thus preserving the line breaks of the original text in the HTML output.

[% FILTER html_line_break %]
The cat sat on the mat.
Mary had a little lamb.
[% END %]

Output:

The cat sat on the mat.<br>
Mary had a little lamb.<br>

uri

Top

This filter URI escapes the input text, converting any characters outside of the permitted URI character set (as defined by RFC 2396) into a %nn hex escape.

[% 'my file.html' | uri %]

Output:

my%20file.html

The uri filter correctly encodes all reserved characters, including &, @, /, ;, :, =, +, ? and $. This filter is typically used to encode parameters in a URL that could otherwise be interpreted as part of the URL. Here's an example:

[% path  = 'http://tt2.org/example'
   back  = '/other?foo=bar&baz=bam' 
   title = 'Earth: "Mostly Harmless"'
%]
<a href="[% path %]?back=[% back | uri %]&title=[% title | uri %]">

The output generated is rather long so we'll show it split across two lines:

<a href="http://tt2.org/example?back=%2Fother%3Ffoo%3Dbar%26
baz%3Dbam&title=Earth%3A%20%22Mostly%20Harmless%22">

Without the uri filter the output would look like this (also split across two lines).

<a href="http://tt2.org/example?back=/other?foo=bar
&baz=bam&title=Earth: "Mostly Harmless"">

In this rather contrived example we've manage to generate both a broken URL (the repeated ? is not allowed) and a broken HTML element (the href attribute is terminated by the first " after Earth: leaving Mostly Harmless" dangling on the end of the tag in precisely the way that harmless things shouldn't dangle). So don't do that. Always use the uri filter to encode your URL parameters.

However, you should not use the uri filter to encode an entire URL.

<a href="[% page_url | uri %]">   # WRONG!

This will incorrectly encode any reserved characters like : and / and that's almost certainly not what you want in this case. Instead you should use the url (note spelling) filter for this purpose.

<a href="[% page_url | url %]">   # CORRECT

Please note that this behaviour was changed in version 2.16 of the Template Toolkit. Prior to that, the uri filter did not encode the reserved characters, making it technically incorrect according to the RFC 2396 specification. So we fixed it in 2.16 and provided the url filter to implement the old behaviour of not encoding reserved characters.

url

Top

The url filter is a less aggressive version of the uri filter. It encodes any characters outside of the permitted URI character set (as defined by RFC 2396) into %nn hex escapes. However, unlike the uri filter, the url filter does not encode the reserved characters &, @, /, ;, :, =, +, ? and $.

indent(pad)

Top

Indents the text block by a fixed pad string or width. The 'pad' argument can be specified as a string, or as a numerical value to indicate a pad width (spaces). Defaults to 4 spaces if unspecified.

[% FILTER indent('ME> ') %]
blah blah blah
cabbages, rhubard, onions 
[% END %]

Output:

ME> blah blah blah
ME> cabbages, rhubard, onions

truncate(length,dots)

Top

Truncates the text block to the length specified, or a default length of 32. Truncated text will be terminated with '...' (i.e. the '...' falls inside the required length, rather than appending to it).

[% FILTER truncate(21) %]
I have much to say on this matter that has previously 
been said on more than one occasion.
[% END %]

Output:

I have much to say...

If you want to use something other than '...' you can pass that as a second argument.

[% FILTER truncate(26, '&hellip;') %]
I have much to say on this matter that has previously 
been said on more than one occasion.
[% END %]

Output:

I have much to say&hellip;

repeat(iterations)

Top

Repeats the text block for as many iterations as are specified (default: 1).

[% FILTER repeat(3) %]
We want more beer and we want more beer,
[% END %]
We are the more beer wanters!

Output:

We want more beer and we want more beer,
We want more beer and we want more beer,
We want more beer and we want more beer,
We are the more beer wanters!

remove(string)

Top

Searches the input text for any occurrences of the specified string and removes them. A Perl regular expression may be specified as the search string.

[% "The  cat  sat  on  the  mat" FILTER remove('\s+') %]

Output:

Thecatsatonthemat

replace(search, replace)

Top

Similar to the remove filter described above, but taking a second parameter which is used as a replacement string for instances of the search string.

[% "The  cat  sat  on  the  mat" | replace('\s+', '_') %]

Output:

The_cat_sat_on_the_mat

redirect(file, options)

Top

The redirect filter redirects the output of the block into a separate file, specified relative to the OUTPUT_PATH configuration item.

[% FOREACH user IN myorg.userlist %]
   [% FILTER redirect("users/${user.id}.html") %]
      [% INCLUDE userinfo %]
   [% END %]
[% END %]

or more succinctly, using side-effect notation:

[%  FOREACH user IN myorg.userlist;
      INCLUDE userinfo 
        FILTER redirect("users/${user.id}.html");
    END
%]

A file exception will be thrown if the OUTPUT_PATH option is undefined.

An optional binmode argument can follow the filename to explicitly set the output file to binary mode.

[% PROCESS my/png/generator 
     FILTER redirect("images/logo.png", binmode=1) %]

For backwards compatibility with earlier versions, a single true/false value can be used to set binary mode.

[% PROCESS my/png/generator 
     FILTER redirect("images/logo.png", 1) %]

For the sake of future compatibility and clarity, if nothing else, we would strongly recommend you explicitly use the named binmode option as shown in the first example.

eval / evaltt

Top

The eval filter evaluates the block as template text, processing any directives embedded within it. This allows template variables to contain template fragments, or for some method to be provided for returning template fragments from an external source such as a database, which can then be processed in the template as required.

my $vars  = {
    fragment => "The cat sat on the [% place %]",
};
$template->process($file, $vars);

The following example:

[% fragment | eval %]

is therefore equivalent to

The cat sat on the [% place %]

The evaltt filter is provided as an alias for eval.

perl / evalperl

Top

The perl filter evaluates the block as Perl code. The EVAL_PERL option must be set to a true value or a perl exception will be thrown.

[% my_perl_code | perl %]

In most cases, the [% PERL %] ... [% END %] block should suffice for evaluating Perl code, given that template directives are processed before being evaluate as Perl. Thus, the previous example could have been written in the more verbose form:

[% PERL %]
[% my_perl_code %]
[% END %]

as well as

[% FILTER perl %]
[% my_perl_code %]
[% END %]

The evalperl filter is provided as an alias for perl for backwards compatibility.

stdout(options)

Top

The stdout filter prints the output generated by the enclosing block to STDOUT. The binmode option can be passed as either a named parameter or a single argument to set STDOUT to binary mode (see the binmode perl function).

[% PROCESS something/cool
       FILTER stdout(binmode=1) # recommended %]

[% PROCESS something/cool
       FILTER stdout(1)         # alternate %]

The stdout filter can be used to force binmode on STDOUT, or also inside redirect, null or stderr blocks to make sure that particular output goes to STDOUT. See the null filter below for an example.

stderr

Top

The stderr filter prints the output generated by the enclosing block to STDERR.

null

Top

The null filter prints nothing. This is useful for plugins whose methods return values that you don't want to appear in the output. Rather than assigning every plugin method call to a dummy variable to silence it, you can wrap the block in a null filter:

[% FILTER null;
    USE im = GD.Image(100,100);
    black = im.colorAllocate(0,   0, 0);
    red   = im.colorAllocate(255,0,  0);
    blue  = im.colorAllocate(0,  0,  255);
    im.arc(50,50,95,75,0,360,blue);
    im.fill(50,50,red);
    im.png | stdout(1);
   END;
-%]

Notice the use of the stdout filter to ensure that a particular expression generates output to STDOUT (in this case in binary mode).


TT_v224_html_docs/manual/index.html000700 000765 000765 00000040120 11756705104 017062 0ustar00abwabw000000 000000 Template::Manual

Template Toolkit Manual

Top

The Template Toolkit manual contains documentation on using and extending the Template Toolkit.

Template::Manual::Intro

Top

The Template::Manual::Intro page provides an introduction to the Template Toolkit

Template::Manual::Syntax

Top

The Template::Manual::Syntax desribes the syntax and structure of templates and the directive tags embedded within them.

Template::Manual::Directives

Top

The Template::Manual::Directives page lists all the Template Toolkit directives and gives examples of their use.

Template::Manual::Variables

Top

The Template::Manual::Variables page describes the use of variables in templates.

Template::Manual::VMethods

Top

The Template::Manual::VMethods page provides a full list of virtual methods that can be used in conjunction with variables, and gives examples of their use.

Template::Manual::Config

Top

The Template::Manual::Config page describes all of the Template Toolkit configuration options.

Template::Manual::Filters

Top

The Template::Manual::Filters page lists all of the Template Toolkit filters and gives examples of their use.

Template::Manual::Plugins

Top

The Template::Manual::Plugins page lists all of the standard plugins distributed with Template Toolkit and gives examples of their use.

Template::Manual::Internals

Top

The Template::Manual::Internals page describes the internal workings of the Template Toolkit. It is aimed at developers who wish to extend or modify the

Template::Manual::Views

Top

The Template::Manual::Views page describes the experimental VIEW directive.

Template::Manual::Credits

Top

The Template::Manual::Credits page lists the people who have contributed to the Template Toolkit.


TT_v224_html_docs/manual/Internals.html000700 000765 000765 00000113750 11756705104 017724 0ustar00abwabw000000 000000 Template::Manual::Internals

Introduction

Top

This section of the documentation is aimed at developers wishing to know more about how the Template Toolkit works on the inside in order to extend or adapt it to their own needs.

If that doesn't sound like you then you probably don't need to read this. There is no test afterwards.

Outside Looking In

Top

The Template module is simply a front end module which creates and uses a Template::Service and pipes the output wherever you want it to go (STDOUT by default, or maybe a file, scalar, etc). The Apache::Template module (available separately from CPAN) is another front end. That creates a Template::Service::Apache object, calls on it as required and sends the output back to the relevant Apache::Request object.

These front-end modules are really only there to handle any specifics of the environment in which they're being used. The Apache::Template front end, for example, handles Apache::Request specifics and configuration via the httpd.conf. The regular Template front-end deals with STDOUT, variable refs, etc. Otherwise it is Template::Service (or subclass) which does all the work.

The Template::Service module provides a high-quality template delivery service, with bells, whistles, signed up service level agreement and a 30-day no quibble money back guarantee. "Have a good time, all the time", that's our motto.

Within the lower levels of the Template Toolkit, there are lots of messy details that we generally don't want to have to worry about most of the time. Things like templates not being found, or failing to parse correctly, uncaught exceptions being thrown, missing plugin modules or dependencies, and so on. Template::Service hides that all away and makes everything look simple to the outsider. It provides extra features, like PRE_PROCESS, PROCESS and POST_PROCESS, and also provides the error recovery mechanism via ERROR. You ask it to process a template and it takes care of everything for you. The Template::Service::Apache module goes a little bit further, adding some extra headers to the Apache::Request, setting a few extra template variables, and so on.

For the most part, the job of a service is really just one of scheduling and dispatching. It receives a request in the form of a call to its process() method and schedules the named template specified as an argument, and possibly several other templates (PRE_PROCESS, etc) to be processed in order. It doesn't actually process the templates itself, but instead makes a process() call against a Template::Context object.

Template::Context is the runtime engine for the Template Toolkit - the module that hangs everything together in the lower levels of the Template Toolkit and that one that does most of the real work, albeit by crafty delegation to various other friendly helper modules.

Given a template name (or perhaps a reference to a scalar or file handle) the context process() method must load and compile, or fetch a cached copy of a previously compiled template, corresponding to that name. It does this by calling on a list of one or more Template::Provider objects (the LOAD_TEMPLATES posse) who themselves might get involved with a Template::Parser to help turn source templates into executable Perl code (but more on that later).

Thankfully, all of this complexity is hidden away behind a simple template() method. You call it passing a template name as an argument, and it returns a compiled template in the form of a Template::Document object, or otherwise raises an exception.

A Template::Document is a thin object wrapper around a compiled template subroutine. The object implements a process() method which performs a little bit of housekeeping and then calls the template subroutine. The object also defines template metadata (defined in [% META ... %] directives) and has a block() method which returns a hash of any additional [% BLOCK xxxx %] definitions found in the template source.

So the context fetches a compiled document via its own template() method and then gets ready to process it. It first updates the stash (the place where template variables get defined - more on that shortly) to set any template variable definitions specified as the second argument by reference to hash array. Then, it calls the document process() method, passing a reference to itself, the context object, as an argument. In doing this, it provides itself as an object against which template code can make callbacks to access runtime resources and Template Toolkit functionality.

What we're trying to say here is this: not only does the Template::Context object receive calls from the outside, i.e. those originating in user code calling the process() method on a Template object, but it also receives calls from the inside, i.e. those originating in template directives of the form [% PROCESS template %].

Before we move on to that, here's a simple structure diagram showing the outer layers of the Template Toolkit heading inwards, with pseudo code annotations showing a typical invocation sequence.

 ,--------.
 | Caller |     use Template;
 `--------'     my $tt = Template->new( ... );
      |         $tt->process($template, \%vars);
      |                                                     Outside
- - - | - - - - - - - - - - - - - - - - - - - - - - - - - - - - T T 
      |         package Template;                            Inside
      V
+----------+    sub process($template, \%vars) {
| Template |        $out = $self->SERVICE->process($template, $vars);
+----------+        print $out or send it to $self->OUTPUT;
      |         }
      |
      |         package Template::Service;
      |
      |         sub process($template, \%vars) {
      |             try {
+----------+            foreach $p in @self->PRE_PROCESS
| Service  |                $self->CONTEXT->process($p, $vars);
+----------+
      |                 $self->CONTEXT->process($template, $vars);
      |
      |                 foreach $p @self->POST_PROCESS
      |                     $self->CONTEXT->process($p, $vars);
      |             }
      |             catch {
      |                 $self->CONTEXT->process($self->ERROR);
      |             }
      |         }
      |
      V         package Template::Context;
+----------+    
| Context  |    sub process($template, \%vars) {
+----------+        # fetch compiled template
      |             $template = $self->template($template)
      |             # update stash
      |             $self->STASH->update($vars);
      |             # process template
      |             $template->process($self)
      |         }
      V     
+----------+    package Template::Document;
| Document |    
+----------+    sub process($context) {
                    $output = &{ $self->BLOCK }($context);
                }

Inside Looking Out

Top

To understand more about what's going on in these lower levels, we need to look at what a compiled template looks like. In fact, a compiled template is just a regular Perl sub-routine. Here's a very simple one.

sub my_compiled_template {
    return "This is a compiled template.\n";
}

You're unlikely to see a compiled template this simple unless you wrote it yourself but it is entirely valid. All a template subroutine is obliged to do is return some output (which may be an empty of course). If it can't for some reason, then it should raise an error via die().

sub my_todo_template {
    die "This template not yet implemented\n";
}

If it wants to get fancy, it can raise an error as a Template::Exception object. An exception object is really just a convenient wrapper for the 'type' and 'info' fields.

sub my_solilique_template {
    die (Template::Exception->new('yorrick', 'Fellow of infinite jest'));
}

Templates generally need to do a lot more than just generate static output or raise errors. They may want to inspect variable values, process another template, load a plugin, run a filter, and so on. Whenever a template subroutine is called, it gets passed a reference to a Template::Context object. It is through this context object that template code can access the features of the Template Toolkit.

We described earlier how the Template::Service object calls on Template::Context to handle a process() request from the outside. We can make a similar request on a context to process a template, but from within the code of another template. This is a call from the inside.

sub my_process_template {
    my $context = shift;
    my $output = $context->process('header', { title => 'Hello World' })
               . "\nsome content\n"
               . $context->process('footer');
}

This is then roughly equivalent to a source template something like this:

[% PROCESS header
    title = 'Hello World'
%]
some content
[% PROCESS footer %]

Template variables are stored in, and managed by a Template::Stash object. This is a blessed hash array in which template variables are defined. The object wrapper provides get() and set() method which implement all the magical.variable.features of the Template Toolkit.

Each context object has its own stash, a reference to which can be returned by the appropriately named stash() method. So to print the value of some template variable, or for example, to represent the following source template:

<title>[% title %]</title>

we might have a subroutine definition something like this:

sub {
    my $context = shift;
    my $stash = $context->stash();
    return '<title>' . $stash->get('title') . '</title>';
}

The stash get() method hides the details of the underlying variable types, automatically calling code references, checking return values, and performing other such tricks. If 'title' happens to be bound to a subroutine then we can specify additional parameters as a list reference passed as the second argument to get().

[% title('The Cat Sat on the Mat') %]

This translates to the stash call:

$stash->get([ 'title', ['The Cat Sat on the Mat'] ]);

Dotted compound variables can be requested by passing a single list reference to the get() method in place of the variable name. Each pair of elements in the list should correspond to the variable name and reference to a list of arguments for each dot-delimited element of the variable.

[% foo(1, 2).bar(3, 4).baz(5) %]

is thus equivalent to

$stash->get([ foo => [1,2], bar => [3,4], baz => [5] ]);

If there aren't any arguments for an element, you can specify an empty, zero or null argument list.

[% foo.bar %]
$stash->get([ 'foo', 0, 'bar', 0 ]);

The set() method works in a similar way. It takes a variable name and a variable value which should be assigned to it.

[% x = 10 %]         
$stash->set('x', 10);

[% x.y = 10 %]
$stash->set([ 'x', 0, 'y', 0 ], 10);

So the stash gives us access to template variables and the context provides the higher level functionality.

Alongside the process() method lies the include() method. Just as with the PROCESS / INCLUDE directives, the key difference is in variable localisation. Before processing a template, the process() method simply updates the stash to set any new variable definitions, overwriting any existing values. In contrast, the include() method creates a copy of the existing stash, in a process known as cloning the stash, and then uses that as a temporary variable store. Any previously existing variables are still defined, but any changes made to variables, including setting the new variable values passed aas arguments will affect only the local copy of the stash (although note that it's only a shallow copy, so it's not foolproof). When the template has been processed, the include() method restores the previous variable state by decloning the stash.

The context also provides an insert() method to implement the INSERT directive, but no wrapper() method. This functionality can be implemented by rewriting the Perl code and calling include().

[% WRAPPER foo -%]
   blah blah [% x %]
[%- END %]

$context->include('foo', {
    content => 'blah blah ' . $stash->get('x'),
});

Other than the template processing methods process(), include() and insert(), the context defines methods for fetching plugin objects, plugin(), and filters, filter().

# TT USE directive
[% USE foo = Bar(10) %]

# equivalent Perl
$stash->set('foo', $context->plugin('Bar', [10]));

# TT FILTER block
[% FILTER bar(20) %]
   blah blah blah
[% END %]

# equivalent Perl
my $filter = $context->filter('bar', [20]);
&$filter('blah blah blah');

Pretty much everything else you might want to do in a template can be done in Perl code. Things like IF, UNLESS, FOREACH and so on all have direct counterparts in Perl.

# TT IF directive
[% IF msg %]
   Message: [% msg %]
[% END %];

# equivalent Perl
if ($stash->get('msg')) {
    $output .=  'Message: ';
    $output .= $stash->get('msg');
}

The best way to get a better understanding of what's going on underneath the hood is to set the $Template::Parser::DEBUG flag to a true value and start processing templates. This will cause the parser to print the generated Perl code for each template it compiles to STDERR. You'll probably also want to set the $Template::Directive::PRETTY option to have the Perl pretty-printed for human consumption.

use Template;
use Template::Parser;
use Template::Directive;

$Template::Parser::DEBUG = 1;
$Template::Directive::PRETTY = 1;

my $template = Template->new();
$template->process(\*DATA, { cat => 'dog', mat => 'log' });

__DATA__
The [% cat %] sat on the [% mat %]

The output sent to STDOUT remains as you would expect:

The dog sat on the log

The output sent to STDERR would look something like this:

compiled main template document block:
sub {
    my $context = shift || die "template sub called without context\n";
    my $stash   = $context->stash;
    my $output  = '';
    my $error;

    eval { BLOCK: {
        $output .=  "The ";
        $output .=  $stash->get('cat');
        $output .=  " sat on the ";
        $output .=  $stash->get('mat');
        $output .=  "\n";
    } };
    if ($@) {
        $error = $context->catch($@, \$output);
        die $error unless $error->type eq 'return';
    }

    return $output;
}

Hacking on the Template Toolkit

Top

Please feel free to hack on the Template Toolkit. If you find a bug that needs fixing, if you have an idea for something that's missing, or you feel inclined to tackle something on the TODO list, then by all means go ahead and do it!

If you're contemplating something non-trivial then you'll probably want to bring it up on the mailing list first to get an idea about the current state of play, find out if anyone's already working on it, and so on.

When you start to hack on the Template Toolkit, please make sure you start from the latest developer release. Stable releases are uploaded to CPAN and have all-numerical version numbers, e.g. 2.04, 2.05. Developer releases are available from the Template Toolkit web site and have a character suffix on the version, e.g. 2.04a, 2.04b, etc.

Once you've made your changes, please remember to update the test suite by adding extra tests to one of the existing test scripts in the t sub-directory, or by adding a new test script of your own. And of course, run make test to ensure that all the tests pass with your new code.

Don't forget that any files you do add will need to be added to the MANIFEST. Running make manifest will do this for you, but you need to make sure you haven't got any other temporary files lying around that might also get added to it.

Documentation is often something that gets overlooked but it's just as important as the code. If you're adding a new module, a plugin module, for example, then it's OK to include the POD documentation in with the module, but please write it all in one piece at the end of the file, after the code (just look at any other Template::* module for an example). It's a religious issue, I know, but I have a strong distaste for POD documentation interspersed throughout the code. In my not-so-humble opinion, it makes both the code and the documentation harder to read (same kinda problem as embedding Perl in HTML).

To share your changes with the rest of the world, you'll need to prepare a patch file. To do this you should have 2 directories side-by-side, one which is the original, unmodified distribution directory for the latest developer release, and the other is a copy of that same directory which includes your changes.

The following example shows a typical hacking session. First we unpack the latest developer release.

$ tar zxf Template-Toolkit-2.05c.tar.gz

At this point, it's a good idea to rename the directory to give some indicate of what it contains.

$ mv Template-Toolkit-2.05c Template-Toolkit-2.05c-abw-xyz-hack

Then go hack!

$ cd Template-Toolkit-2.05c-abw-xyz-hack

  [ hacking ]

$ cd ..

When you're all done and ready to prepare a patch, unpack the distribution archive again so that you've got the original to diff against your new code.

$ tar zxf Template-Toolkit-2.05c.tar.gz

You should now have an original distribution directory and a modified version of that same directory, side-by-side.

$ ls
Template-Toolkit-2.05c  Template-Toolkit-2.05c-abw-xyz-hack

Now run diff and save the output into an appropriately named patch file.

$ diff -Naur Template-Toolkit-2.05c Template-Toolkit-2.05c-abw-xyz-hack > patch-TT205c-abw-xyz-hack

You can then post the generated patch file to the mailing list, describing what it does, why it does it, how it does it and any other relevant information.

If you want to apply someone else's patch then you should start with the same original distribution source on which the patch is based. From within the root of the distribution, run patch feeding in the patch file as standard input. The 'p1' option is required to strip the first element of the path name (e.g. Template-Toolkit-2.05c/README becomes README which is then the correct path).

$ tar zxf Template-Toolkit-2.05c.tar.gz
$ cd Template-Toolkit-2.05c
$ patch -p1 < ../patch-TT205c-abw-xyz-hack

The output generated by patch should be something like the following:

patching file README
patching file lib/Template.pm
patching file lib/Template/Provider.pm
patching file t/provider.t

TT_v224_html_docs/manual/Intro.html000700 000765 000765 00000055667 11756705104 017074 0ustar00abwabw000000 000000 Template::Manual::Intro

Introduction

Top

The Template Toolkit is a collection of Perl modules which implement a fast, flexible, powerful and extensible template processing system. It is most often used for generating dynamic web content, although it can be used equally well for processing any kind of text documents.

At the simplest level it provides an easy way to process template files, filling in embedded variable references with their equivalent values. Here's an example of a template.

Dear [% name %],

It has come to our attention that your account is in 
arrears to the sum of [% debt %].

Please settle your account before [% deadline %] or we 
will be forced to revoke your Licence to Thrill.

The Management.

By default, template directives are embedded within the character sequences [% ... %] but you can change these and various other options to configure how the Template Toolkit looks, feels and works. You can set the INTERPOLATE option, for example, if you prefer to embed your variables in Perl style:

Dear $name,

It has come to our attention that your account is in 
arrears to the sum of $debt.

...etc...

The Template Perl Module

Top

The Template Perl module is the front end to the Template Toolkit for Perl programmers, providing access to the full range of functionality through a single module with a simple interface. It loads the other modules as required and instantiates a default set of objects to handle subsequent template processing requests. Configuration parameters may be passed to the Template constructor method, new(), which are then used to configure the generate object.

use Template;

my $tt = Template->new({
    INCLUDE_PATH => '/usr/local/templates',
    INTERPOLATE  => 1,
}) || die "$Template::ERROR\n";

The Template object implements a process() method for processing template files or text. The name of the input template (or various other sources) is passed as the first argument, followed by a reference to a hash array of variable definitions for substitution in the template.

my $vars = {
    name     => 'Count Edward van Halen',
    debt     => '3 riffs and a solo',
    deadline => 'the next chorus',
};

$tt->process('letters/overdrawn', $vars)
    || die $tt->error(), "\n";

The process() method returns a true value (1) on success and prints the template output to STDOUT, by default. On error, the process() method returns a false value (undef). The error() method can then be called to retrieve details of the error.

Component Based Content Construction

Top

A number of special directives are provided, such as INSERT, INCLUDE and PROCESS, which allow content to be built up from smaller template components. This permits a modular approach to building a web site or other content repository, promoting reusability, cross-site consistency, ease of construction and subsequent maintenance. Common elements such as headers, footers, menu bars, tables, and so on, can be created as separate template files which can then be processed into other documents as required. All defined variables are inherited by these templates along with any additional "local" values specified.

[% PROCESS header 
     title = "The Cat Sat on the Mat"
%]

[% PROCESS menu %]

The location of the missing feline has now been established.
Thank you for your assistance.

[% INSERT legal/disclaimer %]

[% PROCESS footer %]

You can also define a template as a BLOCK within the same file and PROCESS it just like any other template file. This can be invaluable for building up repetitive elements such as tables, menus, etc.

[% BLOCK tabrow %]
   <tr><td>[% name %]</td><td>[% email %]</td></tr>
[% END %]

<table>
[% PROCESS tabrow name="tom"   email="tom@here.org"    %]
[% PROCESS tabrow name="dick"  email="disk@there.org"  %]
[% PROCESS tabrow name="larry" email="larry@where.org" %]
</table>

Data and Code Binding

Top

One of the key features that sets the Template Toolkit apart from other template processors is the ability to bind template variables to any kind of Perl data: scalars, lists, hash arrays, sub-routines and objects.

my $vars = {
    root   => 'http://here.com/there',
    menu   => [ 'modules', 'authors', 'scripts' ],
    client => {
        name => 'Doctor Joseph von Satriani',
        id   => 'JVSAT',
    },
    checkout => sub { my $total = shift; ...; return $something },
    shopcart => My::Cool::Shopping::Cart->new(),
};

The Template Toolkit will automatically Do The Right Thing to access the data in an appropriate manner to return some value which can then be output. The dot operator '.' is used to access into lists and hashes or to call object methods. The FOREACH directive is provided for iterating through lists, and various logical tests are available using directives such as IF, UNLESS, ELSIF, ELSE, SWITCH, CASE, etc.

[% FOREACH section = menu %]
   <a href="[% root %]/[% section %]/index.html">[% section %]</a>
[% END %]

<b>Client</a>: [% client.name %] (id: [% client.id %])

[% IF shopcart.nitems %]
   Your shopping cart contains the following items:
   <ul>
   [% FOREACH item = shopcart.contents %]
     <li>[% item.name %] : [% item.qty %] @ [% item.price %]
   [% END %]
   </ul>

   [% checkout(shopcart.total) %]

[% ELSE %]
   No items currently in shopping cart.
[% END %]

Advanced Features: Filters, Macros, Exceptions, Plugins

Top

The Template Toolkit also provides a number of additional directives for advanced processing and programmatical functionality. It supports output filters (FILTER), allows custom macros to be defined (MACRO), has a fully-featured exception handling system (TRY, THROW, CATCH, FINAL) and supports a plugin architecture (USE) which allows special plugin modules and even regular Perl modules to be loaded and used with the minimum of fuss. The Template Toolkit is "just" a template processor but you can trivially extend it to incorporate the functionality of any Perl module you can get your hands on. Thus, it is also a scalable and extensible template framework, ideally suited for managing the presentation layer for application servers, content management systems and other web applications.

Separating Presentation and Application Logic

Top

Rather than embedding Perl code or some other scripting language directly into template documents, it encourages you to keep functional components (i.e. Perl code) separate from presentation components (e.g. HTML templates). The template variables provide the interface between the two layers, allowing data to be generated in code and then passed to a template component for displaying (pipeline model) or for sub-routine or object references to be bound to variables which can then be called from the template as and when required (callback model).

The directives that the Template Toolkit provide implement their own mini programming language, but they're not really designed for serious, general purpose programming. Perl is a far more appropriate language for that. If you embed application logic (e.g. Perl or other scripting language fragments) in HTML templates then you risk losing the clear separation of concerns between functionality and presentation. It becomes harder to maintain the two elements in isolation and more difficult, if not impossible, to reuse code or presentation elements by themselves. It is far better to write your application code in separate Perl modules, libraries or scripts and then use templates to control how the resulting data is presented as output. Thus you should think of the Template Toolkit language as a set of layout directives for displaying data, not calculating it.

Having said that, the Template Toolkit doesn't force you into one approach or the other. It attempts to be pragmatic rather than dogmatic in allowing you to do whatever best gets the job done. Thus, if you enable the EVAL_PERL option then you can happily embed real Perl code in your templates within PERL ... END directives.

Performance

Top

The Template Toolkit uses a fast YACC-like parser which compiles templates into Perl code for maximum runtime efficiency. It also has an advanced caching mechanism which manages in-memory and on-disk (i.e. persistent) versions of compiled templates. The modules that comprise the toolkit are highly configurable and the architecture around which they're built is designed to be extensible. The Template Toolkit provides a powerful framework around which content creation and delivery systems can be built while also providing a simple interface through the Template front-end module for general use.


TT_v224_html_docs/manual/Plugins.html000700 000765 000765 00000101202 11756705104 017373 0ustar00abwabw000000 000000 Template::Manual::Plugins

TEMPLATE TOOLKIT PLUGINS

Top

The following plugin modules are distributed with the Template Toolkit. Some of the plugins interface to external modules (detailed below) which should be downloaded from any CPAN site and installed before using the plugin.

Assert

Top

New in 2.20! The Assert plugin adds an assert virtual method that you can use to catch undefined values.

For example, consider this dotop:

[% user.name %]

If user.name is an undefined value then TT will silently ignore the fact and print nothing. If you USE the assert plugin then you can add the assert vmethod between the user and name elements, like so:

[% user.assert.name %]

Now, if user.name is an undefined value, an exception will be thrown:

assert error - undefined value for name

CGI

Top

The CGI plugin is a wrapper around Lincoln Stein's CGI.pm module. The plugin is distributed with the Template Toolkit (see Template::Plugin::CGI) and the CGI module itself is distributed with recent versions Perl, or is available from CPAN.

[% USE CGI %]
[% CGI.param('param_name') %]
[% CGI.start_form %]
[% CGI.popup_menu( Name   => 'color', 
                   Values => [ 'Green', 'Brown' ] ) %]
[% CGI.end_form %]

Datafile

Top

Provides an interface to data stored in a plain text file in a simple delimited format. The first line in the file specifies field names which should be delimiter by any non-word character sequence. Subsequent lines define data using the same delimiter as in the first line. Blank lines and comments (lines starting '#') are ignored. See Template::Plugin::Datafile for further details.

/tmp/mydata:

# define names for each field
id : email : name : tel
# here's the data
fred : fred@here.com : Fred Smith : 555-1234
bill : bill@here.com : Bill White : 555-5678

example:

[% USE userlist = datafile('/tmp/mydata') %]

[% FOREACH user = userlist %]
   [% user.name %] ([% user.id %])
[% END %]

Date

Top

The Date plugin provides an easy way to generate formatted time and date strings by delegating to the POSIX strftime() routine. See Template::Plugin::Date and POSIX for further details.

[% USE date %]
[% date.format %]        # current time/date

File last modified: [% date.format(template.modtime) %]

Directory

Top

The Directory plugin provides a simple interface to a directory and the files within it. See Template::Plugin::Directory for further details.

[% USE dir = Directory('/tmp') %]
[% FOREACH file = dir.files %]
    # all the plain files in the directory
[% END %]
[% FOREACH file = dir.dirs %]
    # all the sub-directories
[% END %]

DBI

Top

The DBI plugin is no longer distributed as part of the Template Toolkit (as of version 2.15). It is now available as a separate Template::DBI distribution from CPAN.

Dumper

Top

The Dumper plugin provides an interface to the Data::Dumper module. See Template::Plugin::Dumper and Data::Dumper for futher details.

[% USE dumper(indent=0, pad="<br>") %]
[% dumper.dump(myvar, yourvar) %]

File

Top

The File plugin provides a general abstraction for files and can be used to fetch information about specific files within a filesystem. See Template::Plugin::File for further details.

[% USE File('/tmp/foo.html') %]
[% File.name %]     # foo.html
[% File.dir %]      # /tmp
[% File.mtime %]    # modification time

Filter

Top

This module implements a base class plugin which can be subclassed to easily create your own modules that define and install new filters.

package MyOrg::Template::Plugin::MyFilter;

use Template::Plugin::Filter;
use base qw( Template::Plugin::Filter );

sub filter {
    my ($self, $text) = @_;
    # ...mungify $text...
    return $text;
}

Example of use:

# now load it...
[% USE MyFilter %]

# ...and use the returned object as a filter
[% FILTER $MyFilter %]
  ...
[% END %]

See Template::Plugin::Filter for further details.

Format

Top

The Format plugin provides a simple way to format text according to a printf()-like format. See Template::Plugin::Format for further details.

[% USE bold = format('<b>%s</b>') %]
[% bold('Hello') %]

GD

Top

The GD plugins are no longer part of the core Template Toolkit distribution. They are now available from CPAN in a separate Template::GD distribution.

HTML

Top

The HTML plugin is very basic, implementing a few useful methods for generating HTML. It is likely to be extended in the future or integrated with a larger project to generate HTML elements in a generic way.

[% USE HTML %]
[% HTML.escape("if (a < b && c > d) ..." %]
[% HTML.attributes(border => 1, cellpadding => 2) %]
[% HTML.element(table => { border => 1, cellpadding => 2 }) %]

See Template::Plugin::HTML for further details.

Iterator

Top

The Iterator plugin provides a way to create a Template::Iterator object to iterate over a data set. An iterator is created automatically by the FOREACH directive and is aliased to the loop variable. This plugin allows an iterator to be explicitly created with a given name, or the default plugin name, iterator. See Template::Plugin::Iterator for further details.

[% USE iterator(list, args) %]

[% FOREACH item = iterator %]
   [% '<ul>' IF iterator.first %]
   <li>[% item %]
   [% '</ul>' IF iterator.last %]
[% END %]

Pod

Top

This plugin provides an interface to the Pod::POM module which parses POD documents into an internal object model which can then be traversed and presented through the Template Toolkit.

[% USE Pod(podfile) %]

[% FOREACH head1 = Pod.head1;
     FOREACH head2 = head1/head2;
       ...
     END;
   END
%]

Scalar

Top

The Template Toolkit calls user-defined subroutines and object methods using Perl's array context by default.

# TT2 calls object methods in array context by default
[% object.method %]

This plugin module provides a way for you to call subroutines and methods in scalar context.

[% USE scalar %]

# force it to use scalar context
[% object.scalar.method %]

# also works with subroutine references
[% scalar.my_sub_ref %]

String

Top

The String plugin implements an object-oriented interface for manipulating strings. See Template::Plugin::String for further details.

[% USE String 'Hello' %]
[% String.append(' World') %]

[% msg = String.new('Another string') %]
[% msg.replace('string', 'text') %]

The string "[% msg %]" is [% msg.length %] characters long.

Table

Top

The Table plugin allows you to format a list of data items into a virtual table by specifying a fixed number of rows or columns, with an optional overlap. See Template::Plugin::Table for further details.

[% USE table(list, rows=10, overlap=1) %]

[% FOREACH item = table.col(3) %]
   [% item %]
[% END %]

URL

Top

The URL plugin provides a simple way of contructing URLs from a base part and a variable set of parameters. See Template::Plugin::URL for further details.

[% USE mycgi = url('/cgi-bin/bar.pl', debug=1) %]

[% mycgi %]
   # ==> /cgi/bin/bar.pl?debug=1

[% mycgi(mode='submit') %]
   # ==> /cgi/bin/bar.pl?mode=submit&debug=1

Wrap

Top

The Wrap plugin uses the Text::Wrap module to provide simple paragraph formatting. See Template::Plugin::Wrap and Text::Wrap for further details.

[% USE wrap %]
[% wrap(mytext, 40, '* ', '  ') %]    # use wrap sub
[% mytext FILTER wrap(40) -%]    # or wrap FILTER

The Text::Wrap module is available from CPAN:

http://www.cpan.org/modules/by-module/Text/

XML

Top

The XML::DOM, XML::RSS, XML::Simple and XML::XPath plugins are no longer distributed with the Template Toolkit as of version 2.15

They are now available in a separate Template::XML distribution.


TT_v224_html_docs/manual/Syntax.html000700 000765 000765 00000053400 11756705104 017246 0ustar00abwabw000000 000000 Template::Manual::Syntax

Tag Styles

Top

By default, template directives are embedded within the character sequences [% and %].

[% PROCESS header %]

<h1>Hello World!</h1>
<a href="[% page.next %]"><img src="[% icon.next %].gif"></a>

[% PROCESS footer %]

You can change the tag characters using the START_TAG, END_TAG and TAG_STYLE configuration options. You can also use the TAGS directive to define a new tag style for the current template file.

You can also set the INTERPOLATE option to allow simple variable references to be embedded directly in templates, prefixed by a $.

# INTERPOLATE = 0
<td>[% name %]</td>
<td>[% email %]</td>

# INTERPOLATE = 1
<td>$name</td>
<td>$email</td>

Directives may be embedded anywhere in a line of text and can be split across several lines. Insignificant whitespace is generally ignored within the directive.

[% INCLUDE header
     title = 'Hello World' 
     bgcol = '#ffffff' 
%]

[%INCLUDE menu align='right'%]

Name: [% name %]  ([%id%])

Comments

Top

The # character is used to indicate comments within a directive. When placed immediately inside the opening directive tag, it causes the entire directive to be ignored.

[%# this entire directive is ignored no
    matter how many lines it wraps onto
%]

In any other position, it causes the remainder of the current line to be treated as a comment.

[% # this is a comment
   theta = 20      # so is this
   rho   = 30      # <aol>me too!</aol>
%]

Chomping Whitespace

Top

You can add - or + to the immediate start or end of a directive tag to control the whitespace chomping options. See the PRE_CHOMP and POST_CHOMP options for further details.

[% BLOCK foo -%]    # remove trailing newline
This is block foo
[%- END %]          # remove leading newline

Implicit Directives: GET and SET

Top

The simplest directives are GET and SET which retrieve and update variable values respectively. The GET and SET keywords are actually optional as the parser is smart enough to see them for what they really are (but note the caveat below on using side-effect notation). Thus, you'll generally see:

[% SET foo = 10 %]
[% GET foo %]

written as:

[% foo = 10 %]
[% foo %]

You can also express simple logical statements as implicit GET directives:

[% title or template.title or 'Default Title' %]

[% mode == 'graphics' ? "Graphics Mode Enabled" : "Text Mode" %]

All other directives should start with a keyword specified in UPPER CASE (but see the ANYCASE option). All directives keywords are in UPPER CASE to make them visually distinctive and to distinguish them from variables of the same name but different case. It is perfectly valid, for example, to define a variable called stop which is entirely separate from the STOP directive.

[% stop = 'Clackett Lane Bus Depot' %]

The bus will next stop at [% stop %]    # variable

[% STOP %]                              # directive

Block Directives

Top

Directives such as FOREACH, WHILE, BLOCK, FILTER, etc., mark the start of a block which may contain text or other directives up to the matching END directive. Blocks may be nested indefinitely. The IF, UNLESS, ELSIF and ELSE directives also define blocks and may be grouped together in the usual manner.

[% FOREACH item = [ 'foo' 'bar' 'baz' ] %]
   * Item: [% item %]
[% END %]

[% BLOCK footer %]
   Copyright 2000 [% me %]
   [% INCLUDE company/logo %]
[% END %]

[% IF foo %]
   [% FOREACH thing = foo.things %]
      [% thing %]
   [% END %]
[% ELSIF bar %]
   [% INCLUDE barinfo %]
[% ELSE %]
   do nothing...
[% END %]

Block directives can also be used in a convenient side-effect notation.

[% INCLUDE userinfo FOREACH user = userlist %]

[% INCLUDE debugtxt msg="file: $error.info" 
     IF debugging %] 

[% "Danger Will Robinson" IF atrisk %]

versus:

[% FOREACH user = userlist %]
   [% INCLUDE userinfo %]
[% END %]

[% IF debugging %]
   [% INCLUDE debugtxt msg="file: $error.info" %]
[% END %]

[% IF atrisk %]
Danger Will Robinson
[% END %]

Capturing Block Output

Top

The output of a directive can be captured by simply assigning the directive to a variable.

[% headtext = PROCESS header title="Hello World" %]

[% people = PROCESS userinfo FOREACH user = userlist %]

This can be used in conjunction with the BLOCK directive for defining large blocks of text or other content.

[% poem = BLOCK %]
   The boy stood on the burning deck,
   His fleece was white as snow.
   A rolling stone gathers no moss,
   And Keith is sure to follow.
[% END %]

Note one important caveat of using this syntax in conjunction with side-effect notation. The following directive does not behave as might be expected:

[% var = 'value' IF some_condition %]   # does not work

In this case, the directive is interpreted as (spacing added for clarity)

[% var = IF some_condition %]
   value
[% END %]

rather than

[% IF some_condition %]
   [% var = 'value' %]
[% END %]

The variable is assigned the output of the IF block which returns 'value' if true, but nothing if false. In other words, the following directive will always cause 'var' to be cleared.

[% var = 'value' IF 0 %]

To achieve the expected behaviour, the directive should be written as:

[% SET var = 'value' IF some_condition %]

Chaining Filters

Top

Multiple FILTER directives can be chained together in sequence. They are called in the order defined, piping the output of one into the input of the next.

[% PROCESS somefile FILTER truncate(100) FILTER html %]

The pipe character, |, can also be used as an alias for FILTER.

[% PROCESS somefile | truncate(100) | html %]

Multiple Directive Blocks

Top

Multiple directives can be included within a single tag when delimited by semi-colons. Note however that the TAGS directive must always be specified in a tag by itself.

[% IF title; 
      INCLUDE header; 
   ELSE; 
      INCLUDE other/header  title="Some Other Title";
   END
%]

versus

[% IF title %]
   [% INCLUDE header %]
[% ELSE %]
   [% INCLUDE other/header  title="Some Other Title" %]
[% END %]

TT_v224_html_docs/manual/Variables.html000700 000765 000765 00000163064 11756705104 017700 0ustar00abwabw000000 000000 Template::Manual::Variables

Template Variables

Top

A reference to a hash array may be passed as the second argument to the process() method, containing definitions of template variables. The VARIABLES (a.k.a. PRE_DEFINE) option can also be used to pre-define variables for all templates processed by the object.

my $tt = Template->new({
    VARIABLES => {
        version => 3.14,
        release => 'Sahara',
    },  
});

my $vars = {
    serial_no => 271828,
};

$tt->process('myfile', $vars);

myfile template:

This is version [% version %] ([% release %]).
Serial number: [% serial_no %]

Generated Output:

This is version 3.14 (Sahara)
Serial number: 271828

Variable names may contain any alphanumeric characters or underscores. They may be lower, upper or mixed case although the usual convention is to use lower case. The case is significant however, and 'foo', 'Foo' and 'FOO' are all different variables. Upper case variable names are permitted, but not recommended due to a possible conflict with an existing or future reserved word. As of version 2.00, these are:

GET CALL SET DEFAULT INSERT INCLUDE PROCESS WRAPPER 
IF UNLESS ELSE ELSIF FOR FOREACH WHILE SWITCH CASE
USE PLUGIN FILTER MACRO PERL RAWPERL BLOCK META
TRY THROW CATCH FINAL NEXT LAST BREAK RETURN STOP 
CLEAR TO STEP AND OR NOT MOD DIV END

The variable values may be of virtually any Perl type, including simple scalars, references to lists, hash arrays, subroutines or objects. The Template Toolkit will automatically apply the correct procedure to accessing these values as they are used in the template.

Example data:

my $vars = {
    article => 'The Third Shoe',
    person  => { 
        id    => 314, 
        name  => 'Mr. Blue',
        email => 'blue@nowhere.org',
    },
    primes  => [ 2, 3, 5, 7, 11, 13 ],
    wizard  => sub { return join(' ', 'Abracadabra!', @_) },
    cgi     => CGI->new('mode=submit&debug=1'),
};

Example template:

[% article %]

[% person.id %]: [% person.name %] <[% person.email %]>

[% primes.first %] - [% primes.last %], including [% primes.3 %]
[% primes.size %] prime numbers: [% primes.join(', ') %]

[% wizard %]
[% wizard('Hocus Pocus!') %]

[% cgi.param('mode') %]

Generated output:

The Third Shoe

314: Mr. Blue <blue@nowhere.org>

2 - 13, including 7
6 prime numbers: 2, 3, 5, 7, 11, 13

Abracadabra!
Abracadabra! Hocus Pocus!

submit

Scalar Values

Top

Regular scalar variables are accessed by simply specifying their name. As these are just entries in the top-level variable hash they can be considered special cases of hash array referencing as described below, with the main namespace hash automatically implied.

[% article %]

Hash Array References

Top

Members of hash arrays are accessed by specifying the hash reference and key separated by the dot '.' operator.

Example data:

my $vars = {
    'home' => 'http://www.myserver.com/homepage.html',
    'page' => {
        'this' => 'mypage.html',
        'next' => 'nextpage.html',
        'prev' => 'prevpage.html',
    },
};

Example template:

<a href="[% home %]">Home</a>
<a href="[% page.prev %]">Previous Page</a>
<a href="[% page.next %]">Next Page</a>

Generated output:

<a href="http://www.myserver.com/homepage.html">Home</a>
<a href="prevpage.html">Previous Page</a>
<a href="nextpage.html">Next Page</a>

Any key in a hash which starts with a '_' or '.' character will be considered private and cannot be evaluated or updated from within a template. The undefined value will be returned for any such variable accessed which the Template Toolkit will silently ignore (unless the DEBUG option is enabled).

Example data:

my $vars = {
    message => 'Hello World!',
    _secret => "On the Internet, no-one knows you're a dog",
    thing   => {
        public    => 123,
        _private  => 456,
        '.hidden' => 789,
    },
};

Example template:

[% message %]           # outputs "Hello World!"
[% _secret %]           # no output
[% thing.public %]      # outputs "123"
[% thing._private %]    # no output
[% thing..hidden %]     # ERROR: unexpected token (..)

You can disable this feature by setting the $Template::Stash::PRIVATE package variable to a false value.

$Template::Stash::PRIVATE = undef;   # now you can thing._private

To access a hash entry using a key stored in another variable, prefix the key variable with '$' to have it interpolated before use (see Variable Interpolation).

[% pagename = 'next' %]
[% page.$pagename %]       # same as [% page.next %]

When you assign to a variable that contains multiple namespace elements (i.e. it has one or more '.' characters in the name), any hashes required to represent intermediate namespaces will be created automatically. In this following example, the product variable automatically springs into life as a hash array unless otherwise defined.

[% product.id    = 'XYZ-2000' 
   product.desc  = 'Bogon Generator'
   product.price = 666 
%]

The [% product.id %] [% product.desc %] 
costs $[% product.price %].00

Generated output:

The XYZ-2000 Bogon Generator 
costs $666.00

You can use Perl's familiar { ... } construct to explicitly create a hash and assign it to a variable. Note that commas are optional between key/value pairs and = can be used in place of =>.

# minimal TT style
[% product = {
     id    = 'XYZ-2000'
     desc  = 'Bogon Generator'
     price = 666
   }
%]

# perl style
[% product = {
     id    => 'XYZ-2000',
     desc  => 'Bogon Generator',
     price => 666,
   }
%]

List References

Top

Items in lists are also accessed by use of the dot operator.

Example data:

my $vars = {
    people => [ 'Tom', 'Dick', 'Larry' ],
};

Example template:

[% people.0 %]          # Tom
[% people.1 %]          # Dick
[% people.2 %]          # Larry

The FOREACH directive can be used to iterate through items in a list.

[% FOREACH person IN people %]
Hello [% person %]
[% END %]

Generated output:

Hello Tom
Hello Dick
Hello Larry

Lists can be constructed in-situ using the regular anonymous list [ ... ] construct. Commas between items are optional.

[% cols = [ 'red', 'green', 'blue' ] %]

[% FOREACH c IN cols %]
   [% c %]
[% END %]

or:

[% FOREACH c IN [ 'red', 'green', 'blue' ] %]
   [% c %]
[% END %]

You can also create simple numerical sequences using the .. range operator:

[% n = [ 1 .. 4 ] %]    # n is [ 1, 2, 3, 4 ] 

[% x = 4
   y = 8
   z = [x..y]           # z is [ 4, 5, 6, 7, 8 ]
%]

Subroutines

Top

Template variables can contain references to Perl subroutines. When the variable is used, the Template Toolkit will automatically call the subroutine, passing any additional arguments specified. The return value from the subroutine is used as the variable value and inserted into the document output.

my $vars = {
    wizard  => sub { return join(' ', 'Abracadabra!', @_) },
};

Example template:

[% wizard %]                    # Abracadabra!
[% wizard('Hocus Pocus!') %]    # Abracadabra! Hocus Pocus!

Objects

Top

Template variables can also contain references to Perl objects. Methods are called using the dot operator to specify the method against the object variable. Additional arguments can be specified as with subroutines.

use CGI;

my $vars = {
    # hard coded CGI params for purpose of example
    cgi  => CGI->new('mode=submit&debug=1'),
};

Example template:

[% FOREACH p IN cgi.param %]     # returns list of param keys
[% p %] => [% cgi.param(p) %]   # fetch each param value
[% END %]

Generated output:

mode => submit
debug => 1

Object methods can also be called as lvalues. That is, they can appear on the left side of an assignment. The method will be called passing the assigning value as an argument.

[% myobj.method = 10 %]

equivalent to:

[% myobj.method(10) %]

Passing Parameters and Returning Values

Top

Subroutines and methods will be passed any arguments specified in the template. Any template variables in the argument list will first be evaluated and their resultant values passed to the code.

my $vars = {
    mycode => sub { return 'received ' . join(', ', @_) },
};

template:

[% foo = 10 %]
[% mycode(foo, 20) %]       # received 10, 20

Named parameters may also be specified. These are automatically collected into a single hash array which is passed by reference as the last parameter to the sub-routine. Named parameters can be specified using either => or = and can appear anywhere in the argument list.

my $vars = {
    myjoin => \&myjoin,
};

sub myjoin {
    # look for hash ref as last argument
    my $params = ref $_[-1] eq 'HASH' ? pop : { };
    return join($params->{ joint } || ' + ', @_);
}

Example template:

[% myjoin(10, 20, 30) %]
[% myjoin(10, 20, 30, joint = ' - ' %]
[% myjoin(joint => ' * ', 10, 20, 30 %]

Generated output:

10 + 20 + 30
10 - 20 - 30
10 * 20 * 30

Parenthesised parameters may be added to any element of a variable, not just those that are bound to code or object methods. At present, parameters will be ignored if the variable isn't "callable" but are supported for future extensions. Think of them as "hints" to that variable, rather than just arguments passed to a function.

[% r = 'Romeo' %]
[% r(100, 99, s, t, v) %]       # outputs "Romeo"

User code should return a value for the variable it represents. This can be any of the Perl data types described above: a scalar, or reference to a list, hash, subroutine or object. Where code returns a list of multiple values the items will automatically be folded into a list reference which can be accessed as per normal.

my $vars = {
    # either is OK, first is recommended
    items1 => sub { return [ 'foo', 'bar', 'baz' ] },
    items2 => sub { return ( 'foo', 'bar', 'baz' ) },
};

Example template:

[% FOREACH i IN items1 %]
   ...
[% END %]

[% FOREACH i IN items2 %]
   ...
[% END %]

Error Handling

Top

Errors can be reported from user code by calling die(). Errors raised in this way are caught by the Template Toolkit and converted to structured exceptions which can be handled from within the template. A reference to the exception object is then available as the error variable.

my $vars = {
    barf => sub { 
        die "a sick error has occurred\n";
    },
};

Example template:

[% TRY %]
   [% barf %]       # calls sub which throws error via die()
[% CATCH %]
   [% error.info %]     # outputs "a sick error has occurred\n"
[% END %]

Error messages thrown via die() are converted to exceptions of type undef (the literal string "undef" rather than the undefined value). Exceptions of user-defined types can be thrown by calling die() with a reference to a Template::Exception object.

use Template::Exception;

my $vars = {
    login => sub { 
        ...do something...
        die Template::Exception->new( badpwd => 'password too silly' );
    },
};

Example template:

[% TRY %]
   [% login %]
[% CATCH badpwd %]
   Bad password: [% error.info %]
[% CATCH %]
   Some other '[% error.type %]' error: [% error.info %]
[% END %]

The exception types stop and return are used to implement the STOP and RETURN directives. Throwing an exception as:

die (Template::Exception->new('stop'));

has the same effect as the directive:

[% STOP %]

Virtual Methods

Top

The Template Toolkit implements a number of "virtual methods" which can be applied to scalars, hashes or lists. For example:

[% mylist = [ 'foo', 'bar', 'baz' ] %]
[% newlist = mylist.sort %]

Here mylist is a regular reference to a list, and 'sort' is a virtual method that returns a new list of the items in sorted order. You can chain multiple virtual methods together. For example:

[% mylist.sort.join(', ') %]

Here the join virtual method is called to join the sorted list into a single string, generating the following output:

bar, baz, foo

See Template::Manual::VMethods for details of all the virtual methods available.

Variable Interpolation

Top

The Template Toolkit uses $ consistently to indicate that a variable should be interpolated in position. Most frequently, you see this in double-quoted strings:

[% fullname = "$honorific $firstname $surname" %]

Or embedded in plain text when the INTERPOLATE option is set:

Dear $honorific $firstname $surname,

The same rules apply within directives. If a variable is prefixed with a $ then it is replaced with its value before being used. The most common use is to retrieve an element from a hash where the key is stored in a variable.

[% uid = 'abw' %]
[% users.$uid %]         # same as 'userlist.abw'

Curly braces can be used to delimit interpolated variable names where necessary.

[% users.${me.id}.name %]

Directives such as INCLUDE, PROCESS, etc., that accept a template name as the first argument, will automatically quote it for convenience.

[% INCLUDE foo/bar.txt %]

The above example is equivalent to:

[% INCLUDE "foo/bar.txt" %]

To INCLUDE a template whose name is stored in a variable, simply prefix the variable name with $ to have it interpolated.

[% myfile = 'header' %]
[% INCLUDE $myfile %]

This is equivalent to:

[% INCLUDE header %]

Note also that a variable containing a reference to a Template::Document object can also be processed in this way.

my $vars = {
    header => Template::Document->new({ ... }),
};

Example template:

[% INCLUDE $header %]

Local and Global Variables

Top

Any simple variables that you create, or any changes you make to existing variables, will only persist while the template is being processed. The top-level variable hash is copied before processing begins and any changes to variables are made in this copy, leaving the original intact.

The same thing happens when you INCLUDE another template. The current namespace hash is cloned to prevent any variable changes made in the included template from interfering with existing variables. The PROCESS option bypasses the localisation step altogether making it slightly faster, but requiring greater attention to the possibility of side effects caused by creating or changing any variables within the processed template.

[% BLOCK change_name %]
   [% name = 'bar' %]
[% END %]

[% name = 'foo' %] 
[% INCLUDE change_name %]
[% name %]              # foo
[% PROCESS change_name %]
[% name %]              # bar

Dotted compound variables behave slightly differently because the localisation process is only skin deep. The current variable namespace hash is copied, but no attempt is made to perform a deep-copy of other structures within it (hashes, arrays, objects, etc). A variable referencing a hash, for example, will be copied to create a new reference but which points to the same hash. Thus, the general rule is that simple variables (undotted variables) are localised, but existing complex structures (dotted variables) are not.

[% BLOCK all_change %]
   [% x = 20 %]         # changes copy
   [% y.z = 'zulu' %]       # changes original
[% END %]

[% x = 10
   y = { z => 'zebra' }
%]
[% INCLUDE all_change %]
[% x %]             # still '10'
[% y.z %]               # now 'zulu'

If you create a complex structure such as a hash or list reference within a local template context then it will cease to exist when the template is finished processing.

[% BLOCK new_stuff %]
   [% # define a new 'y' hash array in local context
      y = { z => 'zulu' }
   %]
[% END %]

[% x = 10 %]
[% INCLUDE new_stuff %]
[% x %]             # outputs '10'
[% y %]             # nothing, y is undefined

Similarly, if you update an element of a compound variable which doesn't already exists then a hash will be created automatically and deleted again at the end of the block.

[% BLOCK new_stuff %]
   [% y.z = 'zulu' %]
[% END %]

However, if the hash does already exist then you will modify the original with permanent effect. To avoid potential confusion, it is recommended that you don't update elements of complex variables from within blocks or templates included by another.

If you want to create or update truly global variables then you can use the 'global' namespace. This is a hash array automatically created in the top-level namespace which all templates, localised or otherwise see the same reference to. Changes made to variables within this hash are visible across all templates.

[% global.version = 123 %]

Compile Time Constant Folding

Top

In addition to variables that get resolved each time a template is processed, you can also define variables that get resolved just once when the template is compiled. This generally results in templates processing faster because there is less work to be done.

To define compile-time constants, specify a CONSTANTS hash as a constructor item as per VARIABLES. The CONSTANTS hash can contain any kind of complex, nested, or dynamic data structures, just like regular variables.

my $tt = Template->new({
    CONSTANTS => {
        version => 3.14,
        release => 'skyrocket',
        col     => {
            back => '#ffffff',
            fore => '#000000',
        },
        myobj => My::Object->new(),
        mysub => sub { ... },
        joint => ', ',
    },
});

Within a template, you access these variables using the constants namespace prefix.

Version [% constants.version %] ([% constants.release %])
Background: [% constants.col.back %]

When the template is compiled, these variable references are replaced with the corresponding value. No further variable lookup is then required when the template is processed.

You can call subroutines, object methods, and even virtual methods on constant variables.

[% constants.mysub(10, 20) %]
[% constants.myobj(30, 40) %]
[% constants.col.keys.sort.join(', ') %]

One important proviso is that any arguments you pass to subroutines or methods must also be literal values or compile time constants.

For example, these are both fine:

# literal argument
[% constants.col.keys.sort.join(', ') %]

# constant argument
[% constants.col.keys.sort.join(constants.joint) %]

But this next example will raise an error at parse time because joint is a runtime variable and cannot be determined at compile time.

# ERROR: runtime variable argument!
[% constants.col.keys.sort.join(joint) %]

The CONSTANTS_NAMESPACE option can be used to provide a different namespace prefix for constant variables. For example:

my $tt = Template->new({
    CONSTANTS => {
        version => 3.14,
        # ...etc...
    },
    CONSTANTS_NAMESPACE => 'const',
});

Constants would then be referenced in templates as:

[% const.version %]

Special Variables

Top

A number of special variables are automatically defined by the Template Toolkit.

template

Top

The template variable contains a reference to the main template being processed, in the form of a Template::Document object. This variable is correctly defined within PRE_PROCESS, PROCESS and POST_PROCESS templates, allowing standard headers, footers, etc., to access metadata items from the main template. The name and modtime metadata items are automatically provided, giving the template name and modification time in seconds since the epoch.

Note that the template variable always references the top-level template, even when processing other template components via INCLUDE, PROCESS, etc.

component

Top

The component variable is like template but always contains a reference to the current, innermost template component being processed. In the main template, the template and component variable will reference the same Template::Document object. In any other template component called from the main template, the template variable will remain unchanged, but component will contain a new reference to the current component.

This example should demonstrate the difference:

$template->process('foo')
    || die $template->error(), "\n";

foo template:

[% template.name %]         # foo
[% component.name %]        # foo
[% PROCESS footer %]

footer template:

[% template.name %]         # foo
[% component.name %]        # footer

Additionally, the component variable has two special fields: caller and callers. caller contains the name of the template that called the current template (or undef if the values of template and component are the same). callers contains a reference to a list of all the templates that have been called on the road to calling the current component template (like a call stack), with the outer-most template first.

Here's an example:

outer.tt2 template:

[% component.name %]        # 'outer.tt2'
[% component.caller %]      # undef
[% component.callers %]     # undef
[% PROCESS 'middle.tt2' %]

middle.tt2 template:

[% component.name %]        # 'middle.tt2'
[% component.caller %]      # 'outer.tt2'
[% component.callers %]     # [ 'outer.tt2' ]
[% PROCESS 'inner.tt2' %]

inner.tt2 template:

[% component.name %]        # 'inner.tt2'
[% component.caller %]      # 'middle.tt2'
[% component.callers %]     # [ 'outer.tt2', 'middle.tt2' ]

loop

Top

Within a FOREACH loop, the loop variable references the Template::Iterator object responsible for controlling the loop.

[% FOREACH item = [ 'foo', 'bar', 'baz' ] -%]
   [% "Items:\n" IF loop.first -%]
   [% loop.count %]/[% loop.size %]: [% item %]
[% END %]

error

Top

Within a CATCH block, the error variable contains a reference to the Template::Exception object thrown from within the TRY block. The type and info methods can be called or the variable itself can be printed for automatic stringification into a message of the form "$type error - $info". See Template::Exception for further details.

[% TRY %]
   ...
[% CATCH %]
   [% error %]
[% END %]

content

Top

The WRAPPER method captures the output from a template block and then includes a named template, passing the captured output as the 'content' variable.

[% WRAPPER box %]
Be not afeard; the isle is full of noises,
Sounds and sweet airs, that give delight and hurt not.
[% END %]

[% BLOCK box %]
<blockquote class="prose">
  [% content %]
</blockquote>
[% END %]

Compound Variables

Top

Compound 'dotted' variables may contain any number of separate elements. Each element may evaluate to any of the permitted variable types and the processor will then correctly use this value to evaluate the rest of the variable. Arguments may be passed to any of the intermediate elements.

[% myorg.people.sort('surname').first.fullname %]

Intermediate variables may be used and will behave entirely as expected.

[% sorted = myorg.people.sort('surname') %]
[% sorted.first.fullname %]

This simplified dotted notation has the benefit of hiding the implementation details of your data. For example, you could implement a data structure as a hash array one day and then change it to an object the next without requiring any change to the templates.


TT_v224_html_docs/manual/Views.html000700 000765 000765 00000122500 11756705104 017053 0ustar00abwabw000000 000000 Template::Manual::Views

Overview

Top

A view is effectively a collection of templates and/or variable definitions which can be passed around as a self-contained unit. This then represents a particular interface or presentation style for other objects or items of data.

You can use views to implement custom "skins" for an application or content set. You can use them to help simplify the presentation of common objects or data types. You can even use then to automate the presentation of complex data structures such as that generated in an XML::DOM tree or similar. You let an iterator do the walking, and the view does the talking (or in this case, the presenting). Voila - you have view independant, structure shy traversal using templates.

In general, views can be used in a number of different ways to achieve several different things. They elegantly solve some problems which were otherwise difficult or complicated, and make easy some things that were previously hard.

At the moment, they're still very experimental. The directive syntax and underlying API are likely to change quite considerably over the next version or two. Please be very wary about building your multi-million dollar e-commerce solutions based around this feature.

Views as Template Collectors/Providers

Top

The VIEW directive starts a view definition and includes a name by which the view can be referenced. The view definition continues up to the matching END directive.

[% VIEW myview %]
   ...
[% END %]

The first role of a view is to act as a collector and provider of templates. The include() method can be called on a view to effectively do the same thing as the INCLUDE directive. The template name is passed as the first argument, followed by any local variable definitions for the template.

[% myview.include('header', title='The Title') %]

# equivalent to
[% INCLUDE header  title='The Title' %]

Views accept a number of configuration options which can be used to control different aspects of their behaviour. The 'prefix' and 'suffix' options can be specified to add a fixed prefix and/or suffix to the name of each template.

[% VIEW myview 
     prefix = 'my/'
     suffix = '.tt2' ;
   END
%]

Now the call

[% myview.include('header', title='The Title') %]

is equivalent to

[% INCLUDE my/header.tt2  title='The Title' %]

Views provide an AUTOLOAD method which maps method names to the include() method. Thus, the following are all equivalent:

[% myview.include('header', title='Hello World') %]
[% myview.include_header(title='Hello World') %]
[% myview.header(title='Hello World') %]

Local BLOCK Definitions

Top

A VIEW definition can include BLOCK definitions which remain local to the view. A request for a particular template will return a BLOCK, if defined, in preference to any other template of the same name.

[% BLOCK foo %]
   public foo block
[% END %]

[% VIEW plain %]
   [% BLOCK foo %]
   plain foo block
   [% END %]
[% END %]

[% VIEW fancy %]
   [% BLOCK foo %]
   fancy foo block
   [% END %]
[% END %]

[% INCLUDE foo %]       # public foo block
[% plain.foo %]         # plain foo block 
[% fancy.foo %]         # fancy foo block

In addition to BLOCK definitions, a VIEW can contain any other template directives. The entire VIEW definition block is processed to initialise the view but no output is generated (this may change RSN - and get stored as 'output' item, subsequently accessible as [% view.output %]). However, directives that have side-effects, such as those that update a variable, will have noticable consequences.

Preserving Variable State within Views

Top

Views can also be used to save the values of any existing variables, or to create new ones at the point at which the view is defined. Unlike simple template metadata (META) which can only contain static string values, the view initialisation block can contain any template directives and generate any kind of dynamic output and/or data items.

[% VIEW my_web_site %]
   [% view.title   = title or 'My Cool Web Site' %]
   [% view.author  = "$abw.name, $abw.email" %]
   [% view.sidebar = INCLUDE my/sidebar.tt2 %]
[% END %]

Note that additional data items can be specified as arguments to the VIEW directive. Anything that doesn't look like a configuration parameter is assumed to be a data item. This can be a little hazardous, of course, because you never know when a new configuration item might get added which interferes with your data.

[% VIEW my_web_site
        # config options
        prefix = 'my/'
        # misc data
        title   = title or 'My Cool Web Site'
        author  = "$abw.name, $abw.email"
        sidebar = INCLUDE my/sidebar.tt2 
%]
   ...
[% END %]

Outside of the view definition you can access the view variables as, for example:

[% my_web_site.title %]

One important feature is the equivalence of simple variables and templates. You can implement the view item 'title' as a simple variable, a template defined in an external file, possibly with a prefix/suffix automatically appended, or as a local BLOCK definition within the [% VIEW %] ... [% END %] definition. If you use the syntax above then the view will Do The Right Thing to return the appropriate output.

At the END of the VIEW definition the view is "sealed" to prevent you from accidentally updating any variable values. If you attempt to change the value of a variable after the END of the VIEW definition block then a view error will be thrown.

[% TRY; 
     my_web_site.title = 'New Title';
   CATCH;
     error;
   END
%]

The error above will be reported as:

view error - cannot update item in sealed view: title

The same is true if you pass a parameter to a view variable. This is interpreted as an attempt to update the variable and will raise the same warning.

[% my_web_site.title('New Title') %]    # view error!

You can set the silent parameter to have the view ignore these parameters and simply return the variable value.

[% VIEW my_web_site
        silent = 1
        title  = title or 'My Cool Web Site'
        # ... ;
   END
%]

[% my_web_site.title('Blah Blah') %]   # My Cool Web Site

Alternately, you can specify that a view is unsealed allowing existing variables to be updated and new variables defined.

[% VIEW my_web_site
        sealed = 0
        title  = title or 'My Cool Web Site'
        # ... ;
   END
%]

[% my_web_site.title('Blah Blah') %]   # Blah Blah
[% my_web_site.title %]                # Blah Blah

Inheritance, Delegation and Reuse

Top

Views can be inherited from previously defined views by use of the base parameter. This example shows how a base class view is defined which applies a view/default/ prefix to all template names.

[% VIEW my.view.default
        prefix = 'view/default/';
   END
%]

Thus the directive:

[% my.view.default.header(title='Hello World') %]

is now equivalent to:

[% INCLUDE view/default/header title='Hello World' %]

A second view can be defined which specifies the default view as a base.

[% VIEW my.view.fancy
        base   = my.view.default
        prefix = 'view/fancy/';
   END
%]

Now the directive:

[% my.view.fancy.header(title='Hello World') %]

will resolve to:

[% INCLUDE view/fancy/header title='Hello World' %]

or if that doesn't exist, it will be handled by the base view as:

[% INCLUDE view/default/header title='Hello World' %]

When a parent view is specified via the base parameter, the delegation of a view to its parent for fetching templates and accessing user defined variables is automatic. You can also implement your own inheritance, delegation or other reuse patterns by explicitly delegating to other views.

[% BLOCK foo %]
   public foo block
[% END %]

[% VIEW plain %]
   [% BLOCK foo %]
   <plain>[% PROCESS foo %]</plain>
   [% END %]
[% END %]

[% VIEW fancy %]
   [% BLOCK foo %]
   [% plain.foo | replace('plain', 'fancy') %]
   [% END %]
[% END %]

[% plain.foo %]     # <plain>public foo block</plain>
[% fancy.foo %]     # <fancy>public foo block</fancy>

Note that the regular INCLUDE/PROCESS/WRAPPER directives work entirely independantly of views and will always get the original, unaltered template name rather than any local per-view definition.

Self-Reference

Top

A reference to the view object under definition is available with the VIEW ... END block by its specified name and also by the special name 'view' (similar to the my $self = shift; in a Perl method or the 'this' pointer in C++, etc). The view is initially unsealed allowing any data items to be defined and updated within the VIEW ... END block. The view is automatically sealed at the end of the definition block, preventing any view data from being subsequently changed.

(NOTE: sealing should be optional. As well as sealing a view to prevent updates (SEALED), it should be possible to set an option in the view to allow external contexts to update existing variables (UPDATE) or even create totally new view variables (CREATE)).

[% VIEW fancy %]
   [% fancy.title  = 'My Fancy Title' %]
   [% fancy.author = 'Frank Open' %]
   [% fancy.col    = { bg => '#ffffff', bar => '#a0a0ff' } %]
[% END %]

or

[% VIEW fancy %]
   [% view.title  = 'My Fancy Title' %]
   [% view.author = 'Frank Open' %]
   [% view.col    = { bg => '#ffffff', bar => '#a0a0ff' } %]
[% END %]

It makes no real difference in this case if you refer to the view by its name, 'fancy', or by the general name, 'view'. Outside of the view block, however, you should always use the given name, 'fancy':

[% fancy.title  %]
[% fancy.author %]
[% fancy.col.bg %]

The choice of given name or 'view' is much more important when it comes to BLOCK definitions within a VIEW. It is generally recommended that you use 'view' inside a VIEW definition because this is guaranteed to be correctly defined at any point in the future when the block gets called. The original name of the view might have long since been changed or reused but the self-reference via 'view' should always be intact and valid.

Take the following VIEW as an example:

[% VIEW foo %]
   [% view.title = 'Hello World' %]
   [% BLOCK header %]
   Title: [% view.title %]
   [% END %]
[% END %]

Even if we rename the view, or create a new foo variable, the header block still correctly accesses the title attribute of the view to which it belongs. Whenever a view BLOCK is processed, the view variable is always updated to contain the correct reference to the view object to which it belongs.

[% bar = foo %]
[% foo = { title => "New Foo" } %]  # no problem
[% bar.header %]                    # => Title: Hello World

Saving References to External Views

Top

When it comes to view inheritance, it's always a good idea to take a local copy of a parent or delegate view and store it as an attribute within the view for later use. This ensures that the correct view reference is always available, even if the external name of a view has been changed.

[% VIEW plain %]
   ...
[% END %]

[% VIEW fancy %]
   [% view.plain = plain %]
   [% BLOCK foo %]
   [% view.plain.foo | replace('plain', 'fancy') %]
   [% END %]
[% END %]

[% plain.foo %]         # => <plain>public foo block</plain>
[% plain = 'blah' %]    # no problem
[% fancy.foo %]         # => <fancy>public foo block</fancy>

Views as Data Presenters

Top

Another key role of a view is to act as a dispatcher to automatically apply the correct template to present a particular object or data item. This is handled via the print() method.

Here's an example:

[% VIEW foo %]

   [% BLOCK text %]
      Some text: [% item %]
   [% END %]

   [% BLOCK hash %]
      a hash:
      [% FOREACH key = item.keys.sort -%]
         [% key %] => [% item.$key %]
      [% END -%]
   [% END %]

   [% BLOCK list %]
      a list: [% item.sort.join(', ') %]
   [% END %]

[% END %]

We can now use the view to print text, hashes or lists. The print() method includes the right template depending on the typing of the argument (or arguments) passed.

[% some_text = 'I read the news today, oh boy.' %]
[% a_hash    = { house => 'Lords', hall => 'Albert' } %]
[% a_list    = [ 'sure', 'Nobody', 'really' ] %]

[% view.print(some_text) %]
                    # Some text: I read the news today, oh boy.

[% view.print(a_hash) %]
                    # a hash:
                         hall => Albert
                         house => Lords
[% view.print(a_list) %]
                    # a list: Nobody, really, sure

You can also provide templates to print objects of any other class. The class name is mapped to a template name with all non-word character sequences such as '::' converted to a single '_'.

[% VIEW foo %]
   [% BLOCK Foo_Bar %]
      a Foo::Bar object: 
          thingies: [% view.print(item.thingies) %]
           doodahs: [% view.print(item.doodahs)  %]
   [% END %]
[% END %]

[% USE fubar = Foo::Bar(...) %]

[% foo.print(fubar) %]

Note how we use the view object to display various items within the objects ('thingies' and 'doodahs'). We don't need to worry what kind of data these represent (text, list, hash, etc) because we can let the view worry about it, automatically mapping the data type to the correct template.

Views may define their own type => template map.

[% VIEW foo 
     map = { TEXT  => 'plain_text',
             ARRAY => 'show_list', 
             HASH  => 'show_hash',
             My::Module => 'template_name'
             default    => 'any_old_data'
           }
%]
    [% BLOCK plain_text %]
       ...
    [% END %]

    ...
[% END %]

They can also provide a default map entry, specified as part of the map hash or as a parameter by itself.

[% VIEW foo 
     map     = { ... },
     default = 'whatever'
%]
   ...
[% END %]

or

[% VIEW foo %]
   [% view.map     = { ... }
      view.default = 'whatever'
   %]
   ...
[% END %]

The print() method provides one more piece of magic. If you pass it a reference to an object which provides a present() method, then the method will be called passing the view as an argument. This then gives any object a chance to determine how it should be presented via the view.

package Foo::Bar;
...
sub present {
    my ($self, $view) = @_;
    return "a Foo::Bar object:\n"
         . "thingies: " . $view->print($self->{ _THINGIES }) . "\n"
         . "doodahs: " . $view->print($self->{ _DOODAHS }) . "\n";
}

The object is free to delve deeply into its innards and mess around with its own private data, before presenting the relevant data via the view. In a more complex example, a present() method might walk part of a tree making calls back against the view to present different nodes within the tree. We may not want to expose the internal structure of the tree (because that would break encapsulation and make our presentation code dependant on it) but we want to have some way of walking the tree and presenting items found in a particular manner.

This is known as Structure Shy Traversal. Our view object doesn't require prior knowledge about the internal structure of any data set to be able to traverse it and present the data contained therein. The data items themselves, via the present() method, can implement the internal iterators to guide the view along the right path to presentation happiness.

The upshot is that you can use views to greatly simplify the display of data structures like XML::DOM trees. The documentation for the Template::Plugin::XML::DOM module contains an example of this. In essence, it looks something like this:

XML source:

<user name="Andy Wardley">
    <project id="iCan" title="iCan, but theyCan't"/>
    <project id="p45"  title="iDid, but theyDidn't"/>
</user>

TT View:

[% VIEW fancy %]
   [% BLOCK user %]
      User: [% item.name %]
            [% item.content(myview) %]
   [% END %]

   [% BLOCK project %]
        Project: [% project.id %] - [% project.name %]
   [% END %]
[% END %]

Generate view:

[% USE dom = XML.DOM %]
[% fancy.print(dom.parse(xml_source)) %]

Output:

User: Andy Wardley
  Project: iCan - iCan, but theyCan't
  Project: p45 - iDid, but theyDidn't

The same approach can be applied to many other areas. Here's an example from the File/Directory plugins.

[% VIEW myview %]
   [% BLOCK file %]
      - [% item.name %]
   [% END %]

   [% BLOCK directory %]
      * [% item.name %]
        [% item.content(myview) FILTER indent %]
   [% END %]
[% END %]

[% USE dir = Directory(dirpath) %]
[% myview.print(dir) %]

And here's the same approach use to convert POD documentation to any other format via template.

[%  # load Pod plugin and parse source file into Pod Object Model
    USE Pod;
    pom = Pod.parse_file(my_pod_file);

    # define view to map all Pod elements to "pod/html/xxx" templates
    VIEW pod2html
        prefix='pod/html';
    END;

    # now print document via view (i.e. as HTML)
    pod2html.print(pom) 
%]

Here we simply define a template prefix for the view which causes the view to look for pod/html/head1, pod/html/head2, pod/html/over as templates to present the different sections of the parsed Pod document.

There are some examples in the Template Toolkit test suite: t/pod.t and t/view.t which may shed some more light on this. See the distribution sub-directory examples/pod/html for examples of Pod -> HTML templates.


TT_v224_html_docs/manual/VMethods.html000700 000765 000765 00000205474 11756705105 017524 0ustar00abwabw000000 000000 Template::Manual::VMethods

Scalar Virtual Methods

Top

chunk(size)

Top

Splits the value into a list of chunks of a certain size.

[% ccard_no = "1234567824683579";
   ccard_no.chunk(4).join
%]

Output:

1234 5678 2468 3579

If the size is specified as a negative number then the text will be chunked from right-to-left. This gives the correct grouping for numbers, for example.

[% number = 1234567;
   number.chunk(-3).join(',')
%]

Output:

1,234,567

collapse

Top

Returns the text with any leading and trailing whitespace removed and any internal sequences of whitespace converted to a single space

[% text = "  The bird\n  is the word" %]
[% text.collapse %]       # The bird is the word

defined

Top

Returns true if the value is defined.

[% user = get_user(uid) IF uid.defined %]

dquote

Top

Returns the text with any double quote characters escaped with a backslash prefix. Any newline characters in the text will be replaced with "\n".

[% quote = 'He said "Oh really?"' %]
[% quote.dquote %]        # He said \"Oh really?\"

hash

Top

Return the value as a hash reference containing a single entry with the key value indicating the original scalar value. As with the list virtual method, this is generally used to help massage data into different formats.

lcfirst

Top

Returns the text with the first letter converted to lower case.

[% word = 'BIRD' %]
[% word.lcfirst %]        # bIRD

length

Top

Returns the length of the string representation of the item:

[% IF password.length < 8 %]
   Password too short, dumbass!
[% END %]

list

Top

Return the value as a single element list. This can be useful if you have a variable which may contain a single item or a list and you want to treat them equally. The list method can be called against a list reference and will simply return the original reference, effectively a no-op.

[% thing.list.size %]     # thing can be a scalar or a list

lower

Top

Returns the text in lower case.

[% word = 'BIRD' %]
[% word.lower %]          # bird

match(pattern, global)

Top

Performs a regular expression match on the string using the pattern passed as an argument. If the pattern matches the string then the method returns a reference to a list of any strings captured within parenthesis in the pattern.

[% name = 'Larry Wall' %]
[% matches = name.match('(\w+) (\w+)') %]
[% matches.1 %], [% matches.0 %]    # Wall, Larry

If the pattern does not match then the method returns false, rather than returning an empty list which Perl and the Template Toolkit both consider to be a true value. This allows you to write expression like this.

[% "We're not worthy!" IF name.match('Larry Wall') %]

[% IF (matches = name.match('(\w+) (\w+)')) %]
   pattern matches: [% matches.join(', ') %]
[% ELSE %]
   pattern does not match
[% END %]

Any regex modifiers, like /s, should be added in the regex using the (?s) syntax. For example, to modify the regex to disregard whitespace (the /x switch), use:

[% re = '(?x)
           (\w+)
           [ ]
           (\w+)
         ';
  matches = name.match(re);
%]

To perform a global search to match the pattern as many times as it appears in the source string, provide a true value for the global argument following the pattern.

[% text = 'bandanna';
   text.match('an+', 1).join(', )      # an, ann
%]

repeat(n)

Top

Repeat the string a specified number of times.

[% name = 'foo' %]
[% name.repeat(3) %]        # foofoofoo

replace(search, replace)

Top

Outputs the string with all instances of the first argument (specified as a Perl regular expression) with the second.

[% name = 'foo, bar & baz' %]
[% name.replace('\W+', '_') %]        # foo_bar_baz

You can use $1, $2, etc., to reference captured parts (in parentheses) in the regular expression. Just be careful to single quote the replacement string. If you use double quotes then TT will try and interpolate the variables before passing the string to the replace vmethod.

[% name = 'FooBarBaz' %]
[% name.replace('([A-Z])', ' $1') %]  # Foo Bar Baz

remove(pattern)

Top

Outputs the string with all instances of the pattern (specified as a Perl regular expression) removed.

[% name = 'foo, bar & baz' %]
[% name.remove('\W+') %]    # foobarbaz
Top

Performs a similar function to match but simply returns true if the string matches the regular expression pattern passed as an argument.

[% name = 'foo bar baz' %]
[% name.search('bar') ? 'bar' : 'no bar' %]        # bar

This virtual method is now deprecated in favour of match. Move along now, there's nothing more to see here.

size

Top

Always returns 1 for scalar values. This method is provided for consistency with the hash and list size methods.

split(pattern)

Top

Calls Perl's split() function to split a string into a list of strings.

[% FOREACH dir IN mypath.split(':') %]
   [% dir %]
[% END %]

substr(offset, length, replacement)

Top

Returns a substring starting at offset, for length characters.

[% str 'foo bar baz wiz waz woz') %]
[% str.substr(4, 3) %]    # bar

If length is not specified then it returns everything from the offset to the end of the string.

[% str.substr(12) %]      # wiz waz woz

If both length and replacement are specified, then the method replaces everything from offset for length characters with $replacement. The substring removed from the string is then returned.

[% str.substr(0, 11, 'FOO') %]   # foo bar baz
[% str %]                        # FOO wiz waz woz

squote

Top

Returns the text with any single quote characters escaped with a backslash prefix.

[% tim = "Tim O'Reilly" %]
[% tim.squote %]          # Tim O\'Reilly

trim

Top

Returns the text with any leading and trailing whitespace removed.

[% text = '  hello  world  ' %]
[% text.trim %]           # hello  world

ucfirst

Top

Returns the text with the first letter converted to upper case.

[% word = 'bird' %]
[% word.ucfirst %]        # Bird

upper

Top

Returns the text in upper case.

[% word = 'bird' %]
[% word.upper %]          # BIRD

Hash Virtual Methods

Top

keys

Top

Returns a list of keys in the hash. They are not returned in any particular order, but the order is the same as for the corresponding values method.

[% FOREACH key IN hash.keys %]
   * [% key %]
[% END %]

If you want the keys in sorted order, use the list sort method.

[% FOREACH key IN hash.keys.sort %]
   * [% key %]
[% END %]

Having got the keys in sorted order, you can then use variable interpolation to fetch the value. This is shown in the following example by the use of $key to fetch the item from hash whose key is stored in the key variable.

[% FOREACH key IN hash.keys.sort %]
   * [% key %] = [% hash.$key %]
[% END %]

Alternately, you can use the pairs method to get a list of key/value pairs in sorted order.

values

Top

Returns a list of the values in the hash. As with the keys method, they are not returned in any particular order, although it is the same order that the keys are returned in.

[% hash.values.join(', ') %]

items

Top

Returns a list of both the keys and the values expanded into a single list.

[% hash = {
      a = 10
      b = 20
   };

   hash.items.join(', ')    # a, 10, b, 20
%]

each

Top

This method currently returns the same thing as the items method.

However, please note that this method will change in the next major version of the Template Toolkit (v3) to return the same thing as the pairs method. This will be done in an effort to make these virtual method more consistent with each other and how Perl works.

In anticipation of this, we recommend that you stop using hash.each and instead use hash.items.

pairs

Top

This method returns a list of key/value pairs. They are returned in sorted order according to the keys.

[% FOREACH pair IN product.pairs %]
   * [% pair.key %] is [% pair.value %]
[% END %]

list

Top

Returns the contents of the hash in list form. An argument can be passed to indicate the desired items required in the list: keys to return a list of the keys (same as hash.keys), values to return a list of the values (same as hash.values), each to return as list of key and values (same as hash.each), or pairs to return a list of key/value pairs (same as hash.pairs).

[% keys   = hash.list('keys') %]
[% values = hash.list('values') %]
[% items  = hash.list('each') %]
[% pairs  = hash.list('pairs') %]

When called without an argument it currently returns the same thing as the pairs method. However, please note that this method will change in the next major version of the Template Toolkit (v3) to return a reference to a list containing the single hash reference (as per the scalar list method).

In anticipation of this, we recommend that you stop using hash.list and instead use hash.pairs.

sort, nsort

Top

Return a list of the keys, sorted alphabetically (sort) or numerically (nsort) according to the corresponding values in the hash.

[% FOREACH n IN phones.sort %]
   [% phones.$n %] is [% n %],
[% END %]

import

Top

The import method can be called on a hash array to import the contents of another hash array.

[% hash1 = {
     foo = 'Foo'
     bar = 'Bar'
   }
   hash2 = {
       wiz = 'Wiz'
       woz = 'Woz'
   }
%]

[% hash1.import(hash2) %]
[% hash1.wiz %]             # Wiz

You can also call the import() method by itself to import a hash array into the current namespace hash.

[% user = { id => 'lwall', name => 'Larry Wall' } %]
[% import(user) %]
[% id %]: [% name %]        # lwall: Larry Wall

defined, exists

Top

Returns a true or false value if an item in the hash denoted by the key passed as an argument is defined or exists, respectively.

[% hash.defined('somekey') ? 'yes' : 'no' %]
[% hash.exists('somekey') ? 'yes' : 'no' %]

When called without any argument, hash.defined returns true if the hash itself is defined (e.g. the same effect as scalar.defined).

delete

Top

Delete one or more items from the hash.

[% hash.delete('foo', 'bar') %]

size

Top

Returns the number of key/value pairs in the hash.

item

Top

Returns an item from the hash using a key passed as an argument.

[% hash.item('foo') %]  # same as hash.foo

List Virtual Methods

Top

first, last

Top

Returns the first/last item in the list. The item is not removed from the list.

[% results.first %] to [% results.last %]

If either is given a numeric argument n, they return the first or last n elements:

The first 5 results are [% results.first(5).join(", ") %].

size, max

Top

Returns the size of a list (number of elements) and the maximum index number (size - 1), respectively.

[% results.size %] search results matched your query

defined

Top

Returns a true or false value if the item in the list denoted by the argument is defined.

[% list.defined(3) ? 'yes' : 'no' %]

When called without any argument, list.defined returns true if the list itself is defined (e.g. the same effect as scalar.defined).

reverse

Top

Returns the items of the list in reverse order.

[% FOREACH s IN scores.reverse %]
   ...
[% END %]

join

Top

Joins the items in the list into a single string, using Perl's join() function.

[% items.join(', ') %]

grep

Top

Returns a list of the items in the list that match a regular expression pattern.

[% FOREACH directory.files.grep('\.txt$') %]
   ...
[% END %]

sort, nsort

Top

Returns the items in alpha (sort) or numerical (nsort) order.

[% library = books.sort %]

An argument can be provided to specify a search key. Where an item in the list is a hash reference, the search key will be used to retrieve a value from the hash which will then be used as the comparison value. Where an item is an object which implements a method of that name, the method will be called to return a comparison value.

[% library = books.sort('author') %]

In the example, the books list can contains hash references with an author key or objects with an author method.

You can also specify multiple sort keys.

[% library = books.sort('author', 'title') %]

In this case the books will be sorted primarily by author. If two or more books have authors with the same name then they will be sorted by title.

unshift(item), push(item)

Top

The push() method adds an item or items to the end of list.

[% mylist.push(foo) %]
[% mylist.push(foo, bar) %]

The unshift() method adds an item or items to the start of a list.

[% mylist.unshift(foo) %]
[% mylist.push(foo, bar)    %]

shift, pop

Top

Removes the first/last item from the list and returns it.

[% first = mylist.shift %]
[% last  = mylist.pop   %]

unique

Top

Returns a list of the unique elements in a list, in the same order as in the list itself.

[% mylist = [ 1, 2, 3, 2, 3, 4, 1, 4, 3, 4, 5 ] %]
[% numbers = mylist.unique %]

While this can be explicitly sorted, it is not required that the list be sorted before the unique elements are pulled out (unlike the Unix command line utility).

[% numbers = mylist.unique.sort %]

import

Top

Appends the contents of one or more other lists to the end of the current list.

[% one   = [ 1 2 3 ];
   two   = [ 4 5 6 ];
   three = [ 7 8 9 ];
   one.import(two, three);
   one.join(', );     # 1, 2, 3, 4, 5, 6, 7, 8, 9
%]

merge

Top

Returns a list composed of zero or more other lists:

[% list_one = [ 1 2 3 ];
   list_two = [ 4 5 6 ];
   list_three = [ 7 8 9 ];
   list_four = list_one.merge(list_two, list_three);
%]

The original lists are not modified.

slice(from, to)

Top

Returns a slice of items in the list between the bounds passed as arguments. If the second argument, to, isn't specified, then it defaults to the last item in the list. The original list is not modified.

[% first_three = list.slice(0,2) %]
[% last_three  = list.slice(-3, -1) %]

splice(offset, length, list)

Top

Behaves just like Perl's splice() function allowing you to selectively remove and/or replace elements in a list. It removes length items from the list, starting at offset and replaces them with the items in list.

[% play_game = [ 'play', 'scrabble' ];
   ping_pong = [ 'ping', 'pong' ];
   redundant = play_game.splice(1, 1, ping_pong);
   redundant.join;     # scrabble
   play_game.join;     # play ping pong
%]

The method returns a list of the items removed by the splice. You can use the CALL directive to ignore the output if you're not planning to do anything with it.

[% CALL play_game.splice(1, 1, ping_pong) %]

As well as providing a reference to a list of replacement values, you can pass in a list of items.

[% CALL list.splice(-1, 0, 'foo', 'bar') %]

Be careful about passing just one item in as a replacement value. If it is a reference to a list then the contents of the list will be used. If it's not a list, then it will be treated as a single value. You can use square brackets around a single item if you need to be explicit:

[% # push a single item, an_item
   CALL list.splice(-1, 0, an_item);

   # push the items from another_list
   CALL list.splice(-1, 0, another_list);

   # push a reference to another_list
   CALL list.splice(-1, 0, [ another_list ]);
%]

hash

Top

Returns a reference to a hash array comprised of the elements in the list. The even-numbered elements (0, 2, 4, etc) become the keys and the odd-numbered elements (1, 3, 5, etc) the values.

[% list = ['pi', 3.14, 'e', 2.718] %]
[% hash = list.hash %]
[% hash.pi %]               # 3.14
[% hash.e  %]               # 2.718

If a numerical argument is provided then the hash returned will have keys generated for each item starting at the number specified.

[% list = ['beer', 'peanuts'] %]
[% hash = list.hash(1) %]
[% hash.1  %]               # beer
[% hash.2  %]               # peanuts

Automagic Promotion of Scalar to List for Virtual Methods

Top

In addition to the scalar virtual methods listed in the previous section, you can also call any list virtual method against a scalar. The item will be automagically promoted to a single element list and the appropriate list virtual method will be called.

One particular benefit of this comes when calling subroutines or object methods that return a list of items, rather than the preferred reference to a list of items. In this case, the Template Toolkit automatically folds the items returned into a list.

The upshot is that you can continue to use existing Perl modules or code that returns lists of items, without having to refactor it just to keep the Template Toolkit happy (by returning references to list). Class::DBI module is just one example of a particularly useful module which returns values this way.

If only a single item is returned from a subroutine then the Template Toolkit assumes it meant to return a single item (rather than a list of 1 item) and leaves it well alone, returning the single value as it is. If you're executing a database query, for example, you might get 1 item returned, or perhaps many items which are then folded into a list.

The FOREACH directive will happily accept either a list or a single item which it will treat as a list. So it's safe to write directives like this, where we assume that the something variable is bound to a subroutine which may return one or more items:

[% FOREACH item IN something %]
   ...
[% END %]

The automagic promotion of scalars to single item lists means that you can also use list virtual methods safely, even if you only get one item returned. For example:

[% something.first   %]
[% something.join    %]
[% something.reverse.join(', ') %]

Note that this is very much a last-ditch behaviour. If the single item return is an object with a first method, for example, then that will be called, as expected, in preference to the list virtual method.

Defining Custom Virtual Methods

Top

You can define your own virtual methods for scalars, lists and hash arrays. The Template::Stash package variables $SCALAR_OPS, $LIST_OPS and $HASH_OPS are references to hash arrays that define these virtual methods. HASH_OPS and LIST_OPS methods are subroutines that accept a hash/list reference as the first item. SCALAR_OPS are subroutines that accept a scalar value as the first item. Any other arguments specified when the method is called will be passed to the subroutine.

# load Template::Stash to make method tables visible
use Template::Stash;

# define list method to return new list of odd numbers only
$Template::Stash::LIST_OPS->{ odd } = sub {
    my $list = shift;
    return [ grep { $_ % 2 } @$list ];
};

Example template:

[% primes = [ 2, 3, 5, 7, 9 ] %]
[% primes.odd.join(', ') %]        # 3, 5, 7, 9

TODO: document the define_vmethod() method which makes this even easier


TT_v224_html_docs/js/tt2.js000700 000765 000765 00000016024 11756705103 015300 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------ * set_cookie(name, value, days) * * Set a cookie with the name and value passed as the first two arguments, * set to expire in the number of days specified in the third argument. *------------------------------------------------------------------------*/ function set_cookie(name, value, days) { var expires; if (days) { var date = new Date(); date.setTime(date.getTime() + (days*24*60*60*1000)); expires = "; expires=" + date.toGMTString(); } else expires = ""; document.cookie = name + "=" + value + expires + "; path=/"; } /*------------------------------------------------------------------------ * get_cookie(name) * * Returns the value of the cookie identified by the name argument. *------------------------------------------------------------------------*/ function get_cookie(name) { var namestr = name + "="; var cookbits = document.cookie.split(';'); var n; for(n = 0; n < cookbits.length; n++) { var c = cookbits[n]; /* remove leading whitespace */ while (c.charAt(0) == ' ') c = c.substring(1, c.length); /* if the name start this cookie fragment, return the value */ if (c.indexOf(namestr) == 0) return c.substring(namestr.length, c.length); } return null; } /*------------------------------------------------------------------------ * functions to handle multiple handler for onload and onunload events. *------------------------------------------------------------------------*/ var onload_functions = new Array(); var onunload_functions = new Array(); function page_onload(func) { onload_functions.push(func); } function page_onunload(func) { onunload_functions.push(func); } function page_load() { for(var i = 0; i < onload_functions.length; i++) { try { eval(onload_functions[i]); } catch(err) { alert(err) } } } function page_unload() { for(var i = 0; i < onunload_functions.length; i++) eval(onunload_functions[i]); } window.onload = page_load; window.onunload = page_unload; page_onload('load_style()'); // page_onunload('save_style()'); /*------------------------------------------------------------------------ * load_style() * * Initialises the stylesheet based on any cookie currently set. *------------------------------------------------------------------------*/ function load_style() { var style; if (style = get_cookie("stylesheet")) set_style(style); if (style = get_cookie("body")) document.getElementById("body").className = style; } /*------------------------------------------------------------------------ * save_style() * * Saves the stylesheet name back to a cookie *------------------------------------------------------------------------*/ function save_style() { var style; if (style = get_style()) set_cookie("stylesheet", style, 365); } /*------------------------------------------------------------------------ * get_style() * * Returns the title of the current active stylesheet. *------------------------------------------------------------------------*/ function get_style() { var elems = document.getElementsByTagName("link"); var n, elem, title; for (n = 0; (elem = elems[n]); n++) { if (elem.getAttribute("rel").indexOf("style") != -1 && (title = elem.getAttribute("title")) && ! elem.disabled) return title; } return null; } /*------------------------------------------------------------------------ * set_style(title) * * Set the active stylesheet by enabling the * element that has a title attribute matching the title argument, * and disabling all others. *------------------------------------------------------------------------*/ function set_style(title) { var elems = document.getElementsByTagName("link"); var n, elem, tattr; // alert("SET " + title); set_cookie("stylesheet", title, 365); for (n = 0; n < elems.length; n++) { elem = elems[n]; if (elem.getAttribute("rel").indexOf("style") != -1 && (tattr = elem.getAttribute("title"))) { elem.disabled = true; if (tattr == title) { elem.disabled = false; } } } return false; } /*------------------------------------------------------------------------ * widescreen_on() * widescreen_off() * * Turn widescreen mode on/off by setting the #body class *------------------------------------------------------------------------*/ function widescreen_on() { document.getElementById("body").className = "wide"; set_cookie("body", "wide", 365); } function widescreen_off() { document.getElementById("body").className = ""; set_cookie("body", "", 365); } /*------------------------------------------------------------------------ * switch_element(node, class) * * Toggle the node's className between "open $class" and "shut $class" *------------------------------------------------------------------------*/ function switch_element(node, classname) { node.className = node.className == 'open ' + classname ? 'shut ' + classname : 'open ' + classname; return false; } function switch_section(section) { return switch_element(section.parentNode.parentNode, 'section'); } function switch_subsection(subsect) { return switch_element(subsect.parentNode.parentNode, 'subsection'); } /*------------------------------------------------------------------------ * switch_tag_class(root, tag, from, to) * * Switch all tag elements under the root from one class to another. *------------------------------------------------------------------------*/ function switch_tag_class(root, tag, cfrom, cto) { var nodes = root.getElementsByTagName(tag); var n, node; for (n = 0; (node = nodes[n]); n++) { if (node.className == cfrom) { node.className = cto; } } } function shut_all(root) { if (! root) root = document; switch_tag_class(root, 'div', 'section', 'shut section'); switch_tag_class(root, 'div', 'subsection', 'shut subsection'); switch_tag_class(root, 'div', 'open section', 'shut section'); switch_tag_class(root, 'div', 'open subsection', 'shut subsection'); switch_tag_class(root, 'div', 'wedged section', 'open section'); switch_tag_class(root, 'div', 'wedged subsection', 'open subsection'); return false; } function open_all(root) { if (! root) root = document; switch_tag_class(root, 'div', 'section', 'open section'); switch_tag_class(root, 'div', 'subsection', 'open subsection'); switch_tag_class(root, 'div', 'shut section', 'open section'); switch_tag_class(root, 'div', 'shut subsection', 'open subsection'); switch_tag_class(root, 'div', 'wedged section', 'open section'); switch_tag_class(root, 'div', 'wedged subsection', 'open subsection'); return false; } page_onload('open_all()'); TT_v224_html_docs/images/arrows/000700 000765 000765 00000000000 11222361074 016362 5ustar00abwabw000000 000000 TT_v224_html_docs/images/glass/000700 000765 000765 00000000000 11222361074 016156 5ustar00abwabw000000 000000 TT_v224_html_docs/images/glass/blue/000700 000765 000765 00000000000 11756705152 017120 5ustar00abwabw000000 000000 TT_v224_html_docs/images/glass/common/000700 000765 000765 00000000000 11756705152 017461 5ustar00abwabw000000 000000 TT_v224_html_docs/images/glass/green/000700 000765 000765 00000000000 11756705152 017271 5ustar00abwabw000000 000000 TT_v224_html_docs/images/glass/grey/000700 000765 000765 00000000000 11756705152 017137 5ustar00abwabw000000 000000 TT_v224_html_docs/images/glass/orange/000700 000765 000765 00000000000 11756705152 017444 5ustar00abwabw000000 000000 TT_v224_html_docs/images/glass/purple/000700 000765 000765 00000000000 11756705152 017500 5ustar00abwabw000000 000000 TT_v224_html_docs/images/glass/purple/col_blue_in.gif000700 000765 000765 00000000631 11222361074 022431 0ustar00abwabw000000 000000 GIF89aÕ¤è#6G!mŸŸ­«¦¿¡¡¯F!j.HF!lBe,DCe%9D h w±C g?`/H©¤½5a—ت¥½&:T†;[¢£±šÚ¬¨Áw®.F.G %3]4Q1[j–k˜ %5Ru¬œÜ¡ãp–Ô•Íå–Ïç˜Ñè–Ïæ”ÌäJ#qI#qK$sJ$sG"nJ#rI#p!ù,¶ÀMÆE,Ç̆Ph9ŸÐh´@`¾®Ø¬VK­ Xà°x<T$˜zÍn·’Ci¤ªÛïx;és€08+‚ƒ„‚'  ! (Ž‘("& )œžŸ)  ­®¯ ¦· ½¾¿ ·5ÇÈÉÊËÈ7ÎÏÐÑÒÓÔÕÏ2ØÙÚÛÜÙ1ßàáâãà6æçèéêëìíç4ðñòóôñ3÷øùúûøA;TT_v224_html_docs/images/glass/purple/col_blue_out.gif000700 000765 000765 00000000651 11222361074 022634 0ustar00abwabw000000 000000 GIF89aÕ%8I#pJ#qI#qŸŸ­¡¡¯«¦¿7e1L.G¬¨Á((<¢£±3†==^H#oª¥½F!l"4Be¬¨Á9·? $.G.H:Z.`;D h$87¬>4Ž=4=)9:%97®>2L9¸?8¶>©Õ´6®;¥Ñ¯%y)¦Ò°§Ô²3¤84ª:§Ó±7³=J$sK$s9¹?J#r!ù,Æ@ÅE,G §0˜9ŸÐhtP`ڮجVKÅdà°x<6`˜zÍn· 'F¯Ûïw¡ùÿ€ 5ˆ‰Š‹‹ #/’“”••# 7œžŸŸ )%-§¨©ª¨*$ ',³´µ¶´& !:ÀÁÂÃ:(!"ÄÎÁ"+ÏÀÕäêëìä;ôõö÷øùúûõ8þÿ ü—£ Áƒ ;TT_v224_html_docs/images/glass/purple/col_grey_in.gif000700 000765 000765 00000000631 11222361074 022450 0ustar00abwabw000000 000000 GIF89aÕ#6¹±¯G!m«¦¿¡¡¯ŸŸ­F!jgZl¬¨Á%9Be?`.H¢£±,Dª¥½H8Sª¡£®¦¥‹€‰;[©¤½C g&:F!l/HCeD hxqrB3N5Ryss4Q % %.FD5O.G†~„ˆ…´­«°¨¦}xw©¢ ÏÓÕÑÔ×ÍÐÒÏÒÕÎÑÓJ#qI#qK$sJ$sG"nJ#rI#p!ù,¶@D£E,Çb@`9ŸÐh”0`¾®Ø¬VK}`à°x<.<*—zÍn· †ˆ£ªÛïxû'ÄX$N+‚ƒ„‚& $)Ž‘) #(œžŸ(%­®¯¦·½¾¿·5ÇÈÉÊËÈ7ÎÏÐÑÒÓÔÕÏ2ØÙÚÛÜÙ1ßàáâãà6æçèéêëìíç4ðñòóôñ3÷øùúûøA;TT_v224_html_docs/images/glass/purple/col_grey_out.gif000700 000765 000765 00000000651 11222361074 022653 0ustar00abwabw000000 000000 GIF89aÕ%8I#pJ#qI#q¡¡¯«¦¿ŸŸ­J:W1LF!j.HD h.GG"nª¥½„ $¬¨Á¢£±:Z=^?`"4BeG!m#5°§©!3F!l½µ´+Am_s(<©¤½H#o0µ¬¬š–$82L³ª«H8U%9˜•¾¶´¼´²´­«ÏÓÕ}xwÑÔ×ÍÐÒ©¢ ¹±¯ÏÒÕÎÑÓ°¨¦J$sK$s¿·µJ#r!ù,ÆÀˆ$F,GI¤@x9ŸÐh”P`֮جVKulà°x<68B™zÍn· !F¯Ûïwˆ¢2šùÿ€#7ˆ‰Š‹‹ .’“”•• 4œžŸŸ *(-§¨©ª¨$& %,³´µ¶´+ :ÀÁÂÃ:)"ÄÎÁ'"ÏÀÕä êëì ä;ôõö÷øùúûõ8þÿ ü—£ Áƒ ;TT_v224_html_docs/images/glass/purple/col_orange_in.gif000700 000765 000765 00000000626 11222361074 022761 0ustar00abwabw000000 000000 GIF89aÕ#6G!mŸŸ­¡¡¯«¦¿F!jBeCe&:F!l¢£±,DD h%9;[.Hçs©¤½ª¥½âqW+(/HC g¶Z?`ƒA¬¨ÁR(%.FžP %Q'& %²Y .G¡P4Q5R´Y ÷{êtñxâp§SàÀäÄ¡áÀI#qK$sJ#qJ$sG"nâŸI#pJ#r!ù,³@¢E,G…†0 9ŸÐht@`J¯WªDàêz¿`°@°Îè´Z-ˆ<@•|N¯ÏGž¦aRùÿ€! $(‹ŒŽ(% )™š›œ)" 'ª«¬£´  º»¼  ´3ÄÅÆÇÈÅ5ËÌÍÎÏÐÑÒÌ/ÕÖרÙÖ1ÜÝÞßàÝ6ãäåæçèéêä2íîïðñî0ôõö÷øõA;TT_v224_html_docs/images/glass/purple/col_orange_out.gif000700 000765 000765 00000000646 11222361074 023164 0ustar00abwabw000000 000000 GIF89aÕI#pJ#qI#q¡¡¯ŸŸ­«¦¿1LZ,*.G(Zµ¬½­hÓª…i´ÐW¥aB•j–êÚ»xórmû6„ßNEfá§°áÃz+ÎÚÕ­Í¿€!&|¸òâ˘_6îûF¨Y®ÝMºtæÓ¨#n~ÜùóƒÐ¥cßKM»6ÂÕ {-Z6iÛÀã†Aœøç,\ôYμyð穇ß\yóëгcÆýªû«0-ÄÿH¾¯¼ùóÚÓ'æî¼xòç㫟—ý÷-bŒw_>ýÿ[Ù^~ûõ‡€^…~ ¾7F|D(á„ V(Ô‚ †7Þƒvȇ… jÆ—M±”X¢æTðà,¶èbˆ0®„›‰'¦¸¢‹8ƨ£D3š(Š*–¡ÇD¹ã‘õx"é¤HF©’±©;èä¡å–\Jé¥ATZ‰%—dæñå™EyeÓl Pd ƒÇœt։晸±ù£›pÊYçŸw~™g›h3ܡ袌êå {zh¢ŒVꨔ¸  ©¦ ±Å3Ø!ꨤ^e¦› Ðé§¡’ꪩH¢ÿÊé‡ÚàÌ$¸æª+¬GâVÀ¯¿^@ ¶Òaì±Èòº£¯À ,±Î +-ÊêˆÛØb  GØLà†+nµ1^›íÛvû­¸ì’ £¹Ú¢ 5$ãÆ½øæënˆð¢+/½öæ+ð¾ â&ËÁ²@4ÍÔ G,1ÁŒ°Â ;,ñÆpP\!n„r/Ðèâ°(§¬²Ç ‚,2$›¬Ê4ËÁ2‚.Ü Å£A@-ôÍæ óÎ=ÿ,´Ð©ýnªD­Êκs 3sd­õÖNÓµÔT[õÖ[sÒõ|¸M ¶Ú¶èÒC¼!÷ÜtŸ­^ÚkOÐöÛqÓÿM·Ùvk‡Û„`‹-$,7Œ7îxà‚˜@á†#®¸Ž;þË/g78á¶4ÐÀÛѰÆé¨§Þ9tŸ.:馧ž:竇›è¸+± I ¡ÏïÀ_»í’ã.ºî¼ûüòà W¼ñÈ÷¾<óÍ׆›Øc¿Œ8hƒ?à‡/~õÖKž½öÜ÷þ„øì“OÛõÙ‹‚‹µ$áƒìï>j%u¾üP#2à…Fä|ûãŸLhb“ÿáb~µ¨…p@~$ð4¹HF ŠvpiG-v¡ xÁàh„ UxÁÌdpÁXE¤àAùP #F|€GøÐ‡-ÜŽEÿ†Á&`‚5Å&n˜C^ðB]ˆ"$‚x™LœÂ­àÀ3ð%zqø†Ô FìBÂàÅ#ÖHÅÅdbmÑ,ðE/:À‹c-€QFFø±Šy£LfÁ ¡ŽvÄã9F@&&„1ÇE(â’ŠHƒ&ÁIN2R ŽÔ $O!“\17À$&5ÉÊNv2”¢…E`QV|!å‚*wÉKXæe”2i2.L•ÈL¦&}‰—Ls P‡w|` €P&2™ÙÌAÈ2˜…à"˜ˆ`"èL§:ÀÍn~s†˜8  30a«°Æ!öÉhÏ}¶ó.Îô&)M±XÌ¢óä+4¡ D8ô¡ˆø'@úM‚ØE.ˆQˆŽz´£m&$½ B‚  H©!VÊÒ•†T¤Å)NŠ’šô¦7}©(ÐAøô§@„N‡JÔ¢¢% ;TT_v224_html_docs/images/glass/purple/footer-23.gif000700 000765 000765 00000015376 11222361074 021713 0ustar00abwabw000000 000000 GIF89a®P÷8[U*ŠÅ²ÜÃÃÃ[-’ıۭ¢»É¸ÞÁ®ÙK%yÑÑÒo8´ÆÀϼªÔº¨ÑȶÝ̹âôôôÆ´Þ¿¬×«•ÆÄ´ÚrT™Ã°Úϼ沣ݦ¾íííj5¬Íºåäää“y³ïïï̹伲ʾ«Ö¼ªÒ«««ÓÎÙ×ÕÙÀ¯Ö¹¹¹d2¡½¼½ÞÞÞɶ๯ǯ®¯Ë¸ãƵÜʹߵªÂ¾¬Ô¼¬Ñ¾®Ò†k©¹¨ÏÍÍÍØÖÛ™‚¶¼¨Ö»ªÑ®¡¾ÕÕÕæææØØÙ°›ËÚÙÜ_0›·¶·m8²À®Ô±׸§Í¼©ÓÀ°Ôg3§²²²a1âàå¯غ©Îµ¡Î£¿Î»å˺àÈÈÉÅÅÆäáçǶÜòØÂ°Ö];‡¶¥Ê¹°Ãc1 l5®Ê·áÜÚÝó×Á°Ö·­Åh4©J%v¬¡¹º§Ñ¹§ÐèæëéæëíëðíëïéçììêïëéíëéîêèíîìðL'{ðíòðîòñïóñðôòðôòðõóñöõóø÷ôùÇÆÈ¸¥Ð^/˜M){q9¸p8¶l6®n7³e3¤i4ªþþþº§Ò¹§Ñ¸§Îåã誟·¶¦Ìµ¥Êûûû÷÷÷ïíññññâââ§§§êêêO'€r9¸i5ªº¨Òééém6°úúúöööðððq8¶»¨Óq8¸ýýýùùùo8µq8·üüüëëëÀ­Øf3¥i5«m7±òòòÊ·ân7²Èµà¯Úl6±óóó¹§Ï¾«Õλ滨Òl6°½¬Ó¸¦Î·¦ÌÀ­×øøøèè踧Ïj5«·¦Ím6±l6¯¼«Ñãã㺪Ïh4ª²¨¿¶¦Ë»©Ñ¯¤¼¾­Ó³¨Àg4¨¿®Ö¸¨ÍÝÝÝáááöôø¯¯°e3¥»°È¾´Ë¿´Ì·§Ì%ð€L ÈÀ:ðŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ WȺð…0Œ¡ gHÃÚð†8Ì¡whÃy­XBŸÿ‘EÀ­ððˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈEê Óà"à‹ó ‘]EÔÊÖÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“ ìdÿþ„6¤ÑKiÌJ(WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—Àää$ª‘ƒ¼¸âh¦<¥¡ÚÆDéá™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎvºóðŒ§<çIÏzÚóžøÌ§>÷ÉÿÏ~úóŸ ¨@JPŠ¡,øW§Ì/¥Ò¨D'JÑŠZô¢ͨF7ÊÑŽzô£ ©HGJÒ’šT VXÁqƈÌd6:̓LgJÓšÚô¦8Í©NwÊÓžúô§@ ªP‡JÔ¢õ¨HMªR—ÊÔ¦:õ©PªT§JÕªZõªXͪV·ÊÕ®zõ«` «XÇJÖ²šõ¬g-‚Œq‰äHbK‚ àK¥S´Úõ®xÍ«^÷Ê×¾úõ¯€ ¬`KØÂö°ˆM¬b[Ö'”@#->á OD"¨ …f7×Îzö³  ­hGKÚ¸Rç à¢ü‡Öºöµ°­lgKÛÚÿÚö¶¸Í­nwËÛÞúö·À ®p‡KÜâ÷¸ÈM®r—ËÜæ:÷¹Ð®t§KÝêZ÷ºØÍ®v·ËÝîz÷»à ¯xÇ{‚(ÀœØ%"ð Iø¢¥ð„|çKßúÚ÷¾ó½¬~÷Ëßþú÷¿î/ñ3€aÞÈ„‚=4Þ;øÁް„'Lá [øÂΰ†7Ìá{øÃ ±ˆÇ«€"ä @HÅ@á ZDàÅŸˆ±ŒgLãÛxƒȱŽwÌãûøÇ@Öñ€¿@À¢ƒÄ‚¯s‡&;ùÉP޲”§Lå*[ùÊXβ–·Ìå.{ùË`³˜ÇLæ2›ùÌhN³š×Ìæ6»ùÿÍp޳œçLç:ÛùÎxγž÷Ìç>ûùÏ€´ Ýä”à ,08¡â €Ž´¤'MéJSš˜Î´¦7ÍéN{úÓ®pà„Ch¢ Å(”¼d®úհ޵¬gMëZÛúָε®wÍë^ûú×À¶°‡Ml7?!&fÁ4<à ü✈¶´§Míj[›Ú—ȶ¶·Íín{ûÛßN…¸"¨`…0ÂqŠU·Z+vˆ·¼çMïzÛûÞøÎ·¾÷Íï~ûû߸ÀNð‚üàO¸ÂÎð†;üá¸Ä'NñŠ[üâϸÆ7ÎñŽ{üã ¹ÈGNò’›üäôÿ.ï R0€(àC†4X@óšÛüæ8ϹÍ+Áóžûüç@ºÐ‡^ r“:ˆ‡!Ö­j%+åPºÔ§Nõª[ýêXϺַÎõ®{ýë`»ØÇNö²[¼'Hišð‚¸ýíp»Üç.wKØýîxÏ»Þ÷Î÷¾[bê8Cœ° V¢Lw7W&ÁøÆ;þñ¼ä'OùÊ[þò˜Ï¼æ7ÏùÎ{þó ½èGOúÒ›þô¨O½êWÏúÖ»þõ°½ìgOûÚÛþö¸Ï½îwÏûÞûþ÷À¾ð‡ÿúLaï8 ij›Õ[¡ƒô§Oýê[ÿúØÏ¾ö·Ïýî{ÿûà¿ÿøÇOþò›ÿüèO¿ú×Ïþö»ÿýð¿üçOÿúÛÿþøÏ¿þ÷Ïÿþûÿÿ€8€X€x€˜€õç 6°d@\¦Ö|ëv N§ ˜¸Øø ‚"8‚$X‚&x‚(˜‚*¸‚,Ø‚.ø‚æÇ€(@07P_`x°j£ [Ñ@„B8„DX„Fx„H˜„J¸„LØ„Nø„P…R8…TX…Vx…X˜…Z¸…\Ø…^ø…`†b8†dX†fx†h˜†j¸†l؆nø†p‡r8‡tX‡vx‡c˜ 6p(põLÀ¹Pèx˜ˆŠ¸ˆŒØˆŽÿøˆ‰’8‰”X‰–x‰˜˜‰š¸‰œØ‰žø‰T¨‡|è‡h€ `°ƒ¡pˆnЊ®øŠ°‹²8‹´X‹¶x‹¸˜‹º¸‹¼Ø‹¾ø‹ÀŒÂ8ŒÄXŒÆxŒÈ˜ŒÊ¸ŒÌØŒÎøŒÐÒ8ÔXÖxØ˜Ú¸ÜØÞøàŽâ8ŽäÉP6 }ø‡RP«À³°n=¨åXöxø˜ú¸üØþø9Yy™ ¹ÁxŽé¸ŽP¦¨ …`„0Y¹‘Ù‘ù‘ ’"9’$Y’&y’(™’*¹’,Ù’.ù’0“29“4Y“6y“8ÿ™“:¹“<Ù“>ù“@”B9”DY”Fy”H™”J¹”LÙ”Nù”P•=©5РЀP Z¹ð Ð ¦p >˜‘RY–fy–h™–j¹–lÙ–nù–p—r9—tY—vy—x™—z¹—-I•V‰•Z‰B€ ƒ8 ©6&r˜Š¹˜ŒÙ˜Žù˜™’9™”Y™–y™˜™™š¹™œÙ™žù™ š¢9š¤Yš¦yš¨™šª¹š¬Ùš®ùš°›²9›´Y›¶y›¸™›º¹›¼Ù›¾ù›ÀÉšT© ÐÐ pœÀî ñ¸ŠZœÐÒ9ÔYÖyؙڹÜÙÞùàžâÿ9žäYžæÙ™ÃYœÈyœ Px…èœYò9ŸôYŸöyŸø™Ÿú¹ŸüÙŸþùŸ : Z z š  º  Ú ú ¡:¡Z¡z¡š¡º¡Ú¡ú¡ ¢":¢$Z¢&z¢(š¢ªÅP 4РƉœ `jİnc¢¢8š£:º£<Ú£>ú£@¤B:¤DZ¤Fz¤Hš¤Jº¤LÚ¤Nj ,ê¢0ºž3J‘9&s¥Zº¥\Ú¥^ú¥`¦b:¦dZ¦fz¦hš¦jº¦lÚ¦nú¦p§r:§tZ§vz§xš§zº§|Ú§~ú§€¨‚:¨„Z¨†z¨ˆš¨Šº¨ŒÿÚ¨Žú¨Ê§Ìp Å  /ª ˜ª 3ŠIX© ª¢:ª¤Zª¦zª¨šªªºª¬Úª®úª°«²:«´Z«¶Ê¦“Z©—š©›Ú©còÀ¬Â:¬ÄZ¬Æz¬Èš¬Êº¬ÌÚ¬Îú¬Ð­Ò:­ÔZ­Öz­Øš­Úº­ÜÚ­Þú­à®â:®äZ®æz®èš®êº®ìÚ®îú®ð¯ò:¯ôZ¯öz¯ãjQк` ð¯ÿÚ«WªøZ°{°›° »° Û°û°±;±[±{±›±»±Ôª¯üê¯;ë©ZÁ&{²(›²*»²,Û².û²0³2;³4[³6ÿ{³8›³:»³<Û³>û³@´B;´D[´F{´H›´J»´LÛ´Nû´PµR;µT[µV{µX›µZ»µ\ÛµI«¯Ë@¶` #P¶#0²câµj»¶lÛ¶nû¶p·r;·t[·v{·x›·z»·|Û·~û·€«³`+¶dk¶h«k¸Š»¸ŒÛ¸Žû¸¹’;¹”[¹–{¹˜›¹š»¹œÛ¹žû¹ º¢;º¤[º¦{º¨›ºª»º¬Ûº®ûº°»²;»´[»¶{»¸›»º»»¼Û»¾û»À˺ ûÚ P¸g{œ:°Y¼Îû¼Ð½Ò;½Ô[½Ö{½Ø›½Ú»½ÜÛ½Þû½àÿ¾â;¾äÛ¹Ã[¼Çk¸Êë«Z¡îû¾ð¿ò;¿ô[¿ö{¿ø›¿ú»¿üÛ¿þû¿À<À\À|ÀœÀ ¼À ÜÀüÀÁ<Á\Á|ÁœÁ¼ÁÜÁüÁ Â"<Â$\ÂŒI€Ë ÆÛ‡›&Ã2<Ã4\Ã6|Ã8œÃ:¼Ã<ÜÃ>üÃ@ÄB<ÄD\ÄF|ÄŒÂ*ÌÂ-Ü/ìHÅR<ÅT\ÅV|ÅXœÅZ¼Å\ÜÅ^üÅ`Æ3¬Ä+ÜÄN¼¾Ìëü°ÆlÜÆnüÆpÇr<Çt\Çv|ÇxœÇz¼Ç|ÜÇ~üǀȂ<È„\Ȇ|ȈœÈŠÿ¼ÈŒÜÈŽüÈÉ’<É”\É–|ɘœÉš¼ÉœÜÉžüɠʢìÈh  8à+¬ª¬O<Ê®üʰ˲<Ë´\˶|˸œËº¼Ë¼Ü˾üËÀÌÂ<ÌÄìÇX Ä¨¼ÊªÜÊÅÜÌÎüÌÐÍÒ<ÍÔ\ÍÖ|ÍØœÍÚ¼ÍÜÜÍ®|>µà¸ ÊÌÌÞœÎê¼ÎìÜÎîüÎðÏò<Ïô\ÏöLÌà j@Îæ¼ÊUʾYqÏ]Ð}ÐÐ ½Ð ÝÐýÐ÷Ìá<θPÎçL£6ª°ÑÝÑýÑ Ò"=Ò$]Ò&}Ò(Ò*½Ò,ÝÒ.ýÒ0Ó2=Ó4ÿ]Ó6}Ó8Ó:½Ó<ÝÓ>ýÓ@ÔB=ÔD]ÔF}ÔHÔJ½ÔLÝÔNýÔPÕRÓà`^àʰ µ0i° ¢ðÕ_ÖÀ ï9&ŽpÖhÖj½ÖlÝÖnýÖp×r=×t]×v}×x×z½×|Ý×~ý׀؂=Ø„]؆}؈؊½ØŒÝØŽýØÙ’=Ù”]Ù–}Ù˜Ùš½ÙœÝÙž]ØhàÀ Z­]]Î` íÉœ‡©ðÚ°Û²=Û´]Û¶}Û¸Ûº½Û¼ÝÛ¾ýÛÀÜÂ=ÜÄ]ÜÆ}ÜÈÜʽÜÌÝÜÎýÜÐÝÒ=ÝÔ]ÝÖ}ÝØÝÚ½ÝÜÝÝÞÿýÝàÞâ=Þä]ÞæÜ]ÞÊÀ ¼ ¥ÝÕ^ Ö¢@„Ɇ Ÿþðú½ßüÝßþýßà>à^à~àžà ¾à Þàþàá>á^á~ážá¾áÞáþá â">â$^â&~â(žâ*¾â,Þâ.þâ0ãÞÞîÍü¬ßà›°ã<þ]ù•a9–þÀD^äF~äHžäJ¾äLÞäNþäPåR>åT^åV~åXžåZ¾å\Þå^þå`æb>æd^æf~æhžæj¾ælÞænþæpçr>çt^çv~çxžçz¾ça ÀP j ‹à:Îãé”^é–~阞难éœÞéžþé ê¢>ê¤^ê¦~ꨞꪾê¬Þê®þê°ë²>ë´^ë¶~븞뺾ë¼Þë¾þëÀìÂ>ì­>è…nè;N‚ðŽñx‘BNìÐíÒ>íÔ^íÖ~íØžíÚ¾íÜÞíÞþíàîâ>îä^îæ¾é‹îéžì®îîî¦ø ©x˜B®îö~ïøžïú¾ïüÞïþþïð?ð_ððŸð ¿ð ßðÿðñ?ñ_ññŸñ¿ñßñÿñ ò"?ò$_ò&ò(Ÿò*¿òÏî.ÿîï~‚ÿHˆ†(ä0ó8Ÿó:¿ó<ßó>ÿó@ôB?ôD_ôFôHŸôJ¿ôLßôNÿôPõR?õT_õVõXŸõZ¿õ\ßõ^ÿõ`öb?öd_öföhŸöj¿öb/å9Xª¸èþàòv÷xŸ÷z¿÷|ß÷~ÿ÷€ø‚?ø„_ø†øˆŸøŠ¿øŒßøŽÿøù’?ù”_ù–ù˜Ÿùš¿ùœßùžÿù ú¢?ú¤_ú¦ú¨Ÿúª¿úž?È|ÎgB^÷¬_û¶û¸Ÿûº¿û¼ßû¾ÿûÀüÂ?üÄ_üÆüÈŸüÊ¿ü‡SðïPÀÁ@Ï÷n ýÚ¿ýÜÿßýÞÿýàþâ?þä_þæþèŸþê¿þìßþîÿþðÿò?ÿô_ÿöÿøŸÿú¿ÿü $XÐàA„ .dØÐáCˆ%N¤XÑâEŒ5näØÑãG!EŽ$YÒäI”)U®T‰)@ &ˆ8jµ€P¨Qƒ2ùãÉóÐO A…%ZÔèQ¤I•.eÚÔéS¨Q¥N¥ZÕêU¬YµnåÚÕëW°aÅŽ%[ÖìY´iÕ®eÛÖí[¸qåÎ¥[×.Xk«V11£‰˜Y†lâÔÙ³'"ĉ/fÜØñcÈ‘%O¦\ÙòeÌ™5oæÜÙógСE&]ÚôiÔ©U¯fÝÚõkرeϦ]ÛöÿmܹuïæÝÛ÷oÔš4±âð·Ð,X L:•3ÓNÃþ M§^ÝúuìÙµoçÞÝûwðáÅ'_ÞüyôéÕ¯gßÞý{øñåϧ_ßþ}üùõïçßßÿp@ 4ð@T>br™eX[Ž°ç ‹Î 3ÔpC;ôðCCqDK4ñDSTqE[tñEc”qFk´ñFsÔqG{ôñG ƒrH"‹4òH$“TrI&›tòÉR9BnÊI' £ó§J.»ôòK0ÃsL2Ë4óL4ÓTsM6ÛtóM8ã”sN:ë´óN<óÔsO>ûôóO@tPB 5ôPDUÛtQFuôQH#•ÔÏPB9¥9ç*ÔÒ°A:õôSPCuTRK5õTTSUuUV[uõUXc•uVZkµõV\sÕuW^{õõW`ƒvXb‹5öXd“UvYf›uöYh£•vZj…­ð¹M³Õv[n»õö[pÃw\rË5÷\tÓUw]vÛu÷]xã•w^zëµ÷^|óÕw_~ûõ÷_€x`‚ 6ø`„Vxa†vøaˆ#–xbŠ+¶øbŒ3ÖxcŽ;öøcCyd’K6ùd”SVye–[vùe˜c–yfšk¶ÙÛ€;TT_v224_html_docs/images/glass/purple/footer-24.gif000700 000765 000765 00000002233 11222361074 021700 0ustar00abwabw000000 000000 GIF89aF÷8[U*ŠÅ²ÜÃÃÃ[-’ıۭ¢»É¸ÞÁ®ÙK%yÑÑÒo8´ÆÀϼªÔº¨ÑȶÝ̹âôôôÆ´Þ¿¬×«•ÆÄ´ÚrT™Ã°Úϼ沣ݦ¾íííj5¬Íºåäää“y³ïïï̹伲ʾ«Ö¼ªÒ«««ÓÎÙ×ÕÙÀ¯Ö¹¹¹d2¡½¼½ÞÞÞɶ๯ǯ®¯Ë¸ãƵÜʹߵªÂ¾¬Ô¼¬Ñ¾®Ò†k©¹¨ÏÍÍÍØÖÛ™‚¶¼¨Ö»ªÑ®¡¾ÕÕÕæææØØÙ°›ËÚÙÜ_0›·¶·m8²À®Ô±׸§Í¼©ÓÀ°Ôg3§²²²a1âàå¯غ©Îµ¡Î£¿Î»å˺àÈÈÉÅÅÆäáçǶÜòØÂ°Ö];‡¶¥Ê¹°Ãc1 l5®Ê·áÜÚÝó×Á°Ö·­Åh4©J%v¬¡¹º§Ñ¹§ÐèæëéæëíëðíëïéçììêïëéíëéîêèíîìðL'{ðíòðîòñïóñðôòðôòðõóñöõóø÷ôùÇÆÈ¸¥Ð^/˜M){q9¸p8¶l6®n7³e3¤i4ªþþþº§Ò¹§Ñ¸§Îåã誟·¶¦Ìµ¥Êûûû÷÷÷ïíññññâââ§§§êêêO'€r9¸i5ªº¨Òééém6°úúúöööðððq8¶»¨Óq8¸ýýýùùùo8µq8·üüüëëëÀ­Øf3¥i5«m7±òòòÊ·ân7²Èµà¯Úl6±óóó¹§Ï¾«Õλ滨Òl6°½¬Ó¸¦Î·¦ÌÀ­×øøøèè踧Ïj5«·¦Ím6±l6¯¼«Ñãã㺪Ïh4ª²¨¿¶¦Ë»©Ñ¯¤¼¾­Ó³¨Àg4¨¿®Ö¸¨ÍÝÝÝáááöôø¯¯°e3¥»°È¾´Ë¿´Ì·§Ì%øÌcꩨ¦ªêª¬¶êê«°Æÿ*무Öjë­¸æªë®¼öêë¯À+ì°Äkì±È&«ì²Ì6ëì³ÐF+í´ÔVkíµØf«í¶ÜFK*>sÔSÆú,Ê£µAú‘¤–¶ën|FrÈ…èÀ:¤aEûôkÏ¿,ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñÅg¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ4׌r¿ûˆqO`̃O=c$z©Û»ï&­tb™nŠH!nXÇ8I¨pB“è¡õÖ\wíõ×`‡-öØd—möÙh§­öÚl·íöÛpÇ-÷Üt×m÷Ýxç­÷Þ|÷ÿí÷߀.øà„nøáˆ'®øâŒ7îøãNË$§°Š=bô ´ŒÝÑÿ ½ôè¤KÔ´ ˆ´ã,’Ä \tãÍ´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üòÌ7ïüóÐG/ýôÔWoýõØg¯ýöÜwïý÷à‡/þøä—oþù觯~ø ,Ø2Ä$ ìÆÏåòã¹Ñ¢—îÿÿ1Ò!Rçˆ*´Î \xB\À Ð9ðŒ 'HÁ Zð‚Ì …ò|ÜãC˜ÀlÁPˆ!sÈßþ Õ?ºð™šW! ø©8a¨F¸Áúð‡@ ¢ÿ‡HÄ"ñˆÔÇ @ƒSØã~c ‡þŠÆB¬œfR/Ì"éú°©BD‚uT8ƒ€ c‡HL£×ÈÆ6ºñpŒ£{È)Làr¸>¢8ÅÏõ¨…Z d»b˜ºM '(Á%.d ÒX$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨ä 0PèQ…T$ IË!eŠS‘¨B*¬€†E2Ò‘L¥0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4½óÀCaH!ä‘.YZ>µ '‘¸¸†vH‚‹ˆC|ÙÈGFršðŒ§<çIÏzÚóžøÌ§>÷ÉÿÏ~f’àÀP3ô±=³§BWÃED¸ ~PÁ Ø™Ã#dàþ̨F7ÊÑŽzô£ ©HGJÒh†pûÈG¤H4oH )kúpˆ?8bI·èE«aQŒ–ô§@ ªP‡JÔ¢õ¨HMê&i`‹Sˆaôàf,A“P™Zµ,jàÔ(ɇu.²Œ<½¨RÇJÖ²šõ¬hM«Z×ÊVQ–aC`Á=´)ÕÑTõªxKV ! R,â ¦À€`søÈDCGˆM¬bËØÆ:ö±¬d'KÙÊZö²˜Í¬f7ËÙÎzö³  ­hGKÚÒšö´¨M­jWËÚÖºöµ°­lgKÛÚÿÚö¶¸Í­nwËÛÞú–±¨€äz°tªž¹k^—‘¬¶c­kƒ`[Âö·ØÍ®v·ËÝîz÷»à ¯xÇKÞòš÷¼èM¯z×ËÞö–×4@é<¢(U?~F¹ÌÍ/EÊ)ŠOIwº„Í€aÝKàøÀN°‚Ìà;øÁް„'LaÛÒq«>¶‰\ÎàW¿ >ˆÖðPÿRâÄ'€E? ¹øÅ0ޱŒgLãÛøÆ8αŽwÌãûøÇ@²‡Lä"ùÈHN²’—Ìä&;ùÉP޲”§Lå*[ùÊXβ–·Ìå.{ùË`³˜ÇLfw¸Å=®};óá»Yÿ #~(ÞЧxÅ-.³ž÷Ìç>ûùÏ€´ MèBúЈN´¢ÍèF;úщŽA|÷1ߨv“Íß„é›78³aÎu¶³ŠœgH›úÔ¨NµªWÍêV»úհ޵¬gMëZÛšËfÀ°\éÚáÌ´™Óúõ4¨@lb#À=øÀ9lÄìf;ûÙÐŽ¶´§Míj[ûÚØÎ¶¶·Íín{ûÛà·¸!4á׸ÅôK±ìvûCØt.¶±‘­ìqÛûÞøÎ·¾÷Íï~ûû߸ÀNð‚\F’–/}/­™_»;¯ðnƒ¼1á  ϸÆ7ÎñŽ{üã ¹ÈGNò’›œÛúÿе†9¼f_gšÝßtÄ'^ñ\üä8ϹÎwÎóžûüç@ºÐ‡îñU¢Ý-ÝŒÃcnÕ™›âÇ8ѧNõª[ýêXϺַÎõ®w;á”^x¯)³t¦Ç4â˜H;Å%Ѓ+@dˆ»ÜçN÷ºÛýîxÏ»Þ÷Î÷¾ûýàOøÂþðˆO¼âÏøÆ;þñ¼ä'OùÊ[þò˜Ï¼æ7ÏùÎ{þó ½èGOúÒ›þô¨çûTÎë–[¦ìfW(ÚÕî ¶»î©Ï½îwÏûÞûþ÷À¾ð‡OüâÿøÈO¾ò—Ïüæ;¿ùF?·šþòØs:âÈ~ö…€¼]Qà¿ÿøÇOþò›ÿüèO¿ú×Ïþö»ÿýð¿üçOÿúÛÿþøÏ¿þ÷Ïÿþûÿÿ€8€X€x€˜€ ¸€ Ø€ø€8XØ~`Wiõårëf}2GbŸFgÚ·}Ý÷}x‚(˜‚*¸‚,Ø‚.ø‚0ƒ28ƒ4Xƒ6xƒ8˜ƒ:¸ƒ<ȃeÀzVW˜{HKا}ÜçvY =Ø„Nø„P…R8…TX…Vx…X˜…Z¸…\Ø…}i–n¯W}EbGH‚JÈ„^¸†l؆nø†p‡r8‡tX‡vx‡x¸ƒÈG 7DX†ZqB0ˆÜW€ ˆ²ˆŒØˆŽÿøˆ‰’8‰”X‰–x‰˜˜‰š¸‰œØ‰žø‰ Š¢8ФXЦxЍ˜Šª¸Š¬ØŠ®øŠ°‹²8‹´X‹¶x‹¸˜‹º¸‹¼Ø‹¾ø‹ÀŒšX@Èr—ñ‡€øB‚HˆØ`ˆˆ¨ˆÂÒ8ÔXÖxØ˜Ú¸ÜØÞøàŽâ8ŽäXŽæxŽˆ²J?0P%†~H†ÉÈ\·ô¸ @-‰h(üØþø9Yy™ ¹ Ùù‘™&¸Rî(Èÿ3õxù¸’"9’$Y’&y’(™’*¹’,Ù’.ù’0“þ8@r…Aÿ؇€‘‘Y:iø¨ )“DY”Fy”H™”J¹”LÙ”Nù”P•‰ M0 M99vƒ=yU?é‘B)R9–dY–fy–h™–j¹–lÙ–n)•v4\••Z™<Ù•KqD°—øˆú(30‚9˜„Y˜†y˜ˆ™˜Š¹˜ŒÙ˜Žù˜™’9™”Y™–y™˜™™š¹™œÙ™žù™ š¢9š¤Yš¦yš¨™šª¹š¬Ùš®ùš°›²9›´Y›¶y›¸™›–Ù1@ öP\°Ä#}q—x™4zÉ—-à—˜ºÙœÎùœÐÒ9ÔYÖyؙڹÜÙÞùàžâÿ9ž‡É `“0Ps4Œ24ŠEJ¦1 …p Åé• jKŸù‰5 00e : Z z š  º  Ú ú ¡:¡Z¡z¡š¡º¡Ú¡ú¡ ¢":¢$Z¢&z¢(š¢*º¢,Ú¢.ú¢0£2:£4Z£6z£8j¡ÐC@ y4@£‰²(÷"T°UÐ×€)õ¹P§ŸûÙŸÿ™£Vz¥Xš¥Zº¥\Ú¥^ú¥`¦b:¦dZ¦fz¦hš¦jº¦lŠ #ÐFð,°÷à".ãò™}BH*  ïp$öñ¤âq¦p¨8€>@¥áÿPŽú¨©’:©”Z©–z©˜š©šº©œÚ©žú© ª¢:ª¤Zª¦zª¨šªªºª¬Úª®úª°«²:«´Z«¶z«¸š«ºº«¼Ú«¾ú«À¬Â:¬ÄZ¬¥z àƒ@ , tÊ3ù­Ò:­ÔZ­ÖZ­Þ‚ä Ið~`… „ NJ¨‚d¨ˆª¨Œj¬ìÚ®îú®ð¯ò:¯ôZ¯öz¯øš¯úº¯üÚ¯þú¯°{©§ M@ƒð”c9  û°±;±›28ÓV€l …°‡0®ƒj®xŸt–¨‰º¨þ :°.û²0³2;³4[³6ÿ{³8›³:»³<Û³>û« )ж@C0À<0LÛ´Nû´PµM‹ …3 ]p*ãÖà…€âJ®$[²rv²(«²0À²?»¶lÛ¶nû¶p·r;·t[·v{·xû¯rpvÔí¸‚;¸„[¸… >ÞÐ \pI°ÀŽÐ`+²c«Œ&Û>¹‹Ê!Ð Psº¢;º¤[º¦{º¨›ºª»º¬Ûº®ûº°»²;»´[»¶{»¸›»º»»¼Û»¾û»À¼Â;¼Ä[¼Æ{¼È›¼Ê»¼ÌÛ¼Îû¼Ð½Ò;½Ô[½Ö{½Ø›½Úû E OÀVÿà¸U¹ˆpäÚ• @Çì˾ ¬ ¾ð-ô[¿ö{¿ø›¿ú»¿üÛ¿þû¿À<À\À|ÀœÀ ¼À ÜÀüÀÁ<Á\Á|ÁœÁ¼ÁÜÁüÁ Â"<Â$\Â&|Â(œÂ*¼Âßâ  !PNpÞ:¾k¾è›¾þ³¾íËï¿óËÂB<ÄD\ÄF|ÄHœÄJ¼ÄLÜÄNüÄPÅR<ÅT\ÅV|ÅX\Â.Ì ! g@ áJ9¬Ã¤ÃÃîÛ¹/ü YüÆpÇr<Çt\Çv|ÇxœÇz¼Ç|ÜÇ~üÇ€ü-¯ð­ÐÅ 'ÿ° ’‹ÃhœÆ—ÛÃïë¹ àÆ|ɘœÉš¼ÉœÜÉžüɠʢ<ʤ\Êø0È PÈ À>`V U@Æ‚ ¶œ——›¸<ɬ` Ð ÝòËÀÌÂ<ÌÄ\ÌÆ|ÌÈœÌʼÌÌÜÌÎüÌÐÍÒ<ÍÔ\ÍÖ-½À&À ªœ‹@’Ðk`ƵlËeÛ¹¬Ë¼ìË×üÎðÏò<Ïô\Ïö|ÏøœÏú¼ÏüÜÏþüÏÍ,Ù¼ÍÝh ~Àn€æ|ÎÆy¹†ц° Á`ÃÀ¼p­½ÑÝÑýÑ Ò"=Ò$]Ò&}Ò(Ò*½Ò,ÝÒ.ýÒ0Ó2=Ó4ÿ]Ó6}Ó8Ó:½Ó<ÝÓ>ýÓ@ÔB=ÔD]ÔF}ÔHÔJ½ÔLÝÒ¼ÀÃ`Á° ­·à§Žð‡pÆÝ.'Ñ]ÑÑM]Öf}ÖhÖj½ÖlÝÖnýÖp×r=×t]×v}×x×z½×FýÔQ=Õí| È£®0×ÕDòÕ½ ° ij |=Ù”]Ù–}Ù˜Ùš½ÙœÝÙžýÙ Ú¢=Ú¤-­±0 9@ «ÐTmžp‹@ ’`؈í.Š=ÑýØ‘]Ú¼ÝÛ¾ýÛÀÜÂ=ÜÄ]ÜÆ}ÜÈÜÊ­§Ú«ÝچЎËȳ\Û^}¹ Ý Å0 9ÿà°â=Þä]Þæ}ÞèÞê½ÞìÝÞîýÞðßò=ßô]ßö}ßøßú½ßüÝßþýßà>à^à~àžà ¾à Þàþàá>á^á~ážá¾á°à90 Å ÚÝmà­¢@·mÝôq#ÎÝÞ Þã2>ã4^ã6~ã8žã:¾ã<Þã>þã@äB>äD^äF~äCÞáâ#^â íkâ*.ÇVκРÆ0 à^þå`æb>æd^æf~æhžæj¾ælÞænþæpçr>çt^çv~çxžçz¾ç|Þç~þç€è‚>è„^è†~èˆÿžèоèŒÞèŽþèé’>é”^é–~é> ÆÐ ºpåŒPâp ÐQ>å”RåWžå[Þå—¾ê¬Þê®þê°ë²>ë´^ë¶~븞뺾ë¼Þë¾þëÀ켞é›ÞéWê¢.å¤Îg Î ³€`÷píØžíÚ¾íÜÞíÞþíàîâ>îä^îæ~îèžîê¾îìÞîîþîðïò>ïô^ïö~ïøžïú¾ïüÞïþþïð?ð_ððŸð ¿ð ßðÿðo€³ În ÈåʾìªÑìÏíÓ^í_ò&ò(Ÿò*¿ò,ßò.ÿò0ó2ÿ?ó4_ó6ó8Ÿó:¿ó7/ñoñïì?ê$ HŸ Šð \þÖÎóPõR?õT_õVõXŸõZ¿õ\ßõ^ÿõ`öên/à³ð Š H CßñEÏGŸôKßôO/öv÷xŸ÷z¿÷|ß÷~ÿ÷€ø‚?ø„_îdoöh¯öHßöo¿â—«¿ô¥€ /PH ˜Ÿùš¿ùœßùžÿù ú¢?ú¤_ú¦ú¨Ÿúª¿ú¬ßú®ÿú°û²?û´_û¶û¸Ÿûº¿û¼ßû¾ÿûÀüÂ?üÄ_üÆüÈŸüÊ¿üÌßüÎÿüÐýHP/€ ¥€ö‘ÏøOåÿù¿0ù•ùÑ?þä_þæþèŸþê¿þìßþîÿþðÿò?ÿô_ÿöÿøŸÿô?ýÕ¥~)"¨¨Í8lܬQãÏáCˆ%N¤XÑâEŒ5näØÑcD5kܰó¦ ”8yª¥’}1eΤYÓæMœ9uîäÙÓçO A…%ZÔèQ¤I•.eÚÔéS¨Q¥N¥ZÕêU¬YµnåÚÕëW°aÅŽ%[ÖìY´iÕ"©¥–'N))L¸°áG¼yõîåÛ7oÈ‘%O¦ä¤ªÖ‹—j/fÜØñcÈ‘%O¦\ÙòeÌ™5oæÜÙógМپ¨¥*nJº úeÝÚõkØ E’4)·”ÿaÄ0CïæÝÛ÷oàÁ…'^ÜøqäÉ•/gNttéRrSÛ]ÝúuìÓ¬ÒÓ³JQ\Yh^ÞüyôéÕ¯gßÞý{øñåÏjÁU”JÏà¢F¨únv¯í#ì»DijútðA#”pB +´ðB 3D ûÜÒï´¹ú£n@K4Q¶ÀLòdE+©Ãmx°gFk´ñFsÔqG{ôñG ƒrH"‹4òH$“TrI&›tòI(£”rJ*«´òJ,³ÔrK.»ôòK0ÃsL2Ë4óL4ÓTsM50@“:*ID?§[íD<óÌn;?TdÑ@ÂÓD‹ä`óPDUÿtQFuôQH#•tRJ+µôRL3ÕtSN;­TŽ´Ð?@þôä ?üÓsUV] ©QúlÃÔg©M¶áÆS^{õõW`ƒvXb‹5öXd“UvYf›’›m4GN:ë|ÃQÚ¹³Un»õH AÚÙä‘EÚäÜsɤ‘:4ñ@›à¡Fzëµ÷^|óÕw_~ûõ÷_€x`‚ 6ø`„Vxa†vøaˆ#–xbŠ+¶øbŒ3ÖxcŽ;öøcCyd’K6ùd”SVye–G¦ž´ñÎF2IÝsÛHæ‘MÚä?oƒš"p ‘„”E”Ég@l¥£]&´0à;ª¶ÿúj¬³Özk®»öúk°Ã{l²Ë6ûl´ÓV{m¶Ûvûm¸ã–{nºë¶ûn¼óÖ{o¾ûöûoÀ|p 7üpÄW|qÆ'ü´`N:ädze!E’B~úsÐ*z‚ࣦխäéPî`‚ bÇcvÚk·ývÜs×}wÞ{÷ýwàƒ~xâ‹7þxä“W~yæ›wþy裗~zê«·þzì³×~{î»÷þ{ðÃ|òË7ÿ|ôÓW}îc÷àõ;B©£r›™vጠ¥s C÷¿Õ>⎠€,nQt%"^ðB#X÷ ×½îuy `-xA fPƒä`=øÿA†P„#$a MxB¦P…+da ]øBÆP†3¤a mxCæP‡;äa}øC QˆC$bxD$&Q‰Kdâ%¿OÈð‚Ínv®ÜBpÄчÿ…€„@ÄHü àL]™h ëP‡P|BŽw cíxG<æQ{äcýøG@Rƒ$d! yHD&R‘‹dd#ùHHFR’“¤d%-yILfR“›äd'=ùIP†R”£$e)MyJT¦R•«de'åÅ7N‘Š™¨ºl ‚T¹„£}‰§>b í$Pll#œùFhFSšÓ¤f5­yMlÿfS›Ûäf7½ùMp†Sœã$g9ÍyNt¦Sëdg;ÝùNxÆSžó¤g=íyO|æSŸûäg?ýùO€T %hA zÐ~:S– ´â=Q„8,‚’Ð/yÑõ¡h‘¨B*¬`†T¤p BMzR”¦T¥+eiK]úR˜ÆT¦3¥iMmzSœæT§;åiO}úS U¨C%jQzT¤&U©KejSúT¨FUªS¥jU­zU¬fU«[åjVI*R°ÚÀ ©¨B$ø×KŒ¦5;="ÄUº@¬s¥k]ízW¼æU¯{åk_ýúWÀV°ƒ%la {XÄ&V±‹elcûXÈFVÿ²“¥le-{YÌfV³›ålg=ûYІV´£%miM{ZÔ 'È_Ïq5 U­³­N0QˆH°áT8A6òZàW¸Ã%nq{\ä&W¹Ëensû\èFWºÓ¥nu­;ܰխè%ETpv”`Ë@q‘|d$'YÉKÿfr“üd(GYÊS¦r•­|e,gYË[±ŠKÀŽ3¨ ¤€q;^ÛßXÍyÑ(!±c6>¾E:”Ñ<çYÏ{æsŸýüg@ZЃ&t¡ }hD'ZÑ‹ft£ýhHGZÒ“¦t¥-}iLgZÓ›æt§=ýiP‡ZÔ£&u©M}jT§ZÕ«fu«]ýjXÇZ鸅˜á@68ÂÌàíš}Í—6¿¹nDà‡-a‹HÆœýlhG[ÚÓ¦vµ­}mlg[ÛÛæv·½ýmp‡[Üã&w¹Í}nt§[Ýëfw»ÝýnxÇ[Þó¦w½í}o|ç[ßûæw¿ýýo€\à'xÿÁ >ðd,;[ðª 7¼Nó¯-¾‘«‡XÃÚ I°ÁØx„ü”§\å+gyË]þr˜Ç\æ3§yÍm~sœç\ç;çyÏ}þs ]èC'zÑ~t¤']éKgzÓþt¨G]êS§zÕ­~u¬g]ë[çz×½þu°oÝä €ÃÙ ‰H´ã3&š/þvä8؈ð¸"1 IlBlà{ßýþwÀ^ðƒ'|á xÄ'^ñ‹g|ãÿxÈG^ò“§|å-yÌg^ó›ç|ç=ÿyЇ^ô£'}éMzÔ§^õ«g}ë]ÿzØÇ^ö³§}ìE± IŒ"nPûÄÛÿ.w¸¿#׸ Ö@÷B¢ípCóÿ|èG_úÓ§~õ­}ìg_ûÛç~÷½ÿ}ð‡_üã'ùÍ~ô§_ýëgûÝÿ~øÇ_þó§ýíüç_ÿûçÿýÿ @@,@\¾äûDX^s;á{@Œ“;Û¸Cã[ Ì@ Ü@ì@ü@ AA,AÌ”@5èB/üB0 C1C2,C3ìC?üC@ DADB,DCúñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉIG‚â“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈLæ.ÀÌf:ó™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎvºóðŒ§<çIÏzڟȧ>÷ÉÿÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽzô£ ©HGZQO˜ô¤(M©JWÊÒ–ºô¥0©LgJÓšÚô¦8Í©NwÊÓžúô§@ ªP‡JÔ¢õ¨HMªR—ÊÔ¦:õ©Pê=¦JÕªZõªXͪV·ÊÕ®zõ«` «XÇJÖ²šõ¬hM«Z×ÊÖ¶ºõ­p«\çJ׺Úõ®xÍ«^÷Ê×¾úõ¯€ ¬`KØÂö°~í‡bËØÆ:ö±¬d'KÙÊZö²˜Í¬f7ËÙÎzö³  ­hGKÚÒšö´¨M­jWËÚÖºöµ°­lgKÛÚÿÚö¶¸Í­nwËÛÞúö·À ®p‡KÜâ÷¸ÈM®r—ËÜæ:7¹ùˆ®t§KÝêZ÷ºØÍ®v·ËÝîz÷»à ¯xÇKÞòš÷¼èM¯z×ËÞöº÷½ð¯|çKßúÚ÷¾øÍ¯~÷Ëßþú÷¿°€LàóN°‚Ìà;øÁް„'Lá [øÂΰ†7Ìá{øÃ ±ˆGLâ›øÄ(N±ŠWÌâ»øÅ0ޱŒgLãÛøÆ8αŽwÌãûãÇ@²‡Lä"ùÈHN²’—Ìä&;ùÉP޲”§Lå*[ùÊXβ–·Ìå.{ùË`³˜ÇLæ2›ùÌhN³š×Ìæ6»ùÿÍp޳œçLç:ÛùÎxγž÷Ìç>ûùÏ€´ íç úЈN´¢ÍèF;úÑŽ´¤'MéJ[úҘδ¦7ÍéN{úÓ µ¨G-é˜úÔ¨NµªWÍêV»úհ޵¬gMëZÛúָε®wÍë^ûú×À¶°‡-ë[ûØÈN¶²—Íìf;ûÙÐŽ¶´§Míj[ûÚØÎ¶¶·Íín{ûÛà·¸Ç-m[˜ûÜèN·º×Íîv»ûÝðŽ·¼çMïzÛûÞøÎ·¾÷Íï~ûû߸À.ïZüàO¸ÂÎð†;üá¸Ä'NñŠ[üâϸÆ7ÎñŽ{üã ¹ÈG.qZ˜üä( O¹ÊWÎò–»üå0¹ÌgNóšÛüæ8ϹÎwÎóžûüç@ºÐ‡.óYýèHOºÒ—Îô¦;ýéPºÔ§Nõª[ýêXϺַÎõ®{ýë`»ØÇ.õ˜ýìhO»Ú×Îö¶»ýíp»ÜçN÷ºÛýîxÏ»Þ÷Î÷¾ûýàOøÂþðˆO¼âÏøÆ;þñ¼ä'OùÊ[þò˜Ï¼æ#;TT_v224_html_docs/images/glass/purple/header.gif000700 000765 000765 00000035457 11222361074 021425 0ustar00abwabw000000 000000 GIF89aà‚÷P'}L$xŠŠŠb0„„„].•r9¹–––‚‚‚žžžœœœ’’’ʼه‡‡Â¹ËkR†l6®J$t¢¢¢ÈºØ   ŽŽŽÂµÐ¥¥¥˜˜˜ŒŒŒf3¤O%zššš6Sˆˆˆwwwp8µT)…ƸÖ9[M&y”””ĹÑR(Y,ĶÕV*ˆ©™»n7²h4¨`0šZ,d2 ƒm›µ¥Çk5«j4«p8´n8³¹²Á\-’ƺÔe2¢É¼Ùm6¯^0™h3¦`/˜–ƒ¬È»ÖN&|5UX+ŒÆ¸ÔC!ic1ž=af2£X+ŠÇºÖ÷Òg4¦i4©S(‚^/—ŸÔÁ²ÓS)ƒÇ¹×»´ÃQ'ÍÈÓ1MJ#rL$uH"oI#pýýýL%vË¿Ùúúú7XöööøøøõõõçççìììK$vîîîïïïA g3QǻԿ·ÇþþþO&{˾ÙN&yM%xN%xO&zN%yJ$sI#qJ#qK$tM%vN&zÌ¿ÙʾØÉ½Ö˾ØJ#sH#p¾·ÅǼÓȼÔâââ§§§óóóc1Ÿ(AI#rH$tK#t{{{ÞÞÞ~~~äääÖÖÖxxxÁÁÁyyyÚÚÚzzzÉÉÉÃÃÃ|||ÑÑÑÒÒÒÓÓÓªªª}}}ÂÂÂÏÏÏÈÈÈ×××ÍÍÍØØØæææÇÇÇÜÜÜÊÊÊÔÔÔ¿¿¿ÀÀÀ¸¸¸«««ÛÛÛÎÎÎÌÌÌÐÐЯ¯¯ËË˺ºº½½½ßßßÙÙÙ¼¼¼µµµ»»»¾¾¾ãããÝÝÝàààÄÄÄÆÆÆ­­­©©©ááá®®®²²²ÅÅÅååå³³³¶¶¶···´´´ÕÕÕ¨¨¨°°°¬¬¬¹¹¹¦¦¦±±±n7±j5ªq9·É½×ȼÕɼ×L%wN&{ʽؼµÄȼÖȽշ°Àʽٷ°¿¶¯¿½¶ÄH#qd1¡Ê¾×öõ÷8UÜØßQ5pL&wíëîN'{ɽÕñññèèèüüüòòòðððíííôôôêêêùùùëëë÷÷÷éééûûûÿÿÿ!ù,à‚ÿ»H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£J*Ò‹Õ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓvó¨^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàËÿÏ®§¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒF(á„Vhá…f¨á†vHá †(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ $tÖiçxæ©çž|öé矀*è „j衈&ªè¢Œ6êè£F*餔Vj饘fªé¦œvêé§ †*ꨤ–jꩨ¦ªêª¬ŽºÇ«°Æÿ*무Öjë­¸æªë®¼öêë¯À+ì°Äkì±È&«ì²Ì6ëì³ÐF+í´ÔVkíµØf«í¶Üvëí·à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ+ï¼ôÖkï½øæ«ï¾üöëï¿,ðÀlðÁ'¬ð 7ìðÃG,ñÄÈrañÅg¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ4×lóÍ8ç¬óÎ<÷ìóÏ@-ôÐDmôÑH'­ôÒL7íôÓPG-õÔTWmõÕXg­õÖ\wíõ×`‡-öØd—möÙ6ƒ¡öÚl·íöÛpÇ-÷Üt×m÷Ýxç­÷Þ|÷ÿí÷߀.øà„nøáˆ'®øâŒ7îøãG.ùä”Wnùå˜g®ùæœwîùç ‡.zæ|”nú騧®úꬷîúë°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üòÌ7ïüóÐG/ýôÔWoýõØg¯ýöÜwO=à‡/þøä—oþù觯þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ  HÀð€L ÈÀ:ðŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ WȺð…0Œ!ë@ÃÚð†8Ì¡wÈÃúð‡@ ¢ÿ‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ1ÞápŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”žœƒ*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›à §8³i‡ršóœèL§:×ÉÎvºóðŒ§<çIÏzÚóžøÌ§>÷ÉÿÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽR4 ©HGJÒ’šô¤(M©JWÊÒ–ºô¥0©LgJÓšÚô¦8Í©NwÊÓžúô§@ ªP‡JÔ¢õ¨HMªR—ÊÔ¦:õ©PªT§JÕªZõªX}j¶ÊÕ®zõ«` «XÇJÖ²šõ¬hM«Z×ÊÖ¶ºõ­p«\çJ׺Úõ®xÍ«^÷Ê×¾úõ¯€ ¬`KØÂö°ˆM¬bËØÆ:ö±¬d'‹W˜rಘͬf7ËÙÎzö³  ­hGKÚÒšö´¨M­jWËÚÖºöµ°­lgKÛÚÿÚö¶¸Í­nwËÛÞúö·À ®p‡KÜâ÷¸ÈM®r—ËÜæ:÷¹µ}© ¦KÝêZ÷ºØÍ®v·ËÝîz÷»à ¯xÇKÞòš÷¼èM¯z×ËÞöº÷½ð¯|çKßúÚ÷¾øÍ¯~÷Ëßþú÷¿°€LàøÀN°‚ÌÞUn5¤ˆ°„'<áÑYøÂΰ†7Ìá{øÃ ±ˆGLâ›øÄ(N±ŠWÌbËqãÅî˜îúR Û‚ȱŽwÌãûøÇ@²‡Lä"ùÈHN²’—Ìä&;ùÉP޲”§Lå*[ùÊXβ–·Ìå.{ùË`³˜ÇLæ2›ùÌhN³š×Ìæ6»ùÿÍpŽs”a•†4€|s°C#Œ…>û¹Ïƒ´ MèBúЈN´¢ÍèF;úÑŽ´¤'MéJ[úҘδ¦7ÍéN{úÓ µ¨GMêR›úÔ¨NµªWÍêV»úհ޵¬gMëZÛúÖ¸Îu¦ÏqFøZu溇 ÿÙÏH¶²—Íìf;ûÙÐŽ¶´§Míj[ûÚØÎ¶¶·Íín{ûÛà·¸ÇMîr›ûÜèN·º×Íîv»ûÝðŽ·¼çMïzÛûÞøÎ·¾÷Íï~ûûßx¹KP$lÁ¨pì?‡áá¸Ä'NñŠ[üâϸÆ7ÎñŽ{üã ¹ÈGNò’›üä(ÿO¹ÊWÎò–»üå0¹ÌgNóšÛüæ8ϹÎwÎóžûüç@ºÐ‡Nô¢ýè+o °6H &€Ÿûœ‚ªWéXϺַÎõ®{ýë`»ØÇNö²›ýìhO»Ú×Îö¶»Ýç~ðC:ZÐ%àQg8¬nõ¸ûýàOøÂþðˆO¼âÏøÆ;þñ¼ä'OùÊ[þò˜Ï¼æ7ÏùÎ{þó ½èGOúÒ›þô¨O½êWÏúÖ»þõ°½ìgOûÚ{þ3PBèÐ>W= À‚†OüâÿøÈO¾ò—Ïüæ;ÿùоô§Oýê[ÿúØÏ¾ö·Ïýî{ÿûà¿ÿøÇOþò›ÿüèO¿ú×Ïþö»ÿýð¿üçOÿúÛÿþøÏ¿þ÷Oþmäž tPl{—Áp€˜€ ¸€ Ø€ø€8Xx˜¸Øø ‚"8‚$X‚&x‚(˜‚*¸‚,Ø‚.ø‚0ƒ28ƒ4Xƒ6xƒ8˜ƒ:¸ƒ<؃>øƒÈ|lX€À÷J¸„LØ„Nø„P…R8…TX…Vx…X˜…Z¸…\Ø…^ø…`†b8†dX†fx†h˜†j¸†l؆nø†p‡r8‡tX‡vx‡x˜‡z¸‡|؇~ø‡€ˆ‚(†(G%½‡QPŽÿ舀‰’8‰”X‰–x‰˜˜‰š¸‰œØ‰žø‰ Š¢8ФXЦxЍ˜Šª¸Š¬ØŠ®øŠ°‹²8‹´X‹¶x‹¸˜‹º¸‹¼Ø‹¾ø‹ÀŒÂ8ŒÄXŒÆxŒÈ˜Œ§˜ ̘MX|aH@ ׈U0ØhÚ¸ÜØÞøàŽâ8ŽäXŽæxŽè˜Žê¸ŽìØŽîøŽðò8ôXöxø˜ú¸üØþø9Yy™ ¹ Ùù‘ÉŽÚ  áñÌè Jˆ|B w@Œˆ$Y&y’(™’*¹’,Ù’.ù’0“29“4Y“6y“8ÿ™“:¹“<Ù“>ù“@”B9”DY”Fy”H™”J¹”LÙ”Nù”P•R9•TY•Vy•X™•Z¹•\Ù•^É“ÚÉ‘`|~€ˆȈQ@’#@nù–p—r9—tY—vy—x™—z¹—|Ù—~ù—€˜‚9˜„Y˜†y˜ˆ™˜Š¹˜ŒÙ˜Žù˜™’9™”Y™–y™˜™™š¹™œÙ™žù™ š¢9š¤Yš¦I˜oð(`Ú0–Þà ã›ã0%à×8, ›_Л¾ù›ÀœÂ9œÄYœÆyœÈ™œÊ¹œÌÙœÎùœÐÒ9ÔYÖyؙڹÜÙÞùàžâÿ9žäYžæyžè™žê¹žìÙžîùžðŸò9ŸôYŸÓ©ýP­™ °)›ãà %€¸‰,p ö™  º  Ú ú ¡:¡Z¡z¡š¡º¡Ú¡ú¡éÉ  ààŸ›%À DP z ôð¢0£2:£4Z£6z£8š£:º£<Ú£>ú£@¤B:¤DZ¤Fz¤Hš¤Jº¤LÚ¤Nú¤P¥R:¥TZ¥Vz¥Xš¥Zº¥\Ú¥^ú¥`¦b:¦dZ¦fz¦HêúI¢ÛЯ›J)` -Цvz§xš§zº§|Ú§~ú§€¨‚:¨„Z¨†z¨ˆš¨Šº¨ŒÿÊ¥ïðnÛÐ  z›ºÙ¢,ШœÚ©žú© ª¢:ª¤Zª¦zª¨šªªºªdZ2ºþÀªJZ„àÚЦ'Z}€×ÈLð«LàÂ:¬ÄZ¬Æz¬Èš¬Êº¬ÌÚ¬Îú¬Ð­Ò:­ÔZ­Öz­Øš­Úº­ÜÚ­Þú­à®â:®äZ®æz®èš®êº®ìÚ®îú®ð¯ò:¯ôZ¯öz¯øJ¬ •P ‡€ø` © õ`ÂJk` “ ›¯K¬æàn0“J© Ð%Ð ¼ª›L`û° ²";²$[²&{²(›²*»²,Û².û²0³2;³4 ²eÿ ¬ü0û þ À  ½ “  ȰÅ@ ¬Ð ¡ ¾Ð Âà ð ¶€ ¸à —àø`­j@õP³Éj;0±{±«±½Ú±ëµj»¶lÛ¶nû¶p·r;·t[·v{·x›·óа’p ¿@ Ï0 —P œ@¸ÂÀ º€ PK Í` ´   ð ¶  ±p —À ªP ¸` ÈÀ °Ð7 ­d` À œ° “À ‡Àkû (°C0=»¹[+ʱ›¶z¼Â;¼Ä[¼Æ{¼È›¼Ê»¼ÌÛ¼ÃÛgp Ï ©` ¤Ð ¾p° h𺰠µÿ •à ¥à ¸p  ´€ ¢p“° ªp ¨Ð ˜‹Ìð p´Ì  ú€¬ý[¿P — ¢p œ ¤ÐÀpš0 ¸Ð¾@³´k»¸«»=À»sÊF ¬ÎÂ"<Â$\Â&|Â(œÂ*¼Â, ®k¸p¸ ž ¸P ù ¦ª ư ¨p¢` žð Âà ª°` °0 ¡à ©0 ¦ ’` µ° ©Ð °€£ð P © ùPú0¥0 —  áû ÎP ªà ½0 œË¯ªð´µP « É€ Ï@ öà²|»¹K¶%°w#бÿ¬bÐÈŽüÈÉ’<É”\É–|ɘœÉš¼ÉœÜÉžüɠʢ<ʤ\ʦ|ʨœÊª¼Ê¬ÜÊ®üʰ˲<Ë´\˶|˸œËº¼Ë¼Ü˾üËÀÌÂ¬Ê®à ‰ðÈ ¿Ð¹«° ²À ³€  °  ™  0¢ £Ð ~‹ ™ ` š° É ¾ ù ºÐ “ È Ñ0  €¯ ÉÀ ¨ Ä ¦  •0Ýì ³À ª ¡ À² ¡ µ€ÁÐ µà fкH[ Æ€ÌõPÃ\ÉÜC@º‹±˜ªÈÒ,ÝÒ.ýÒ0Ó2=Ó4ÿ]Ó6}Ó8Ó:½Ó<ÝÓ>ýÓ@Ô’œ °§Ðȼ0 ¤ §` — µ0 ¦0 BË — ýð ` ³  ² € ³ ¥  «0 ³À ’0§€ ³€ ´P à Í ¯»`Å  ¢ ` Ë ¶ ´0Î@ ¡À ’ ˆ` £ ™@ Ò  ´P ¡° šÀ ¼0 ¿` É0 ¶@À¿ð ó Ç Ó#}Áº{ÈQ૲­´]Û¶}Û¸Ûº½Û¼ÝÛ¾ýÛÀÜÂ=ÜÄ]ÜÆ}ÜÈÜʽÜÌÝÜÎýÜÐÝÒ=ÝÔ]ÝÖ}ÝØÝÚ½ÝÜÝÝÞÿýÝàÞâ=Þä]Þæ}ÞèÞÑ- º€œÐ @ ¹ ÷’ÀS¼ ¿0 ÜÌ ‡ ÷ š ² 0 ¤ ûð «P k€¡  ~ž ¡° ž É0¹ËÀ 0 À ­Ð « šp g° ° šP Á ½` ¼P ôÛ îÌ ·À € € Ð à óÜ ·Ð ¯É€¹— û0e Þ¶}(0;Ð`Ò=0JÀ«¬²=ÛPæb>æd^æf~æhžæj¾ælÞænþæpçr>çt^çv~Ûd€ °¢ à ÷ ’ úPû0 òÿ ¾°Ö© p “P » j, À « ° —€ùà   ¬ð Êð p ª° Íðç€~NÅÀ “0 -Î ÄÐ ` ã+ µ@㥠հϨ@ »€ ­° ÕP  ´À @ ÁÀ Ì0 à •0 ÷@ê~+æRNåVŽå=  ›^:îw¾îìÞîîþîðïò>ïô^ïö~ïøžïúç‰pg€ À ú¾@Ûü  õ0 ‡€}Û ñ½ÆÂ` ¸  Ëp ©°gp  ²€ û Æà §p ’PŰð ¥ ` 0  ˆÿàòÕ° 0 °£€¥ ¼p´µ Þ  ˀнÀ È ã¼€€Ó ÒÀ ¬€¼À £´` ¥  ûå90å$`W~öJ°Áçžî:°ïnÿöp÷r?÷t_÷v÷xŸ÷z¿÷¼]¹ P ¯`‚~úök°Æ fp¿@ .O ®€Ëp ¯  ª ù  ¦  hP k0 ¢p½Æ “`óÀঠ½ÀË 0 ×Òð ¥° ´ ºà »@ ¯ èµ  ¨À Õ€•À ô« œÐ ñ= ¥@ ÐÐ È €€ š •ÿà ±À —° ¸  ¬ð ê=öSPögåiŸÈ^Îö:Pò?ÿô_ÿöÿøŸÿú¿ÿüe$XÐàA„ .dØÐáCˆ%N¤XÑâEŒ5näØÑãG!EŽ$YÒäI”)U®dÙÒåK˜1eΤYÓ&BZ$ U¦'ŸÕ35©S3 íûå@Á[Θ±â$+˜(SÀHMÊwÊ™¤y©žý R²[¨‰¥A…Òn5Ó´lªj•F±²UmB0WÒFõÊDk–­ œ4µB¶Ë¢ É‚!ËàjÔ®Z¨jÕâÅÀ-OÌôrB• Ò›9œL9bÅõk%QFQ¡Ã¶ÿ훹uïæÝÛ÷oàÁ…'^ÜøqäÉ•/gÞÜ9Í\ > Øeª W{ñå•KVµJ˜—,Ò ± —°`“~å •ŠT>{h|]šTgWŽ™à–j¦9†"±€T8‰E1Q&áÅ“¨œÑå—KŒÉ$“O‚‘e‚f‘…Rné ‚ *Å™e˜!b `šhØDlQà˜TX¹åS™Iµ)Hp$)P¢ ŒˆÁ¶¢ägJ*«´òJ,³ÔrK.»ôòK0ÃsL2Ë4óL4ÓTsM6ÛtóM8ã”sN:ë´óN<óÔsO>ûôóO@tPB 5ôPDßüÿÀ‚H.Y€eò™2‘T.™¥M%D"1†H4°2@@Dá¥X1¦•{89c YTYc \PF”bzÑ%Z\™¦2:ø¤˜KœÁÅ•Væ!æh*A¥Tœ…—eh‰ED¢)å–P˜Á ^Y@ši^Yæ„ f‘æ˜OX@4Agj‰e•LÖTµÕŒ|ÍŠ%YPáÉ(¥Lta†vøaˆ#–xbŠ+¶øbŒ3ÖxcŽ;öøcÙTE§l‘„ŸQ¦”—PdA¤2°•P"‰Da ˆD瀆€‚YedF†Q ùÅ|.¹äeD9aÃ^TqÿåQˆáe‚cª %T2Q^p9&[d™•C‚Ù°N¨$U(%“j ù¤™hzé„™ÄÖ¥‚]ˆ±ÅÔf>  2©D–yöåA.r`‚G`¢6. dÐC}tÒK7ýtÔSW}uÖ[wýuÕwf€]øùÅ ~ð±Ç™RÄE@çÐ@ÁN‡Æ"¡f ZÁ@\ú™%“RÌ`%–gŒ!%”`RiÅ™LRéd^.¡edš‰e[ŽiEaÎ8¤d¦%“QÜ®Þ]T‰&“d4cøD%¨ÕŒLðB—è+&À 1@f¦J@1*à ô¢šÅ/Hqÿ@åà«) LH%Ìažƒ] ]øBÆP†3¤a mxCæP‡hÊG$à‚¦àÇ>r‘‹L#<‘F$à¼Hh"y6CÀ¢5 Uü¢“0Å*ÌpŠR$É0M?& ¨h¿è24†TðbŸ-ZAŒZL¢¡€…'ÔŒhÔ‚¤`Æ2j SLÃÈ@3¢1 |B¨h…\¡€«Äk½à„+ tà@ŒK^>a¡NLwaÀf°¡I+€l)2äR—»äe/}ùK`S˜Ã$f1yLd&S™Ëdf3ùLhFSšÓ¤f5­yMlÿfS›Ûäf7½ùMp†Sœã$g9ÍyNt¦Sëdg;Ý9Me€ @Ð@†°t"Ôða@!€âùšñÏ8àÁ-^! Ë"° C*ø 4¬"CȘšA‹Q ½ †=JAŒfPë˘œ$€ Qèb{»øE+ÈÀ²^̳hF+xQ©P@cÕhÅ,^q Tc™˜-*aÉ[žq‹hX€›pbµ7ñø‚Àˆ—4<1‰UÀbó@CöúqUÌ£©¸GhM!‹QÂŽcE2ž1bèb£PK1já‰y@Ê0F-žÿ Yøb ™¸„4fq‹U,9(…0*!éSƒј1Pá OPß8Æx Œ¨. º ÆyÕ Hcª…/àNŽ ˜z˜A#êkË¡}çÿýÿ @@,@<@L@\@l@|@ŒÀ¯›„Ç;|@ƒÂ»Ox<˜10€&2€Ç† g`eè„XÈ…C0¹y8…y¸„PP¶z8„TP4°X …`0O8|ð„1yHg8„P(† QRX…NÐXȇU8„~¨YY¸…Tð…bÀ…N˜X¸…Cx†`è‡WRh…R@†R¨…ÿJ¨†hÜÛjˆ†«ñ„€pg …]P"0°W˜a@ƒ·ƒ?S£‚%„¹/ý3: œDJ¬DK¼DLÌDMÜDNìDOüDP EQÜÄÇ«|H„£ë‡\€ÇK€Çû±M0 ЄJð„\@‹Zpa¸U`†YP^_®3ðO°‡g(…}ðU8V˜|˜‡RPƒ~؇QhŒ`P3N˜IFWè‡TÀSð^Pc8¾Sè…Q`è‡Pp#R(U¸…Z`_P†Qx¾[H†b €‚«„X(’ã aˆj°˜€DÏÈMH†]˜{p»r¸ÿ*Xh‡F`„Á/¢‘ÉQ,I“íS?ýS@ TATB-T5]i¨{ÒN €Hx„G Xf@†N¨H …½(—WpH€Ôaxh @°€±Pa…NP††+…Rè‡S8„¥Ù A€eðŒh¬†gè„YNPQ0TˆO0…qŒ…:†~“…Ë»„_3³¨Vk½VlÍÖjÅ…CèVoýVp WqWr•„E˜ ‚XR'}×$0TyWz­W{½W|ÍW}ÝW~íWýW€ XX‚-Xƒ=Ø4 c¨‡}ˆR4ˆÔøTP"X¸ÿS€yM€$Pa”„TA”T»xNx†~-* \О`¸eðM0†IQ°…ÐX0™å HP…gˆ²z¸®LM  fh†R€ce€Áyè¨Z©Zª­Ú©Í¬ÍZ­ÝZ®íZ¯õÚ}[- &I«vI'Uµ][„m[·}[¸[¹[º­[»½[¼Í[½Ý[¾[y€R°O¸T(ýH•¼H­þàD8 °,U €ÔGø¤eÀ9¦J¾S`dJ4…§a S°P¸§Ð„T…]x†^Àc=„ší­|ØOà„OHHð…S¸Æ{Pƒÿ5°á^â-^ã=^ã•å]^æm^ç}^è^(Û¨¡Éw][íí[îí^ïý^ð _ñ_ò-_ó=_ôM_1í‡{¨zR€ÒjxxP°Üj R8†«ÚØQa<úÔ#€ÙPP€jX(]Pª_œ 8I°‡IÀ…Iø28i† UØq…z¸…iPU H†¡´…f(ÖS؇{XTTܯk -H”HØaîaŽ^ b!b".b#>b$Nb%^b&nb'~b(Žb)žb*®b+¾b,Îb-Þb.îb/þb0c1c2.c3>c4Ncÿ5^c6nc7f^{#êX„}eЉûÍ`…\(4@„G˜<x„aØHu(dPÈP‡t†ï8Ai°…\°fÐJe€„3È„Y0yø`€¤Ô…I ŠÕÂ…Ð84Èaè¶fð_`_yÀ2à‡2Ð}^îe_þe`æ^öb.fc>fdNfe^æcÖu ‚èa˜fj®æ7¾flÎfmÞfnîfoþfpgqgr.gs>gtNgu^gv–‡yÈTå‡|ˆ³ °\Q5‹VÐ…šc{¶ÜàçG•èH™9b †|A†J8†`À…y(4ÿSÈ©„T ÀÃP…>"¤U Y‘‰úoì‡5H2(1 fzø—~i8ˆi™žiš®i›¾iœÎiÎé6¨Þ®f¡®fä-j£>j¤Nj¥^j¦nj§~j¨Žj©žjª®j«¾j¬Îj­Þj®îj¯þj°k±k².k³>k´Nkµ^k¶nk·~k¸Žk¹žë¸VRð­Nð{H…YP€ ¸^À„Q°Œe¨_ h=\¨„fW8L˜LøÀBNLʰL …:–](D0‹K¸ŠŠ®\°LÀ„(–TÐ É4…½v\X†QðüÀ~Ðø‚šþÿßþmànánâ.nã>näþ‡žN«–¡~nºŽnéžnê®në¾nìÎníÞnîînïþnðoñoò.oó®êUP[…f°‡`(g¨„[ †˜´€ ˜ä‡Ó&åÊzT˜1 €ªŠ„°–›€`ÖQÐ]Ð]€7”T@LP<È„Zp‹2\ˆUS`…`Ð*\Üz˜éä^qoq'î6`æVX¿q¿ñóÞqïqÿq r!r"/r#?r$Or%r`ÈìZ¸U Ñóc¨hŸ (†à5êÀ„G€†Mà Oÿ ™Q€]8ÃR`>OðWˆ…Q8†Lp]˜,°…XÐ…Uà„rL†QØdH8·Dà—éotGôáŽñ‚hÞK¿tLÇô%ßtNïtOÿtPuQuR/uS?uTê 8íÈÆ„d°[ @SP¤>†Ó&€p,À„ LÈihuûü€A,†`8Y¨„PЋŒg__†V8†U`…R8†{8©X8…öUôiH/wswñ_×JÏtv·ô[ywxwyŸwz¯w{¿w|Ïw}ßw~ïwÿw€xx‚/xƒ?x„Ox…_x†ox‡xˆxÿ‰ŸxНx‹¿xŒÏxßxŽïxÿxy‘y„gõȾ‡cTL8g¸}W'ÂE–†˜€Hv ˜À„0Æ)è„càap>iøBHXÅdž^˜NiP…b€^h·;6Ýæm88w®ïúân&X×$àvow’?{´O{µ_{¶o{·{¸{¹Ÿ{º¯{»¿{¼Ï{½ß{¾7xYxìcÈÜHÀfØ­CØwèuÊ€Iž@<íÅApˆQ΀jè€[p…J˜€TÈU˜„×ëL†IE… ø„N›](…i0“Ƈ2Ømr÷zÚ¯ý60j²ÿÞï}ßï}5~á~â/~ã?~äO~å_~æo~ç~è~éŸ~ê¯~ë¿~ìÏ~íß~îï~ïÿ~ðñò/ó?ôOõ_öo÷øùŸú¯ûç~`8R09áˆI­Ô,hðàd$ˆé8 I´ l´ä€A¨fÎЪ´ Ñ­Z¦,YB @A ,P›ð‰Ó©{‰ø‰¡ο B‡-jô(Ò¤J—*-ÂDŒ$žP­jÕêÁ¬Z·ríêõ+ذbÇ’-kö,Ú´jײmëö-ܸrçÒ­k÷.Þ¼z÷òíë÷/àÀ‚.lø0âÄŠÿŸ™  0m"°ÉÒåGÃ@uH`IÐ>àà4M0,›¶‹X*–0`ðÁ.ÐŽµ’´O}þ~ejü8òäL‹*cê‹èÒ§K¿gý:öìÚ·sïîý;øðâÇ“/oþ<úôê׳oïþ=üøòçÓ¯oÿ>þüú÷óïïÿ?€ 8 x ‚ *¸`‚ýTƒ 8`I› c &,YòK ™l–H('dðI΄ –X`I @»LsH?öà#Ü?)÷#A.Å\0<÷uIFÇ “M:ù$”QJ9%•UZy%–Yj¹%—]zù%˜a"ÈÿJ4ÐDÊŒ‘ˆŠˆ²e¨¡3¢ÉffÐ` "¼è¢ -¥YÀ‘KÐà¤O>'$¢‰I¤‘¼¤‘J©˜•Zz)¦™jº)§zú)¨¡Š:*©¥š'ÍL¥E¸ &Ã0¢.½,S‹(l2e• (‘X€C +–(l„Ho¿g衊J;mRDðÜ£“j …©Ýzû-¸áŠ;.¹åš{.ºéªK+Pè@ #[$X’v§”ö› @ô(1`0Æ.d‰ܘãŽþô-µKüO*H1O@q Ç{Ü1!‹<2É%›|2Ê)«¼2Ë-»üÿ2Ì1Ë<3Í5Û|3Î9ë¼3Ï=ûü3ÐA =4ÑE}4ÒI+½4ÓM;ý4ÔQK=5ÕU[-õ) ` % Pò%RBI-(/@‰KlÑ&”p´ÀµPÊ0_S3èN=ù81ßW,E<8ÈW~8â‰+¾8ã;þ8ä‘K>9å•[~9æ™k¾¹Ñ§pâËšp"2+ cÁ×X€”´ýH.*'Q$­6dI½M%®«I‰Í§´}/m1î(á„ïó<ôÑK?=õÕ[=öÙk¿=÷Ý{ÿ=øá‹?>ùå›>úé«¿>ûí»ÿ>üñË??ýõÛ?þùë¿ÿ?ÿýûÿ?(À~ù 5hÁ]0€@…‰p6Ü ˜h%¡=`|€½z„ë @‰€¡àÄ× ,LG<ÚÛñb¤ä-ïרs¨Ã°‡>ü!ƒ(Ä!±ˆF<"“¨Ä%2±‰N|"£(Åù£­è€(/ )ডÄ^‡‰±yc3D"Q ™0,r·œäÍP2¼ã¢”§æí°8œ" )ÈA²†<$"©ÈE2²‘Ž|$$¡·ŠP¢™Œ, €Ž-l¦!%>3Žm˜0@ ñ žo†W<<Òòÿ8ÉûÁ_€ÃÔ€—¾ì%0#)Ìa³˜Æ<&2“©Ìe2³™Î|¦÷’A 3*€ÒØÇ'( l^h´Ä…>YP„¸+' 0JÃhaÃVËy.'?xÎ # Ï}òsŸÐü'@*д =(BªPü)À½£„BSÍN:ÀµÓf5ÈW =B„p"&°\Ì‘Pzƒ=SJ”1ÄÀH@¸F?cºÏ|д¦6½)NsªÓò´§>ý)Pƒ*Ô¡µ¨F=*R“ªÔ¥2µ©N}*T£*Õ©RµªV½*V³ªÕ­rµ«^ý*XÃ*Ö±’µ¬f=+ZÓšÕGhšÿ±@`B˜@'–Ú<\  € ä#Â{qTªØ¢°Ô¥0•iLÕ*ÙÉR¶²–½,f3«ÙÍr¶³žý,hC+ÚÑ’¶´¦=­VG¡€]`‚¯²ZñT„ Ÿ©m¤á OÀó…(]¬JÇàœ—FÀÆ=.r‹Úå2·¹Î}.t£+ÝéR·ºÖ½.v³«Ýíîô¾PUIa[LhÆ2¨Æ1ðV(¸Âulq“+_ô£¾ö½/~ó«ßýò·¿þý/€,à¸À>0‚¬à3¸Á~0„#,á S¸Â¾0†3¬á s¸Ãþ0ˆC,⓸Ä&>1ÿŠS¬â#X÷µí& ° ¾bÀ‡%^bÛÛÞ÷ò@—°ƒ,ä ³¸ÈF>2’“¬ä%3¹ÉN~2”£,å)S¹ÊV¾2–³¬åO° x†+j{ÁP"è­ÃØ«cÅŽ¡Ø~<ä9yËv¾3žó¬ç=ó¹Ï~þ3 -èAºÐ†Nð-p;ãŽòÕ!ØD$ Ñ‰3˜ÔŽkÞ±›á,g:ùОþ4¨C-êQ“ºÔ¦>5ªS­êUkX! †4B`‘á¶¶ Є2ÐPĪùÒ)mó›ãl »ØÆ.6«“­ìe3»ÙÎ~6´£-íiS»É²ÁB4à œj»Í-|ÿc3øÖטö­nbW»Ýî~7¼ã-ïyÓ»Þö¾·…C &!€Å BŠÚ.ðýX>Êæßš{žm–Š "°îuÏ£â¿8Æ3®ñs¼ãÿ8ÈC.ò‘“¼ä&?9ÊS®ò•³¼å.9Ìc.ó™Ó¼æ6¿9Îs®óó¼ç>ÿ9Ѓ.ô¡½èF?:Ò“®ô¥¼˜Gm!jDÔÚ¶ E?ÔPÇ7œÍ€¸Ä'~l¦“½ìf?;ÚÓ®öµ³½ín;Üã.÷¹Ó½îv¿;Þó>tI@= ¨íŒpË[¬b÷¨?ÊÝõÅ–@ ŠxB |€ƒP¾ò–¯¼Þ3¯ùÿÍs¾óžÿ<èC/úÑ“¾ô¦?=êSr_Xê ¨º4naŠ~>8 _ò“¯üå3¿ùÎ>ô£/ýéS¿úÖ¿>ö³¯ýís¿ûÞÿ>øÃ/þñ“¿üæ??úÓ¯þõ³¿ýî?üã/ÿùÓ¿þö¿?þ§`À"‡èÄ(C%€—ìšâážbéäõðý^þ= F N V ^ f n v ~ † Ž ZŸ$œ ¦` 6ß þÂ%pÂ(4ƒ4hÂ/ÌØÃNøÃ! ) ïÝ€¡¡"‚!&¡.!6ÿ¡>!F¡N!V¡^!f¡n!v¡~!†¡Ž!–¡ž!¦¡®!¶¡¾!Æ¡Î!Ö¡Þ!æ¡î¡~‚þ! bú!- ƒ-h‚'ðÝ> >$ÞÂí Þ‘Z¡%ŠÀ!d¢&n"'v¢'~"(†¢(Ž")–¢)ž"*¦¢*®"+¶¢+¾",Æ¢,Î"-Ö¢-Þ".æ¢.î"/ö¢/þ"0£0#1£1#2&£2.#36£3>c*ú‚$(Ã)ÌC> ÁÈ>AˆÁ#F"ãI:¼€Ä]â%r:¦£:®#;¶£;¾#<Æ£<Î#=Ö£YAÿ܃dc=lc=< $‚£ 5Þ8–£9¡<,$C6¤C>$DF¤DN$EV¤E^$Ff¤Fn$Gv¤G~$H†¤HŽ$I–¤Iž$J¦¤J®$K¶¤K¾$LƤLÎ$MÖ¤MÞ$Næ¤Nî$Oö¤Oþ$P¥FÖQ&>˜$ž7$q $AÆP Ü9â6T¥U^åUòƒVn%Wv¥W~%X†¥XŽ%Y–¥Yž%Z¦¥Z®%[¶¥[¾%\Æ¥\Î%]Ö¥]Þ%^æ¥^î%_ö¥_þ%`¦`&a¦a&b&¦b.&c6¦c>&d®eü£>x£?0%×=¥JE¥ L%V~¦UúÿƒhŽ&i–¦iž&j¦¦j®&k¶¦k¾&lƦlÎ&mÖ¦mÞ&næ¦nî&oö¦oþ&p§p'q§q'r&§r.'s6§s>'tF§tN'uV§u^'vÖ&=¤@öšfÒgz&h~fS–§yž'z¦§z®'{¶§{¾'|Ƨ|Î'}Ö§}Þ'~æ§~î'ö§þ'€¨€(¨(‚&¨‚.(ƒ6¨ƒ>(„F¨„N(…V¨…^(†èw^Z À\ƒÜ6‰–¨‰–膦¨Š®(‹¶¨‹¾(ŒÆ¨ŒÎ(Ö¨Þ(Žæ¨Žî(öèñt臆舞(‘€)’&©’.ÿ)“6©“>)”F©”N)•V©•")‚¨ˆ)‘^©—~)˜†©˜Ž)™–©™ž)š¦©š®éfz(ˆŠÀr)в)Ö©Þ)žæ©žî)Ÿö©Ÿþif©À©œš( *¢&ª¢.*£6ª£>*¤Fêw *¡*‰J*¦fª¦n*§vª§~*¨†*Rjœª¨ž*ª¦ªª®*«¶ª«¾ê’ª¥^*¬Öª­Þ*®æª®î*¯öj¢Èê¬úª°+±«±+²&«˜«¥*«³>+´F«´N+µV«Ä0«©Z«¶n+·v«·~+¸r*¶Êi¸–«¹ž+º¦«º®k ºé –*¹²«¼Î+½Ö «½Þ+¾"ʸri@;TT_v224_html_docs/images/glass/purple/hide_menu.gif000700 000765 000765 00000000714 11222361074 022116 0ustar00abwabw000000 000000 GIF89a(ÕÙÙÙåååÉÉÉÊÊÊËËËÚÚÚòòò×××ÔÔÔÞÞÞáááèèèÑÑÑÓÓÓØØØÛÛÛìììçççÏÏÏíííêêêÍÍÍÈÈÈøøøõõõúúúùùùÆÆÆöööÇÇÇ÷÷÷ÌÌÌûûû!ù,(é@pH,ȤrÉl:ŸÐ(ô¢@,†v+x Å™)›Ë‰ÅR)Öðx¡\YK"çüy‚ˆ4zqy‰Ž•މ–ŠŠ›‘“£—™£Ÿ§¤Ÿ±²š§Ÿ¡£¥”§˜´–«‰ÃÈÉÉÏÈÃÐÄÙà ÏÌÚáÃÏ ÚéêéÈÕÉéÔëüý ìK7¯š=v `ðǰ¡Ã‡#J\Ç¡¢Å‹3jÜȱ£Ç1ˆI²¤É“(I;TT_v224_html_docs/images/glass/purple/hide_menu_roll.gif000700 000765 000765 00000000714 11222361074 023146 0ustar00abwabw000000 000000 GIF89a(ÕŸŸŸ¹¹¹———   ÒÒÒºººììì···®®®ÓÓÓ¸¸¸ÅÅÅ£££¢¢¢«««¡¡¡ÖÖÖááášššžžžÛÛÛóóóÇÇÇÕÕÕ­­­¯¯¯›››ààà”””–––øøøõõõùùùúúúööö•••÷÷÷ûûû!ù,(éÀ’pH,ȤrÉl:ŸÐ(TdÁ@†v+( !‹*›ËF§ó(Öðx üX3.çü9’‰d^Np‹‰Œ‹Œe3£v_ªª«wª³³´k6­\.“l6¬Ÿ’®aaa!ù,Ü‚ÿ½ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱcÁ CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒò žùú$ÑæÖðbË?œvZAAÔ)Ä540&Øáa¢¬¶êê«°6ÿÙƒüõ‘A >£ K 3Î; ±Ì¦vÊC±ÿT Ž !„ A\`B,v(¹äª±f«í¶V†“Ýv`BŽ‘æ°ã×à œ€ì?}\ð‚wF¼€GÇ&„äаƒ:x˜AnálðÁ'\À 7ìðÃG,ñÄWlñÅg 1{î±ñ Mà˜Cšk–ļˆ¼ïq Š(‚…Yà¦+ÿ´ NäÔ“Á &ôÁ1DmôÑHk¬ôÒL7í´ÓÅZ”;éøa¦¼¼ÛKlÔë²"~”mv h— (\Àéu~€/& 4kÝä­÷Þ|÷ÿí÷߀.øà„nøáahgDË\“ë®Løú Ârƒ,à1ïY`a¶%€žvÚ”¾…¼œZS'3ô‚Â@U.ûì´×nûíÝ$Ž‚+ÃÈP®ðh‘®©í¾ï ïe±…™”½è{D¿ÚÀT_Bé1+¢À 9ïûAmˆ!Þ°òî觯þú;cBKè:2¥–PÊïFq-oºÙÒ‹^ ª D”î€Ø‹° ¹díÀ¬ã†,@AXXÀ‚¼ 3‹xðƒ ¡GHšð„(L¡ WˆBe@~M@‡ÖþµŒ ëka{æA6ÐMz,`éÿšÑ .‘ Šh†€† ¢°Å `€ Ø‚ ‘0†#¡=ˆã‹` cõÀÂ2šñŒhLc ¸Ñ°(‡`$˜‰I¨b,W,ôAsaš‡çžÀçM¯zÔÀï±…F6ò÷X "ž‚€hà^lঠD @Æ»(ÆR‚Q¨L¥*Õ8 ޵ËÈ@ 3dC˜à b9‚à®b­ ylèÃòš÷9çCä¹`Ó˜GœÙÈ* ’!H†1PÑV&ù‘ŒM¦ú/NÀ ^€ŠýB›Ä)Áy$´{mCïÑÌ„Õc%kjU«÷,nã Á?P Žv¤Ô`†‚ðrØ€DC6ÊW.:Xvðs'Lá [ØÂvˆç za)XKH 3õ®NeàT´»ðÀæS«ˆ0`gÁÞ‡¾7¾eo5ê ®|`±2@GÑlv”¶hÈdú¥âqÒ£¡Übƒ§LåA\øÊXÎrs»!Å1Hܯ(7¬ËeŽ l§*€âlÊÿXÞVèÕö–v¬9ž¯2‹ì€ ¿£, Rö\ ›¨x5Ð0Œd HþÇ ò@•:BÊU¦²R°éNsúÓž5¨G-êR“úÔ¦N5ªW­o€éÜèÝï‚7¼ Y¿ Sæ‘… ,îË`ÆÖ,‡EPÆËüêC# ßÓ¢¶ʨ/QaªÉïjY³_/_@ Ù& ,XÅ ~€ËnêË@.žÛKºûÝïÖ¼çMïzÛûÞøÎ·¾÷Íï|ÏJº~†G +Õ¦û¥ Yú›8°`¨¡y{ÐÀ<‚i‹}1ƒ-@Á=DkcdÁ´e}6Q@#áHGLÿ@×ä*ש• Bް$*p†U0ã;Ђe9õ‚)ä  #`@ô¢½èýNºÒ—Ît|€Vú‡Oâlÿ«kÈrØÄÆÃ‡—-™H¯"³€‚‘~`]’Î#ù@ZçÚ2j7 @‘]W]¶îe±ú`kÄüÐ$x£É!#Œc ã¨+ŒÀ„Ÿ}èGüšNùÊ[~Ó_š/L®+”KŽr{¼Ü‘wA>üô`{zQD%°!?()3–QU°º€¢oßóvØÀƒz,áÃßþn¸?ôa2x¹ÌqÁ‚a$áh* úIä¶€¡{¿û࿼ÿøÇï3¼Úà ‚™Ð¤&=Oï-g”ç„f‚³©Ï„ö/ã{°]°BPR;ûCð%rb+ rr¼RnÀ",6T,Z‡$/PzX@‡†MÆ x«p 5€3L°Ð5}ÐÖ‡}Ú÷},~T€0ƒ28ƒ4Xƒ6xƒ8˜ƒ5è 3O¿wmôs)ÃW,P6 'Àvœµ„©ç{àÐlVÊ€B€{}à' 0rPB@.Œ•rÃÃ.ð÷~H Ð9Í£6F¶|,@×p /ðcS`œâMf#°‚-Ø‚:ˆ‚8ˆ„ˆîƒ0u÷€¿,5ÿ”u™S/¥§KX‰— û…t ­·l ¨@!mb'˜s-À ÕÅ~%“]çK,Ãôç:Š@ÞÆ|«` ×` 20HÀs×`}m}d°}ʸŒËXˆÎøŒƒX&ðõ 2…wËp†iHzSE`‰ׄ^€¢ HˤÁ …{f5`DpTÔ, ØT7") &b[Cb·u:„„áŽeƒ6ŠÐV$Wáv?@l@2À2€êçxŒÌx‘/¹‘3ø>ë'K€]'óŠñLôŽ—vû…¢Ð +ÀJÀw{§uV& ‘ÿp n²œt'ôÑø„e¸ |d,™cU\(©zb‡nÕÔÀU ¡ðÀ¾Su…RË ~‹Ð7 ty‘u€ey–f™–h¹–jÙ–lù–n—u€ ]FAà )–¹¢4`ê€uÅ"P9ä2‡’EpPú§‰Š´]õPîu{ì˜c 0ñ£KA¼` ^4@[“Ø)Ç£kXàK©’ãhŽ[ðPnS ¡97B‚Ë€†(Ð78Ðb9–ËXÂ9œÄYœÆyœÈ™œÈ©ì1#ÿÀ]®@Kæ‡7"×`âÔGGi“XJ©”߸„ÿ• ˜Ø,Ù ³ )Víre¥{(!Œ[‰3ÿ7Å ;PU| ·{€šjžœEž+IŽ õUón«PG@•³É!Cã0{ÿÀÜ@)ˆŒÀÉŒÊù¡ ¢ÄÙ¯v I.2€OZ ˜€ãMÝK¸'+¾‰k:yò ()Œ,êðˆ‰:”Y $ç@t›/ +Ù“Æ ·Ûëÿ«+µ™ººe'0L€I’œ’kF`¬P>g€õ®p›´èš Pü¹ú ·i žÊc÷…+×f³(,3 Á7ÿðÖ°OD@²Þ[¸’\¸VPÉ–|ɘœÉ•|$ê .¾s&æB† |kÆ2z( ‚t£ç[€¨ˆ[Ç*ió¦.ùÁû[ZõÊÇ9&m(À\| « ¤ ¨»·Ù)_ƒ<~r—Á gІðZ@øÀ¤¿K«v,ÌS[Z"¬¼÷j¢bˆ&ðÀÀï§2ûªòâ6÷Y';PÀ @²“\Ïd ÉøŒÉÝOÓÅ êg]íg2?p†µ‹3´i«¢°FKTTÜpÀ¹z¼BÊË àÇ}À Ì Ñ³Ìx iÐwÌ‚vZ6ÍŒ»gͬ€¦P{¹QPÿ4 Þ¸ ÀÍ‘¹ÇCʼ<2g)Ì`pù³u¢Z9°‹@¶ð<` õ@E·i‹0Ï3lÏ÷œÏ™œîS/Qð(b#&˜ÊÌ WCp®jm´^Ð’³À° ‹Ì:û5Á¤ß özXp4@.M`™; ` ‰ üP(° Æ '5/´ÆlŒ±` ·Ý0&À õñÿ Ñ6½ m ê9 »ü©ÖÚaõ˜#U7ÖïRöÂA€0PÛµ­Ô9pÁšTtRx`@wÕö¬Õ•\2»8È>,fXfÚ©9Ü9ÍÖj­¥…pÓv, ¸º.`õÿð™n’™›·ÇÇíàÓ6 pÖµ? A¨k؉ Ì› {0Œà ,ݱ åÙ¥Ài(À ኇ’v°7ÓrÀ©i 8Ð87²ˆÌ zŒ† /¯—ÝVIÉ`Û·½#° teW½À›7 Ü“ü .þâ/^ñÔ×ã2kƒw¦Lš,³†I9>ži]…p£×  pdzpצ4½‹L9®ÃÊP¤DÅa(ÌÚ½’.e߇]À|€S,Ü(@±p ªP4à:ƒuF y[œbŠpÓ Ÿ{×i`<ðuÐk‚ãklÿ€ ,PI1‡Mâ"!A€Æ ´Q€_™} É… ã/Ž«Ú ; Þ¬(ÔDpþ©<­¥Až×­çðå¸z×¥U /€ú0Š{bô§i¶y9BI%EEøÍðëò½ óÐw;pv·‰Î·€ nçÂyüp / +ZW®`ä¹ Fž³"»~“|§N„éüŸn.["®#b/`zRW½ÀÀ›¼éÏžþ Ò`¶2ÙjuúH„f]PÔ=ñBNä›päP,Ìr Åë¸Ë&2Šv2‡è°ÿLÎ…ž]? t2l™+‰`žñÿ= ¹ ÆHPR'Å2y9œ(kɿР‰4PWðä~ñHÎÓ`S 2°¯@,ÄRb#Šp£Í3Œnd…ÛøžOøPlZ@ÃøïtŠ}Xð_ p_  4ÐyM rdváÛØ6<äã~ÿ÷×]› ôñ r°©w×|¬ (° Spv6 l>éTÂîíû¼ð@6À t 1눭 訰WRAÐ`P fy•|ðBÿ–bô/à pû±^ÀÓ€s‘ïÀ¢§†óÀCN´œÅõ²EÛ„®=R× ÜÐ#øâ´2{˜}3\ð°ýÿ F?P¥“>sè5z@þ÷€/äE@øŽS ±»üÍVkGÁX€¼à]óÛ/ IC´ ÿ\`ã*ƒfþ½¨ÑÃD—Vœâ“†5flTè…â–Ž:ü~ý*V²˜”ª^0»FcÇ¿(F²¢Ù("˜³PüãÙ“g  /PàÉ‚%ßÑ!I‡*R$“E!B a Õ“ÔÈ%[¢]qBhcóA†f'þˆ"#Œ]0 [¥ƒ[(ÐIx Åµ>£\`c„ ‡-Ù”.VZÈq‘M›Š£MI°h¦¹ Ð¹ÝçÏ ,föິ>ÿÙâµlY[ªyôÁc…ÿ #x0äß!²[!‡ÏÖê}Hø…!"OÞEYL‡‘cwTàBÔCˆ¢Ø]ºÄÁHžQFì…ñâ|M³5B„Åj§'¸¨¡a±Šº$® ‹ûàA ®ñí6~ âp¸a®ºèºË‚ d8^z¨¶8@ƒ÷sÌ1F"Û›$:%Í8£´Ï”m([ x ‡¾ èð#ŒèC5Ÿ€Ê`aå ðX&£Näál 9”àÃnÔùà¯ð° …H¢î.~P@Ârš3b‹DŠS :Êâ…ŒxAQ*ÆN„ ”DDif–-ôãÿ¯¿*ª&°Ä¢![ðø‡/} ¨àŸî˜ â- )¬¥[^€G‚L7ý§¡˜‡ _JLêDFR\±&Ho…Ë4›´j06zAb ¾rȈ$ X†§ L°#ð @ú …Û`ñ¦œ[b×#~عgQX<®œˆeøÁ€êá&#JAà_μë¸AâK$ÂÌB1⌓”DT¥Ö-¸uV%+'-#È¢¿Uª8âˆPBÉãÒš² v„‡u å·àš°B 0—&ˆ ážðÀcƒ¤|4ЊY´‰a…çdg”Y`䬔ÁMÈeð‘ÿ@ea‰$È©'°>Œ€åŒX`Í6$-0¤œrbé!pÃ( *ØžÙ˜G8!NŽmîÄH#îPgß~ýEÉyéÝhÊQÈá†fıi]±ÅQ² fƒ9ðäÞÈ Àô¤XKðÔƒÜ@šÓÌ…3p }ÿƒg¤âR³¢vIp|ÈL4hC ržĈ%r¢`Ÿâ–€!`Öø‘OzqÛ°â·P6R@H `:8è Y‡Cðà Vø’s.f<Ë÷hD$sÅm§˜×¢€Ä ðdÀ8^7AàÅž” /jŒHëÛõfy™hhï–¸üL°†õ‚(Xc 9ÔÚ=…`Ru<«'QxA/˜9DP`š[@.`Ñàã<N!TD¨¥e‰0Š‘Œ(à‚iD §E¯¸h( Bhã{“nȆ6¶1ÁÚÀ•GBB±‹5$DKQ3Ý…ÿK^2@ˈÉH¦uÓx5lÀœ¡@°Â[JAÔÌà:x#[<…Q©žBKAm+Qkt£T@|Ù‘Ö˜`>rØ €• @+°„%ÀÌ™F” W¥iXÀ×ø@Á€c“ˆtn­µê¯f,#( Ú#)@ºh¤á ¤lÀ3Ÿh mÇ@ZÐRD‡$&IMÂR ÆÀ}˜—êa >ç¤eø€^ Œ<{,ÀÓÆ@Ä#ŽÁKpEnð(PFP],[ÙòV3å¥Q5ntFa˜}-Y~ÁÆ-À3¥»¸hÕºÒÿŒ!.PíT lø)fléÖvüʨÄr…0¢ €¬RK{QP°Œ:¸0 µ’tø…A€ ð¾J{Ú–’xÄåhPF6B;D8ŒÂîE@¶ ZˆË…žGœ‹RìD`ôúKÒk˸búÊXÖ2,†U 胩öLB}÷ÙÏžô‚ /ÀÔ1}YC Šæ’c‚¬‰9ôàxi\T©¡`u?˜‚ dpו‘Cç¶±XR€¿éÖÚü;çnèï …ä‚ýmGÿ?h ›¶Ðˆ 3[¼ H$½¢…”r’¥à~é þÁ ™’äÖÀƒ ªá‚W¸uF¯ ‘ÿh„݇Ö1UL@Ç8LŠ„eÄÆ'® Í Ø…eŒºÐ"4„d#Ž º¶ŽAÝD™! C ÷rSq\-kD°¶ÀºW/RƬA¯z¬Êm#hA±!HB’_wÓõl‚\LDiØ9(ŒÀSDÀÖÀhºÊQ‡•6úÛ¼³Àþq™ˆÌàFžPv¼å7ò ®¶ÆòAÈ{¢-¡à¡à8¢ œ!( €È»0r®Æ@Œ³½Ù·GÍÃ:#3t¼Æ6&A¾aC–­‚«;[[ÿìFœ#Ð@n›ÛŽØía(ä^÷»ç½îEÿœÝ’î€Sf¥Õ¯·ó-àn>dƒ‡WÜóÞ1€´ po$€a!‡–Á*jÉ6–JãŽõQjfÄqŽ? @žØLAÌdïq™/m€¦ã!ÏÕÜ;8¨íÓˆ ˆ6°8WdŸ(&ÑÓ·/y0Ô4¢ˆ3Ó0ƒU¨³€¬“  ‹¾ÞKA,… ú,qŽK8‡ £0ÍR€>: 4(-èKÁéË…°>žøÏ‚H‚À‡)p z¨rxÀ™s*}â'"QµÂxˆ„80»°›Œ‡$Ђè¿‘€:t8åZ†Àò H´1G¨‚5X]ÜE^DñY1lþk<ÿ;C®„ܳ™ëf ‡k˜O‘"8.½ã;¿«™jŽØ€L=m؆4H¤Eêˆþ¡(EŒÞvlGw|GxtÇÜ3W:ߎJlg‹†q[7a…:˜ u„ÇÜ£>˜`à »ÙíƒC%œ‚)H‚qhl$ÿ#¡ V°_ÜEðIeÃý+Fc,C3\I–4CvL…`’@³Œ `[¿Š@X-0ÁG«»:Êž‹BçˆySÇTˆG§|J¨t²à“’(>}<…m#°…åË$Nj´¦ŒÇT°Þ±‚i!Åh^ ·zØ·Ü$#"Œ#I’X(qaXÉ¿Ü8Ih€”lIÃlIs0el²Qì‰X† ȀרB‚à `ƒø,á#>«Û…sÄm0åûæó°_È{`ÇÄ\MÖlM×|MׄCغ®sŽð¨«Ä € 0  -ÿÀ=AˆMeœ¾b°‚XÀ XH"yÎ(Œna£ó#UP…pðKhèÎ8øNjÀÁ4Ƹóš óÀ…Í•I¢€‹ð³  Òj4A˜P5]Óÿ 5‡³GS€éqž2ÛŒjx°"‡–A)ˆr€H…5mÏû…C@lð4nÑ<Éì¯[ÀQ=r¨„šÔ‡} ÈTM}‚èT#ýTP UQ5O](ÕõLC TCØÂ×|}¬Äa©&UUX©5ƒUX«Õ/ÈÚ/¨…Z¸( Ëue×Aj¨¥¥¨“¸®CJh†sàÕ%…ÊØ†x ¾á3NRG®ÕZ½Ý[¾í[¿-Õ­<¹e *tš‚›0‚!‡—` q…‚Zð[­åÚZ0‡¯}Ø_àCšTÏU:³-A軽tMNVÚ Zd¨Ú«m]óäÛZÐÌ¥¾bØÜCh¬4“tͮԛ¶åÕÿÏÜ@è¬Öã…îØÁ\€] \æmÞ½­y¸4ãø°€4è l–áÒ…pŽHÉ›\çÝZs„|Ú_˜(ö‰´=(HÓõœ]°VdÀ_©ÍTNíTÿý_`îÔ¿½ô5È&-‰D´½T0‡tH „A¤ú]^ Yd /Qˆ0+@Í+(_¦Ü\¨› pHL9$–@‡€$h\à °CðÓá¬5×%>ê;­Elàõ\Þ¬íZ˜Ì…_8]pÐ_‚5Ønb'öß1ˆb)­-UÌMC#Î-U­…1%W0PpÛ·Öm(\½ÿ èY{á)~c8Žc9žâ/Ð…²cÏ"€¢ È€$hEÔ˜E‡ø°átã9†c½5Õ†í½â$W!ÖÚ(®c‡5âÓU]d(X&~bNàD¦âcÐcý‚7.aåÖ"ãàݹ‘šJ”BÙtÐ…OžåYÖ…_8à…s1BtX‚áx¸Œ~Û°Ë…TeZžã:fÖ¬efÙ%Ë#Î_LÎÔèdl†bZfÞ7®c°Ê2Ù,°àà-4­S‡ÚDRø…?Eäe~ç)¾y@W8;$È!H‚)ðŠkh1£ƒ\É#ex.èOŽfKÆ_%ÖäþÍæNˆŽh‰îÿŠî‡}Pd¿5àº{Á Pͺлù@bmcöÛ8Þ‡}¨è/€X@ô(ErÛØ8šÅß(¬:û`Ƀ~h j¡j¢–è}ø¯U×K&ØL¶f‡Ææ¢•žäÊåZ5ņÎ"Óî …ß¥A3Ö« .D~AæeÓ5µ\ò•ä(>êZpizNz8þÙq á}ˆj½Þë¡>j¯b¸_jX†~ê‡&ꋦâ­_AH…ThÄÞÑ`nÜ€|l¶K„ÖaÞDk4GtDÇþìG^Ï´esˆl èŒdöÙ£B:ÍžækÙžm¿NÃÀ&lÜvjÃ~⢖âÿØmdvº\ˆ¶’ÍUh”$À13tVÛ -t:éÎâÜcGr%ß1Ї-†c=aƒÔÈnè„mYžmôæëìvØPÄmÂÖíÝnb¢žd]ÚVê( ¥Û)‰“á(޵MÊb>M*“éÀo÷— ±ø..UTý…:8ƒxå¯XàŸK¬~±‡åMoê1¨…í>÷XøŽoö_ñˆÞ‡u¸Ü¬ƒ¸…3è¿qÏñ3xRÏ-çÀ.àEà‚{Ø‚ €y`›¶@g0V`…˜r*¯r+¿ò)C€Ól4{h`´fÒÍ-Z…B¨}1ÿ¼] ð€5_q7s8s9Ÿs‡èu0÷ì×T"%L?ÿs@tA'Ì8·ó/@×@€XØbø7xtH'7tJ'€X.ea pªR¿Ä6“²Wxˆ ˜ZÐWuMðX÷Z÷Z¸u\§…xX€w Y‚Sx…r(~àì4íZÚõíWCâéh4¼ns:Ÿvj¯v6ß]€‚\€€Opo>tpw?‡sˆ>jt…´WxH_wvôJà„^˜àßpªðtcè\à*0‚ ‹hîð‡g@O8°„‡…_x†/‡wx:ˆøÿˆÿŠÿ:ø„!˜†¨c7]¸Üæ»ýˆ¶v”Où7—êZH…\¸JÈä÷¶fq¯yAs¿N…b(¨'hw ‡ôJ8‚ÕFbcHú{ßF1‚zÀ: Yƒ8XZ„2@xK˜®çz†‡ƒ‡‡x‰§ƒŠ/û? †hÀŽWÇtmvì¯ýrcƒ¼Vy»·{ ø‡_ðvš·yÀ'ô•_‡+€ÉRð7p‚Ÿz ' 0‚ævjx¬ àÅ*È#¸†%=NAPuZð„¬Gø®÷ú†û±'{³¯x) †iXgÔ,Îoæ­Üµ–ö»ßýÿj‚1¸{¨ƒmð{ èóÀ·yIH~I¨ó1¨P8Å~é~Ư<8Ê nÀƒHÐ`”é%ûÛ™èT‡ Ò×úÓŸƒ¯û2XýÖ/{)‚B(@ÓXŽb %,hð „ 2¸ï‹ î(-¨¸Æ6rìèñ#ÈB”Ï Ê”*SºiéÒ Jœ¢d`f€Y†/ò aQ¥Ê‘#Ø| ÏÀ‰.ˆ€öŒ§2–¦Î©ZV¬e¶n¥ãÕ런bÇ*û)Ø$+¹R Òõer=0¬k÷îB@Ƥƒ‚ ˜EŒq…,l˜ãAÍÿÕÑfæñã•*_RöÇf™573D¹€ hPLNHp-È¿l"5Å@èŽTªVgWåÚõ+n°dËJä«•ŽöÌ]³O.ÞäÊñ’4g/¨ÀžiMH ¥ è|`e lø£å>x ¦˜V‘iæWh:¸&„–Rá…ÆÅUP‡†úú+°Á ;,±À~Èûè’c¬“?à@èu¾´×1ÄÒ£?F*éxDñ-ê0óIh±„>øÐ°C©¹‚B$:…Œ&ÌÁj«s¼ +²>¸æwxÒ¦pWÄ9'¯Úû0Äšb²+ÚSŒ±bB {ü1È!‹Üñ¯Ü%ºm~SÑÿGj'XS Ì0³ˤöOFôrª[BǾöû/¬ J±to´®)a ¿ØÓ–œ9,1ÖY»'_18pˆàÐÙe›}6Úi·Q²'s«r¤Çy\pÁΩْwj À Ð÷ú@GUü¶Š´™J3í4„ûÖ 1@aÕj}9æC”Ë/uX0è¡‹>:饃Îö>9¢ìè£äµÄ²'Ðô|+|ÿÃC/Gà[Ò ÑE¿1ñ"h[ ŽÅ´iªIëœRŠÃ}¡ë†Wc¾=ÄÜíÓg1uÀùå›>ú铺êo·¾ÒyXò- ø óáqÿÁ}(ðȩ쵥 Ü–ÞðˆwÀ1Ï6Ê óœç´‚ÝA¯Žõ2„œåpƒÝ±‡ÄŒ°„$j…tn|ê+Ÿñx€a³˜Ãì#þ8ÃñH„, hŒéôð‘֌Ö@ˆ|Qò •¸ä§Éiyž\ô(¨NbDcp€pØ"â\Aaº¸'>ó©Ï}ò³Ÿþ¼çRá5+ às¦Á nL2Ó˜ÆD¦2ÙLÊÈ­p„& D>££Å2¶ ÂU²ß'&¯2NrÆÊœçlÁÔ©ÎxP‚¯À†À_䢧±Pƒ*Ô¡µ¨F=jPsá+Ô¡ jk¢:„’ ¥‚C‰i¬d2eÍtfü&Í;Ђ8&@ZøÀtÿ LzR”Šsœœ|éÒ@)Ó‚iBw „/ØŒi¼¢­ˆbo¡ØÅ2¶±ŽU,b#+ÙÉRv²g`…!äÁ±‘Õ@]ðȨjÕ†:t«õêWƒTÑIÁáð„'  @¼õ‰r+8ëªÉ»âU¯{U§&âq‡xôµ¸>Ç‹\‹0·¹Í%t' ÝéRWºh½.v¥SÂÀ ðH¦:B†fõ¦í*ëRk¹±÷›þÊŠðn{[”¦ô½+åíK}û[¾·¿}õ€L‹x8>ðZ¡kVé*¸º>+v³[]Z BhÇ‹ÕÒ–Œ«Ëì–z)ÊÞÕÊפí•/ÿ}Ã$E»–‚½Mç~ëßþXÀ´¸1Žq¬àïøÁÕ°„c´]ëà@M€ÁFHZ­vø´éèzG,å)“X®)Ö-âæÒsêw¿3¦qs,æ²ò˜Ç>¦.¯«]jI  P(yÚdôÒð«Š2•óÓË›l±_Ó‡òËÿ ó˜u\æŸÙºi^®©5O @Éf²µ<,QAªVÏy.ñ•W¼[@wRÐ#t¡ ]c$ZÑ‹Žn£!œæ5S øÀœ/}Ì9ØÎw±§§ ê>‹:ËŠË/ŒQmèC¸Õ7~uƒcýhHS˜ZMx@’ kóòzÓ5ìt°¥vP¾ÊKŸ'¯üòÌ› KàHâ* 7úpĺ!FÅED ÇÓ#ÈõáXà‚EùçãŽÊ&zè±»f ¹BìHøç¯ÿþú¿àÿÿ  HÀð€L ˆ@OTaÓ"Þh¥«y¨Ãh€SšøšV;e(Cw†XÆ2@höñ ¡Ä…^9, s8Â+ZñˆCâ†8Ì¡ÓÁÀúð‡@ bÿЬ*qž¸…ÿP…€)[P]¶lõ…¾ C\øÄG»ó}pPØŒ1*A ËÐÃ&|a dC3ðƒr©ä`EZaÃB¤ã€ d …HÈB’ÛRÎV°ƒäBUðAš° 1œlŠ”jÝ5^'‹ØmÐãS¾¸ 1£PK5‚ÁJdƒ°Ì†âà„9ä` Ã?¬@†öQÀä!‡IÌbþ/ ƒ*T‚XõabРËIi¯b~…À·EŽo”Ê¡)¥Á4< x>€Eñf wð@ Ùp'Üè‹P$ÂãÃã.ðÿŠÂ—: hAЂô M¨BÊІ:ô¡5(R%7µªF¸Ñ6ê#-HBƒ øù"ð!ƒ¸_7›fò2„bdƒ4ÌaƒÌ"°‡N=XøT )Œç<åà‹8$BýЧÃþÑY,a†5¨@#JÕªZõªXeD–`$#Q u3œ´0†kR]ð1FÀÖ º””b”F5‘†›¦s§áð„'zð¢î0!….§ ˆ‰]lbš¢@„"pC|”j@O@ÙÊZö²˜Í¬f7ËÙÎzö³µ‡–°i »Þ¦À+àý*uº¤_ TJ¸–ÿFí|º+%k‘ʬâ®;Õ«‹¶SÑ|€B …P‡jÏKðÀ ¸T×¾ „8 ª‡°¡v ±]í‚ö»à ¯xÅÛ"U!g‡Â¨Ï€)mQ* mrÓ ²Å YÈ®¥Åð"LÉ(oØÀ7õ©Nóš×õx‡K¤[:¶pKȂֈ° ÔŠ]Üá~°E €•-+ ` ­avGLâ÷Ä(N±gɋɭ éå™Ýb…¦ èÍV|cÆ5æ ŽIÑ Ž’"b§ü¾´”b„F-QÓâåtÀzå«w •°é™5b~ˆÐÆnö<Èð¯æûa¨â±{q‰×Œƒ´ùÿÍnŽ3œç,ç:ÓùÎvÎ3ž÷¬ç>ã ‘ÐJ°«N—ÚÕéªu|x1R@Œ2¡ ÿ0É,TœïȦ¬…mŠS(‡ƒ¯Û1Φ·^4Mqqx—]à‹D\8̶øÙ $5 R(b ƒB €Àë^ûº×8¶°‡MìbûØÈN¶²—lS$Ó=UNÔ¢€ä0ˆIl{œŒÝE™?ÜãwŽšF(N™ ¢œv}rpµd…½ã¢2®VÃP«Ü£ @Pµ5²Qa0«ÂÇ(Ó &å/$2H$Àð†;¼áÌŽ¸Ä'Nñc U¢ŽqÏå¨öVð‚GKZJ·¾–~pBÿ˜‚ 7ðkìÔ¨éo<à"8ô‚«ÄT­Ô¡ {¶ê‚H‘opB‘3 P`…>ˆ”åt*Až@‚ `áÏzÅ·Îõ®·y«/¦ÛWû0oLÞÊŠX[×Þ‚’· !dÃ,‘X4…áVF-š¬nJ™PÐ6íz;tJioB@ xýŠ6¶úª )@AÖð ˜z¾ðÎKÀó÷ºèGol›mÁA˜ÏQ'EÖ¹îbZ\ûÚAi £át†ÞÁŒÈÊîkˆä*Ô=\!d|gÿÙ¬nL)3¨ƒG+C ôÀxU=é<˜‚ @hý@Bÿ柰ù«ƒþóè_8p°þö³ÿýî?üç/ÿúÓÿþöÏ¿BGeÁsüQ…7)DÃ=ÞÓÚ {lW{¶—_áÁ€ Zs`[p&³Ò´Úñ,2R:c§.(cvÿPEkpEE 8Løð @€¯À Ù Æ3 ~ðA ÷¹pãGœ—~BØy P„Fx„H˜„J¸„LØ„Nˆ„Ï £†(É7AÌ7)Î7#}#‡€l¥€·7J±FJ@þ`{ b©Ç` Þ-m«WÕ€%E1Ùf€må4¸o/˜ Ç4èÞ0`,÷÷ƒœÿg~‰O8‰”X‰–¸~0 ò×"‚$xEYä…³W{*p{Ê †FdDL6|Ofmƒ©£XpÂ#c sêÅ(Ë74T °M^È4RÓxƒÕo„È(Pï¶1¥™G@‰Ôh~–x؈{ ƒ¨åsÖ–=Ø;¢ø…`˜_±À`Ä4 Àd¾EsáP‹z}à(l‚.}  PV’ZWø9¶…)€ Ú  £0 HŠ*  z0X­v `ÆÉ}ö¸ˆs@ И5 VWÔ˜"‰âÐ,°pF¸ B  .g+Ds!H“*p^ÿh#pŽ£¤ŽÎÀÐæÐ[NÖw"=–dcS` )féâ(Õd+ˆ¦h›PŽ: †G–ÍfÇH e°­ÂŒ±%% •ð5p ’ÈP„q —rY—ty—s™—v©—x¹—rùgq-M !€x{° ­‚}pS‰…V„R‰“l¥YY{·W ±0†ÀŽBYSæSOöwÑ㉸ˆó0)adÓq¶rMÓI|8 ){<© êhJ>pa^I‘L~Ð*AÐ(Bs >8~›×–nyu|Ùœ~Ù—ÐéœÑɦ'Ðònð 8òLÛ!=§YoUy‚›ÿ0™¹ç†XŽ:à 4ðŽu…SV|g#‰…BÀ]PndÂC)êð7"w€({£À“XÀ©ø“Ð ÌÑ<ð ¾ÉePÞÙ0@ eà(@¨œËY ¢":¢$Z¢&z¢0Qìxƒ!ÒQù@bRŸ“²±;“©µ¹“ç)Xࣛ™ŽÀžhÀðYDBÐn+0#Ó³g5)|P¡c ©U+]0 e 䩣戙èÈ: y@/0”6•SÀÇÈHàÑ& v&@ú`  €Š€pà¡n‰¢~ú§'z-V è…|ëņcu‹cpÿóÃ7™£µ™·¹™\ŽAšŽËð“À³àSÇ%^²‰«×($õÂ"I”@&'S+kP)°¥´É£˜Ù“:Й4° BI”>Wž¦Làe` €(A 'XóZ1à‹pg| ’€:­~ʈ #Kú%®r#4v-9LéZ¿3àà°QÔô–PÈ™’ž Pö °ïi»¨ªãɯ'8ð,0ês] ÛíëÎì¬@»JÅ´¬V°Ù ,a` Æp)@–.äííÍwAf ÕºÄ)À "`êWž¿´× È9@?âÀ~pÜfúhÀŒ®.Ñ~{P@÷W~«Î å’=zx‚zðö,€®¨€înDTödaðNX?KWV«`-ᇜLÏfŸ Bp(ÂâXãz0 o q?ꤞ©/?ÿòÐñ½õ¾ÌW„Òï ƒ–b 9ð}SÆ¢ªÌrk¼ÎývO Û \aþ!òƒ0H .TˆÑ1näø"D™ˆbDü8Åe’Ž}ˆˆüû7OÝ5DE"èÁÂåKØXŒÊ2ªX1,zä¨ )Ñ¥;wx0!CfÆÑ(P CŸ $©RPéI  2hÝšaáž&(lcŒä?3ê˜!ò!… ˜q±ÍÅ–Ån(Å6ž‚Ú ¦ì­Z声O{¬ÈZä 9 ѽ³™IÞ[ÃGˆ•=žìÙ ÄÌ7¦ñK„F§tv;Ë#ôS :.N ãŒàš-ª"8¿‹°ÂØ2ä–ÜiÉã^Žî”Iž¡á…@@ aIR\‡cƒ Œ&‰+z°gg«¶úqðžj«±f Ü™ƒÝæ±â -|ò™(« "·çÿYc·áž[n„È! 0Ðîrï  ƒIü`Mm’^œ„'náà€1‡` ¹pbH(ƒŒ‡ÿ<åy€càÕ˜€E’k ¡’zBé0v:&°ÈEЩ£•a..9ÜF2ä Z@c‚/ 9^pÐâüÝl ð!| +¢@xe0Üà/ÊÌ<Ö€ˆ*¬bH©¨šAƇ5 ¢q|0—0„ñ 'oAÄ2Úw!ÛÑ k`×îaƒœks „Œ±ÔíÐ] ˆ@˜)¼àȃ8Ar¤Â6 a ã Y !a· a¯˜š-vÑ‘Záè®B‚Æž(… ¶ Þ¬aº_à 0âhlpLS á ÈCïÒ<0bý0AМ·0ÿœð,_èÂZ„°‡pÜÂYxAØèF6¦óœnü—b}Ð7sÅy!nqÀHySR/ò‹AÊ þ3FÞ¢'„@C¡´Ð]y÷ gä!ˆÁf1mð€WÆ=˜UΚðŽþ,h& Z65c†5!t­¬éHðÂX&žú €¨¬!ω_äA Rp“£ñä*i<#”œÙ ÂÁjÅ•šáŒg¬ˆp@-©ÇÕØ(´S¬îTÈþ`ˆ~€«k](BØ:‘8!iã ÊFAÇz2V#%®ž!@f“Äçðª@ ñÂH>šÅÓ¶ú,#²±lä’^Ï{ãêv mºYŽìéSZx‚}œ‡ÜVcÿ•ÿÿ`/rR†9TÁË:æli«aŽÒÊV(²¬1pJ-# 'í&¢@НPt-m!iaӽʀßìA8"Û˜ÁgÀìúð°Ìa…®>i!ˆ}† ÕöàjÕ¸Æ6º{å?¨ðo€\àçÇÿL?ú»x„_„0º¦» ü-ð‚ÃUPÇ?¢kÔþÈ…±iµÆ/y>cžzõ¼èiæǽ†Š€„# @ÌneUZZ1:@û¥Ò~pþíð)`ÛÉ7Ø€%aþ¢Èg¦°Tusƒ(¨ckbÃóàð¹Vë|èAWÍi.Hè{ßüxÛÝþoV ƒ]JúA…*Ä ÛÑbš\Ëzp È‹cÀ°ÇIbjôa Š×ÂÚ0€¼#þ½bS©“ äæGP ’¢óž+ *I ýZ(tH{Ú±ü÷Y™kȺ6Ce©øe-˜ 5ÐÛ"³ÿ(.öQ¨Ny¯x½Vèn©¬k·øÛÿváFœ)`…î¹-ZÀ»Œ.‡vÝ–×À ·¨Â«ÿ¡tØR æzFÜë^‹asfÌÐMD|¦ ¤@Á.<”¤½Ñ{‚Ši¡ #­¡#º¢K€Fø7¨‚.ð¸XS¼ ‚Ìz“: ¥Sæ¨>(5n ‡!c´)(²(/ƒk|AŒA„ÁÛ#.‰^  q7F0Ž´¡£UØ’}£l=ºy=¸†/ ‰8äH¼-Ð*¬: ¶ÍèŒä ‡Á蜢 ƒ8 ƒÒ3=l4$H=ÕkCÿ7T=t~X$‰CBˆÐ= 0"Xƒ{8úÑ%|«C;9ⱸàt…|DH„DW€…D8Ö°—Ôy(¸ yê@XÄ}sÄ”Cº)€@1È c¸€Þ»XdºÍ’9šK.O¸§ ’U𢈃8H†dènPÓ£ƒLÃ5|Ce|CvpA*@­*XE’˜ck°ÌË¿=˜ƒ)0Á.ð´¾àù)xЏkè"älFvl„v|GwŒGxœÇF(€x+ Tã‚&¹'²a€($1Á©£©U“ÇxtÆ‚a°=@1hB™›È´˜ƒüóÿ{4IqÈÅøÅnè9ȆlXà†€6d\C`Ãe|IvˆÉFà`‡=àƒœH´À¿ëU‡")¨ÔP’XÇëã´R«¾S5`PGwŒI¨ŒJ©œJªœJW°ˆ»9p‡4ù-|O¸†н¨ø#ŠcÁªŒG*8ۇ¹1 ™ã&o’ÐHIÓ«aîñ9pNàk°QXdI—|IÆ<ƒ¨t¿‚„p°‚a`†. ‚y ‚.Ы‚¼|( ;Ï™¾p$D²ñí í:˧¬J×|Mª „.໯™Û|`Æé…p†èÞø£ÿïƒW€Í™ô«_(Ž!>¸>àƒüëÌHãíQ£3špLk@ð ÏAPCÅlIób  Áqü.Ns/Þð UPvˆP3=ÓíW¬–ÿ½qZÀšè…crË&ûˆ‘ï=S'¥É°úQ4b„½ÜO+Í·… ›v*(RF-ÒW@$]RIMÒpƒJmÏjã˜ød4B¬JC;.qSÃG+à£Z(¤>Â’-aAµTX½ÔXUY­UZµTx , ƒ{¨‚#9µ‡´‚Ù‘‘¸á¤v¸ÕZ ÷\Hød£ñÙÎi=§´++‹ë·÷„ÏU`Ô`Ô x…HTr5O78WtmÏ‚£›øT'k­1æÃʈ›bG.…Ÿ[ø$¹c¨(*¨TtX‚-Xƒ=Xöô„5¸Ã'[ƒ*€…`µ‡=âÿ@µuÎF؃M×öD䆦\ÖŽ}Z¨%X`ðŸ¸ä€EJ@„o˜ @‡>8Vu@¾átÚ¨Xgm9Ü«éâ7 -ÓteÈ–uY#…Ô›Í[½%ϧÅÔgì«”I޽… õÙÒ{šn9±»Ÿsá³=[É-ØP´(ʈH¿6h‚[Qt ‹úX`¼RÖÉ¥\guÒkMŽ%ØxRºmÙF­€#Ý[ÛµÙ¨eЩ|U©=Dµ©£ÿS=´=ê£?ÓvhÝÓ=Ý_°‚‘ÊÄ[?q¡1Ûb†=±ƒW@Þä=W3ÍÝ™äÙ×Ú½]óUC|H_õ]_|è^K“OdY(ÚIÀ‡á^K_"Oá'V_×…Mqø ­,8Õg ­1¾!Be…Mÿ5\ƒÅà OóÓÉ’¸†=X«Á+XÖ$~b?þã,Žb¿ê`pÒò½â½Íb`™T[Wx»þÙ1T‚SÕDZ0"32-Âçs;WøäO^G¨tÝ'e…‡ƒy¹{˜ƒ¤±·ü†#dYžån_vxÆ_°‡Ù5dXD¶]?öÞPÝŒË4`Ø´ÆÝ©êAZ¨ߥ#{ ¸ŠË4jÜ[GöL×'T˜XD¸†9˜« r0»rX®TZ^gY¶ÔmÖåBa_þe½}bïíÓÁ Ytñ…%^…{ŽvÛ8xúÄ9øàØg…Vh¹Ù+#ÜØeeÏ÷tQÿbén[£´ò2Hufg¶ç×õ+x.Ò!•gzÖ[0‚”NéZvçu-qè…јiš¦iOÈ_TS‚M0CX†eP‚`¨:L+÷Š u°‚p€°‡[`j§nj¨~j©†j\ì*¦Ü·Ÿ•JÈŒÖM¬5J;´ìc•ë•&k³.k´>kµNk–`~‘.éðDL4¬k»¾k¼Îk44¾îk–nßv(8¸eˆxp€:HlÅ^ì:pM(Ñ´RLNÈ5ð  Ðƒk +™?è@€‚OøB(mÔNíÒÖfm]Ð…z¨xPƒŸP6Àh¦eÁ-Óð…Oÿu×Uãc•ökâ.nã>näFn#À‡7€‡Bžk½žnê®kânéM/6€‡:)`lðnìLp‚­ñO$pl€ËŽ„] ‚ )¬Ã8à„f „+xMØo<èoÿþï7ð'ð+¸‡‡KPq(€"Üí[ÞY†X;wtNn Ïp ïkfnW†^PƒèOº®n¿ëâ&a·VÐMøîðŽñLP…\`—r˜‡"P÷…H¸  +8;V+˜¨]ÈïýÖ„?hò&ÿo<ð/p@8p+·òH€€/ÂvˆJG®¶Ÿ]P î /s3¿nÿ#pƒv€Ø…’æek(ñŸs4ǹ…VØ…î†ño@?U°‚]艟H¡°B·Šˆƒl@òÐoþvò?€r)*¯ò+ßôHPV@gu,Óˆ¾Tíã3?uTOi·.CxsŽó9õHq5wÀ‚=÷n]ßõw(‚q¯)˜'ø‰ÿ$ð†1òìdÈp„H_rJ¯t—òLßtm?€KèØ·F8^$VâT/÷S_n7xRdPƒ7OX—õGót‡d¨‡]¿w^÷óñ¶„9SŽ/ðƒM@ôõðž)`!nkpBt&§tKÇvÿ*×vЇ‡e`¦uÄJ5usïx3Oóe€Vçexwx¯n HywW(,€˜‡y|÷î>¯ƒ8X„0`—0°„2Ѓ?რ°…˜98‚g_ø†§öj§ôKÏôl§ø+8€]¨°¸ ¿pâNy­ßz®ïz¯ÿz°{¿Nsv€m`’7ù“Ÿî­çkæ¦Vˆ„˜—ù™çsÆv;(}@¿çñì"Y@˜Pƒ¿! ƒdƒhŸv;°ƒ¥‡øÿvú‰‡ú8€ P†O'Náök 0€°ÿ|Ð}¯÷k[dh Ýï”óµÏk­ïk·N…s˜{8¨{»_lÇ&…kˆ‚ÿª=©¹h˜,Ÿ©‹$øEh×…ÀƒÆwüÇòÈ—|§üÊ—zªoZuÎzÏ}îïþ®çp׸`ˆwgýÖ¿ë¶7€†^)˜{ÛïõLx$è‡ó‹* Í‘Œ‹ˆ{EâÄ鿢‚.@oì0üãð!D<%ªhñ╌5èØ±‚2V`4bçŸ*5°léò%̘2gÒÔ Ò¾ìø1°·ìR¤% †-jô(Ò¡. qÃÆ-8R§J©jÕj¬Zµ:°3£ ‘Q.€`b‹– ¶Ä¸‘ãß¿yVމ#ÇZ³OWþ0´ñ/ÞhØãB„ÿ쪆?vPª\Yó2æÌ-+ãtÊï× {>ªx)mú4êÔªK/5àêTªW¯n­í ÓRBîÁÍqaà 0`nl0÷+Nê&ˆÀÑ7|~(á†9"öòÄ/~¸1’Ò€æôêer6Òˆ8Õ cÿ>þüú÷ÓYÚôiT±Á1mµq•É€¨RÆÇÁ…ƒp•"Ärq$#'Í ˆC}Ug`Ùa´]FÝu¤cÒZ‡·ýq€#p"‡*G8q.)3ÄQWA¤ZsÎ{ùÕ—­º âD±¾1+­lÞŠkňSd®w’yw»0à ;ü0SLýçg²ËZÜì´h¼1Ç i„±ŒJ¥í¶Üv‹!ŽT`M6r$óÿ2A/_˜ '¦Æ‹‡&ôêL¾× ¦f­ÿâJˆ/Ä YIûš0ÓM;ý4ÔQC0üò硃F˱]{ýµ‡Œ-ÉnÕ­o K3âºÐ²q“ZjŽè…³™ìLo™>OÄoÐnb$ˈÃ7R;ð8ä‘K>9å•[9;®À' Ž@ê(ƒ ‚B»1Ø`‹½(ÙeÈÕmx\ñ‰#m[c 'œÌŽ@3vÀaΙè½7Ïùý÷¬{4øÐõøbA0âœÀ€03=düX=öÙk¿=÷Ý_ 7ÎÇ5˜ß ¡7Kzé]Ÿ.r¶ªWe`·¾q!º8ÒÿÁ9çtàˆ.†°»/1Äw¿^߆8 yƒSÃ.²`g£Ò¸{¡Á r°ƒÔ C(Â’p„öX…ÂAšÕ”¦%HB Ò‡1µ/lþ›€ä‡úÝA®;^G®<ÐË€Ü[ý¶@ ÍCûÄ'†0(Rqç¨À¯X-r±‹^Ü¢#ÂØ1’±ŒcìÓØŒ-"BIJjð„$”À •@ßFG€ö½/u:4ÉЦ·ÀLdUF4"ð‚GHÇsâà¨(É*JQŠº¨&ëqÉM0Œû£'Í(Jþ¥Qlt#ò„A(€$˜áMwCÔåPÿ‡R$ÚyHꑉL¢Ï–¸&B’“œd%-©‹e2“™ž|æ3GiÆRš²m|c*‰R”à ¯Ì eéÑòH¶Äe.Ó©Îú2‘~y#æÈWÇ”d2‡ÐÌ}êšÐ”f©‰Æ5Z•Ù4J%JЀÐ3–^ëc-ÿÈÃuR´‡¾D <•ØH&6°ž÷¤d%ùÙLþ gè9z̓¥ hÀúê¾—~¶¼åD+ªÎ]º˜×æa:ZÌB1Ÿ"u&ICiRR T¥e)Qžà…„.œ¥MÏ™Sæ’§¿Ìh07:L¡B’¨QLæQ—™T¥š¥)‰=%6¡:”Tâ›2µá8qhN‰Ú†«;mçW{Vyrô‘õ4&QšÖµŠq©nuj\åJÇäѪxe SôÚ(ù¡Ó¯],FûS±Õ°M,ZËØ¥2•š•kQè0U4ôk0©©9»UÏz5´ÂvH»b–µ!UíZYûX¸ÂV›³M€e;TT_v224_html_docs/images/glass/purple/logo_purple.gif000700 000765 000765 00000032374 11222361074 022517 0ustar00abwabw000000 000000 GIF89aÜ‚÷º¬ÌñññºŠåÅÅÅX+‹èèèÑÀçlF—I#pm7±þþþP'}½­Ñ‚d£õõõL%vµ…âÁ°Ö6ga0›("3|Z£\«\Fr‰TÇ…i¤ëë뺺º6V›gÒU)…’Ššp8µeG…~bœ‰k¬Dƒ‚gŸ³¤ÄR(`Qq[4‡d2¡>l7+Eííí–‹¢V*ˆåååC4R)DK$tpKš+"4¬zÜyU£ƒp—D!j½³ÈÅ´Ú l6®jfnOJTÓÓÓƒLÃY(ž–aÏ{[r9¸­¥·yA½„b¨{l‹ÜÜÜÔÃéf3¤Ê¹ßa-¦tQ›¨¨¨úúú].•›§h4¨J#rd0ªîîî`;‰O&{j5ª]+¢k5¬÷÷÷̼ájT‚ÕÄê[Ì£–³rS“¬½âââÓÂèϾäŠt¢Í¼âd;‘¬˜Âνã=vÌ»àu<»n6´Z,M%xÀ’éM$„sM °¨¹È·Ý˾ØÈ¼Ôš…±Ÿš¥ËºßQ#•¥sØÊ¹Þ”k»T(ƒU&šg3¦.WÂ²×Æ»Ò^/—¡Œ¹\-’eµ¢pÖQ+|}FÀ•}²Z>wpZ‰ÎÌÑ›qľèɸÞo7³‘y«L9`S>iÌÄÓпåξãF#oµ¦Æ~Z§ÆµÛg2­¤‘¸xVk5²¶«ÂL †g©}u†0LȸÜL%wv[“¢vÍŸlÕª|ÖvP¡N&|R)„²à…}‡e¬Ã·Ïf3¥º®ÈA fH"o`5O(v>»K%xx_”o7¶Ä³Ùi5¨|W¦L&z¨•¼`/™c1ži4©_¡"?T'‘¨wÚL'v¦˜¶wX™Q&‹nN­€Ö¿¯ÒsB­g@’jA™Y/‡G-e¦xÑU-€A+XÕÏÚN,u·¨È°¡Á‡k§V,„k9§¨Ÿ³¨š¹O%z=aJ#~O2oX)—Q'F!xN&yÀ¯Õs;ºË¿Ù½ç¯~Þi3¯L%yg3©i6«·£Îk6¬Ÿ’¯g=–ųÜI#s±ŸÇb0£e3£GŠ!ù,Ü‚ÿu H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱcA CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒò´B´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶,XhÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘'?ØÌ¹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶mÏsrëÞÍ»·ïßÀƒ N¼¸ñãÈ“÷¦!òçУKŸN½ºuÞæRQèÁ½;… t\ÿO¾¼ùóÏu¤ªÐÃF¦Q‹&1råáB H(P耾¿ÿÿ"§KÊôP dL2 À#³Üð‡+Dˆ‘A3P yìtèᇠ†(âˆ$–hâ‰(¦¨âŠ,Žø€9RЂÌÒ ðÌòG…ô(†DT(„#kÌ^‹%j¡ä’L6éä“PF)å”TViå•XfÙd.ÚµIÒ@”@°cHAŠ<¡„")ÀÀáˆ=¦K3ÌÁŽ–|öé矀*è“tÀ^˜Ñ ƒ”Ð!3dàˆò<1ˆ)ÿdª©\„G/s: =ÊT çžƒ¦ªêª¬¶ª Äÿ(C4“0Šc<®ˆá¤\1¦šfZB ÁþãÇqÈéH¡9Ï©Hvèê´ÔV[evÛµ€Á"ˆIæ,Œ!D/Ìrl°ÄÈ~ÊH@ì?ƒ„bŽò„‘äVξüöëï¿ ,ðÀlðÁ'¬ð 7ìðëǞ{Äãm™Ìf¡<áG±ÿ¸QÈʤÉ/¿D’&6àùîÀô‚„<\TP ¾¬-Ä<÷ìóÏ@½¡b’ ­Üé¤ö²ÈˆÁ/&TmÂW_=B$2ôPH¦OÄÙ‹¥=¤‚ ­©£öÚl·íöÛpÇ-÷Üt×m÷Ýxk¡ÛDÿƒcƒ«Bðêë¹ÂJ Œ~ÚF’ƒÕVc=Âä# ü‹-TvœÀpáFÍíCÞ¤—nú騧®ö =dRË‚c–¹£Hs+A!ÛÙ€ C^µä”OþKå¬DBF d*¯;¡øQª:èÒÉKªg¯ýöÜÃËÙÐ裋Z©ÓÅŠ<± )˜ ðÃ_Ä/EÁŠýö³B"ØÐ¼¤0B¸P<¥¢L ¨@8ðŒ 'HÁ Zð‚Ì 7ˆAsT€ â£3t¥¦' d%(Äâ( ƒ©¹~Z3Þ3žA†F#5Ì!ðö€2¡¦x‚ÿŒ S(㸰Å!ô‡&:ñ‰P|§HÅ*ZñŠ\—lV˜ÃD@F:Ü D4W±J®leÂq0ŒáêGÃh@YÈcE ‚hˆ Îð†'¾Q†T`~ˆƒâà7Ø ;°óðŽJZò’—Ä¢&7ÉI, BbíÉÄ «‘‰TH˜\„èéndíù] Ç"ÔÑYPA#@¢< *€$rð Oxâß`ÃR0?È '¤’8ILZӒ̦6·ù@+È@ïY„âñX( ßi#zÁMA­=ìÃÚû„G¼9Îð†xÔ嬠ÿ êùS Í@‡ ÊÀóÅÅ(.¸#OøÇ ~P jBñ¢O„F7ÊÑŽzô£ ©HGJÒ’š”£Z€‘~úV+ñÝjBð€ÆÄ iÐŽˆhȾ£-ªÍ’rt$.³  vÐýÌ…RÍÁTs(5"E¾q‚ª–!¡{‚9¸0ÄPü£28B—ˆQŒžô¬hM«Z×úÉ.͈[7¢¸‡w T#Ê)ydJÈD40ÏyÆo޶j4ªAÔFÌŸÔ[jSÍ«íô€Jj1yÕD< ¸‚z!S8ò”dY/úÖºöµ°­lgKÛÚÿÚö¶¸µm¡&‰ ¼âbÈš€Ñ±AøÁƒèTÌÁ\#´³€ ¬ðÔ 5Ÿ»Z6 ÉHÆ3«ËTÌ€Žè…š¸`$t¢»ße!­l%åk»£Ê(Ät2‚`°{owsG@€Œàpà4Ç—|Ë÷|Í×|¸Øø ‚"è:À:ˆò áƒo” { v>¶W 6À>&uã']ç‡~¶~  °OîG'ue8` 3 "j"À-Þ’#7.å‚8ÿPyn ï“¿€ ;¸0HÎp i T@6p7 q)5°|ø|Î7‚p‡r8‡ð=6°.ÕBð¾‚B*ÄSSCƒ5¨7˜~E0 £`GÕ åÀÜÿåE2•&p&À èУæ[b’og’vk÷o¼~/4O[ãv[ˆP6–`˜-À³w.j^}¶x‹·H‡º¸‹sh$ÉWså„j…Rxy‘‚8~Rw~VdPfŒ¥Kµ]OÕ5b&î*t"®±·`LS{és{1˜#Œ¤¸5¼—^&hJ  `¯ã Fð1 7ÇgkX‹¸øRÀ‹98Ûà-)žè}™p¾#~ Ž„Xˆ6 ev¦ †ÔØfvÈ À¤ HH Dà PNte;“§)l´B=¥y§Pƒç79Ïÿé%m^¨Šñ˜ð[àU…  A.xùr@O•P9•RY•Ty•V™•X¹•rÀ \23йðQ92 &@õrJ׿OÈ8ˆ 0‘8hKИ×°ìÀKБW>®Ð ¡0~0O@ ÛÈ\Ž&4Ãj¡èÇ(‘sYˆ‰ °^€æ“¨Ð6ŽxBëÐ0’°1€LÙ”·(®ùš°›²9›´Y›´ ‹'# è`J3j60 ‚#–ÐN”Çt0“P“ãW“7ˆƒÉ€ˆP€‘™?`Ÿø9 Ð ¶r¹·ý8 ­‰ TZ¥Z+¡ô ÷fjâ ôñ#t ¤~…†¢(ˆ‚x š~PmŠˆù£*ð*IµT&ÖÛ€q±ç õ¢)  ¦4ãB\À"22™qIƒÎÉžÒÿYш{I÷—>ù“€â’iRzýp Ø`@À2ç*¥UzªµùMöD‡4ñ)´“èyÅÌÀN³w2Ž‘4¹£p P`‘Ãê¨Y To6jIPv¦ö„Qš2=Ð GZÀ26Ê¡zˆ¹*  z¹ Ìq_— Fš2ÀB“ f„&v5ZÌ…H ý‰´Xª¬©°;°[° °jŒW#Qy·c\CaË5$p@”ò­Pw jÊžâZð£!{5@¬&û£×À%¸ˆ¢(6BŽ)-hœ™R*,ÿ`$ i†¹£ ½ú­‹Š~mJ¬?Š—¼ÀY¢ëJþÃ>“Ð(ð€wòGžð%„ã Ð?P¤êþúûµ`;°s@4£V abvØ}VkFaó`Àº± è÷±°x© |{ YP $k²Ó™‚@^F³(yˆ+þ€ÿöÕÓ)vH`œ<û­ËÉŒû¨zÙKÖƒ¹@ ®–¿å´À`$ WðW 1#B€µ°µ]{‹a{»‹0ÒèPÙð²1;{.XŽÊ0[æLN£ ™ £jš A ²Œ•—¹ ° s°‚ð· ¸Y¸=ÿ@ñð-MˆOxeò›º ©ð!Y¦Ð3H·Ð§‹h®‘Ê‘þd¢‡r`ˆ ³ä³¤ÌBŽÁ/Ë¥v6ð°À\û¯¸¶¸¹7³’`·â ‹Û‡éƒœ2 ˜ k_@‹tB—ú¡™‹—( —¼„T}Ù û° k¸B»áP B€«ã’ìN¡¨!}i= 7ÀppBqy é7 È ЈûÐ "Æ]:ìÁ7~ÃCeGynž`“,îðË@À¯´Ëµl̵SðÆpÇr<Ço¬°Âo88Œæ;ŒWfy:™‰9_#DÀQ Ïÿ`‘ŽªP 7ÅþYXÌ*¸Œ\ yY„WÐ òG 'äÃG,`=,L¹@âË¢5+Èȱ `£€‘P¼ ’¼¿:º šb£#B.jÇpkb2À<©@,aÃ+~€µÀ¯müÌ^@ÇÒ,ÇAÇ[ÏWg7\Ál{艌$°¡Ï; @%0CTZ…Ћ•Kê ¼Ô¹“\É|#ÔàE˜ìÄ‹ˆ©üÉb;!Ãt—• ¹°û  @Ð4° å ÛàS. ¬§²Œ‘jÛl*g¿evÂe>ÃÍ,´mÇ' ðäl òPzÑÍ<»kÌÆÓLǪÿš!ˆ2 ˆ«`³×4/¨´ìÓ$ÔàðÍàËÑ Õ° ÊÀUpÐ9„y¹‘YÍÊ ÁeqK²£€£`´¬=¡À¤¥^ÄÂÐ9C Z (P»@!Fà4é\Ôá\k å°fWÜ% ŽKó&ô4mÔ@@ 0AÀ ’ šp(m \eˆ 1 | Í3ýÆr °Z\tL8†ó’‰³8ɈAýÍß̱°œщ××  ¹H\X¹ÐuÔófî‘ mjðT²£0 ö«‚z£gY7ÊЗjí ó àÖ²ðÐÔ`ÁgÿøÊ¯mÓɃ4°²xê7—#‘±¦…  ºm»W Üpß÷­ š` ¸,`ÎDôæ¨9s›ÝÆˆà ®àràAHø:À8;}¬F¯4…¬=Ô¬íÚ Û€Žz êÀнÀ`p±,` jˆr4‚MWíDÀÕîÄy{ ±"DÿgZ=@Ð9cÝ”Ý0rð= ÐW™ÒE ¦þáZX.¯Û§ÍŸø}‘ùT°{¦ˆ ößúÍßG ¡…2-sšÓ^°à nJ˜g bjÍo!M¼á‡á«=Ô>Ñl:Ãy‰®º` vf“ÿhµÂÐ 6Pyʰ7efnW!ðÜÛ°ÕÐáÓY »p'‰É¤ —  ¼ äD0±@Ž –^uzuk·àÄkâ©”}ÁÛ‚=ì–0X2&p…n×帀 wßš ;p΀´PÀ°¤^U|§™š0½ÀÖn Øží©ŒÒ Ø’BØ¡üoŒŽ«½ç$ áI@Ѳ ŽZë‚°¶œÑÊ€ å4)‹éºà 7\iÛ1\°ºãYZq ™> 8Àîœ~ =° L­€ ( Ý¯ °pŒ4PH¯^&îõÛÈsPè7ÀbB &Lyx£‚ø ®…‚tÇ~Éÿ>ø€¿W@½uŽtšüXíÖîÙŽíù±ò #ä„_ “m´ ¿Pî«} çα¯é K®ápÂ{yËêÑ#'&Iµ®À R>´×–ƒ°ÒÊ[@Pé`ð5` µîEO`W~52 P™êS àÙî àhâUq› °MÑž·Ý@% ±Îô€¬ÚB-]W8r|6Hß@øàåêeó/@ Û@ì$à-0Êô <®?ùÑ òú{H3ÂŒ¡oõPϱµàñŸpðŽº × ê°ÄðS<Õ‹÷ ÒW\0É –0ZHðÉ'“*T\õ¶2ÿ÷îÕù ¹  ÉL Ôêr ˆ€í` ¯?ZPq@;~uzzß/½=%þ $øÏM¡ =ldCÂáC‡N5hÉ›·ßʵçQš1øðQ¡òâ6’Ì"ÌÏ¿B@YRK9uNà«Ç$ˆ¹bª ÁBÊb£"ÄS$NMMR5™5¬­¹†b»4tꤣ¬Ž(T¨%ž˜8/ š4dÈ £KH˜Ñ£ÇÚBƒŒ õoÆ6 ‰±Â:Pm—¶OäõÆå_äLAÄÓ³gAH!ABÊO‰Ï,\] Å”mÜ <¨Ô†ÿ 0&ž:Œ:õT²dEÀ”a#*ÑžKiÒäPBÒ$ˆ“ €dšAHáh ´$† œ:szž!"ž1ÀÜ«l­ ºwó>U«~Õ$®â`ÌÕëª}È:Ksf @!HÚ¢ž¡Öûç@ Ž*è )˜Áœu|IE™!€Ã47*PÍ‚O†E+®(¨ã‰^ˆúG™T4S¤³Ï<›"²8¨ìAFIl‚ ÒLÔZ« F˜7û¬²`(€Ä#år°R ,Ÿ;‰–‚ŒX5¸ó<ñÆ›€˜  L%8É_–d²üòKæ“O°ÂÁŽÖ€A9öÑ…,SIÿ¨LžiåK:(¹!ƒ†(©TTFN%HÊ/e:èÄR}™G‡ÈHé%Žõz ƒD €”«T:xÂwä1ENY˜±ÆÏT¼¢Å+^Äf!…Æ‚ ª#’%{£J¿ kT…FrYÎJæ°Ä.°ÁLH€F)Ö°Êì®4Óäi†,˜¹Á‘'š¡…윪<õìSÙd«æuV+—´þÚ&šIfqkÁx<È ]’Óœ}ö)ÐȵRÉežU ubbY@Ò6„|•ÉdÙËg*x"8XEm_1Xž:°WR‘ ( €e?iàZ ’ÿ ઎r«®´x@—ºõËZ·@fgAÁµ(ʤɦðÄ;Ƙ2¸.[pj¾úðÜ×j°Öp; Ð]>Т{hA„E$^›’Y!B$â¸ÂÁ$è!•˜'–Xˆ™ebZo]e^PE`˜…'à0B˜ZHŒOkp,œ¸…2Ë(È%hžŽqþùc @28€)ªt ¯áiHœšjì»ï‚ÅPTYxñz;q%Oái ÅÜ• ŒÈw Ú•Û º9'Œ^2ð! 5Ђ Ö.Ð'Xêf*¸† v±k qAŠ 5T ÿˆTØÉxEP"fáb!ÇäBu`§[€ìf‡^,@‡±›]í  ˆ !øÜ@ßñéO\«À:rç¢Ìrè ô 7 ‚ ƒ‰Ã–Ö˜ vÀÁ0¤V•€åg`ÖºY8>à•Xh,íËE*"„P`!EÈFP(A0ÃbHÁ^X pÀ]AˆÝðHHƒa ò%HÅ!X+ÑŸ³‹k¼ê@ A€]XcŒÔŠ"dуaÜà¸ÅaR<t9H”1ª”ñâ0 @1kƒaúˆŠ˜B3A€ÈL–êA4H¤D ÿ¸U®ü §)NaV|Þj5ˆP &ƒ¨@*.¸†j¨rƒeå˜PŽ2Ž4€µ(L°(çdÅÄàwäÒR¼D¤"åæ @R¢8†9:à1À!_3Až>ÁŸp ‚@æÐ`Z@Ö ÁÅyP3È…#þ B$† yaÜãK˜Š5$¦"ŒzT Ê᨜ÚÐxBh ËEÊÀ„w¢›=`zªbÕeˆA€)ƒœÏƒAü0ˆ8 æs=èÀ5ܺ‹ æÃ´F5nv‘–ô¤b ¢ ç—É-"(kƒGæÄÀ9Ïíô(%è‹ÿܵÞdÿ¢¬hŒ „^¦2HÌ(ìPƒ5ì™^aÇ*øÙO²ÈBÚ°ƒÄ8ä‚¡pGNã°?‚xªBrêxA;¥ 'ˆ nq:N+íV»Û• ®É§q­eÃF¾(`_‰õ+ànwW`ÎB˜â Àp‡þêÀÖ¤7™Ç-iM»¾¦6r"LB<ì›^ ¡à y©¨ü nŠäÎÜ":ÙG®@3Mi¾É4á Jê0éiãkŽL)${u„é0L(  C8ÞîþQ‚Úü%TûHê`G;_…u¬äônwW¡3Å5Ïýè¬v¡ ÜéN³RœÑvkÌÝc¼ò¦ÿ¸‚ˆÌ@S¦²µPZ ÃÅ£@@Ö2·lá.iSµà´0%A“FJÁ+€® ªBš¢Ø-iù_†%„˜ CÄâ!(jÆjã(àD!äè€æpeÔ­LvÃüᯜwdPoÆCžûá›è DQ¦XÅP#SKN'z!~Ì æX…/RzZøú³axX üH1WöCWO²Ù¨h³CP`È`rž,w[¶E#Tf×]Àø) ÈÍIÆž<˜‡ËTf”ÕV°ÍnòNNª &/~K;b.S¸FuÿÁ»ÛÄ'kØ8utwшTQ†š¾ØÌ8c=bÉò0`¨C-_#ØÁFʰˆå¯³5vòðÁ¡3/wÞìmcAç@šÐÀ4ÙÖ[G”;`Õ"¨¾÷ͯیUÆ«Öàf4ØjÏš}Ä‚‡œît3jdøÃçc'{ÙÉÝ$Es¯ùÀ%®AP}YÌ:Ö ¬@ìeG{?>P™"Àè…Ñ Gì"6~¡À’‰O”ðr(ÄiBáB $!-ÂÀEsÛ<41C#·½sžû\fõÇ‘àŽ8j!W—MK["åÕ•lÿPÆöx+Š˜n/`ö ü6àÌ$nó¾w³G_ú²˜^VÕªQðéÃÈæ…žÀ{S ïÇ€þÙWp ~ O ‘øg@ Ò0Ñ ‰÷cN¨.3Ÿ=ꌾ–9žêÊHÐ>ú³™]Èe¯"B _§;´›€}¨£ÀÁƒ! $W`f°/·€T6Ïi¶Åò© ©T @“0 *¼9ÿš€¬ÒÓ¶ÓC=ž Bð¹ P?&$1p…-¼윖+?K`Á!”º]P5V3¢ø°‚+;BÈDMÜDNìÄMô9Œ´B@Œ (Åà¹A(i² è9«h‚Nô¹ó›˜eˆ„;ë¸+`ƒ àœýê/ Ñ­¿¸é€4TC* *HÀ74*9l@ÌFmtÀL¼…ˆÂù‹ƒÚr„ÃÛ/Ì; 7˜7,–ÍbÄOè 5 ö“¸Ë ¸ÎˆÅ[ðDüǼ…»•1…1£RœG©S„:«ƒº{‘T ¢íêGO¼¸›ÿ)è‹)ˆAAyR y¸‚tœBØ-sð…Ôñ…ŽaÆgć1g ‡qà,½F²Æ ØlÜFŸÌÆ*ÈÄ&P0)$S.à‚!ð¯3S Q? Ƕó½a(E¸³kȇ) »±;‰ô‡L J±$„±,K²ðCˆ¯$ËÒ NÿáNâ,Îâ\ X†‡Tt’þ¨K0‡ …,9Á»X4γl‚c˜€)ƒ}P e(„Ù@L¾ð‹vÒ[OšYÀ!s(ƒÌ<Oð„R¸ˆ#øÌÐÍÑìOáôÆ @Ù¢€Mqå‹ IXÏØ1å4¾|©HÀÍy´ƒ›é뙫íNãüP-ÎT0‡ï#Œðk;HQk8Hb0 À¨^(–#‚EÈ»[ÑÓü.DPà…†ù m¼]PÃ!÷ô¡bZÒÈúôˆR)½ƒÍý¼R,ÍR-E.-Í¡ P9è„Lq< 1‡ÇlÐÙ& ‹Aÿ˜ØF¼€¸ƒ&É(5 ØqZ²äR=ÝS>íS?õÓ* #̱A8¢j#ˆ–„" ‚^° pºQ<­‚?EÓJŒ”ƒb’_`‹’sÈ_`Ïö$¦®k¦fòQˆR`€ixÕ(½-UZÍR>ÍDõQôqO*USU*U3‚":¢7ýj¸ 8‡„ƒHIÍÓJ}VhÝS,z‚P€ƒ<Û3º|#bH©(¬—‰ ø!c˜ÔhÍÄ‹œÁ"@¦jO€+&¥b¦ãêNcèQxU|}U\Y­UÕ-Ø-a¨‚&¸Èt5&d:&xe¾ÎSUqKWÁÍ›ËÿZa»]¡*ŠE‚XýX Y‘dPpë¢AX€mí˜Tèf€€ …•)×&‘X‚-؃ý®zUu]Ò%]&¦j½ »/õÎNÀ×ÀWÀ…~ýWªÝO%Ù*@»»éQ¡M*g²D‚KÎåÌܼzô;ãªVD8†&@†[¹ýXaP; Rà‚ É…–݇¾06f@ËÈÇ›ÅSÛµÔíÎETu¦;YÎ'D„¦Í×iÀ…¨¥Ò*í\Ïý\Ðí\‘U\­å c8]çã.èÇÒÑ•ÁBh²å¾¬\=RÛ Ð) ¿*@\ßÝÙÿc0«A '‹yè„Æ«€Í›xYÞWÚ‘ÔÞýÝ€U\‹D²±R]Ö¥Tž­o<ËÅ\Xå×Ð-_ó­Ò.H_õííRZô®¾ N¸ X_Ô$¤€7å¾cÝ… 2€‰¸QèÝõ-`>`^ß-@†T/´rGÐ=!8ˆ†@X€‹¼èh)&à6`íR¡ÄDùýØô]`B8¿ðÅ\ˆÕóaÐ aöÕSâÔÓ-(ààS·¤€h(ÛÒ&nVyø& hVd a%Vbd@ÙØER€`ùó€ø2@ Ó¨ÙÍ8†[Hâ%NàþÓ€cd8Mð½Üÿ|}aò•a7ÞÉ0ŽÛ^à pHÝ)ªb¬Ì‡Ð¸Ç.º YhÛÍá0.ä®sèØÃ“?"8,¹eXàWB dCÎä¶Ô‹´Üvpa~c7öR.eS¾TFeÞYå•޳ÙÝcDè=>e0‡¦^‘=àTFå-¨‚èòôj%…8 …Ëã)„ÐÛÝœí‚{0eižfj®fk>å_æNcPãipÕ)åQ¾fUf_ž%ØEá™Úd«ÔßÝÄòÒ¬ (²&Q{îÙÃXõ½‡m‚DÞÈÃ4e˜NJT„qíÝh¾f†nhqÎæ0†}XãÿV ep>_qNá5MB¸…[ÐÁQóAEdDT{ÄXµaí%Ü®ÜA~é°,Í|®á¾Å ÏcTŠT°¡jÛgvh êRæç¬è‰†ÚŠ€#¸è¾fõ%YÀ48$C¸;6 Äà“i4^ˆ&|ì}¨8‚“j±Þ»°D†Ãí‚3þ®ÔReø) è€X€óé$j»j´^a(¤h6^j¦6_kNá3^\Æ%Ó5 ÃX¨Å€ Ýü ®Ôˆ¤DÎ8.þìyî’EBàÒ1þÒï\‹::_HÒ¢ê €Û»^m†îaÐë£~ÕVíë¿6߸mÜêzxm­•ÿ †Ž nánõãV2HîhPnÀP[‰´1‹NØ–¼nëÎnìÞníVÉß"€¶Ý®Õ­|ÐÕÔueØ«œæðÜŽoùžoú®oûÎm¨‡¬ÝkÙNj¥¶Fpppú&åzØ‚;\ð…gH{0€3˜p ¯ð3ØN°—¡ŒE…'å‡â@Ž4ƒ –[3È ‡€àP‹Shø¾o(r)¿m¸dàΰ¤–Òü,p/ÿrkœoRæç;L²,°‡ÿ3`&°p6?Ø è„×… à;ñDx„äȨ‡¦YÔào˜U5àDWE_tFÿGwô7ˆôHw'xƒ>è{¸„,à9`é<õÙÒý ##Ë- å)?uT—ï*†[8b`ƒ-Ò.sZðÿe˜Y4Xó6ÿu& nŠD7°68öbH„KHŽå q³ç¥€8@øDç„6Øömgt5xtH—tK¿ôK„>ø‚D8N÷t™J>ØÕÍÓ.0õT¯÷T÷- ‡@G˜í¤ö†Y¯uó{ðÞ…GHs_ÿu67 €~ˆØÿäyD8f¿’¼i›Â@ |øàUÀvDçönotp÷q'w•„D¨^h[°¤TõìŽM_z·wœŸr肬•2ðw6xú°£·*ïz¸(5z¨‡ú_‡ˆ*!3eHä¸x+Á#F`K27„Ïv’oo÷/@y•û>„J¸„y €íl›7eÜ>z¾ï{¿ÿ{À|Á?ú8H2_f`R¡'úZçû8¨rG|}ˆzËWó6ó0.°„pエ€H¨nQXž…0y L‡2ð³ym'ùµ?yq‡û•—{{ˆ†!÷âÿÎÞ‚…Fzà|á~âïû¤§‡& €Ÿ÷ïÆw|0è7ú÷Þ‚[P„"ìÇþË_x6ß„1¨€!X®8˜€\ànA0@°쨀 {×ÇØOû´g{”wûÛ'¨„GˆF0Vø#T¥‹ -1´â!Ĉ'R¬h±"C…>¶TYŽFz;Rà$Ê”*W²<ÑR‚{ÈšÈJææM&:wî<ãó§OœlÔñ#ÏH/`¡bU°!ˆ ‘À#bÄÏ¿=ðùÀª/hƶ)kö¬š´iß°më¶\¸€æªT‰Á3YˆVܪ²å^†!^,løðĆ19ÿNhf€HoL¶¬lÙåÃŒ]ªø‹Õgž¢™j`“’ ¦ü2‚IG A%½¸üû7>g^ƒR3ÍÙämÔ®uë<®\ºví>xÌ_d2Œø;xŠc"»åQE"’”/³Wù2ÁæÄÞ0=ºgé ›¾‘ðϨŽ!@@ñˆáoÿ¸aWäœÀ@0}ˆE–rf1§†sÏAGW]ÓÝ•×^}uXÝ…·"‹ƒ%àƒLœ@C4—àsD íéˆYf>Äç h9ÝGZ~AqòB nücÊqÀ!DDxàAH2HonôðWex3 (}´qÿ\†2×á[J7xTRÝ@Øi—PŠ„µxgaÁÈ‘?ˆÀ°ÊD1(¡…z(¢ƒ¾÷c¡ Y¤~_ Ò ½ùñ„§ ´¬BÓªï*Äé×_tÖÙPÓNF9yþ[µtþ¹çž;0:é£{q:ê©{ öÆ–möhoÒ†*†àI´ü屮€ðc8ó²7íð &rÇŽ³Î„þ3\Aƒ¸x›xD /rt‹0Jæƒä ‰?>ùå›>úäûPÔŠp:è¥;pºõÛÿý^ýÿ"2b»þ:OΆ6Ú‚Þø9œ1†2pxßð"p<5pByTUY6ĪÃEÏ^ö¢^õðPŒh éžÒº Â¥¯….|! c(ÂïÂh ¦V5®]t^¨Ÿ‚(Ä!Q!àŸÿ¬@üm_D0¦q»o|£ V´â½ÁC„‰‚hØÄ•×< 6ÇUÐñàEÂ&â¼ À¶GƒT¡ŽÈ¸#ó¨Ç=ò±~ÄcÌ3)4¬bs zøC)±‘FDâØ„´Dl5qj( !EoxÞà$¦ÁÅJ´«‚›c1/2rˆƒ°Bc¬@¸F<è£ÿP/`@€) â¾$ˆ?‚)Ìa³˜Æ<&2…yŒ BÈŠ–b Íl ‘ž[d#…hDKø ‘tÔ$ó#»6<Á0DÚÑŽ"‹ÌÌÌÁ®ÚÇÇǰ°°ÑÑÑd3£_/šY-‘].–½½½ÚÚÚ¤ŒÂ|^¡%<3Q6W^/˜\.—ºººr°p9·À«Ùk6®ÏÏÏn8´a1œf3¦B kE#ph4§e3£N'd2¡g3¦ÓÓÓïïïJ%yH$txYž8-“a1N)|ÍÍÍ—}¸·¢ÒU*ŠÊÊÊP'7YS*‡¹¤ÓW,Žb1 ÆÆÆ4TT*‰V+‹k6¯¥Ãb2 `0œ]/–\/–h4©>fT*‡ÛÛÛ¼¼¼9[ßßßh4ªÍ¼âƵÛÁ°Öi4ªe3¤n7³K%yl6®p8¶ÔÃéq9¸r9¹ÿÿÿ!ù,Üÿ{ ä¥b„'D¸ŒÉÀᮇ#J| ¢Å2jÀ±#‚ ˆY¡dI(QBX¹R–Ë—0Ȕ٠fM 81Pع“OŸ ‚½@ô„£Gg)]Ê4‚S§¢F•@•ªƒ«W hÝJ««×¯]ˆ«¡lŠ!LX1 ­[pãÆå@—CŽ-9¬èÒ!¯¿{‘¥FD:œÈâE‹7vä2äH‘&O¦TÀ²%ÌÏ3iÚlS'O ? ]PÔ(Ò LcÏz Uª…ªV±:ØÊ¬ï±dÍ¢UËÖm[¹ÈërÐÒfÇ -úþõxC ? LaUGq†ÆàWÿŒœq2åÊ.cμ™sçÏ C&ó4êÔ«Y} [öRÚØvnºíƾýÜeipVZkwrsÕå4Ý ~&Ð(ÐpK.,Pa‡wà5&Fä™'zé©—Yíu|1É7Ziö¥Æ@~­ñçß´ ˆ›ˆ`‚_-È pg…ÒÅD%0|€„ 'tH݇(èò‚5AÉŠ¥ÈØŠäà"Œê0cïáèRhÌÇãi>¹ßkC* ‘ê¦$“M.ØàƒÄI8•pÕ ^7èàA]NWÝ`B\Kb¤©¦Dl¶hœ2²·™vÞ©£M{òÿÔçjAè ¶™äˆzåä¢ÃE(!¤Ô5ðDt x¹i 4¼€…a˜XÒШ¤Š×æ›èÅ9çªuÚ‰§žõñ‰­"èlEæZ(V‡öJ˯P6:,¤te„sJx ‡ÎV‡BABäÄ'Uô!ÀwØ:¦­©“¡zÙ·)±Úê¸;–+ë¹BÕªî­íJ¥«¡¼ÊK¯ƒÁJù¤;€Ò„Y.‹©—_~ÈK ºŒðƒ, 2J—4ìðcÛžÚmª&ÑÉR«²` «Æ=qcJ%vj4©d1 N%zl5®I$vQ(‚D"mJ&wE"nV)‡D!mj5ªi4¨%»€óçУKŸN½ºõëØ³kßν»÷ïàËÿO¾¼ùóèÓG‡Á¾½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒF(á„ý¡bá…f¨á†vèᇠ†(âˆ$–hâ‰(z8ÁŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’J¦øáPF)å”TViå•Xf©å–\véå—`nÉbd–iæ™h¦yæ l¶éæ›pÆ)çœtÖiçxæ©çž|ÞÉb†{*è „jhŸˆ&ªè¢Œ6ê(›+Zh:”¦ƒž+˜fªé¦œvêé§ †*ꨤ–jꩨvÊ&”‘²W'ޱÿuȬ´Öjë­¸æªë®¼öêë¯À+ì°·Þp«À F:hl„OD+í´ÔVkmÄf«í¶Üvëí¶™>0*0¤ã,&•0 îºì¶ëî»ìJ ï¼ôÖkï½øæ«ï¾üöëï¿,ð¼”|ˆ+7 ²G*`ÂÀ=Z ÁÆ1WlñÅgLñÀwìñÇ ‡Ü1%³ÞàÆé¨P‰?H$ ñË0c¼ÃÌ4×lóÍ8ç¬óÎ<÷ìóÏ@-ôÐ4Ë{pÂ0tRIQÄì´ÓDG-õÔTWmuÔFß,'•8"À×`‡-öØd—-ÀÕh§­öÚlÛ|ˆÖ0`rÙt×]6xç­÷Þ|÷ÿí÷߀.øà„nøáˆë½% P Û-¹Ø‰Wnùå˜g®yåy,~ÃXÌMwl$`ú騧®zê‹´îúë°Ç.ûì´×nûí¸ç®ûî¼÷î:‹?C%ZPL6é«#£üòÌ7ï¼ïÐG/ýôÔWï;ð;2ã딽Äé·/¾ó9”oþù觯þúì·ïþûðÇ/ÿüô×_~&‹@ Áç öß+]ð€L h¿:ðŒ ¸ˆ÷ÉÿÏ~úóŸïLø‘ ¸¡æâ¾øÍ¯~÷Ëßþú÷¿°€LàøÀ÷½B6PCìะMn j[ß [ø½2Ȱ†7Ìá{øÃ ±ˆGLâ›øÄ(Nq†¯@àÁëU¯<ˆ ÛâÆ8αŽwÌã«øÇ@²‡Ld?¢Å«…qŒg\co£ÇPŽòcAå*[ùÊXβ–·Ìå.{ùË`³˜ÇLf*9µq­ÄŒ×ì"ÿÞ²œy Š:ÛùÎxγž÷Ìç>ûùÏ€´ MèB×Ù2@„ˆ›^ö¶ùÍqž³¤olèJ[úҘδ¦ hE3šÍ†40FMêR›úÔ¨µ VÍêV»úհ޵¬gMëZÛúָε®w½jPÈà å]DzÙ\7Ã9ÕÈN6©yÍìf;ûÙÐŽ6¯A‹+0Xj&ö›áŒn{ûÛà·¸»€r›ûÜèN·º×Íîv»ûÝðŽ·¼çMïz—[ °FV‹ PÒã¸À½mï‚üàO¸Âío}ÏÃý^ó¿ƒç[XüâϸÆ7nñ?xüã ¹ÈGNò’›üä(ÿO¹ÊWÎò–»Üãp¾0LÔ@âÆ®8ÇwÎs‹‡âç@ºÐ‡Nô¢ýèHOºÒ—Îô¦;ýé?ÿƒ œAŽEÛ¼ØX§¸Î{ÎõŒCýë`»ØÇNv¨KêVÇz±­ uotýí—…ÜçN÷ºÛýîxÏ»Þ÷Î÷¾ûýàå.Žâ ¾:ÖÙ xüä'OùÊC~ð˜Ï¼æ7ÏùΡ8|âÕn¶3Ãñ»H½êWÏúÖ»>õpˆ½ìgOûÚÛþö¸Ï½îwÏûÞûþ÷À~ìA/ˆqt  Š_{Nï×;ÿùªƒô§Oýê[ÿúØÏ¾ö·Ïýî{ÿûà¿ÿø¥/‹ÀøóÀDé×o…ÓáпëKAÿúÛÿþøÏ¿þ÷Ïÿþûÿÿ€8€H‰ à W@ÉgzÌ'¨zž0Xx˜¸Øø ‚"8‚X q  ð €ìWzî÷¾ƒ28ƒ4Xƒ6ƒ$˜ƒ:¸ƒ<؃>H‚&ˆ‚*È‚ìÇ /xƒH˜„2øƒLØ„Nø„P8Ïp‚.ð„@„ëÇ -ïW ^ø…`†b8†^8fx†h˜†j¸†l؆nø†p‡r8‡tX‡vh†žÐàã°‚-¨…\ød8ˆ„ø…¤pˆˆ˜ˆŠ¸ˆŒØˆŽÿøˆ‰’8‰”X‰–x‰‡˜ žà €…íˆ]Xˆ¤(†°pЍ˜Šª¸Š¬ØŠ®øŠ°‹²8‹´X‹¶x‹§H æÀ‰ ð‰ì×¢(ˆ¥8Œ^È ÆxŒÈ˜ŒÊ¸ŒÌØŒÎøŒÐÒ8ÔXÖhŒ¤0¼ØXÐÞh„-°…ïçäXŽæxŽè˜ŽäxìØŽîøŽð׸ Ú¸ .ÀÞŒZ¸…’ðêøYŽ#0Yy™ ¹ Ùù‘9‘Ù°ÐÐ WÐF¸`ý˜ 9’èH‘&y’(™’*¹’i‘á‘Ù‘Ì0-ð‘ýH’8ÿYŽ£°“<Ù“>ù“@”B9”DY”Fy”H™”J¹”;Ù ¬ð’p~Ѓ@“5i“/@ ¹°•\Ù•^ù•`™ ­0–dY–fy–h™–j¹–lÙ–nù–p—r9—c9¬ p•~P•V X–€˜\y „Y˜†y˜ˆ™˜Š¹˜ŒÙ˜Žù˜™’9™”I˜£€ xù0•áx•` ’ ˜¤ù•¢pš¨™šª¹š¬Ùš®ùš°›²9›´Y›¶y›§Y#p¥ ÖÀ™é— ™¥Yœ\‰›È™œÊ¹œÌÙœ¸© ­pÏà›Àé—š¹@ Ú¹ÜÙÞùÄ  âÿ9žäYžæyžè™žê¹žìÙžîùžðŸò)žÐy) Μž©¡ žþùŸÛ¹ : Z z š  º  Ú ú ¡* ¢Ð mà øéÖiüII@ ´¢":¢$Z¢&J š¢*º¢,Ú¢.:¡ªp m0ÐÀ~°8Ê¡Jà¡'Ú£>*¢Í¤B:¤BZ p¤Hš¤Jº¤LÚ¤Nú¤P¥` DZ¥Vz¥Xš¥Zº¥AjvÐ 4j£8š£` ;ú¡?š¦%ÚlÚ¦njp §êœtšœ§qê¦zº§|Ú§~ú§€º§f #@ ‰ °¡ÿšjú¨" ¨pÚ «  §© Ê0 ÓÀ”œÚ©E©©˜ª §) Í§zª¨šª§jª0 †*\9º¨fê¡ ©jú§f@©§¹©#ЬàË€‰ÄZ¬‘¸ ^à¬0£€©¢@ªf ªÒ:­¨Êª®z¨\°¨ÚZ«Nºð­à®â:®äú­Gp®èz® Ù  Ð‰ ¬  cPX¯öÊ8Õ  ¬€ ­p ª° ìÚéZ°{°›° »°éÚ«p ¬à ­ÚJ«PЭ嚱 ®»®í* §¯ó а /w²(r½Æj!· Û p0üú¯;° ÿ{³8›³ë°Ê±[±‹±;´ã:F{´mjÜ  m /IÀ\0µT[µV{µVk Z»µ\Ûµ^ûµZ‹µT«d[¶Tk oðn@Š` Ðð ÉÀ Ý  Ô­lz´x›·z»·|Û·~Û·lÊ Ý è@±Û dЭ¦°¸ŒÛ¸Žû¸»¸î0¹îp´GÐÔ Ø`¨„0ïð&0º£¦{º¦ûª»º¬«º à°»80»´[»¶;»O»º»¼»(ð»¿;Â+¼6P¼Å»t0H òðnp¤0¢@ {FK¹Ú»½ÜÛ½Þû½àÿÛ½Spfp ¤–ð@‹¸Š¹îû¾’K¹F{¹ƒº¹Ð _0¤»¿¥‹º§Ûº¬º10À,|ÀÀ Ü ÌÀ½ûÀ½ ¼Á;¼3`¼l?°?H Œ@p@ Ø@·×›½á{Â(œÂâK¾Ê° pÀH°¾‰›ð[û½p¹­º ‚pÀ¿ûë¿ÿÀ­KÀ|À¬À ÜÀ=ÀP Å,Á(@Á|Áü°kCpyqKÂG Âd\Æ(¬Ã¬T ‡{±íkÃpl Û{¹Ô ^ð y &pA,ÄýKÄF|ÄHJ¼ÄL|NüÄQÿÌS,ÁVŒÅYü’¼ T É0ÂÖ;ÆfÜÉž<¹Ð0 É@ÐÆNðÆq\Ã×ÐÊ×à—» ØP `{ÌǸœË|ìÇ&Ȭ[ÀÌ…,‡ŒÈN¼ÈŒüÀTüÈ\¼’,É>€? _,ª@°à®¼ÍÜÜÍÞüÍàÎÝœÃf¬0 íË nLëlÃÛLÎæŒÎø@º|Ï},ľ¼ºÁ,Ì…\̉ŒÌ ¼ÌÜÌϬŰû“À §° Ø,Î=ÑýͰ찳\PÀÎíü Ò"=Ò$]Ò m(m×0 À´„ $Ó1Ï»ÿìÇDÜÏÀ<ÌÃÐȼÈËlÅ|Á »að3ð„ÝpÍSà)ÕR=ÕT]ÕV}ÕT]¹   ݆€ÍÎNÀI`Òf}Ö!Mj +]¾¤Cp2mÏ4ÍË7Ó:ÍÓÿÌÄ?½È,ÔCÉл>€”à ¤0 =×`Ñ ÖÙ’=Ù”]Ù–}Ù4ÀÖZM¨ðò bÝ­h=Ú% ÙFP¹«0žàt0×tÏv È­«Ó ×J|È}Å ØÄ+ØMØZ‰° §`OÝØÙʽÜÌ ÙÑ Ò•kwÐý€¿Cp±dMÚ½ÝÜÝÝÞÿýÝÚmÚ+Ý £o€®MÓùÌ¿w=ÛymÛ†¬À¹-ÅÌÛ½m¼EMØaÀÏÐßÐÚÜØÍ]à^ÙÐÝfð #Š3IÞ^áÛ-Þ¢<)` ®ýÚ÷Ûþ‹×ý ßñÀó̽kßWŒßÏLØ>pÔ 0£`ÞÊFpà:~à*ýÊ ÎÕáð†à˜ð ,päHžäJ¾äL~ä:ðä4°Ò©mÞ®Þ¼ìÇ"îÏðÛó½Û¼}Á”LÉ.»C@'P §Ð c €@Oþæpçr>çt^çv®4Àæ¯|Í€ “ðÀ p„^è†~èˆÿžè„þæQ~SþU^×WοY¾Ó$Îå¹íå€ æa>æ[,‹P Ä­æÚÌæn~稞êªÎèzî[­Ð0‚.¢D[ëYpë:pÚf0 áéé­Þ°­ÏîÝσLÈ{ÝÄ ,ÐÊìÈm¼a®Áù » ÐßÏàÊ`ÜPãj½êÜÞíŒÙ§M Ó‚° P ¾@ŒJƒ·ž¹î»Þë‘캌åÃÌÅ>̇ìÓº½ìÝìÅûìýÛ° _ϰ Ê`ãOÕÿðÕðÞ É• `y‘gqÝfjQÖîïï¾>×ôþáÂþË:ïÇžÀüNßÌìÃËé”<ð.ÿŽsðŠÉ0·`· ðÔŸüóß‹´ÔÐ ä~ñ·°ñ7vUAeMíž4àê§ !/Ó#_ï%ÏÏ´ýÞ·]Ìòí×\ßoÏ^ö3ïð† ž° s+ž«¤ì:°ÔZ÷’ª °|`îdƒ»` ·0j‘õ ½@B%pøˆ_Oõ 0õU?ÓWËönò[¯åìõ&öaÏ»ðeßé„M»>€@èɰ ÆØ £ ®/ •ûŽ9 ËЛ @®"º•èn Á` ¸0 …ŸøÄ¿øROõóù“¯õ•oé]ùʾù+ÐùdÿùbúµÛÁj@üÿ°ðè@{É0þä_þæþèŸþêþáÀ‰Ö@†0èŠNg@¦@ ¹P Æ Â¿f +QÐ`Á, ³è¸ÖÀN²7$$NŒXñbÆŽCö)¹òy™Õ?áÜÙó{øñOÏ/ÆÚ>¯×°eÓ¶[wîÞ|E´ Å8afIn.…jÈ9袓n/ê<²»’´ÛŽ»•ãá;šÂsŒ¼ò€B¯²õ4k/>ᣵûVËÏ5Ùf«í¶ÿ°7ˆAZ| —¬ëA¼ ›Bê¬ûC’4ä°Cï@Œ‰±Ä#q'É|8‘²1k‚Ë|±¾U›QŠùÃ1Çyì1„WrÙ® j°¹$óZ2£ „r$)§¼ÀC+¯ÿ1§-èòKËÂdoÅ2Y<3M5glóFÿþ‹“7x Sjr#™Cò9?ÿ¼(Ð ­ Ð)MK-·|R¡$”³J-}ÓÖ4ÝÓMùÔ7~cbŒ±¥H=¼‹U½\Õ¨ÉX¥•C[­ÄuD]Íã5=IÇ V¾a‰]sÓþ’]¶ÙfÓ ˜_äZÎÁk#Ô¶/n“uVí =´JqÕ©\ÏõUÝuß»Ô]ccs³ÓÝ>¥—€à^qà\ò,aÏUýý÷X–õ[îÂq\FžŒ×‡)x‰1}÷ØxáÔ˜Þ3^ Q­VÕ~•<9åÀ¼-ØP—¿ƒyaw¥9]›#Î9Í-FÖç87&€…3¢Mð €;TT_v224_html_docs/images/glass/purple/menu_item_body.gif000700 000765 000765 00000006323 11222361074 023162 0ustar00abwabw000000 000000 GIF89a´dæ½®ÏÆ¸ØÆ¸Ù³Ôôտ±Ñĵּ­Îŷ׳ÕÀ±Ò¸ªÊµ¨ÅÇÇÇ·©Çª¢²¶§È¸©É³§Ã°£À§š·µ©Æ«ž»ÆÆÆ¬Ÿ½µ¨Æµ§Å¨š¸´¦Ä¦š¶´¦Å³¥Ã¯¢¿ªœº«»®¡¾©›º±¤Á²¥Â²¥Ã­ ½¬Ÿ¼©›¹¥™µ®¡¿¤˜³¡–¯£–´™‘ £—±¥˜µ³³³Á²Ó¼­Ï¾¯ÐÀ±Ó»¬ÍȹÚɺ۹«ËȹÛǸÙÊ»ÜÜÜÜĶ־°Ðʼܺ«Ì!ù,´dÿ€/ƒ„…ƒˆ‰Œ’“•–'˜˜&››%žž¡¢£¤ ¦¦,©,#¬¬(¯¯²³³)¶¶¹º»"½½!ÀÀ$ÃÃ*ÆÆÉÊÌÍÎÌÑÒ+Ô+2-1.0ÜÝÝ3Bâãäâ>çè>:ëì<îï9ñò=ôõ÷÷úúýý@ 4@ ƒ(L0 aC!Þ˜8QE2f ±£G A9²†I“R¦ÄÁ²å—0c¾ÜA³æ‚› "8` áÁŸ@6W®h:tìÚ½s'o^=zøòí àïŸÀ« "$°¡Ã%R¼q£ÆÓ )’$€“(ÿUhéR¦Ýš6qêäé3hСEU—TÇR¦Ms<…u*ÕªW±fÝÊuáW°aÇ’½x­ÚŽlm¸} Wî\º8ìÞÅ»gÎ=ýþ%xÜ`ÂIóH¬xqTŽ«"ˆìù#!4gã…8R¤áŽúHÒ‡þ…8d‘7èlI&H“-6õâƒûD(a•^ùP–é¸Q—!ñwˆt I¤€Fø]šµ-™[›N=cœ2GgBvb‘}9Çg[_¹’˜"’ùÚ‘"˜¢J-Õ £pòid“V¦Prxn–é†ÏuØéŸa:&¡ešX*‚‰®¹¨ªN² eŒRÎI!¥³ÞxiŽ·r™«—%yzš¯¡;ª¡h{ª±©Â“¬=­>ÖìŒÏÊê–Ój©§g×öù#¯A‚  ¨f")®`+²‰¬›OJ麒¶káñæYížõrš-¾Ÿr»¯ÿ·ý›¢9ä®Ó$ÁÊì*°*\)†ò>LïgºNW¾cǯ°‡þ[ª3Ï›Ël»Õ-¼b¥l–µ,cKÅÛÖÕ-^%’ZóÆBàlÞÀ¢ÛóÈ?'´•C3\´ÃGCœ´½»¾\±ÓC]è™~™ p:,b½sÁÀ1ÛuÉ_×¶¥cÛZöÊjµ¼´ÚM³$èÌR‡KµÕgÍØÖêî-Yßо+örÔΣá`Â̶ÌÓìøÆëÜ[Èyû<œ³˜»KkÂk±h÷".äÓyÛxÜ6““ºÝ«k-r寭•ßšιѶŸ-ñáÔõ:ºjŒƒ üã_m.ÈÆ·Îuÿò^/ŸùìoiváJ‡¾¶â¿ºí»ö³qð±ßK®^ºr*ØÍCÙ¢Ç>´¹¬z¢ƒïh5ú %x*¢›Àòw7ÖEÉrʼnÝœ‡)Ïm wiCàû®³ÀíÌnõC]÷"WÁð]||3Ÿì¤•¾y}®}ÚÚ]Ûz÷->Ð~ÄbÀ7¹ãõ¯|ÿcúž7@\I„ÔõV#¿ú ˆH™àõ÷¨ñM)V`íœXÀé¹/q$Ü!ßvEÞ¯\[laŇ¼/šìobTáÒºê‹tUÌØÔÜD8îæ\s|¡5x²Zéñ†¤ž¨FZQc„Ì¢IÄýQîÿˆ1LâùhÈÄ1"­ŒP”¤õ( H òtJZ¡êxfÄW]N†at¤ ?è'Ýý{¥û] cùÆœ–tå-E9C¢•ò‘¼ÌѸ¸`:ð'r»™,‰7E—¤4o×Ëiê°•kíŽ-ÖRÿÛ—–ñª‰Úlo?ûÑÔ¶“«=ç1×¹¥fv0¯óHÚ$Òò&7,Í}kdkÑDfwvݽU¸ {Üê¤÷Ü®Mf|ßYßhî6§¿íép븒ó.·µMm^\'[Õ go«ÿËñ>ºÐÓ–t± }lTç´4æ÷«ýk€C<¬ù¹+îÙ‹s4ã:Gr€á=ؘ[Î'9m~r„/›ÕíÞø»ÿïŸÖ·/4Õ®ëu«<ëㄵÃ}rï4ì5?kÕËžòœË´Ñà†6¨aîå§K\›t¶´ÅµñÿùC¼~óMyn[žö˜·}—qOmÇG=û½ß¾ÑwôÙg9ü\ozß­Xìþõ¡·úZìj¥ã8þ·'j¹÷wÒx Æ|ʶ+gc[×s‹W}nWçw•júÇlЇxK€ã'€å‡|(vøG\…ç}î×iÄ·wÒ6vž'‚xs×Uy'Ør[¦yØÿx ¸{—~HwÎgwÂ~)ˆƒF.h0ˆ^s{í7„ïW„—ƒœ'<¨|D§~“Ç~4…(xƒSx„-Èzpçz1Ø„3h‚^hƒŸf„¦ƒ×‚qw†°—†XÅhD†©G…«§a/8‡LX‡™v‡ý7|zH}b‡VX€¼w€¾—€Xzø(ä'sºÇˆ=èˆZØ| ˆvý¶•€ƒ2€æw…èlj?è„]ˆ‡Qxˆ˜ˆU˜„rh†˜@ø‰Š”¨x–è˜H€ä……Ú·Šv(Z,×€¾HŠ—•‰Ã˜Š–mž‰›6‰À6ŠXЇ¨H·H‚ÝGˆÉx0z–Í(Œb¶‰Ñ˜nˆu»¸s¢¸Œæ8j§¨‰Äèƒ28ˆÈÈ€äXa+x‰~w(;TT_v224_html_docs/images/glass/purple/menu_item_foot.gif000700 000765 000765 00000006570 11222361074 023200 0ustar00abwabw000000 000000 GIF89a´dæÆ¸ÙÂ³ÔÆ¸ØÅ·×¿±Ñ½®ÏĵÖôռ­Î³ÕÀ±Ò¸ªÊ¶§È·©Çª¢²µ¨Å¸©É³§ÃÇÇǰ£Àµ©Æ³¥Æ§š·¦—¸§™ºª›¼«ž»°¡Â­ŸÀ¬Ÿ½ÆÆÆµ§Çµ¨Æ³¤Åµ§Å´¦Å´¦Ä¥–·³¥Ã¦š¶§˜¹¨š¸ÈÈÈ´¦Æ¨šº­ ½¯¡Á²£Ä®¡¾©›»²¥Â©›ºªœº«»® À¬Ÿ¼©›¹¬¿±¤Á²¥Ã«œ½²£Å±¢Ã¯¢¿­ž¿¥™µ¬¾®¡¿¤•¶ÔÃéèèèõÖͼáàààÙÙÙÕÕÕ¶¨ÉƶٹªË£–´™‘ ÉÉɳ³³¡”±ÚÚÚÛÛÛ£—±£•µ¥˜µ£•´ÑÑÑɻۻ­ÍËËË¿°ÒŸ“®•Žž¤˜³ÈºÚ¡–¯¢•³ÌÌ̸©ÊÏÏÏÔÔÔ½®ÐÁ²Ó¼­Ï¾¯ÐÀ±Ó»¬Íɺ۹«ËȹÛǸÙȹÚÊ»ÜÜÜÜĶ־°Ðʼܺ«Ì!ù,´dÿ€Oƒ„…ƒ ˆ‰ "Œ#$’“&•–;˜˜2››:žž¡¢£¤?¦¦C©C0¬¬-¯¯²³³7¶¶¹º»5½½4ÀÀ3ÃÃ8ÆÆ)ÉÊÌÍÎÌ'ÑÒAÔAXaVcPÜÝÝR xâãäâtçètoëìqîïsñòrôõ÷÷úúýýv 4@àƒ(L aC5!¶™8QE2f¼Ã±£G6 A9rI“R¦tòež—0c¾„C³æ‚› 4xÁAŸ@JW®h:tìÚ½s'o^=zøòíàïŸÀ« "<°¡Ã%Rls£FÓÞ )’d“(ÿU"héR¦Ýš6qêäé3hСEU—ôÍR¦Mç<…u*ÕªW±fÝÊuáW°aÇ’½x­ÚŽlÙ¸} Wî\ºnìÞÅ gÎ=ýþ%xÜ`ÂIÇI¬xqTŽ«ˆìù#¡4gã…8R¤áŽúHÒ‡þ…8d‘7èlI&H“-6õâƒûD(a•^ùP–é¸Q—!ñwˆt I¤€Fø]šµ-™[›N=cœ2GgBvb‘}9Çg[_¹’˜"’ùÚ‘"˜¢J-Õ £pòid“V¦Prxn–é†ÏuØéŸa:&¡ešX*‚‰®¹¨ªN² eŒRÎI!¥³ÞxiŽ·r™«—%yzš¯¡;ª¡h{ª±©Â“¬=­>ÖìŒÏÊê–Ój©§g×öù#¯A‚  ¨f")®`+²‰¬›OJ麒¶káñæYížõrš-¾Ÿr»¯ÿ·ý›¢9ä®Ó$ÁÊì*°*\)†ò>LïgºNW¾cǯ°‡þ[ª3Ï›Ël»Õ-¼b¥l–µ,cKÅÛÖÕ-^%’ZóÆxàlÞÀ¢ÛóÈ?'´•C3\´ÃGCœ´½»¾\±ÓC]è™~™ p:,b½sÁÀ1ÛuÉ_×¶¥cÛZöÊjµ¼´ÚM³$èÌR‡KµÕgÍØÖêî-Yßо+örÔΣá`Â̶ÌÓìøÆëÜ[Èyû<œ³˜»KkÂk±h÷".äÓyÛxÜ6““ºÝ«k-r寭•ßšιѶŸ-ñáÔõ:ºjŒƒ üã_m.ÈÆ·Îuÿò^/ŸùìoiváJ‡¾¶â¿ºí»ö³qð±ßK®^ºr*ØÍCÙ¢Ç>´¹¬z¢ƒïh5ú %x*¢›Àòw7ÖEÉrʼnÝœ‡)Ïm wiCàû®³ÀíÌnõC]÷"WÁð]||3Ÿì¤•¾y}®}ÚÚ]Ûz÷->Ð~ÄbÀ7¹ãõ¯|ÿcúž7@\I„ÔõV#¿ú ˆH™àõ÷¨ñM)V`íœXÀé¹/q$Ü!ßvEÞ¯\[laŇ¼/šìobTáÒºê‹tUÌØÔÜD8îæ\s|¡5x²Zéñ†¤ž¨FZQc„Ì¢IÄýQîÿˆ1LâùhÈÄ1"­ŒP”¤õ( H òtJZ¡êxfÄW]N†at¤ ?è'Ýý{¥û] cùÆœ–tå-E9C¢•ò‘¼ÌѸ¸`:ð'r»™,‰7E—¤4o×Ëiê°•kíŽ-ÖRÿÛ—–ñª‰Úlo?ûÑÔ¶“«=ç1×¹¥fv0¯óHÚ$Òò&7,Í}kdkÑDfwvݽU¸ {Üê¤÷Ü®Mf|ßYßhî6§¿íép븒ó.·µMm^\'[Õ go«ÿËñ>ºÐÓ–t± }lTç´4æ÷«ýk€C<¬ù¹+îÙ‹s4ã:Gr€á=ؘ[Î'9m~r„/›ÕíÞø»ÿïŸÖ·/4Õ®ëu«<ëㄵÃ}rï4ì5?kÕËžòœË´Ñà†6¨aîå§K\›t¶´ÅµñÿùC¼~óMyn[žö˜·}—qOmÇG=û½ß¾ÑwôÙg9ü\ozß­Xìþõ¡·úZìj¥ã8þ·'j¹÷wÒx Æ|ʶ+gc[×s‹W}nWçw•júÇlЇxK€ã'€å‡|(vøG\…ç}î×iÄ·wÒ6vž'‚xs×Uy'Ør[¦yØÿx ¸{—~HwÎgwÂ~)ˆƒF.h0ˆ^s{í7„ïW„—ƒœ'<¨|D§~“Ç~4…(xƒSx„-Èzpçz1Ø„3h‚^hƒŸf„¦ƒ×‚qw†°—†XÅhD†©G…«§a/8‡LX‡™v‡ý7|zH}b‡VX€¼w€¾—€Xzø(ä'sºÇˆ=èˆZØ| ˆvý¶•€ƒ2€æw…èlj?è„]ˆ‡Qxˆ˜ˆU˜„rh†˜@ø‰Š”¨x–è˜X*f°Æf‹S¶…f'„®ø…m†o8‹uPQGPŒ%gp¸ÈŠj¸Œlèq{(‹«‡g€ÕL0­w G‚ÝGˆ,×€¾HŠ—õJ IPMÀG hŒÙ扑¸i“l£Ø¥øu@KPJ`EPHàNÀ9‘ùy‘°¹‘Бù‘"9’=P’%ù(‰’>°’+¹.ù’0é2)“6P“5É8™“9 <É“9ð“?)B){ù³º­¢78öíntÚBÜõâÇÆmOxöƒ\€Ö(þ!Hoÿ›ßÐç¹²é®p¬OØÆ@¤82ÔÌý"—¿ â­²cžæì¸ ni!{DŸ*®ÚC!ýˆ5¼ÕáÏxvÛß /è?šoƒÓJq¸)÷õFúú¡ ƒ¨Ÿ!L…\Tݤ.òiÐyQ´¡ú>(ºÎzYÌÙÁ=Õñ¬…è‚ —×®: w¬õÞ8ÂÄÉq~ñ8SïˆDý‘Ñk˜;# ;w—Ü ²b½Ã"ÍÜ>cSãYÙ>WfŽ›©<7P—£|äø¾†Ê?0SÓÃäû|‡= "Ò*µ„ŽÀ é:Rê‘—|$Ú/SyMéå°¤ãf ƒôMË„3Q¢,§4MIÍæ±zØ|ç YHr–à$¢3Íäñ3’Õ<š*×xI§mS“¿“Bí©P[>s‚’Óå9…–Áˆ  îl¥ Ëdjt™´ì¨8WRÑyJZ¥Ti<1ÚÍ-ÖÓ¨_ÿœi)˜Gñ=´¤N•h;£ZÌ•µ ±ä$LšU¤Ö4—]MHûéG±B•ŠeªP«JÏ¢*r¡Åk¨IªSÛñô$>ͦE¯¸×yŠiŽeŠi[ÇùVÁ.‘°¾Üi{ºJ6•±hu)Q×ÊÑÉÒTŒŽt(SéºÎ§J1 RM`cµØWÒbõ“e¨>U‹Yuj6˜œ¥èOµ Ú–Õª~½'eQ+R¯®¢a=ékSšWÙ†ö¸µ3»÷QæÆ•EÓ„n]¥+LØV—‡$¤íc¯ú×Üv·ƒÍif »YÄv¶¢VÔ üÔ{Â.J·Z½eeá{Yùú–¾Àµ¯p›_ QÕ±ý¥cÿ Ü]®ÞÔ¹½¥ÝokÜaz–¸ú•'!{³íÚñ½Jå­5Œ`+ØÃø5æYË×õ&÷¨Ëµpøä I°Ž÷°å¹ïp☽Ê=­ŽÍ‰á°Å”|±yhÖâ¦÷ ¶m/…u›âø6q¾ç«o,P;x¶XÖî›éÞïx—~r˜E g'#ýÒJÏtÏ›žV Ë\ÞC§w°™|ójçûŸ˜Æ«ª¹.ZäŽüÕŽ´½ç*^K“·Ã-ÿ,ÈY½ç‰üÄ/7Æ.çÿ•Uí[‡øÏ_t-½Þd§öÑM äuãÚßg6ߟ.Ä¿ƒzê¯:© ¯óÃsíŠwzÌý>sÀƒ^ð¢Ï8éÑžuÄ3=õ]gü×…NóÀÛ\òV§¼˜-Ÿw3çÙÈ}‡ºç+þúߣÜì*/ý]OŸx–ÂÜë¬{ï›/kº[Ê;×úí­¿øÑ6þ×q/z eõ»Kyéz×üõuŸ}Þ»>©¡ÇéèÛ_ù†_¾Ý¸×vÙµ{Ž'v&7w´}´‡wðg|‡|œç_­÷yø{úÇ~ÂwlþW|Ëv|Þ¶zÊ7ÌWÎç}g—t (~ñç!—|'‚RG‚Ý—€9·€ï§‚èÿ)‚/¨}÷7`Tw„Ç÷ ØøØ‚>H@˜M¶¸o·m›6æG€èWagtÁ]ýW…˜ÇmòW~nw~$—~]¸~C8…—lH~ª·„=hN(w‘÷|“†E(†q8cXx†Z˜†\8v^(…|¨~øpr˜{YXm†È†Mõc}‡Œˆf8€¸…gQˆ‰H…˜ˆz(€6övó&‰˜‡&¨€(xƒ¶·‚IØ‚(aQ7n¾7ƒø‹X—‚³˜ƒû储„#ø„ Xv{h‰ŠXŠÕ§‰sHLh‡Çˆ‡‡(ŠÌHŠýö‡»8‘Xr–]{m8Šo¸™ØŽ(ˆHˆŸX‚4¨q6ˆj8ˆ„:¨„ÒX‡á¨†“ˆp•hwaèŒãëȉàè‰5Ç‹8'±HÁhÃx‹fŒ1ˆŒðØ‹5ØÄw„ÿv¶(*;TT_v224_html_docs/images/glass/purple/menu_warm_body.gif000700 000765 000765 00000005464 11222361074 023177 0ustar00abwabw000000 000000 GIF89a´dÕ×ÎãÔÊßÕÌâØÎäÖÌâÙÐæÐÇܶ§ÈÍÅ×ÐÆÛÎÆÙÐÆÚÇÂÌÇÇÇÆ½Ð½´ÆÅ¼Ïûξ¶ÉºͽµÈÁ¸Ì¿·ÊÐÐм´Æ½´ÇĻώϾµÉûϾµÈÀ·ËÁ¹Ì¿·Ë¹ͻ³Æ»²Ä£–´»²Å³³³¹²Ã³®·¸±ÁÔÊàÚÐæÑÈÝÒÈÞÛÒçÜÒè×ÍãèèèÕÌáÓÉߨÏäÙÐåÔËàÛÑçÜÓèÒÈÝ!ù,´dÿÀ’cH,‹›¤Âl:™š¨´C¥F®ØìdË튾_X\)›ÍŸt:Äf[Þp¸dN¯sîw^Oéûÿ‚„…†„‰Š#Œ#&$(*)”••'9š›œš0Ÿ 0/£¤8¦§¨¦,«¬®®6±²³5µ¶·¹¹¼¼1¿ÀÀÃÃÆÆ3ÉÊÊ7ÍÎÏ+ÑÑÔÔ4רÙ.ÛÜ:ÞßàÞ-ãäæ  2îïï ™ô¡ ¤¥©ú¬­¯³mÜXC×®^‚)$V였eŸI¼!mZµÙ2ÒàÖ-œGråÎ¥[ש ˇ7…ˆ`ZÒ•_ƒ¹=¸ÛеXax¥eøß†5vx£zêïùÈà[óY£âvzG¡p0&)ã’4f#MP‚xàNT*heP'™â\²è¥‹û](¦JÇØ$?¬¥™ãš²õˆÌX¢¨%Ù Rp/ò·g'3ŽbÞ™®G舒-'Í™T„ކôe¤zç ™–rhz5i*e{m’xè•Ce‰£Luù¨~š#Ÿ¡ ÷g? JŽlòd(P¸N¤k}DÚe$˜’ªšC¥„»J ±FyˆµvúfD %ÿä¨Õ6u-ªÂNÊ ·—:‰f¸jÎJ®³UÞúi¢r.ÊnEÞyd˜ÚÒë*²Oâ;¨¾;ò릿èªÀ‘Zð¯§æo¬vk¦½™Š{­Û í¿¹*ºëÀnl*žÁZrŸLŽüj²/»i¹µ±,­ËÔl­ÁئªªÂÞ‚Ås@²ŽñBý®\qË¿œq»NqL3’7ë§Î ß µÉS¦l.ÅËÄy±Öi|´×g»tÈõîÜðÙùJÝ,Õ[ÝvººÁÜk©ã@ê±Íwã\fW˜âè3Ä󬉄¯»µÑî" /ããá½ð·°òý°ß…V¹ÅꊺyÌsÏ\·Ò¡;ÞÿjÓàš>9êœ}õÐY {çt'ýqãbç 9É’ÄlꯎõÛÂ.sâÀ‚ü=c/¯·ÙE}ò¾€«,=ðÔo9|ײº¶‹ì}Ù%÷=þÔ–«Žèô­c7×wñÜââ!/ã$ïq/‰œ²œ÷3µùnp¬+Üë¬;ìu¬f ÷”—@æ-'”ƒžùö‡¾þÁMÇ»èŽaQJt¸+]øÐ†²ò­MpnáŸÿÇ9öYðkÛÞ'ŒE6Ò=m†öK› ˜Ãî…= `ñ>—A!n0ù^ýNw¿Ê©e„Ñ’È´ÔGAⵊ-,àªâ—7ú5„¼š§~'F¢‘ÿ±7¾:# ‰cE"Îψ{C"•˜¿è‘°ŽÁ»ã}VˆÁ4jpˆÝë ßh‹çõnŽÔ¡æx¸>)걑|¬ÝoWD§’4$_!Á(4D¦WxD\^.¨=Qn‹^ñ`ÏÂKž+“NÜ$;©B‚Ò…ó‚a)s'ÈÝuQ„7<Ÿ+MX½X^o–@´›-!ÉÁ,ºñƒ•là1ÙÄi>‘.Q,æ÷ˆLÞ’”4%øP™Ä®2š‡„†a¹HcÖ~£”Ÿ$¿¹K8>Ó—l+§>ÉÏ<þpvÇÛæá9P@Îs,õTåñÆ…¾ÒpÖ¬ 6!ú>%±qtòÜ¢3 ¹Q&&ÃmÿÔT¤CGê¾*JÔM)%ÓK9þR¡DÙ'Hû¹Îcªq[ÊŒ'3é9H{¶”œ/Íœë8YFÒ¡è;êM‹ª”—qt T«Aa¢“˜¿)ê?MÐ6zu§¯é©XÕ²Nu˜UõäCkêÈ>F²«:'OÃ:Nº’U“w=k^ÕùɵŽé¤1<"SWêTÈ诣AeèPgª8£>r¢\Íå$WÂÞÓ¥‡ fb¯!73î«í\c[QºTŒ6U£–5$f/#Ô †ÔµWeçQ™¶LN¬õiBëŠXÿáõ·Ví¬c‰µU·¶ á”ka—›Zsš•µ)LkcƒxÓ¿Š– ºCÿ.KsËJ:z4¦ •¥tÉ«Unâ Äî`“;WîÂôœàM§x_+ÜÏâ°µUL*ñ÷TÃþ÷»ÚAkwÔJ_¶V—¶Æµ-eq;›Ë¶ò½Žðb\Ïúµ›ç}+i-©\2WµÎU,tõZâ龲ଆÕ[ÙëöÙý¨o‰:^mÖ´ÖMp2Ê`örȼÕì9›½ ?v¶‘=åŽ º^·˜Þ]­ˆgÌX›¸¼(Ư.ÓËå_.ŸA†ïfå[e#[ؾEp†Ìd/:µsk£[gÚùÀ)¾.›³kÚûWª1°„ñãO+SÏ¡Uóhõ[Zþn×ÅÝ1„ÿMãùÚùÊÎòEù|Û&{ùÉîsˆI]æ[úÆXα–Y½aW¿y·¸2UÉLbSúÎHưŽyÍcÿÊÁ–ó”éLË['ÇJÝó’[íçWÒ'”1‘Ílãkç:ÛËÞv¯»ýìXGYØÏ·­O}éd«ú«mv¶‡ÝíY‡wÂE>6ª1dm‹¯Ëí³¨ýoJS˜Þ¸Nµ®W­îfûzß —õ¨ÎÈr»“àÊÞuÅó}ñó{Œñ½¦±#zhój½Í´8»1ÔwK{Øò^yInï‰ã›Ñž>íXé1ç¼Ð,G6¢_®bN³¸¿ &z¸%=b€“ÛÚï9ºE~ÿp7ÓüÅa.:­‹ô×{éªÙô¢÷‹ð¯‡Zã °Õç-ð³»<í0?.ÉgnòŒÛÜßrwxÀ“Îs´«bÍ1ß;4¿mW±s¼Ò7·Ä·Nñ®ë»ï5ï÷Æßq¬Ëvò9U²åKþåÌ£|Î*/»M[žf¼7}ín;æÁ¾pÇsòu8Èï ×§ZšµŸºÑ©\íÈgÝðçQ{â.ûÒÓî¶ŸtçÿùÝû¼÷⺃Á]Í£?÷’·>åÎv¯Ïþíß¼ôqOx»·þðÊ×;óÍï|ôk>îë8øwøç}Ëówyõ'uÝG|Ù´Õ§u¡gp ÆwÈ}2EmØ~Qº§€z–n£ç€°æw÷}U'xWG}H…m ˆ ¸xC)'R:·zJ×É÷̦xu*ˆz,¨z}…f÷åzж|å'€hz½…sHRñ;TT_v224_html_docs/images/glass/purple/menu_warm_foot.gif000700 000765 000765 00000006304 11222361074 023203 0ustar00abwabw000000 000000 GIF89a´dæÕÌâÖÌâ×ÎãÙÐæÔÊߨÎäÐÇܶ§ÈÐÆÚÎÆÙÍÅ×ÇÂÌÐÆÛÇÇÇÆ½ÐżϽ´Æ¦—¸³¥Æ¾¶É§™ºÃ»ÎºͰ¡Âª›¼ÐÐнµÈ¿·ÊÁ¸Ì­ŸÀµ§Ç¼´Æ³¤Å´¦ÆÅ½Ï½´Ç§˜¹¥–·Ä»Ï¿·Ë­ž¿¯¡Á® À©›»Ã»ÏÁ¹ÌÀ·Ë¹ͫœ½²£ÅÈÈȾµÈ¾µÉ¬¿²£Ä±¢Ã¨šº»³Æ¬¾ÔÃ餕¶Í¼áßßßààà¿°Ò³³³¼¯Í¹ªËÁ´Ñƶٟ“®çççÛÑæ•Žž£•´£•µ½®Ð¡”±ÓÈᢕ³ÉÉÉÙÏåÑÆàÚÑçæææ¸±Á¸©Ê»²ÄÏÏÏÑÑѳ®·ÙÙÙåååÌÌÌËË˹²Ã»²Å£–´ÔÊàÚÐæÑÈÝÒÈÞÛÒçÜÒèèèè×ÍãÕÌáÓÉߨÏäÙÐåÔËàÜÓèÛÑçÒÈÝ!ù,´dÿ€aƒ„…†…"‰ŠŒŽŒ&‘’,””—˜™›œ/ŸŸ-¢¢¥¦¦.©©'¬¬¯°°³´µ4··3ºº½¾¿#ÁÂÄÅÆÄÉÊ9Ì9`W_UZÔÕÕAoÚÛÜÚgßàgfãäpæçèæcëìîîmñòólõö÷ùùüüiÿ8€Aƒj*T覡Çb"F$@‘âš‹3–ÙÈ1ŽÇ =’IÒ€I $P°Ë—/dëF38råÒéd×îÝ€y@ÛÜÊFß¾~*%Xð €…PJu#qbE³®áØ1¤W’%O¦\Ù&L™4kÚ‡ÓŒÎ<ÿÇøüTQ|F‘&U*©Ó§PNuXUÌU¬Z1rÝèõ+X2'QªdiöìÌ´ÛÖ²Åù6]\¹>ëÚ½[Ïh½|ûüXð`ªU'V¼¸qÈÇÅN.[ ZÌ™×¶uÛùÜç¹¢ã‘.iêL°n­æuògo­mû#îÈc)÷ö}¸æáÅÇEž|yÑæýž§‰>½µuسÏ^\¦»÷Çàí6yÀgzéÁq\hí-gjÏÑçuÕY‡ÝUÚmÇ•"¨YþVàym%¨àz ŠæÞƒÎEèׄÔÝwaEòÇaß}(^o"š'\‰ .øNrB9Ÿ?.®£ÿ}Ɔ¡v6r˜£IáñVY˜‘ÈY(Ù i,Æ—dSQ(£“4BÉSJâxX¦¥eNé Ï—w…‰dj–c“ù=¹ßšÝµYeˆåeùã–uvy§ŠFê!Ÿ/úÉäk3Z¤æ†RzH¥€p&*ç¢tg']‚yä^”*ii`gšæ œ²é©›;^)ªZÙ(O쥚çªòõ‰ÐŸ˜¢©)­]Ù V€oò¸k7sŽcâ©D®Hì˜Ò- + VÍšX”Άõi´ºè ©Ör lŠui+i‹­’y쥃eгŒuú¬ŽVš'¯á økO^ K”ž¬òe,`øN¥o„Úf(ÿ¨ÒªûFµÄ¼N°ñFz”˜õvûjTà&è¸7v1ºOË Ç×:ŠjȪÎK²Ã•Þûm²².Ër­…Þzh¨Óì.Ââ<¬Î{òìªÏ(®ÐZ‘[ô¿çæsÒìvlªÍÙŠ|½RÛ ñÏù*»ïÐÍnm.®[v¯ŒŽýnÂN/¼mÉõ±-±Ûm±Ñ§«®ÒƒÆwPòŽõR=¯]uÛA¿uËŽqM7¢wì«ÞLß ¹Ù“¦m2Õ ÅzµæYi}¸çGg¼xØ5ïÝôé9KÞ0åS[ÞzÊúÁÝo¹#AëµÝ·ã]jgØâé7Ô¿ô°™Ä¯¼¹á.#3ó#â¾ôÿÇðòþ´ïÅV޽Õ*‹»}ܳÏ]»âá;ßnã ›?=úÜ~ùà™+üºG»Ä}­y¢ËôÈ&½¡0,}Á[æ^'ÀãÉ-yo2ºêÎt@‰ÜÙv<µI€ÜÔ;'?‚ÏGö›KW¶ÞprÖS²&Ø>¬ÅŽs·ñÞòb"3%ðyo‰žÂø7Õùoxì+Þû,? v­nD ˜D./Ôƒ  wˆÂÂN#@Ɉè’QK|ø+_Q‡¶®Nx®á¡È=ZñsHÛà7 F:ò=nŽ6LŸ˜Ç2î} b¿—EAn‰pù` ÏwÃê©fÿŒ“ÊÄTHE¶’m,âºb˜;6Œüœ·þ'J‘²?þ:% dIBÎлC$'™Ã’±–¼åÖˆÅTjqì¢&_iöo–PÔ£öø¸BIê²™¼¬ßïWHÇ“t$a1A)8d¦_¸D^n®¨Aqn“žñbߘÆkž,›ŽÜ&$»©F!‚Ó3ƒc9ó'ÌýuRŒw<¡;ÍXÁx^pž€´=¡ÉÅLºò‹Õlâ"±Ùȉ>’6‘,è$w‰P#Þ“œ¿4'Ñ™È:®3¢Ç„ˆ-á¹LƒÖ†ã”¡4?ºOX>ÔŸ¬+©N“ÉÓ\þq~Üè%a:T`Ît45ÿUç'qÊ¥¾Óx­"F¡úBE±r|2ݤC‰¹UF&ÄuU¦SÇêÂJJÕ—UM+5™ÓOYþS©„Ù)X{ºÒƒªrc )Ci:L›¶•¤oÍžû¸YJ?Ò•áêK…êQ«ª•Ÿ±t"d+E¢” ÿ)ìOÍÔVzv¯ïé«hÿÙÒNv •õæSëêÌ^F³³z)_C;RÚ’V›·=mnUúÍÕŽê¬q<$c×êXèè°«eê`çª<Ã>sªœÍç4…[âÞÔ­Ç hr/";Sî³-]ekѺX¬6V«Ö5&v¯#Ø)†Õ½—eéa·P9N´GõkRk‹\âö¿–í®ÿs ¶Y×·¨!•mqœ^“š–½iLmsy×ߊ—¨úC0[óËNZz5®M•§„I¬YŽâJÄðp<[Ãõ¤ N©ˆß+àïâ¸õUN:qøXãþøÃBm‡TKcÖV˜¾¶/uñ;Ÿë¶óÅ@Žòr‡`ïú¶£'~-y­©`<2X½V.„u[æ ¿º–®–U\Ý.ë÷ËÙýª ;bÖ¼Nr‘²ÊdsÐüÕî ¹›Á*?w¾Ñ=瞺b?· ^¯˜çÌ\"›¹ÄhƱ>SÌé>_/§†ñve\iC[ÙÆTEr–•ÌhO:½Ou{#\kúúÈi¾0«3ÿlÞ&ûX²q²”qäSKS×áUõxu\^oØÍ3”‡MçÛúÒWÎôUy}ßF{úÑ.Žu˜É]ê:[ûΘγ¦Ù½ew¿z¿ø4eIMfsûֈƲžùÍg.ÿÒ—õ¤iMÏ{'ÏŠÝõ¢ÛíëwÚg”3¡Mmç‹ç;ã ßx¿;þðxGZ๽Ï}í„«û³­v¸—]ñy‡xÊ…>8º±h‹°Ó-µ¸…ýsjS™æøN·¾×­ò†û{çJ—÷¸›ÎÌ’»”è ßwÕs~õ?ó|”1¾¨Á£zlkÅ µ:˱Ø—K|à2_{Y‡nó©ãœÙÞ>ïhƒíÿQç½ØlG8²ß®fn³¹Çà&|È¥=f “Üâ_ï;ÊÅ~tWÓýÍ¡.<½ Žø½×|ñêÙö²wŒôχ[ëL²åg.ôÓ»=õp?0Ùçnö¬ÛÝç²wzÐÏwÔ«cÕqß=D?n[Ñs½ÚP7¹Ô7OõÎë¼÷uïùÖƒßuÌËwúyU´õËþéì£}Öj/½]ÛžjÜ7~õÝn=öA¿tçsúµ:ØoÛÇ[¢õ7y†Gi}™g|'¢zÉxòW~ô{ö7mÝg€ß·~×"%xNrux˜ÒgÔ÷w¬çyó÷z¿·}ˆÄg{íw| ¨{ h‚ˆ‚Ú{+øÿt x€·ƒ¹·i3x}5(yH€u%V0gvcî§l X‚Bo¾wƒXyÂwy•qPÀN°„¹–lâ·d¼7„(Ww„0áXÐB€¨Æ„>ø~O4(…æ×_xg„d…TÐ?°E@RŠ×ƒ øƒ §|Hye˜vbµv\à°h°;Ð@0°‰œ¸‰ð‰ è!0Ф(¦xЍhŠ °Š¬®èŠ6‹±x´H‹p‹¸˜‹)°‹»¨¾è‹ŒÂ(Œ(PŒÅXȈŒ:°Œ:ÎèŒÒ8+PÕˆ؈°ÜØ$ðàâ8!Žä(Ž%pŽèÈê¸JðM`I ò(^?à;TT_v224_html_docs/images/glass/purple/menu_warm_head.gif000700 000765 000765 00000006117 11222361074 023137 0ustar00abwabw000000 000000 GIF89a´dæÔÊß×ÎãÙÐæØÎäÖÌâÕÌâÐÇܶ§ÈÍÅ×ÇÂÌÐÆÛÐÆÚÎÆÙÇÇdz¥Æ¦—¸ª›¼°¡Â§™º­ŸÀµ§Ç¥–·´¦Æ³¤Å§˜¹²£Ä«œ½ÈÈȱ¢Ã¯¡Á©›»²£Å­ž¿® À¨šº¬¿¬¾ÔÃ餕¶æææàààßßßͼáÌÌ̼¯ÍåååÏÏÏŸ“®ÛÑæ¿°ÒÐÐи©Êƶ١”±ÉÉÉÚÑ繪̢•³•Žž½®ÐÑÑÑ£•´ÙÙÙÑÆàÓÈᣕµÁ´ÑÙÏåÔÊàÚÐæÑÈÝÒÈÞÛÒçÜÒèèèè×ÍãÕÌáÓÉßÔËàØÏäÙÐåÜÓèÛÑçÒÈÝ!ù,´dÿ€%%*18‡ˆ‡‹Œ’“”’—˜šš  £¤¥§§!ªª­®® ±±#´´$·$ºº½¾¿ÁÁ"ÄÄÇÈÉËÌÎÏÐÎÓÔ&ÖA=95/:ÞÞ+<(JJ%4B?CQëìëIïðIHóôRö÷øöEûüþþP ø¤ Áƒ& Àá’‡!˜8±€E‹L2jÔ褣ÇDB†@’d““(SYÉrŠË—0]™IÓ€M 0@€œÏ)døP¢‚ŒvH£ÄƒG¯^¾§üúý0°*”ƒXŸ(\Ø0@į+^,°±ìdzNDŽ, ¥Û&,ÿ[ÆœK³æÍœ;{úôybŠ@’"]ú®é¼§P£™JÕªÀ¬·võúUbرdËrDëQ-¶mߢŒ»r.ݺFnâÔÉsïÞ.fÜÜŽ°<Èó)^<ÕñcÈ·˜\Ù2EÌš7sN«´èѤMÇDú.k½®•œ°q€vm†‘䯷›±ï€ÀƒKîZüaXÈ“3YÞѳóçp£KI]5ÞÖÙ‘Ó@wÞ¹nã飘y祧Õz µ·Ä{ñ%Gs"Ý÷iGìÇjþ] €h[x *ƒ¾9(qíQ8–|óÑg[øå—‡2h]^#*1`.…bŠåõÖ`ÿz/²ãe3Êwá%åÈ!Sô÷#€Iä‰&˜ä?ç]Å$„=y\”ÚØŽø]É£–6ý‡]v^šx`S)J1&@K×d„jŠuS¾YeœúyHçj@Ž˜§w`ò‰ä‚J¶x¦B0'ã¡Rº™!œ6ºß£v9)m•:%&¦d Ù iz %¨m.G¥IŒî8§uŠ(i‰”îéêx6¦© hRf뚸j–訋–ê«£ÀBÊ%žÄ²jìa—®˜©c.6+á§…ª«¢¼Z+¶u…i—Ý Ö*¸¯Šë²³š[(|lJ+êZÕŠ&'¼v;/·D*õ­xáJµ/¹›rEèÿ³†¦›+g»†æni¿Æ»å®­jïÃ}&[f¹œ:‰1ÀÑš5ðg¤lªt¨ KoÃ÷Bœ¯Ä€ò›­ÎV†nf£Õ±•7›–óÂ%×›TÏ)Ã4Å̶|±Ñ·j,ðºÔ¶kóµ§f›ê°<£ñ>,bݯֵr ­×2ƒM°Øo\¶È ouÚF†‰¬Õʺ=´¿/Wø5Çìz<ö»{'¬-É{™<µÚ?³=®U,[7X]#½¸Ò3M6ÎfëÌ𗘮ïÕœW<œËrg,zÝŒ‡íxÞMŸÆ÷äªJ=X빩,ëáp úÜ·o4íÝ»»¥7꿟½3ë[š9oÇžµçÊGt4ÿ¢3kø8ÈÏ$¯ß• ÿ]öÇOøÊ²wZ;Ìt;_~ͼŸîtêPkàâq¤íµÍ{oß¹BG>»Ñ¬`ýƒõ$g½Õé ~ørÐ ‡@ä)ð_ŠÃétg: þ¯zªûö(8ù½ŽƒUéÜì¶¶<Û50wÐ+!ú"§¾‘o€Li!bŒ'4¬mÌ»ásØ+úŽ‚)à ƒ¨= j®{1¬íjˆ¿æ)‡Ä›ôz7²Ï'–}fEîÁ.‹ß›áçÄÇ@uÑ|Üá{Ø7Ê¡Ñ}ì ÚÚÜC‚h‘†tL¢—Æè©„Œ0yÚIÄÂ11/¤_íÇÅêÏÿx£ÿžÈGà¡mŠ–¬¢ 7¨ÉÊ1|Ʊá"ϲ´&êñ„P à+yUq~Ç3"âîçÉ/22”eQ¨KJ¢²—ñûe&ƒ™ä!Q–I£eélÙ¡år’Bd‘XèKL²’š9"&Bm’›X’¤yArFÓœW|£!7¹ÅDbstîdâǺ™¾êôñ‡Ï,`GWrÒŸ]Tb@©C‚òР¦¼^=©xOݳˆÕü`âØùÉ;òO”N\æ7çN^*t•ù,äoø‰ÈXFt– Ùæ@ãiF–¦ñ}öÌ L ÙJ¾òš7ÍfNß¹So–²‚*Üh*;JžN˜Öÿ\gÌJzÌ“&3¥‘ì)B¥ M¡Jóœ Mç0;IRcN™ÐQfX™ Ο’xgiQ±*Rb¶5#Ï£(<ŠQ¨J‘¬/Í+QÑ©ž¬Žt«n]ª@ÏgÑ=6Š»Lè%=:Í´6¶¯l…,`÷A”Þ’”—mfK5[N΢õª!=ªVóÙÎ蔲<¥«OÅé°5V­³°U«cý*ÚÒ«që‡t;Öbùv ݧCûiÓbŽö¸¥ýêiUúTÌÒÓ¹AeãP£;ÓéÖÔ=uTªm™Š[®o·.ÝlUÛA¾Êö±´½®I³›ÜíÎu¥ÍõÖs ¸¹†õ¡Õý«q÷+FíV—ÝU­ÿ]ÇÉQ³âs±ž}ÐpC›ßw•¿'™„S[WÞ ’ÀX”î©‹^Eª·>·ÍãƒQûÞŸlÀ -°Ší‹àÿ³’lS ZãS"V¾÷ bp?{_âv8°p 1$— `#ƒ·ÂâU,yÑsÈ9&¸¸PF®”åJå—8¾­ïkëÛO(½ r”u¤Ü1×Êïo×l`³øÍ.Žóz'+ãÜVY£Wžª…]«WÆj´µ®‡ß*f:û·Ì$†/k©šd«²Y¸þò“IÛàþΘ»™¶ñåp<^—wÅçô¹Ji[úÔÿ5³¦œæNÓ·Ïmþóøp:h!·—È>Äóõÿ ]Ws™¦^öqR cöÚ½ÉFtž±¼çFgXøõ¢~?\ê1×9KbUöª™b}¾Úϱö‹1DhÓâÓEÖö²¹Ýì¿;Øñ†3‹=gÓ8ÛLtY³|á-› Ú°”¶¤Ãlkƒ£:ß ß¶¢Îh /ùÑMæ°¸'-çJ[<שV·Ùc?ۼіõ´^íz;ØÐºVõÊùÝn™¾Ö1—7µémìk#û **Ï[îîŸÃ;è§uÉ+>e;:ãûÞx·=þi&»Yè4'zÁ«Žî;ë{ÝKoµËóˆË|â¤v¤©qžò³ï\ëýn:Ûîv°Kà&'»DDD555nnnÚÚÚÕÕÕ!Y,~~~¶Æ¹ÝâÞêìëfff"\-ÄÑÇààà8•IÂÂÂÏØÐHHH5Eçêè$$$ U*1?@«S²²²!!!»È½ŠŠŠ===§ºªQQQmr6‘GÜÜÜ^^^:fB)))ÎÎÎ%d1ÆÆÆ@@@:™Jb…i ?¨RV{]-x;€œ†:::|™‚,u:'h3RRR¢¶¥ccc3ˆB©©©èëé*p7@¨R;M™™™¯À²³Ã¶$a0S)ÑÑÑ,]5=¢O‘‘‘ÌÌÌÊÊÊÄÄÄqqqˆˆˆëïëqw¨•*r8ÙáÛGpO*^4ËÖÍÉÔ˽ÊÀ```¥¥¥sss:›L®¿±>kG!X+>¦Q>¥Qïñððòñ=£P<žM888ÔÝÖ+t9/}>NuVLtTw•}nŽt¥¸¨$a/SzZ3‰C1‚@j‹q-[6#V,.]8'X1&W/õõõïïïúúúóóóîîîB¯UA¬TB®UA­UB¯VA­TiiiA®UèèèëëëÖÖÖhhh?§R×××ÙÙÙ---åå寯¯žžžãããØØØÓÓÓ®®®B­Uêêêãçäääätttââ⪪ªÒÒÒóõóééé§§§íîí¦¹©ÒÜÔwwwÑÚÓéíê¾¾¾0>‘©–„Ÿ‰ãè䑪–3`;7“H%X/NwV.`7÷ø÷˜¯œgˆlûüû4ŠC´Ä·›„*[3x—~ÈÒÊõ÷õîïîh‰nâèã#_/¡¡¡“ª—[€bØßÙA®V¤¸§—¯œ¹Ç»áæâòóò@jIêëêz—€r’xt’yt”zkkk.{<°Â³ÇÒÉöööøøøíííýýýñññüüüùùùôôô÷÷÷òòòûûûððð@ªS!ù,F2ÿí H° AƒÐæ¸Y§2D-ŠgÚÁ‹3jÄ8@…G¦@¢–C[¼Mr4ׯ—ñÉœI³¦M™ÚÊUòvH Z :}úЧ>@ ñIWâ¦Ó§P£Î †h$?¡>ÙøÇµ+× ŸH z"¦ ©hÓÚŒ€á Nž¼Ê• j‹#DT¨uÚ¯¯ß¿€ ¨¹ˆåvJõÆR‰À#KžÜœ˜G¡2$ÞÜUT†)׿PMÚ/kBmåÌÚS†-Ø”žY …B¤V³nêÈÚÀÿJñHÔîãÿ:±&x?MУKŸ®)˜¥G vgØ®{3©BxQÿO¾¼t)GšhÞL«Ó¿T©lÀå *ÏŒxæÉçÛÏ¿¿ÿnË`Êf6€¢F*©¤çÈ‘¢ryR%L:)2VbùO($¢§¨¦ªj¥—"¦)§ªîÿꕈ‘jj¬¸ªÊ§ŸˆÚÈ1±nPÈŸs)êÈ<¹&;éež)pê0—Ä™Ò(é<Üvëí·K69—(‚ŒÎ·ÜbÂM¨þã€5èÆ+ï¼ÜÎXãµÔÌp :Þ& yéj‘ŒÐ/&'¬ðÂhÈá\b‘Bà ¬Ç3G° 'bÀp8 ‡,òÈ!'ÓAj2@Í%. ‚d·™([,A2Éúä¬óÎ<ë³Nzë!Êè|Î28K—}zôìôÓPïìY.9;·Á.ÄBÀAÔ`‡ópe`êU't`ËÎæÌ ±g3#Æb× õqlJÐYÚÿ@…`I"o;[D iD!hêêêE!iðððE!kÏÎÐH#p<\Be–‘œ&:*AÑÑÑ=^G"l?b?aF"m;[/Hîîî)@<\=\Á¿ÂB g»»»D g¼¹¾8W¸¸¸···B!g«««?_ëëëßßàG!lÝÜÝÓÓÓÍÍÍSG`ri{#6#6(=!4*A+B3N‡‡‡+C.æææE"l1KqhzÅÅÅèèè œ¦0IC h2L(>%9º·½>_¾¾¾&^¼¼¼?a#5E"kÒÒÒ;Z9X¥£§qg{3PbXm$8<[+B–œyyyŽˆ”¤¤¤ÙØÙÊÈË2NŠƒ‘ÑÐÒ¦¢ª6TÇÇÇÔÔÔÎÎÎÛÛÛŽŽŽäääÜÜÜàààÞÞÞÝÝÝâââáááßßßóóóòòòñññ!ù, (ÿL   Áƒ*\Ȱ¡Ã‡#Jœhp Å‹ >Øø`€Ç CŠI²¤É“(Sª\©’ッ/:p`F„rêÜɳ§ÏŸ@ƒ íÉ ¨QC“*Ýy´èÏ›`X˜ ¡ª„«X«ZÀÉ€DˆK¶¬Ù³hÓª]˶­Û·l3ˆQÒ›SX•Puæ¾LPaÈ+^̸±ãÇ##n@¹reɘ3O¶|9±a &L ¢‚‰3DÁšà ~4Èx‘ƒrëÞÍ»·ïßÀƒ§@añãÈΜ9ñäÐ)  "EŽ?dÐhPÑ#œ#S?ˆÿ§Y`‚Œ_G!m!3C hG#oÄ»ÏK%uF"l>`L%w?a=^K$uD!iȽÔɽÕK#sH"p¼·ÂúÍM&xE"lC!h022MǼÔ=_Ë¿Ø!2?c5QF"n&<3P+B9YK#tJ$rJ$t>^C!i!4;\M$w½·ÄI$r!4I$s?b!3?aL%uǽÓD!kL&x<]H#qG"oÅ»Ð@c5R $ƼÐD!j?b2NǼÒK%v½·ÅBeL$vD iB fI#rE!kI"oE"kD h/IF!lAfD!h 3ʽ×=^>aK$tË¿ÙI#qJ#rI#pH"o!ù, (ÿ H°`AD"tà@áB#FšHq@¢$hÔˆ(Ï,‰i¨Ã> F*™ÈE;bØb(!`èd0ÑsÞJèÏiœ phƒ®˜J¨"uZ(™Z j{M@vFC¬à˜¢mWÿT™  ®B†èX» ¯wδA(…a%JÐâ…†Ç èpð§Æ‹ ˜ƒ0@O/!BWP@D¨¾° Z/.ÈÎ`ƒÊ!¨OèÖEJn(dN&NŒ¹`Ö e&p˜¾ò@?XŠ Ø£ÉK¢jAA^ “'Fø@YS¨}¡$>X ±Â}{ò7¬(Á¿}ƒ<À±‚ 6@ì@B 4Hð `ˆ b°`Ál ÔøÀ!z C´˜¢h4ÖH£Z;TT_v224_html_docs/images/glass/purple/tab_roll.gif000700 000765 000765 00000003361 11222361074 021760 0ustar00abwabw000000 000000 GIF89a (÷F!lC gF!k 1@d;ZH"o3$B:W@cE!jH"nG!mH#oF"lI#pD!i;YB fG"m 2AeD hïïïAdAcÜÛÝE!iôôôõõõöööD iD!h;[I"oE!k<\H#p>`=\&:*Aåååâââ;[/H=^Be‰—?bG"lF"m)@<\?a˜£¯®±C fßßß8W3P)?ºººããã:Z•š;\?aááâ6TC hÍËÏB!gÜÜÜ#6(>ÅÅÅÕÔ×>^+B!4!3ììì<1I”””?_ßÞàÀÀÀ<[$8.>_+BD!j!2@aÖÖÖ;Z?b+C1KÅÂÇvm€F!j®ª²ÈÈÈËËË<]ÆÃÉukB gVJb6T#6ul~%96RE"lE8Uf\pççè(=9XÐÐÐÍÍÍ´´´2L3ND g¨¤­"4ààà—£E"k#50I*A4PëëìG!lA e2N=]ÉÉÉ&<………G"näääáááëë뜜œÓÓÓÚÚÚçççîîîúúúøøøóóóòòòñññùùùððð!ù, (ÿ 4 © Áƒ*\Ȱ¡Ã‡#Jœhp Å‹ 2ØÈ€Ç CŠI²¤É“(Sª\©’#ƒƒ/.X0A†rêÜɳ§ÏŸ@ƒ í© ¨QC“*Ýy´èÏ›dL˜Ù êƒ«X«NÀ©`ˆK¶¬Ù³hÓª]˶­Û·l-€aÒ›SX}Pu&ŒHxQˆ+^̸±ãÇ##N@¹reɘ3O¶|9±á $HðÂ3$ ,ÁšàŒ 92ØpqKrëÞÍ»·ïßÀƒñãÈΜ9ñäÐ#`‚Ä '[¾dxèÙESEˆÿ§)@‚DK XϾ½û÷ðãËŸOßýûøó¨Ï¿¿þÿìE!ˆ(ÐÐ.ÄP É, É_k<ÑFŠt¢á†vèᇠ†(âˆ$–hâ‰'†"°AÈ(B‚‚œ¶Ñ_pŠ<öèã@I¢7ÌᇠŒ˜VG!] 1„ž)å”TV¤f¤àH@4b…•d–iæ™7 ¸! hâÉœtÖiçxæ©çž|öé矀 h 4!e$@!袌6êè£ú C 5Ta^Dªé¦œvé-„QÃxjꩨ¢JDèQŸÄÿ*무Öjë­¸æªë®¼öêë¯ÀÆZFtðk°È&«ì²Ì6{+ =q¬³ÔVkíµÈjbÇÓbëí·àZ{D„bî¹è¦«îºì¶ëî»ðÆ+ï¼ôÖ›nZØ«ï¾üöëï¿ï®0ÀlðÁþª€ 7ìpÃ*ð¡ÉÄWlñÅg¬ñÆwìñÇ ‡,²Å?¨QÉÉ(§¬òÊ,·ìòË0Ç,óÌ4×l³Êƒ¤‘ÉÎ<÷ìóÏ@-ôÐDmôÑH'­´ÏI0AÉÓPG-õÔTWmõÕXg­õÖ\wíµÔ`\ÉØd—möÙh§­öÚl·íöÛpÇ-·Ù{øpÉÝxç­÷Þ|÷Îí÷߀.øà„n¸ÞôaÉâŒ7îøãG.ùä”Wnùå˜g®¹ãTD²Éç ‡.ú褗nú騧®úꬷîºè„òúì´×nûí¸£;(¼÷îûïÀ/üðÄoüñÈ'¯üò¿{póÐG/ýôÔW_|Ï[¯ýöÜw?=öÞ‡/þøâcÏÉù觯þúì·ïþûðÇ/ÿüô×o¿úhrÿþü÷ïÿÿ„_þHÀð€ÿËß$ÈÀ:ðŒ 'HÁ Zð‚Ì ¸;TT_v224_html_docs/images/glass/purple/tab_warm.gif000700 000765 000765 00000004146 11222361074 021760 0ustar00abwabw000000 000000 GIF89a¾(÷G"nF!kF!lC g@d 1;ZH"oI#pJ#rK$tL$uI#qL%vË¿ÙJ$sJ#qK$sM%wM%xM%vN%yN%xN&yO&zO&{N&zM&yO%zJ#sH#pʾ×˾Ø6SɽÖÌ¿Ù4%CF"l:WG!mȼÔH#oʾØÅ»ÐH"nAeE!j;YD iD!iG"mF"mȽÕB f˾Ù½ÇɽÕD!hAdË¿ØÉ¾ÖL$vʾÖǼÒK$u=^D hE!iA eññòȽÔ½Èåäæ?bAc?a)@G"lC h!3>_ÖÔØE!lÍËÐL%wK#s;[Ç¼ÓÆ¼Ò;[!4F"nǼÔI#rI"p•Ž›E"kúúúºÌúÍÖÓÙ¿¹ÆBeĻϢ¨D!jöö÷K%u&:<\=\1K6TJ$r+B*A<[íííçæéŠ•#6+BÇÃÌÄ»ÎÁºÈ$9#54P*A>^I$sèçéÀ¹ÆÆ¼ÑI$rxn‚þÈ5S@c@a7T0I2L!3M$xʽ×&<òñó<]5Qåäç@bÓÏÖG9Vǽҿ¸Æ)?øøù2MÌÈÐi^s®ª³½·ÄûÍ5RÁ¹ÊÁ¹ÉD gùùùÑÎÕøøø>`¥¥¥5QWKdL%uG:VG#n¢œ¨5RypƒÒÐÔȼÕK%w1&:G"oÆ»ÑÄÂÆÅ»Ï.G$8/H-FJ%uE"lÞÜßM&x?`E"mAfD!k;]@dF!jL&xÍÉÒìë좜§-FE6SÚ×ݺËG!lC fH"p>_xoG#o—£)@3Pîíïõõö?b,E:\"4ÈÃÌǽÓH:VE!k¿¸Ç-EǽÔ)A%9¢œ©B g(>M$wC!gïïð7V=]I"o´°¸öööñññ÷÷÷êêêâââ§§§ûûûýýýþþþÿÿÿ!ù,¾(ÿ<  Áƒ*\Ȱ¡Ã‡#Jœhp Å‹3jÜxÑà‰'ˆI²¤É“(Sª\ɲ¥Ë—.Až8ȱ¦M,XÈhR¢D€Ÿ@ƒ J´¨Ñ£H“*]Ê´iÏMdäLAÕ«X³jÝÊÕª Ÿ.†ÄÈ!d€Ù³hÓª]˶­Û·pãÊ WHŽ1†¸ÐS*‹ª] Î*ÀE '5̴Сƒ€ãÇ#KžL¹²å˘3kÞl™q‹5j €Ü€z`Àºµë×°cÇRMÉ’ nèd±b ·ïßÀƒ N¼¸ñãÂ_¼0ÁÜrãÊ›;÷½ÜÄ V²´qèÚ"%fNÁÿXFM*=«Ò«_Ͼ½{ö5–üqç§€ýûøóëßÏ¿¿ÿÿH€$hñD€ÿXàö xß#âàÁ¿ÀD-á‚©yÁZ †(âˆ$–("%y2Œ=ÿ´èâ‹0Æ(ãŒ4Öhã8¾¨?9æ¸ãŒüàSS<ã ´! œp€‡ ˜(å”"ÊQOXf©å–\v¹%h¬ãÈ*DÄ )0`Èl¶éæ›pÆÙ&6þxiçxæ©'´21”ÀÄÁ¡ˆ&ªè¢Œ:ˆžF*é¤0¢1D¸0ÃQ> À§ †*ꨤ*¥¨¦ªj–¡ÌD¦2¤ÿÉf©´ÖªÀª¸æª«‹_ÈQÌpZ… kì±È&«ì®Ì6;)(o$ƒ“ «ìµØëì¶ÜzéŒ/ò´F, xºF覫îºì®Ûí»ðæ8Å6PÀSB q(ð üöëï¿ÿïÀÇø8—¸,ЀG,ñÄK\ðÅó“I"ÇHáA@ô@Å$—lòÉ(—ŒñÊðFÁ 9,¬@X`óÍ8ç¬óÍ,÷Ì­,è(#…5,ðÎ$­ôÒL7´ÏP3ËO9pÔ0 ÷iCÍ"Aç0…Æp†3¬à ]/úÁІ:ô¡¨D'JÑŠZô¢ͨF7ÊQ‡¢¢–F*>¡‡ÜàG0é8š;TT_v224_html_docs/images/glass/purple/top_grad.gif000700 000765 000765 00000001644 11222361074 021763 0ustar00abwabw000000 000000 GIF89a ‚æe2¡K$tI#pp8µU)…P'}G"lZ,ŽO&{a0šX+‹n7±H"ol6®F!kJ#rG"mL$un7²q8¶o7³m6¯b0œp8´_/—].”N%xT(ƒg3¥m7°f3¤o8´Y+Œi4©j5ªG!lS(c1^.–S(‚k5­M%x\-’Y,O&zP&|J#qi4¨l6­r9¹`/˜Q'~[-‘^.”[-\-‘h4¦^.•Q'T)ƒR(T)„N%yd2 e2¢h4¨g3¤R(€R'W*‰g3¦d1ŸL%vX+ŠV*ˆV*†k5¬[,V*‡I#qW*ˆJ$sf2£a0›N&yK$sc1Ÿc1ž]-“j5©M%wM%vh4§`/™j5«k5«r9¸H"nq9·!ù, ‚ÿ€‚ƒ„……#ˆ‰ŠŒŽ’“”••a˜™š›œ˜  ¡¢££¦§¨©©O¬­®.°±²´µ¶··Qº»¼U¾¿ÀÂÃÄÅÅÈÉÊËËHÎÏÐ[ÒÓÔZÖר)ÚÛÜÞßà>âãäTæçè,êëìîïðññ-ôõöøùúûû3þÿuHˆÁƒ‡(\ȇÇIHœHñ„Å‹7hÜÈq‡Ç {ˆI’€É“(S¦\²¥K'0cÊTB³¦M(8sê,³§Ï$@ƒ U@´¨Ñ£GA(]Êt…Ó§PHJµjÕ&X³jµÁµ«W`ʽA¶¬YhӪŶ­Û pÿãÊ­A·®Ýxóê5Á·¯_ € 9¸¦¡×­ŸÕª!{¡³/Ì5 ˜ÒÙ®¡%Â2Ö«ˆ#·¤ŸÍ6׬ŸÏ6¡*k”É4%L83K:6x  )Œ%sKy£k–JÉ5¤èœÜ¡ãp–Ô•Íå–Ïç˜Ñè–Ïæ”ÌäÛ:Þ>Ý=Þ=Ü;Ý<!ù,³@É"F,Ç…„€9ŸÐhÁÈ\dجv»½d*‚—xL.—•†`Æn»ßoAcRâ´îø¼BM($&.ƒ„…†„!" +‘’“+)#,žŸ ¡, *¯°± ¨¹¿ÀÁ¹4ÉÊËÌÍÊ8ÐÑÒÓÔÕÖ×Ñ9ÚÛÜÝÞßàáâãÞ6æçèéêç7íîïðñî5ôõö÷øõA;TT_v224_html_docs/images/glass/orange/col_blue_out.gif000700 000765 000765 00000001173 11222361074 022600 0ustar00abwabw000000 000000 GIF89aæ©ïnµ¢Ü;•(Û:Õ8dgH×­Ÿ ÙÏ6É4Ô9ÕªÙ®¡`jÛ<·¥Ÿ%Ö«Ø9:_q"§Š&¸¦¡Â2׬Ÿ¨íÚ;·¤Ÿv SA;·2ƒ#ŸÞ±/ á¯/ˆ·S@;T>8†´–(‚#qp§ìœÜ•Íå¤è–Ïç˜Ñè¡ãp–Ïæ”Ìä–ÔÞ>Ý=Þ=Ý<ªð!ù,Ø€6„…†‡‡ 5Ž‘‘  9˜™š›› 3¢£¤¥¥:¬­®¯¯ 8¶·¸¹¹ ;ÀÁÂÃà 2ÊËÌÍÍ 7ÔÕÖ×× 4Þßàáá/%1éêëìê'0.)õö÷øö,$(*€H° +L ðƒbhñaÀˆÈ° ¢ÀDpp±ä„BXɲe #&”œI³¦Í‹=rêÜɳ§N@ƒ J4(£H“*]Š4;TT_v224_html_docs/images/glass/orange/col_green_in.gif000700 000765 000765 00000000626 11222361074 022552 0ustar00abwabw000000 000000 GIF89aÕ7³=Ø9µ¢Õ8t·¤Ÿ·¥ŸÖ9<¤7&¸¦¡Ù®¡Â2Ö«ÕªÏ6É4Ì5ˆ#5¨9%׬Ÿ]B³/G…+×­ŸÍ6P` )Y;K>)¡*J(t'sX=%Œ%'u(=ƒ*l6®;4ª:%y)3¤8©Õ´¥Ñ¯¦Ò°§Ô²§Ó±Û:Þ>Ý=Þ=Ü;Ý<!ù,³À…ÂE,GÅ"cˆ9ŸÐhÔ©dجv»-T˜xL.— ‡àÅn»ßoƒâ±îø¼ Q#(-ƒ„…†„ $+‘’“+ &*žŸ ¡*% ¯°± ¨¹)¿ÀÁ¹3ÉÊËÌÍÊ7ÐÑÒÓÔÕÖ×Ñ8ÚÛÜÝÞßàáâãÞ5æçèéêç6íîïðñî4ôõö÷øõA;TT_v224_html_docs/images/glass/orange/col_green_out.gif000700 000765 000765 00000000653 11222361074 022753 0ustar00abwabw000000 000000 GIF89aÕ8¶>nµ¢Ü;aD•(Ú;jÔ9g·¤ŸÖ«HÙ®¡Õª×­ŸØ9>ª9¸¦¡v ׬Ÿ:·>UfdÛ:·¥ŸÂ2Õ8IŠ,É4Ï6Û<`Š&%·2;­:E‘/‚#q±/:¯;¯/–(D“0ƒ#bBp9¸?©Õ´6®;¥Ñ¯%y)¦Ò°§Ô²3¤84ª:§Ó±7³=Þ>Ý=Þ=Ý<9¹?!ù,ÈÀ†$F,GI㑱9ŸÐh4ó (rجv»UP‚šxL.— ‡`Æn»ßoCÄ Ùïø|ž!Ò€n€‚ƒƒ 8Š‹Œ 2”•–—— :žŸ ¡¡'$©ª«¬ª)/&,0µ¶·¸¶%-*?ÂÃÄÅ?.(ÆÐÃ+>>ÑÂ×å#!ëìí!#åóôõö×<ùúûüýú= H0àŽƒ*\ˆ0;TT_v224_html_docs/images/glass/orange/col_grey_in.gif000700 000765 000765 00000000626 11222361074 022420 0ustar00abwabw000000 000000 GIF89aÕ¹±¯Ø9µ¢Õ8t&Ö«Ö9Â2±£žÙ®¡×¬Ÿ¸¦¡ÕªÍ6Ï6¯¦¤³/% „zŒ_P~A,Ì5É4·¥Ÿˆ#×­Ÿ·¤Ÿu:'˜‚zztqs%JŒ%—€y )Kv<)zrp¡*l´­«°¨¦}xw©¢ ÏÓÕÑÔ×ÍÐÒÏÒÕÎÑÓÛ:Þ>Ý=Þ=Ü;Ý<!ù,³@ãE,G†Bƒq9ŸÐh£Ylbجv»Ý, ™xL.—††Æn»ßoACR:±îø¼ï I-ƒ„…†„#$&+‘’“+("*žŸ ¡*  ¯°± ¨¹)¿ÀÁ¹3ÉÊËÌÍÊ7ÐÑÒÓÔÕÖ×Ñ8ÚÛÜÝÞßàáâãÞ5æçèéêç6íîïðñî4ôõö÷øõA;TT_v224_html_docs/images/glass/orange/col_grey_out.gif000700 000765 000765 00000001173 11222361074 022617 0ustar00abwabw000000 000000 GIF89aæ¼´²nµ¢Ü;•(gÂ2¦ˆ~·¤ŸÛ:Ï6¸¦¡Ø9ÕªÖ«Š&`׬Ÿ·©¤·2jÚ;v Ù®¡”eUÛ<·¥ŸdÔ9%Õ8¾µ³‚D-×­ŸÉ4H‚C-ƒ#±/¯/‚#·«§A+ª‡p¸­©–(«’‰q¾¶´´­«ÏÓÕ}xwÑÔ×ÍÐÒ©¢ ¹±¯ÏÒÕÎÑÓ°¨¦Þ>Ý=Þ=Ý<¿·µ!ù,Ø€ 5„…†‡‡ !3Ž‘‘!9˜™š››:¢£¤¥¥ 6¬­®¯¯ #4¶·¸¹¹#7ÀÁÂÃÃ";ÊËÌÍÍ" 2ÔÕÖ×× 8Þßàáá 0)éêëìê-, (/1õö÷øö+% '$€H° *L PƒbpQaÀ€8 !¢@ @àp±d† ,Xɲ¥…2”œI³¦Í‹=rêÜɳ§N@ƒ J4(£H“*]Š4;TT_v224_html_docs/images/glass/orange/col_orange_in.gif000700 000765 000765 00000000623 11222361074 022722 0ustar00abwabw000000 000000 GIF89aÕØ9µ¢Õ8t%Ù®¡&·¥Ÿér׬ŸÖ9èsÕªÖ«Í6¸¦¡ˆ#4Ì]É4Ì5Â2¨G³/×­ŸÏ6·¤ŸŒ%Kƒ/…0¡*s¡PJ )Â[Ä\¢P%÷{lêtñxâp§SàÀäÄ¡áÀÛ:Þ>Ý=Þ=âŸÜ;Ý<!ù,°ÀÂãE,ÇGs¨9ŸÐhô€Ih¤X¬&ÑÀ¾à°Xh0®´zÍfN¨E¯Ûïu“ˆP•X€‚ƒ$# *Ž* +›œž+'(¬­®¥¶ )¼½¾ ¶1ÆÇÈÉÊÇ6ÍÎÏÐÑÒÓÔÎ7רÙÚÛÜÝÞßàÛ3ãäåæçä4êëìíîë2ñòóôõòA;TT_v224_html_docs/images/glass/orange/col_orange_out.gif000700 000765 000765 00000000650 11222361074 023123 0ustar00abwabw000000 000000 GIF89aÕnµ¢Ü;•(’6ñvÛ:Â2Ø9Õ8׬Ÿj·¥ŸÖ«·¤Ÿ×­ŸÕªÏ6²K`H¸¦¡ý~Š&v gÚ;Ù®¡Ô9ÓadÛ<%·2É4’5–(4¯/qòwÚfƒ#Ügpôx±/‚#þ~û}âp÷{àÀäÄ¡§SêtñxáÀÞ=Þ>Ý=Ý<âŸÿ!ù,ÅÀM¥F,ÇÊæÁð9ŸÐh”ñP8¤X¬CÑä¾à°Xh@´´zÍf ŠmN¯ÛíÐa"ëûÿ€€"7‡ˆ‰ŠŠ"8‘’“”” 3›œžž '(1¦§¨©§-,/+0²³´µ³)*&#?¿ÀÁÂ?%.ÃÍÀ$==οÔâ!èéê!âðñòóÔ<ö÷øùú÷:ýþÿúÛA° Áƒ ;TT_v224_html_docs/images/glass/orange/col_pink_in.gif000700 000765 000765 00000000626 11222361074 022413 0ustar00abwabw000000 000000 GIF89aÕÝÝØ9µ¢Õ8tÖ9·¤Ÿœf·¥Ÿ¸¦¡Â2×­Ÿ†7׬Ÿ»šÏ6Ì5É4ˆ#%ÓÈÑÏÍ6ÕªÙ®¡³/&Ö«‘ް˜sJ€4~2 )¡*Œ%²›’%KlØØÒÒÊÊ––Ú£äÜ¥åÙ¡áÚ£ãØ¡áÛ:Þ>Ý=Þ=Ü;Ý<!ù,³@LâE,Çfp9ŸÐh±hbجv»546˜xL.—›‹@Æn»ßoÁe‚â´îø¼oúL%,ƒ„…†„ " +‘’“+!#$*žŸ ¡*' ¯°± ¨¹)¿ÀÁ¹3ÉÊËÌÍÊ7ÐÑÒÓÔÕÖ×Ñ8ÚÛÜÝÞßàáâãÞ5æçèéêç6íîïðñî4ôõö÷øõA;TT_v224_html_docs/images/glass/orange/col_pink_out.gif000700 000765 000765 00000000653 11222361074 022614 0ustar00abwabw000000 000000 GIF89aÕäänµ¢Ü;‹9•(gÔ9Û:j·¤Ÿ×­ŸÕªÖ«H·¥Ÿ×¬ŸØ9Ù®¡Â2%É4Š&Ú;Û<¸¦¡·2dÁŸ¦lv ÚÏäâ`Ï6Õ8ƒ#–(q¯/ÛÖ‚#ÚÔÇ«Š6È®p±/ááÚ£äÜ¥åØØÙ¡áÒÒÊÊڣ㖖ÝÝØ¡áÞ>Ý=Þ=Ý<åå!ù,È@IFF,ÇŒdñˆ9ŸÐhô±€(nجv»U@šxL.— †@Çn»ßoƒâÀÙïø|ÞA™„l€‚ƒƒ!5Š‹Œ"3”•–——"# 9žŸ ¡¡ #&*0©ª«¬ª(.)-µ¶·¸¶+$' ?ÂÃÄÅ? ,/ÆÐÃ%>>ÑÂ×åëìíåóôõö×<ùúûüýú= H0àŽƒ*\ˆ0;TT_v224_html_docs/images/glass/orange/col_purple_in.gif000700 000765 000765 00000000626 11222361074 022761 0ustar00abwabw000000 000000 GIF89aÕlØ9µ¢Õ8tÖ9Ù®¡i(R·¥Ÿ·¤Ÿk#-i4¨Ï6Â2Í6¸¦¡%m/|ˆ#É4³/Ì5n4¢Ö«×­Ÿ×¬Ÿ&Õª )e (se *K%K$rJd,{d,}K%t¡*Œ%n7³i4ªl6®e3¤K%yº¯Ø·«Ô¸­Ö¸®Ö¶«ÔÛ:Þ>Ý=Þ=Ü;Ý<!ù,³@ÃÃE,LJƒˆ9ŸÐhÉ$`جv»Md.‚—xL.——@Æn»ßoÁµîø¼oA%,ƒ„…†„$  *‘’“* ' (+žŸ ¡+!  )¯°± ¨¹¿ÀÁ¹3ÉÊËÌÍÊ7ÐÑÒÓÔÕÖ×Ñ8ÚÛÜÝÞßàáâãÞ5æçèéêç6íîïðñî4ôõö÷øõA;TT_v224_html_docs/images/glass/orange/col_purple_out.gif000700 000765 000765 00000001173 11222361074 023160 0ustar00abwabw000000 000000 GIF89aæp8¶nµ¢Ü;•(o%.Ö«Ô9Û:gp*W׬Ÿr6¨ÕªÙ®¡j×­ŸŠ&Ø9Â2H`Ï6Û<·¥ŸÚ;Õ8r9··2%¸¦¡q1€dv ·¤ŸÉ4p6«p2Šp7­o$.¯/p2Œ±/o$,p‚#ƒ#–(qq9¸n7³º¯Ø·«Ô¸­Öi4ªe3¤¸®ÖK%yl6®¶«ÔÞ>Ý=Þ=Ý<r9¹!ù,Ø€3„…†‡‡8Ž‘‘ "5˜™š››" 4¢£¤¥¥ ;¬­®¯¯ 9¶·¸¹¹7ÀÁÂÃÃ# 6ÊËÌÍÍ # :ÔÕÖ×× 2Þßàáá0$éêëìê&,-)1õö÷øö%.('€H° +T €ƒ*x‘aÀøÀ ¢@ 8p±äBXɲeˆ.”œI³¦Í‹=rêÜɳ§N@ƒ J4(£H“*]Š4;TT_v224_html_docs/images/glass/orange/col_red_in.gif000700 000765 000765 00000000626 11222361074 022224 0ustar00abwabw000000 000000 GIF89aÕÅØ9µ¢Õ8tÖ9Ù®¡·¤Ÿ&·¥Ÿ³/׬ŸºÕªˆ#© Í6Â2É4’Ï6Ì5¸¦¡½%Ö«×­ŸŒ%KJ%¡*xƒy )s‚ ¡lÁ»´†ÑšÒšÓœŸÔž¡ÓŸÛ:Þ>Ý=Þ=Ü;Ý<!ù,³@Ã%F,Ç‹a“9ŸÐh4±Y`جv»=,4‚—xL.—š†ÀÅn»ßoA#Ó1µîø¼/òd$%(,ƒ„…†„'$# +‘’“+ ! *žŸ ¡*¯°±¨¹ )¿ÀÁ ¹3ÉÊËÌÍÊ7ÐÑÒÓÔÕÖ×Ñ8ÚÛÜÝÞßàáâãÞ5æçèéêç6íîïðñî4ôõö÷øõA;TT_v224_html_docs/images/glass/orange/col_red_out.gif000700 000765 000765 00000000653 11222361074 022425 0ustar00abwabw000000 000000 GIF89aÕÈnµ¢Ü;•(Ï6Õ8…Ö«jÔ9d·¥Ÿ×­Ÿ·¤ŸÛ:ժ׬ŸØ9Š&Ú;v ·2š`Ù®¡HÛ<gï %Â2¸¦¡É4„Äp¯/qµ…´–(±/‚#ƒ#ÁÑš»ÒšÓœŸËÔž¡´ÓŸÅ†Þ=Þ>Ý=Ý<Ì!ù,ÈÀLÈF,ÇP¦ÁÀ9ŸÐh”ш8hجv»uD‚™xL.—ˆ Æn»ßoä£ÑÙïø|^óan€‚ƒƒ " 2Š‹Œ "0”•–—— 9žŸ ¡¡ '*©ª«¬ª$%.(5µ¶·¸¶+/&)5?ÂÃÄÅ?5#-ÆÐÃ,>> Ñ ×åëìíåóôõö×=ùúûüýú; H0 ƒ*\ˆ0;TT_v224_html_docs/images/glass/orange/footer.gif000700 000765 000765 00000021461 11222361074 021425 0ustar00abwabw000000 000000 GIF89a¼d÷øÒ¬üÖ°»x5鯥߲†ôΨɶ£÷ЪæÄ¡ÉÉÉ©U͵žÑ¾«Ífäää¹¹¹ò̸̦¦í˨ÙÙÙ㸽^Òœg«««ÔÁ®å¡°°°ÇcõÓ²èÞôzù|½½½Å²ŸòЮÕjíwæÂŸêȥ潔öÔ±ìȤâÀžðέàÀ¡×ıdz ÕÕÕëÆ¡ÍÍÍ®®®î̪èÄ æææærÝnãÀ÷Ò¯ápîɤÀÀÀîί?ëÆ¢äĤîʦòͨúÖ²ØÅ²á¿Ÿð˦ÝÝÝùÔ¯Ùláááýײλ¨Ñ•YùÔ°ÊŽSÒÒÒÐÐÐõϪñʱeéÄŸâ£٪{òÒ²ôЬÐhòΪétéÉ©···æÆ¦ärøÕ²ðбñÍ«ð̨íÍ­êÊ«°Xß¾t:׺žÍ¾°÷Ò­öѬåžäÁžz=áÝØÅ>çÁ›ïïïîîîìììöööúúúõõõøøøÀ|8åqþ~÷{û}ñx§SâpêtèœéééóóóçÁœåÁðæÁœà¾Ý½ã¿âââ§§§¥R›Nþý~ëuóyû~ÞÞÞéÃíÇ¡èÂü~ú}êÄžëÅŸéÂçÂòyûÕ¯ø{æÁîÈ¢ðʤïÉ£âqëÄŸìÆ ðɤðxñË¥äÀìÆ¡ö{ìɦêÄŸïwèèèôyà¿þײðwá¿úÔ®þزúÔ¯ãqçŤäÁÃÃÃß¿ŸïÊ¥ãããéŢ鯣êÅ ßßßãäåÅ¦çÆ¤ãÁŸêuíȤîÈ£ìÇ£õЫðË¥úÕ±ûÖ²õÒ¯ñѲóÒ°ëɨë̬çÁæäâÖÌÂS)ùÓ­çsçǨèÃêÅŸü}Ä…Eâ¿ÞØÒÀ_ùÖ³ôѯÅÅÅòϬóΩëvæÀ™Þ½àÀŸìuýýýüüüñññùùùôôôêêêíííòòòððð÷÷÷ëëëûûûþþþÿÿÿÿ!ù,¼dÿý H° Áƒ*\Ȱ¡Ã‡#Jd8éC%J:FøøÇ±£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµª:(Uú0i¢×¯`ÊKbÅ‹7V]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ó½šukײˆ+^ÌXâYŒKžL¹²å˘3kÞ̹³çÏ C‹ “°V®S«^Íú릡˜¥íG»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàËÿO¾¼ùóèÓ«WOZ¥iíãËŸ¯Z’}q£q¹¡‘Ÿÿÿ(à€hà&¨à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4¾(<ñÄs[{%½‡}@)dDöõÑǰÌâÍ ZÀ¡Ï“PF)å”TViå•Xf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæ©çž|öé矀*è „ê§zÐCþáh"ùxØ”VJ©}’ô1‰%ÁÓK À>ó”jꩨ¦ªêª¬¶êê«°Æÿ*무Öjë­¸æªë®¼öêë¯À+ì°Äkì±È&«ì²Ì6ëì³ÐF+í´ÔVkíµØf«í¶ÐŽŠ!õäq‡>‹òãhm~$©¥ì¶_‘“lòÇ(Éßi죯=üöëï¿,ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñÅg¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,sÉúîcÇ=uÐ1>õÜ‘¨¹:Ò–nGëºkôщeº)'£À3¨€jN8bõÕXg­õÖ\wíõ×`‡-öØd—möÙh§­öÚl·íöÛpÇ-÷Üt×m÷Ýxç­÷Þ|÷ÿí÷߀.øà„nøáˆ'®øâŒ>ŒÔ@‹=vèܳŒÝÏÐÿôç K¤´%œøá ìðqCDÂÍ#°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üòÌ7ïüóÐG/ýôÔWoýõØg¯ýöÜwïý÷à‡/þøä—o~÷\ …´ìSÏäò£ùО‡®ÿþ¹Ié`%l°Hà  çÈÀ:ðŒ 'HÁ Zð‚Bñ>î¡(€àÀ8-ìCÔï~ÊÿV¸¿LÉk¤„ *@ L ÕP wÈÃúð‡@ ¢ÿ‡HÄ"VPPÐ`ùÝöZ ±ršI±ðŠ “ĦèJÜ@MÅÎ,èЈhL£×ÈÆ6ºñpŒãù‘L ÷ÀÇ£¸9©‹€d— K x£ØÅ¦†2a=Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRš’7xÀ h‘ÇJ‘4 ¤,…”)Ny\Ø€v¡HF:ò”À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐôŽpÇ:˜ò@,©ŸYzsHZüƒ*A0(` ¼\d#ÍÍvºóðŒ§<çIÏzÚóžøÌ§>19ÿ¡t¨‡øØžX~ó «Ñ"'œF‰Èá·X†T£ų̂F7ÊÑŽzô£ ©HGJÒgzÐûÈG ´mæG)k$ñšzq¡W€¨D)jQŒ–ô§@ ªP‡JÔ¢õ¨HMj&y ØAôÈæ+AcP™Zµ,}àT-H`ƒ3LA§­èE•JÖ²šõ¬hM«Z×ÊÖ¶‚2€B îqM©Ž¦ªWÍ+X²:ŠJ°ÃœÀ0 i ÀbhAŽËØÆ:ö±¬d'KÙÊZö²˜Í¬f7ËÙÎzö³  ­hGKÚÒšö´¨M­jWËÚÖºöµ°­lgKÛÚÿÚö¶¸Í­nwËÛÞúö·À îcñG"õ`éT=ƒW½:7"YõC((†@Ht°…=lb…ËÝîz÷»à ¯xÇKÞòš÷¼èM¯z×ËÞöº÷½ð¯zÓ±Ä}Ìã‰RíãgšûÜþ2äHÒ¥*¬+QÂ±Š•¯‚Ìà;øÁް„'Lá [øÂΰ†qK È•®úÀær9Ã_ÿšø îâ€ÀâHà ÚmÁfLãÛøÆ8αŽwÌãûøÇ@²‡Lä"ùÈHN²’—Ìä&;ùÉP޲”§Lå*[ùÊXβ–·Ìå.{ùË`³˜ÇLæ2›ùÌhNsމk\ä*Wÿ¿)ñ‰ç,Bh±‹aŒ`5ûùÏ€´ MèBúЈN´¢ÍèF;úÑŽ´¤'íèÔ÷¾QÕfœ¹ S:{!vƳž_cJ›úÔ¨NµªWÍêV»úհ޵¬gMëZÛzÌzðð\ë:âÌÈùÓþ u DAlQð 9@G0P£f;ûÙÐŽ¶´§Míj[ûÚØÎ¶¶·Íín{ûÛà·¸Çý K÷¸É%è¦_jE`»ÛÂ.¶±‘­lf“ûÞøÎ·¾÷Íï~ûû߸ÀNð‚üà0²4J1ßuWñ݇·8qçaûØ9 †–ðŽ{üã ¹ÈGNò’›üä(ÿO¹Ê»­]ƒXÄpö5§Ûq:ÇûâÈÖ8ÇWÎóžûüç@ºÐ‡Nô¢ýè!?¹ݬnÍüºæV½ù¼3¾q{#ýêXϺַÎõ®{ýë`{·n_üj3O‡zL…­‹¶#¡É®:æN÷ºÛýîxÏ»Þ÷Î÷¾ûýàOøÂþðˆO¼âÏøÆ;þñ¼ä'OùÊ[þò˜Ï¼æ7ÏùÎ{þó ½èGOúÒ›þô¨O½êý~—ó:æ–I»ÚÊv·Ãr_½îwÏûÞûþ÷À¾ð‡OüâÿøÈO¾ò—Ïüæ;ÿùÎWz›ÓÝR™³{öžv7¶ß ´A+(ÿEþò›ÿüèO¿ú×Ïþö»ÿýð¿üçOÿúÛÿþøÏ¿þ÷Ïÿþûÿÿ€8€X€x€˜€ ¸€ Ø€ø€8Xx˜dÇpgW²‡}³¤}Üç}à'~˜‚*¸‚,Ø‚.ø‚0ƒ28ƒ4Xƒ6xƒ8˜ƒ:¸ƒ<؃>øƒyàz!fWh7s"8g$Ø}lð}áÇ?ø„P…R8…TX…Vx…X˜…Z¸…\Ø…^ø…(}èöfEx}GhbIK~Øà„`ø†p‡r8‡tX‡vx‡x˜‡z¸‡|؃¸G(!x†X$lpˆK˜ê°mˆ(Žÿøˆ‰’8‰”X‰–x‰˜˜‰š¸‰œØ‰žø‰ Š¢8ФXЦxЍ˜Šª¸Š¬ØŠ®øŠ°‹²8‹´X‹¶x‹¸˜‹º¸‹¼Ø‹¾ø‹ÀŒÂ8ŒÄ؉õ „0wƒHˆ,dˆˆØŠÈˆ PŒÔXÖxØ˜Ú¸ÜØÞøàŽâ8ŽäXŽæxŽè˜ŽêèˆJ§%PM7ËÈŒü#lmpm R°3І†ò9Yy™ ¹ Ùù‘9‘Y‘iÒ+‚1ô¨?öˆúÈþh‘$Y’&y’(™’*¹’,Ù’.ù’0“29“4† 1ÿ0Wø0„øÙ‘ #l0”Ð ê03` P“LÙ”Nù”P•R9•TY•Vy•X™•%y ^p ´`M<Ùk}ñ“@‰4BI”F‰”J©•lÙ–nù–p—r9—tY—vy—ZYGÆPa)–zA–ei4gyR°c ]Àw°˜ŒÙ˜Žù˜™’9™”Y™–y™˜™™š¹™œÙ™žù™ š¢9š¤Yš¦yš¨™šª¹š¬Ùš®ùš°›²9›´Y›¶y›¸™›º¹›¼Ù›¾ù›ÀœÂù™^Ã`ÈåJ;2–F˜Q7q7”„i˜ˆ©˜ÃyؙڹÜÙÞùàžâÿ9žäYžæyžè™žê¹žìÙžYP†à3Œ4%J„Á ¡ð›àœÏé‡g…Y˜ë 3€˜L Ú ú ¡:¡Z¡z¡š¡º¡Ú¡ú¡ ¢":¢$Z¢&z¢(š¢*º¢,Ú¢.ú¢0£2:£4Z£6z£8š£:º£<Ú£>ú£@¤B:¤!:^ÀGóÐ3ú(‹òx.r7À€0 â€)J{ÐI z  Ú J¤b:¦dZ¦fz¦hš¦jº¦lÚ¦nú¦p§r:§tZ§vz§x*¡/àQ 5°÷ß.ₚ}ZpÞ0 °ÿðFbYêMÂV”ZB d ßÀõЩžú© ª¢:ª¤Zª¦zª¨šªªºª¬Úª®úª°«²:«´Z«¶z«¸š«ºº«¼Ú«¾ú«À¬Â:¬ÄZ¬Æz¬Èš¬Êº¬ÌÚ¬Îú¬Ð­Ò:­ÔJ«pép ÃP…¨9“à®â:®äZ®äÚ-ø ½[a “ÐX©€4©•z©™º©Õº¯üÚ¯þú¯°;°[°{°›° »° Û°û°±¦êð1p J9’C …бû± ²" ²&S3i°# ¨³àð›¯J¯Wd¯–Š©ÿp ú*±:»³<Û³>û³@´B;´D[´F{´H›´J묩$íPðpGp V{µX›µZ»µW{ ãi`ëŠ Ì°0 œ¯ò*³3»¥p¯6‹³œº´t[·v{·x›·z»·|Û·~û·€¸ [PG^°>铏л¸ŒÛ¸Ë=Ü P7Àìài ³l»BÂv©— F &°©†pº¨›ºª»º¬Ûº®ûº°»²;»´[»¶{»¸›»º»»¼Û»¾û»À¼Â;¼Ä[¼Æ{¼È›¼Ê»¼ÌÛ¼Îû¼Ð½Ò;½Ô[½Ö{½Ø›½Ú»½ÜÛ½Þû½àÿËW` `”À ™Ë › ¯’йû#l0¿Ð  &ðà-üÛ¿þû¿À<À\À|ÀœÀ ¼À ÜÀüÀÁ<Á\Á|ÁœÁ¼ÁÜÁüÁ Â"<Â$\Â&|Â(œÂ*¼Â,ÜÂ.üÂ0Ã2<ÃÞÉð ]@TP‚¾0 .»¶ð:òK¿ö‹¿úKÃJ¼ÄLÜÄNüÄPÅR<ÅT\ÅV|ÅXœÅZ¼Å\ÜÅ^üÅ`ìÂð & ÂP O 7@ ˜ûðú¾C”nkÄF±0ɰ¿a¼Ç|ÜÇ~üǀȂ<È„\Ȇ|ȈœÈŠÿ¼ÈŒ<*6<±FÐ MPÞ@¡ ¹í Çq|4E\¿u|ÇyÜȤ\ʦ|ʨœÊª¼Ê¬ÜÊ®üʰ˲ìÈÉÉ’Ü °À¸À²– Ä,˜nÛ Ä °&€ÇÀ-ÌÜÌÎüÌÐÍÒ<ÍÔ\ÍÖ|ÍØœÍÚ¼ÍÜÜÍÞüÍàÎâ<ÎÐòÈ&°Â ­p $P ~ð“ÀÉÁÜ.ÂFÌ­`ÌȬÌäÜÏþüÏÐ=Ð]Ð}ÐÐ ½Ð ÝÐÍ,æŒÎêœË ÀưÀ ó\ÏÂ, g m ;Ð &  @`æzÒ(Ò*½Ò,ÝÒ.ýÒ0Ó2=Ó4ÿ]Ó6}Ó8Ó:½Ó<ÝÓ>ýÓ@ÔB=ÔD]ÔF}ÔHÔJ½ÔLÝÔNýÔPÕR=ÕT]ÕV}ÕXÕ:m@  &Ð ;ðÑP\°²þIÏ])ÂöÑ -Ò$mÒZ×r=×t]×v}×x×z½×|Ý×~ý׀؂=Ø„]؆}ØSÍÕ^ ÖÝ p6@µàÆ}Ööì¶«Ù§°)0¾€ pØ¢=Ú¤]Ú¦}Ú¨Úª½Ú¬ÝÚ®ýÚ°Û²=Ûù`Èà ;p ™Ý íÌ•0 ¿lÙì"l™½ ›ÝÙŸÚ´ÝÜÎýÜÐÝÒ=ÝÔ]ÝÖ}ÝØÝڭݶۺÿÍÛ™`@ ™<ÜÄ­Ön{ êí Íð Å€V`t0ßô]ßö}ßøßú½ßüÝßþýßà>à^à~àžà ¾à Þàþàá>á^á~ážá¾áÞáþá â">â$^â&~â(žâ*¾â,nV€ð Íà ê} € äÏ•}Þ”"l5ÎÞÏ0ð-ß,^äF~äHžäJ¾äLÞäNþäPåR>åT^åV~åXžåZ¾åVîâP 2Nãê}ãl¬ã<Þãn[ j^ ÏðÄ0äuçr>çt^çv~çxžçz¾ç|Þç~þç€è‚>è„^è†~èˆÿžèоèŒÞèŽþèé’>é”^é–~阞难éœÞéžþé ê¢>ê¤^ê¦~ꨞêªîåÄðϰ楂0€`æg.$Âëmþæñ­ê¾þëÀìÂ>ìÄ^ìÆ~ìÈžìʾìÌÞìÎþìÐíÒ>íÔí¬îê°.ë´në·$– àž ¯,à÷îê¾îìÞîîþîðïò>ïô^ïö~ïøžïú¾ïüÞïþþïð?ð_ððŸð ¿ð ßðÿðñ?ñ_ññŸñ¿ñßñÿñ ò"ï,¯î™ íµî¨Ý$ßîãÿ^îç.ò6ó8Ÿó:¿ó<ßó>ÿó@ôB?ôD_ôFôHŸôJ¿ôLô$oò(¯ò,Ïí//1/î0ðææŽîMßõ^ÿõ`öb?öd_öföhŸöj¿ölßönÏïOÄõà>õ._õóqõã®õ5ÿö~ÿ÷€ø‚?ø„_ø†øˆŸøŠ¿øŒïq?÷)_÷³Þò;Ž÷ñ!lªù0` 4€Ëpîvú¢?ú¤_ú¦ú¨Ÿúª¿ú¬ßú®ÿú°û²?û´_û¶û¸Ÿûº¿û¼ßû¾ÿûÀüÂ?üÄ_üÆüÈŸüÊ¿üÌßüÎÿüÐýÒ?ýÔ_ýÖýØŸýÚOòËÿ€4` 0ùª`÷•où¬ùšÏùžúÚßþîÿþðÿò?ÿô_ÿöÿøŸÿú¿ÿüv$XÐàA„ .dØÐáCˆ%N¤XÑâEŒ5näØÑãG!EŽtÁbÆ`¨bHÐ @~þôñWÓæMœ9uîäÙÓçO A…%ZgŸ?~ ÈÓSO²:¸Y,Ä>¬YµnåÚÕëW°aÅŽ%[ÖìY´iÕ®eÛÖí[¸qåÎ¥[×î]¼yõîåÛ×ï_À&\Øðaĉ/fÜØñcÈ‘C[榃,¨ž\”IÓègСE& ©R¦N¡Ê¢Q¢êÕȱeϦ]ÛöÿmܹuïæÝÛ÷oàÁ…'^Üøqá“—• êæ˜3KO§^Ýúõ£I—6Í®õ²w°‘'_ÞüyôéÕ¯gßÞý{øñåϧ¯6Ä»å4Âe†Þû0§Ó¶ $e©¢׊¯>#”pB +´ðB 3ÔpC;ô°¬ŠX®ƒ*dA0•þ¤pE[4M»ÔNTÁe¤åCsÔqG{ôñG ƒrH"ߢ%ÄK<1EÏ\tòI(o*0µNªìß°e8ìñòK0ÃsL2Ë4óL4ÓTsM6ÛtóM8ã”sN:ë´óN<óÔsO>ûôóO@tPB 5ôPDUÿtQFuôQH#•tRJ+µ´Ò8(â:ÀÄÊN˜ŒrTRW,TËQA5 ¹tVZkµõV\sÕuW^{õõW`ƒvXb‹5öXd“ ¶5ÔP‘N?µ2T(‰®ÉR³Õ¶´ÓBAUU+±œjrØFYtÓUw]vÛu÷]xã•w^zëµ÷^|óusM+ëÀSP©¥$ÿ¶5ø`£ú°ÄoÁˆ!ÖR~QÖ(G›B:öøcCyd’K6ùd”SVye–[vùe˜c–yfšk¶ùfœsÖygž{öùg ƒzh¢‹6úh¤“Vzi¦›vúi¨£–zjª«fÿZ›rÖX ~!M"†8^öÃlV{m¥vÀPà±Á™WT°EBHäoÀ|p 7üpÄW|qÆwüqÈ#—|rÊ+·ürÌ3×|sÎ;÷üsÐC}tÒK7ýtÔSW}uÖ[wýuØc—}vÚk·ýö×PÃ\AlpÄnG0Ø©d´ÙV~ùšþ l8ƒ±1™D~Á![Ð@ÃFÂ|òË7ÿ|ôÓW}öÛwÿ}øã—~úë·ÿ~üó×þû÷ÿP€$` x@&P d`ø@FP‚¤`-xA fîðž-rÿƒ_ülÕ#Àl@‚Z| yÌc!Â$±‰x`Þ¨€>qCMäÙ Þp@Ž\poC$bxD$&Q‰KdbøD(FQŠS¤b­xE,fQ‹[äb½øE0†QŒc$cÍxF4¦QkdcÝøF8ÆQŽs¤cíxG<æQ{t£sAøŽÙ[oH T€ ³ðÀ6!‰Fr[’˜'`J4`š¸á'rx=RôЮÀA)qJT¦R•«de+]ùJXÆR–³¤e-myK\æR—»äe/}ùK`S˜Ã$f1yLd&S™Ëdf3ùLhFSšÓ¤f5­yMlÿfS›Ûäf7½ùMh–2‚üZ!9ÙÉ=4ÀZ°àÄ$ )IxŽŠ’I© äFN~R‡ eñO€T %hA zP„&T¡ ehCúPˆFT¢¥hE-zQŒfT£åhG=úQ†T¤#%iIMzR”¦T¥+eiK]úR˜ÆT¦3¥iMmzÓ•ö³œú<ç'@<TB&îŒgQŸ$ çy\Ø€ñT¨>õSª"¬zU¬fU«[åjW½úU°†U¬c%kYÍzV´¦U­kek[ÝúV¸ÆU®s¥k]ízW¼æU¯{åk_ýúWÀV°ƒ%la {XÄ&V±‹elc[XªN5ÿªQÀ‹F¢íFå쀺 N0Œ4|ÂdMYÔ¦Vµ«emk]ûZØÆV¶³¥mmm{[ÜæV·»åmo}û[àW¸Ã%nq{\ä&W¹Ëensû\èFWºÓ¥nu­{]ìfW»Ûånw¹kÚÉ>¡Þ Á8±‰>l¶³ëý%-CLÞ ã8&À{_üæW¿ûåoýû_XÀ&p |`'XÁ fpƒü`GX¦p…-|a gXÃæp‡=üa‡XÄ#&q‰M|b§XÅ >Á8*pke–¨ì¥1v>û‡Qx€”àƒ9¨p…9YÈC&r‘|d$'YÉKÿfr“üd(GYÊS¦r•­|e,gYË[ær—½üe0‡YÌc&s™Í|f4§YÍkfs›Ýüf8ÇYÎs¦sí|g<çYÏG¾ÌÁJ°Â£øzÕ[cD“FŸ ­ŽÙá(@¸B;ö|iLgZÓ›æt§=ýiP‡ZÔ£&u©M}jT§ZÕ«fu«ëÜŽ+X@h€7Ø!h?œ7½‡Nt¯AƒÔIX¢Ñ€ Á l … œ!Ëfv³ýlhG[ÚÓ¦vµ­}mlg[ÛÛæv·½ýmp‡[Üã&w¹Í}nt§[Ýëfw»ÝýnxÇ[Þó¦w½í}o|ç[ßûæw¿ýýo€\à'øÿ²ÏP-Ø`$„rm‰I¤×× °…= XT‚$ ¼0ô‚ yÉM~r”§\å+gyË]þr˜Ç\æ3§yÍm~sœç\ç;çyÏ}þs ]èC'zÑ~t¤']éKgzÓþt¨G]êS§zÕ­~u¬g]ë[çúÕQÑ {ƒ ” +*‹Qpâ§xÛ?³è>Lbø€

ã«À¡€»¸³„?P¾?ø@ AA,AìC?üC@ DADB,DCxEXŒEYœEZ¬E[¼E\ÌE]ÜE^ìE_üE` FaFb,FcáDàBÜ;áEýýýúúúÏEöööøøøõõõçççìììîîîïïïùwÜFôÅ­ìůÞÀ±ÚGØEõoj-þþþöɲÝ=ß?Þ=ßAÞ?ôȲõȲӽ±ñÇ²îÆ²ÊAëŲâââ§§§óóó{{{ÞÞÞäääxxxÖÖÖÁÁÁyyyÚÚÚÃÃÃÉÉÉzzzÑÑÑÓÓÓÒÒÒªªªÏÏÏÈÈÈÂÂÂ×××ÍÍÍØØØÇÇÇæææÜÜÜÊÊÊÔÔÔ¿¿¿ÀÀÀ«««ÛÛÛÎÎÎÐÐÐÌÌÌËË˽½½ÙÙÙßßß¼¼¼¾¾¾ãããÝÝÝàààáááÆÆÆåååÕÕÕ¦¦¦úu÷ɲömý~õɲáoù{ÛEòDzðDzàEçìØCïÆ²üûû;öDZñññèèè÷ɳüüüÝ<òòòðððíííôôôêêêùùùëëë÷÷÷éééûûûÿÿÿ!ù,à‚ÿ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£J*R‘Õ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓvé©^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàËÿO¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàp¡D(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H& ä(L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæ©çž|öé矀*è „îyÈ¡ˆ&ªè¢Œ6êè£F*餔Vj饘fªé¦œvêé§ †*ꨤ–jꩨ¦ªêª¬¶êê«°Æÿ*무Öjë­¸æªë®¼öêë¯À+ì°Äkì±È&«ì²Ì6ëì³ÐF+í´ÔVkíµØžZʶÜvëí·à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ+ï¼ôÖkï½øæ«ï¾üöëï¿,ðÀlðÁ'¬ð 7ìðÃG,ñÄ ‹bñÅg¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ4×lóÍ8ç¬óÎ<÷ìóÏ@-ôÐDmôÑH'­ôÒL7ítÑ…D-õÔTWmõÕXg­õÖ\wíõ×`‡-öØd—möÙh§­öÚl·íöÛpÇ-÷Üt×m÷Ýxç­÷Þ|÷ÿí÷߀.øà„nøáˆ'®øâŒ7îøãG.ùä”Wnùå˜g®ùæœwîùç ‡.zܤ”nú騧®úꬷîúë°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üòÌ7ïüóÐG/ýôÔWoýõØg¯ýöÜwO}"à‡/þøä—oþù觯þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ  HÀð€L ÈÀ:ðŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ WȺð…0Œ! AÃÚð†8Ì¡wÈÃúð‡@ ¢ÿ‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBRˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4§IÍjZóšØÌ&*ÁÍnzó›à §8ÇIÎršóœèL§:×ÉÎvºóðŒ§<çIÏzÚóžøÌ§>÷ÉÿÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽzô£ ©HGJÒ’šô¤(M©JWÊÒ–ª 0©LgÓØô¦8Í©NwÊÓžúô§@ ªP‡JÔ¢õ¨HMªR—ÊÔ¦:õ©PªT§JÕªZõªXͪV·ÊÕ®zõ«` «XÇJÖ²šõ¬hM«Z×ÊÖ¶º•ªéHÇ"hJW,@à®xÍ«^÷Ê×¾úõ¯€ ¬`KØÂö°ˆM¬bËØÆ:ö±¬d'KÙÊZö²˜Í¬f7ËÙÎzö³  ­hGKÚÒšö´¨M­jWËÚÖºöµ5‡lÍq ›ÿÚÁ0õnwË[dà·À ®p‡KÜâ÷¸ÈM®r—ËÜæ:÷¹Ð®t§KÝêZ÷ºØÍ®v·ËÝîz÷»à ¯xÇKÞòš÷¼èM¯z×ËÞöº÷½ð¯|çKßúÚ÷¾Ù]Ç: 0ÛÜ6·½åíLàøÀN°‚Ìà;øÁް„'Lá [øÂΰ†7Ìá{øÃ ±ˆGLâ›øÄ(N±ŠWÌâ»øÅ0ޱŒgLãÛøÆ8αŽwìáàr‚¶€„ÌÛ(ùÈHN²’—Ìä&;ùÉP޲”§Lå*[ùÊXβ–·Ìå.{ùË`³˜ÇLæ2›ùÌhN³š×Ìæ6»ùÿÍp޳œçLç:ÛùÎxγž÷Ìç>ûÙË«ô*1à ¤—2‘w+€F;úÑŽ´¤'MéJ[úҘδ¦7ÍéN{úÓ µ¨GMêR›úÔ¨NµªWÍêV»úհ޵¬gMëZÛúָε®wÍë^ûú×À¶°‡Mìb§Ú D B¡ ˆÞŽáÙÏ–‡´§Míj[ûÚØÎ¶¶·Íín{ûÛà·¸ÇMîr›ûÜèN·º×Íîv»ûÝðŽ·¼çMïzÛûÞøÎ·¾÷Íï~ûû߸ÀNð‚üàO¸ÂÛ‰ ` È„¡7ÑlÝBÚ Ï¸Æ7ÎñŽ{üã ¹ÈGNò’›üä(ÿO¹ÊWÎò–»üå7Cˆ°Šøƒ@„B8„DX„Fx„H˜„J¸„LØ„Nø„P…R8…TX…Vx…X˜…Z¸…\Ø…^ø…`†b8†dX†fx†Dxçëw ݧuÒ&~y`~_Ђªp‡x˜‡z¸‡|؇~ø‡€ˆ‚8ˆ„Xˆ†xˆˆ˜ˆŠ¸ˆŒØˆŽÿøˆ‰’8‰”X‰–x‰˜˜‰š¸‰œØ‰žø‰ Š¢8ФXЦxЍ˜Šª¸Š¬ØŠ®øŠ‹Èì€è ç ~nÈu0~tØ‚¬ð‹ÀŒÂ8ŒÄXŒÆxŒÈ˜ŒÊ¸ŒÌØŒÎøŒÐÒ8ÔXÖxØ˜Ú¸ÜØÞøàŽâ8ŽäXŽæxŽè˜Žê¸ŽìØŽîøŽðò8ôXöxÒúª@‹lh Û‡)XåW‡O€ ¹ Ùù‘9‘Y‘y‘™‘¹‘Ù‘ù‘ ’"9’$Y’&y’(™’*¹’,Ù’.ù’0“29“4Y“6y“8ÿ™“:¹“<Ù“>ù“@”B ’0~  ì `Np t@X‡ ^3à_P‡€Œ°•\Ù•^ù•`–b9–dY–fy–h™–j¹–lÙ–nù–p—r9—tY—vy—x™—z¹—|Ù—~ù—€˜‚9˜„Y˜†y˜ˆ™˜Š¹˜ŒÙ˜Žù˜™’9™qùsКÀ IÉ” •X§‚Uù9š”Yš¦yš¨™šª¹š¬Ùš®ùš°›²9›´Y›¶y›¸™›º¹›‡‰ š€wÀ™žù™ešYyœóœÊ¹œÌÙœÎùœÐÒ9ÔYÖyؙڹÜÙÞùàžâÿ9žäYžæyžè™žê¹žìÙžîùžðŸò9ŸôYŸöyŸø™Ÿú¹ŸüÙŸþùŸ âÙ}àÀÉ”Nð”OéÅy•Yi* :¡Z¡z¡š¡º¡Ú¡ú¡ ¢":¢$Z¢&z¢(jŸs0ÀyN  Ê Æù ¢6z£8š£:º£<Ú£>ú£@¤B:¤DZ¤þ ÌY þ`¤ä©¨ wࢠº  *š¡àZº¥\Ú¥^ú¥`¦b:¦dZ¦fz¦hš¦jº¦lÚ¦nú¦p§r:§tZ§vz§xš§zº§|Ú§~ú§€¨‚:¨„Z¨†z¨ˆš¨Šº¨ŒÿÚ¨Žú¨Ê¥± µ0 ­€ø@ Ç@ õ Zú•@ ´ ž©¦Ê¥U º2£ ŠWŠ¥§:«´Z«¶z«¸š«ºº«¼Ú«¾ú«À¬Â:¬ÄZ¬Æz¬³ ZÊñ°ðà” È` Ç@ ¸À+   Ë Çp ½° ¼ ÝÅ@ ¼p þ€nJ PȦ©Š2ЪT:VŠ¥Y¯þú¯°;°[°{°›° »° Û°‹ ª²` Ø Ý@ ·0 »€±Û° ÕP 㪠"5à7à € Îp ·  È Ô   ÍÿÐÊŠ¦  Ùð » ´° ½ ­ÀÿZP ª`Àª÷*\𪱠¡;µT[µV{µX›µZ»µ\Ûµ^ûµWÛ’` Ý Ç@ ÂÐ ×Ð Í “0´Í° Ñà µÀ ÃÀ Ô ½p P ¿Ð ´ Èp Å` ,k À 7 ­ P ú¦[±Ø ·à ¿p »à ÂÐÙÐ ¸@ ÔÐ×p¬¨´ÀÙ´÷Ê308€Xzý ¶´[»¶{»¸›»º»»¼Û»¾û»vZ ù@ ’@ ”À Ç@ ÃÐ@ ù€ Ç  ÉP ­ð ÄÀ ݰ € ùÐ ÄÐ ´ÿ ×p À@ Ù Ä p Ö+p6 ¾Ãp Ðõ ñ0 Àp ¸0·Ý°Ñ€ ` À³”Š â à ¹pÔÐ Â`ÁŠ´Pº´øJOÛ°*»WðÁÂ"<Â$\Â&|Â(œÂ*¼Â,ÜÂ.üÂ0Ã2<Ã4\Ã6|Ã8œÃ:¼Ã<ÜÃ>üÃ@ÄB<ÄD\ÄF|ÄHœÄJ¼ÄLÜÄNüÄPÅR<ÅT\ÅVìà ¯0½p Ø³É Р Ï@ ÛÐ ÍP ¹€ ½¿Ð À[ ¹ ½@ ¸ à ×Ðù೽Р´  0 '°+ÿ`̰ ° Å ÄP µq¼ÏÈpÁÀ¹ÐàÉ ®pË ¾‘´Û: Ú€!ÌõPWœÂL¯L+KÀº ³üËÀÌÂ<ÌÄ\ÌÆ|ÌÈœÌʼÌÌÜÌÎüÌÐÍÒ<ÍÔ\ÂÓ° +` ! Ï Î` Úp Ù ´@ ÏP­»p ¹ÐÝ Úð Ü Û@±Íð 0 Ü Àð » ñ` Ôð Å Yü Ì€ Pp1 ¿ + P   Á² ®Àà ¹ € P Á°¸° " Úp–ÿ‹ ذÅÃ\ËpËN;»üÁWÐW F}ÔHÔJ½ÔLÝÔNýÔPÕR=ÕT]ÕV}ÕXÕZ½Õ\ÝÕ^ýÕ`Öb=Öd]Öf}ÖhÖj½ÖlÝÖnýÖp×r=×t]×v}×x×z½×c- Õ0 »PÉ) Ó ÷²Àæ› Ø p¼ ­ ÷p ¸0 Ð ±@  ûÐ ÉP •€ÁÀ ›}¼ Á ¼pp²   (à'˰ É ¸ ’ Íà ¸P  Ö0Óµ`¸Ö È `® `Ð'‡œÒ` Ì À²·p ûÿÀ×H]ê¶¼æË@ÝÁCÝmÞîýÞðßò=ßô]ßö}ßøßú½ßüÝßþýßà>àJýÔÐ ûð àpú Í °´Óp þ| ¿Ð ·@ µ°¹Ð¿² Ó ÙÐ Çp “×° Ü  ÝÀ Ø ·€ 7p ~®°à" Ê@ +[ "k 4u ÑPÜÃà ðȽ ° R.0Ø Ð pÊÐ1° P ´p1.±ï-ÞäÝÓ·¬Ë8 ÔìÝÞçr>çt^çv~çxžçz¾ç|Þç~þç€Þ߯ ’P AÐ6ÿ@ úð ×`ÔüÀ õ@ ­0 Û ƒí¿Û@ Ô€ ` ÇP ’p ½ Ð@ û ÚÀ Æ` ²€¾Í€ ÃP7P-à-®@ë °'-°À`ÃÐ  ­Ñ° Þ ›»Òœl À3 ' ³­ 6 ° Ô Ä0 Ȱàæ% jnÞlëÍÞþîðïò>ïô^ïö~ïøžïú¾ïüîÔ0 ÁÀ ‘ðà­ ä^ •  ú ’€ @ëÞ'°ÒÀ ¸€ Ü@ Ü0 ÑP Ïð i« Ð@ öžM ¹` -°Ð1ÿ°Ì0 }ÕÍ  ¸P ÊÀ“@ä½Ð †[ »ƒ Ã@ÐÖÀ)à6° Å€ ¿ðáΠ · Ô€ Ê€ |mîè~Þ¹ÜüÁoÞÐönÿöp÷r?÷t_÷v÷xŸ÷z¿÷|ß÷~ÿ÷€ø‚?ø„_ø†øˆŸøŠ¿øŒßøŽÿøù’?ù”_ù–ù˜Ÿùš¿ùœßùžÿù ú¢¯ø 0àÉлúmO Ú ª½-@°Ø)Ýʰ ¡l½Ù ´ưÞ Ø@ ±  1à ¿ð )p4ð Àé1 ÿP L³1p Þ^Ò›»€ ˰ë à á p \ Ñ Ð0¼ jÛUlZ¬J.dØÐáCˆ#êP¥„ K4.áÒWÚŒl#ÑäI”)U®dÙÒåK˜1eΤYÓæMœ9uîäÙÓçO A…%ZÔèQ¤I•.eÚÔéS¨Q¥Nu9-E ˆA¢•ÏžB|Ó¨MƒÆ@ɉaJâp°¢ÅŠ „¬°¶í-lÓ‚æuÒµ[´ê5‹ ‚ÒPà턃 Šír¶ ×/ZxX° ¶[ÚråòuZŒ® )&í4‚un À†ÿ‚"TX±@‚+)S&­±WN«T¼˜qcÇ BR¡N…ßuìÙµoçÞÝûwðáÅ'_ÞüyôéÕ¯gßÞý{øñåϧ_ßþ}üùõïçßßÿp@ 4ð@TpAç ¢nYnò¹î•cny¦\ |æWЦv¨A‚n8Áƒ~1¬™W´Yæž]$©d*©„šb$øEkª™F¸!!~ðE‚[ &eâQ`ÉZб¦ÉžáLg~q¥‚a¤ ¦N°™"€™”¸á™¦dv€!dá˜ëà¡&h\‘Àƒj(&HÁxu$a…’y†`²áç—X°áŸ[n1†›_”ÍdæˆA‚ ¦˜\œ”jh(¦•F«e—jÉ™†É… |I kzi`…r«¡anUL N¨!—Z ‰gŸ_Œ1"(T`AƒBY舃Dud’K6ùd”SVye–[vùe˜c–¹e^[¡~°‰„|ìY`2OèU‰v€,Ä\aðÀob°a~¡¦Ÿgrÿ&eœéFa‚9à˜eÈå˜^à–nHÀ™x[™m$i%Å~ɘx¯æ¥d*È倰Á—Z®L ¶¹¥eb`,†jU hHÁLkj¹ aî)¢-J(¡ã=øèä6­nfÖ[wýuØc—}vÚk·ývÜsg/N€á„Vø!†Ÿ}¦™& ÎÊÕ v—¥s=! j¡l†¡…˜d"1f˜xyå ~h9Àq\ÀÆp™äÎ|Feˆ†–a‚i†J¨ š]£žáLja0 ˆA |Œb,# HÁ~á‹À»HÀ vÐÿ‚4ÆaK£/<Ó Zìl@:0Á 6F¨ ð sƒ¢€@ ÅbÉ žq‚ã±°†ì1 "]©I“E6Šñ‹jtmØXÆ#^egðâP@†‚q.,ãÌL·rA Ôb‚ÒPfäàÐ`?`@ V aÿCfdá  ultÂQëdg;ÝùNxÆSžó¤g=íyO|æSŸûäg?ýùÏ)ºbŽ D6ðHdØÀ0(“! €0@óN @2£Àà…$(! I4#ÂØÇ.òÑ aà!ÔFÕˆ‘G#P»‡»ØaÔ·¸Æ1šÁ§d,ƒ5ÈðÞ1ŠÑ‹m-åR†7Š—C¸È†+|1ŒìÀi?`Œ7ˆ 0 A¸\–Œ(•±›ß ' ’0€èÔ‡èB$ìzW¼æU¯{åk_ýúWÀV°ƒ%la {XÄ&V±‹elcûXÈFVÿ²“¥le-{YÌfV³›ålg=ûYІV´£%miM{ZÔ¦Vµ«…læØ€~¼Â®#]Áô–†²W(€Ð€(CÁä/Œ1 cH‚¸¨G<¤J8ܨÆ/ºñŒ]ÜBðÀF,RP c£x7€ aüÛø7šÑ‹_,‘X¼ŒdX°À3¢CË(3à oH` ÀÕ”ˆD"'hÖ'k€v­à„¡é¤ãº¢AĬ%q‰M|b§XÅ+fq‹]übÇXÆ3¦qm|cçø±(˜ã$î‘an`ÁÒH,,ï'ÿ@…[P\8ã­HF?âA‹~H"”Ȇ=à± eÈÂǨ@6³šbÈ¢ÍèÇ5˜‘\˜Ï½ˆ†$„Á‹\à#¿@aêQŒ ,ãËø6r±7gLâ¿ÀÀ…²±€Ô^;@ ¤‘ h4¯ðÆ P£ÐÀ`@ l Üõ³g´@Ã7 SÄ"ÆG­m}k\çZ×»æu¯}ýk`[ØÃ&v±}ld'[ÙËfv³ýlhG[ÚÓ¦vµ­}mlg[ÛÛæv·½ýmp‡[Üã&w¹Í}nt§[Ýξ |ìCøè†4*PŒ2/Ésœ£„Pƒ`0¼ Eÿ2šñŒxLbkýh2âÑ‹cÜãĀ0„aˆ)ã݈‡ª`Ä ÁÑàEÇ©Á mD£Ô€Æ5*‘‹[DàÒHFqЋal£ 6Æ6Pdc¼:N bž`Ì\S¿5V¸aHu0®ámV³  ¯†µ¬g½n°‡]ìc'{ÙÍ~v´§]íkg{ÛÝþv¸Ç]îs§{Ý›M‹9*“˜÷=xÑo׊ W¼š£hð‹(ƒ½pÆ4Zéx#·†ëÑŠcpcöh†0  ^´¼¨Œ6à!äVüR3ÈF2zQfä#­èG4 hHã×5zÿfH£Ý8@?˜ a,c F4jÁ€ x ä ðF´Å‹4£Q€o”x 7 xÆ6&Ñí ï¡ |€tÞëYÝîó§ýíüç_ÿûçÿýÿ @Ü¿9ª|x…Zë‡ið€9â1‰Ò-!À…Zà…i8iˆ†؆{@†xd€_¸†Ÿ’„kà{è†a؇k@†VPZÀ‡xJè‡}ø/òÚ…gL€~8j †kdІ™3k†_Ȇ~†ö†a@† l€kà`Ø9i8a¹³Zp†a°´†m¨o¨ˆa9€ÿÀ!£{à¶n‚3Ð-˜y?2± øÃ?@ADB,DC$ƒ}ÜÇzøLÐ MÑMÒ,MÓ`N`^àö~`Ž` ž` ®à\=ôÑÃM\ÄÕ]þ`aa.a>aNa^ana~aŽažaxˆ‡ó¼ØxȇõºsO]†j0µèas ‚!†OÉ-!‚·¨•¶í¾h`€ZP€ †xð/b˜†|Èï´ÛÁý dP€Jò…ÿì‡Jx…G€„Fpày`:®ãO¸c<Îc=Þc>îc?þc@öãyÀàÂ%ƒàDNdENäŠmdG~dHŽdIždJ®dK¾dLÎdMÞdNîdOþdPeQeR.eS>eTNeU^eVneW~eXŽeYžeZ®e[¾e\Îe]Þå\¦aà©^¸{8†gH¸K]IZ¢Ý£†ZHH%ЛÑÁ‹^Ð`€ZѤ%Y€q½ Úâh {Ð]X$9.9Ž\˜„`æ ††kð |à}ðFØã(hƒ>h„Nh…^h†nh‡~è d=8ÙÿE®hDæeŒÎhÞhŽîhþhi‘i’.i“>i”Ni•^i–néNN†Tf{à¨ið† xÊ«ˆ‡Šwn_‰‚Op-hr€¨O‹ØP`¨†jÀ…jˆç“…b8]À·È…hHL"jPbиj ½JøçF˜‡<†h·~k¸Žë…–hжèEvi¼Îk½Þk¾îk¿þkÀlÁlÂ.lÃ>l¿Îpކ[@x¸kÐðÆ  pXG]€ H$Ђ­ÆIP€ZI8¾aÀ9^à…µ™Ÿ\H€j€(Ýp†jH†] †} ¼ÿˆ…-{~Xk<–kã>näVèÁÅÕ‰Î6xnèŽnèFlê®në¾nìÎníÞnîînïþnðïL¾wÆf]à/‚8b€‹HVw%X¨Ð… ]¸0ï¥ ñ“€Ph¨…`0t†ôû^€úIhÈ`@¥{@%g0žn¶¾ãäÞpëÁe‚Â=déñçÖ?qOq_qoqqqŸq¯q¿qÏqßqïqÿq r!r"/r#?r$Or%_r&or'r(r)Ÿr*¯r+¿r,Ïr-ÿñòÆæ{Pð縇ßü†ÿˆ€ˆïÄoˆÏVp˜I^0ãmйø½XX@k¾ €]8€@ h3á„€èOèpHt†þðçñ-ÏtMßtNïtOÿtPuQuR/uS?uTOuU_uVouWïqh°æî[Ð…È©Vñ¨ïmö€ð,ðsç†ajx(¸øiH€ZˆcÈd ޳]€Œ(†ð… ‹jÐ6ÆHh —ts?wJçvowwowJˆwyŸwz¯w{¿w|Ïw}ßw~ïwÿw€xx‚/xƒ?x„Ox…_x†ox‡xˆxÿ‰ŸxНx‹¿xŒÏxßxŽïxÿxy‘y’/y“gøl0aÀ4y§…eð÷˜l¨(¢%«^ð p ö%[€†À©°ZXWÈ@b°[X‘¨•¨¦ñ…]°pá&îG?w¬ôt‡68¯ÿz°ÿú“{²/{³?{´O{µ_{¶o{·{¸{¹Ÿ{º¯{»¿{¼§xåâ÷Ipü6$°…À—Þ@[ð€8 8üÃ_(ê¹0„9°…]â¬ú ^xx„€.î¬ý ÿp=Ю{Ô÷ú{X}Öo}×}Ø}ÙŸ}Ú¯}Û¿}ÜÏ}Ýß}ÿÞï}ßÿ}à~á~â/~ã?~äO~å_~æo~ç~è~éŸ~ê¯~ë¿~ìÏ~íß~îï~ïÿ~ð÷þ~`WÀ(°…Š’Z[Ð¥·XPú@·Ê|¥±7ñ…X€`È[5lý€åÁÃZõ³‡OŸ?FŸ>ý«hñ"ÆŒ7rìèñãG9S˜è爑”*Wª¼çò%̘2gÒ¬ió&Μ:wòìéó'РB‡-jô(Ò¤J—2mêô)Ô¨R§R­jõ*Ö¬Z·ríêõ+ذbdžUVA‚ØB€ ­[ºlѵµã Ú·oaIð`Ë€j¸Ø:XƒD‹$ÿì2vï¿Fó&‚¬lù2æËr4‰’%h#dG“.mú4êÔªW³níú5ìØ²gÓ®mû6n°b <(­.-âÚªfmA´_0Äø@ ·jØH±C7e¶HÜ@¤ WËdíƒ÷Hßdʙ׳oIg8BƒÎmÿ>þüú÷óïïÿ?€ 8 Ø“2'Ø‚ (x ‚q9@‚-7ÈdLa¡,"À‚x-ÄàK6Û=h× 5ôPDê¹÷"Œí‰ŸØx#Ž7N²#=úø#A 9$‘Ey$’I*¹$“M:ù$”QJ9%•UZy%–Yj¹%—]zù%˜aŠ9ÿ&™ešy&šiª¹&›mºù&œl³‚ Ì"Ä,0´0‹-°Ì2K4B®0‹b°|¡ˆ­C4 "à@žÞ4öXdéÅx)¦–ÍHI5æøéqŠ:*©¥šz*ª©ªº*«­ºú*¬±Ê:+­µÚzk˜Æìr$¸ì£2+(PCžÔÀà,vÂ2 ‘(ˆap(°5a TPK²lÍ’Âxå—E™Š;.FrÀÇ© ‚º»íºû.¼ñÊ;/½õÚ{/¾ùê»/¿ýúû/À <0Á|0 +¼0à ;ü0ÄK<1Å[|1Æk¼1Ç{ü1È!Gœ7Þ(ÐB5{ÞPŒ7¤0ÿ¨~!  2po6Adë'$Ì¢„³³Kž°§¢CI.¹M‹»é¨û©ÈU[}5ÖYk½5×]{ý5Øa‹=6Ùe›}6Úi« ±Ë,óó8ˆ )øâAÍ΋.î+Ÿ$tè "À@B-¹ „’:™d.:=yŒæ2A|ı9çs¾6è¡‹>:饛~:ê©«¾:ë­»þ:ìí&ƒÂ, äRƒ5ÔBÐò‰·Ÿ³xÐ/à:  AÃD 'Üp·ä™‡ÞDLS~½ŒçŽ®çÝo;øá‹?>ùå›>úé«¿>ûíï{À,€§0Kûø2‹.Ðÿ‚à¶¾¿ ±7>AªC$ˆA-$@ EKÃÛ‚s©{Þóœû2¨Á r°ƒü C(Â’°b)X¶fQƒÄÌÏw0¨Áñðw3€-°ðY`àŠìcŽ£Tä¬Á!Vf‚—ãÞ7’¨Ä%*1N|"£(Å)R±ŠV¼"³¨Å-r±‹^ü"Ã(Æ1’±Œf<#Ó¨Æ5²±n|#ã(Ç9Ò±Žv¼#ó¨Ç=ò±~ü# )ÈAθˆ…Ñjp $€AŸbЋ2öc|³Ó`Ð ÁèÖôÀEÄQVÆ\R @ãÀÄU&‘®|%,c)ËYÒ²ÿ–¶¼%.s©Ë]ò²—¾ü%0ƒ)ÌaÒ'Ô…%c ,#' Í!D ¼h Ò$GÊmjd‚§TÃâP„q’³œä$&:Ó©Îu²³î|'<ã)ÏyÒ³žö¼'>«x‹kpȦ.Œö›0@“‚œ¥¸©Ðn"á›k§9#Z„~P´¢½(F3ªÑr´£ý(HC*Ò‘’´¤&=)JSªÒ•²´¥.})Lc*Ó™Ò´¦6½)NsªÓò´§>ý)Pƒ*Ô¡µ¨F=*R“ªÔ“râÑì,iƒ€ò[Õ[(V/âMT®¡ø*Xà ֥’µ¬f=+ZÓªÖµ²µ­nÿ}+\ã*×¹Òµ®v½+^ójÔd²ÝH4i6„Y !Øl‘³ªÐ­ª¡«b}ìWõ*ÙÉR¶²–½,f3«ÙÍr¶³žý,hC+Z”JcšQ½¡%m1„GI ’bB›Õ­ža –€ìcG«ÛÝò¶·¾ý-pƒ+Üá·¸Æ=nN1oD`"A ¦ Íà‚“¨‡Uµ)[nzÓ½-nÊÜñ’·¼æ=/zÓ«Þõ²·½îe+4†ð ðƒõŸ¡`qiÇ‘Èfb·»Íî6¶80‚Œà÷2¸Á~0„#,á S¸Â®é¤àCh†V M”a£•Àÿ$+`ÅÒv V0Œ Ó¸Æ6¾1Žs¬ãó¸Ç>þ1ƒ,ä!¹ÈF>2’“¬ä%3¹ÉN~2”£,å)S¹ÊV¾2–³¬å-s¹Ë^þ2˜Ã,æ1“¹Ìf>3šÓdÄ ÐTa \!Ý@ý B¯ºb¬ØÅ1†±š-èAºÐ†>4¢­èE3ºÑŽ~4¤#-éISºÒ–³,Üì€@ó Ól’{ÔƒÞólj€Ú¾øÏ¾4¬c-ëYÓºÖ¶¾5®s­ë]óº×¾þ5°‹|¸9sŽ€4ˆÑRŸGŨæs¤°ê5¸ZÁ’¸6¶³­íms»ÛÞþ6¸Ãÿ-îq“»Üæ>7ºÓ­îu³»Ýî~7¼ã-ïyÓ»Þö¾7¾ó­ï}ó»ßþþ7À.ð¼à?8®ð…3¼áènE6š1„Vô ¨E?)ÝS?ÚÒ>ƒ% `…‘“¼ä$w8ÊS®ò•³¼å.9Ìc.ó™Ó¼æ6¿9Îs®óó¼çë–Ѓ.t¡‹èظÅ.€‘€àñ˜„= àwœˆ!ˆöª-Q“s}䮸:ØÃ.ö±“½ìf?;ÚÓ®öµ³½ín;Üã.÷¹Ó½îv¿;Þó®÷½ó½ï~ÿ;à/øÁ¾ð†?<â¯øÅ3¾ñŽ<ä#/ùÉS~ñ¾¸<æ3Ÿyÿµ_^ .x‘é}h¦F,Õ«>Ä«“#ëbè:×[!ûÙÓ¾ö¶¿=îs¯ûÝó¾÷¾ÿ=ðƒ/üá¿øÆ?>ò“¯üå3¿ùÎ>ô£/ýéS¿úÖ¿>ö³¯ýís¿ûÞÿ>øÃ/þñ“¿üæ??ú… YpÃñÈÇ$*|<@½ê¡Ýzoö%Ï'    & . 6 µË$Ü%È_=Ð$@Ä<,Mêå_±ž4%¼žÿ‘<”  ž ¦  ® ¶  ¾ Æ  Î Ö  Þ æ î ö þ ¡!¡!&¡.!6ÿ¡>!F¡N!V¡^!f¡n! Öƒ¾>DÂ#˜Úýe`õl B6A9ˆ¼!Æ!òÖ¡Þ!æ¡î!ö¡þ! ¢ "!¢!""&¢"."#6¢#>"$F¢$N"%V¢%^"&f¢&n"'v¢'~"(†¢(Ž")–¢)ž"*¦¢*"$\ >ÜŸ?˜¡ž¥áB­aÊ!.¾¡?ì"/ö¢/þ"0£0#1£1#2&£2.#36£3>#4F£4N#5V£5^#6f£6n#7v£7~#8†£8Ž#9–£9ž#:¦£:®#;¶£;¾#<Æ£3ÎCj vÑÿâ€eA뱡梞!@¤@$A¤A$B&¤B.$C6¤C>$DF¤DN$EV¤E^$Ff¤Fn$Gv¤G~$H†¤HŽ$I–¤Iž$J¦¤J®$K¶¤K¾$LƤLÎäF⣀Ùb?ú#Ú$Oö¤Oþ$P¥P%Q¥Q%R&¥R.%S6¥S>%T>›-ZNÆaT^%Vf¥Vn%Wv¥W~%X†¥XŽ%Y–¥Yž¥ELeUî$Z¶¥[¾%\Æ¥\Î%]Ö¥]Þ%^æ¥^æã>–ƒ8¬åî¥`&a¦a&b&¦b.&c6æUÚâ_¦cN&eV¦e^&ff¦fn&gv¦MB&`”€gŽ&i–¦iž&j¦¦j®&k"%hJfkƦlÎ&mÖ¦mÞ&næ&a¾æZê¦oþ&p§p'q§qÆoVåq.'s6§s>'tF§tÆerêät^'vf§vn'wv§wŽKuúãwŽ'y–§yž'z¦'j†g.ª§{¾'|Ƨ|Î'}F%{âb}æ§~î'ö§þ'ŒÜ§;TT_v224_html_docs/images/glass/orange/hide_menu.gif000700 000765 000765 00000000714 11222361074 022062 0ustar00abwabw000000 000000 GIF89a(ÕÙÙÙåååÉÉÉÊÊÊËËËÚÚÚòòò×××ÔÔÔÞÞÞáááèèèÑÑÑÓÓÓØØØÛÛÛìììçççÏÏÏíííêêêÍÍÍÈÈÈøøøõõõúúúùùùÆÆÆöööÇÇÇ÷÷÷ÌÌÌûûû!ù,(é@pH,ȤrÉl:ŸÐ(ô¢@,†v+x Å™)›Ë‰ÅR)Öðx¡\YK"çüy‚ˆ4zqy‰Ž•މ–ŠŠ›‘“£—™£Ÿ§¤Ÿ±²š§Ÿ¡£¥”§˜´–«‰ÃÈÉÉÏÈÃÐÄÙà ÏÌÚáÃÏ ÚéêéÈÕÉéÔëüý ìK7¯š=v `ðǰ¡Ã‡#J\Ç¡¢Å‹3jÜȱ£Ç1ˆI²¤É“(I;TT_v224_html_docs/images/glass/orange/hide_menu_roll.gif000700 000765 000765 00000000714 11222361074 023112 0ustar00abwabw000000 000000 GIF89a(ÕŸŸŸ¹¹¹———   ÒÒÒºººììì···®®®ÓÓÓ¸¸¸ÅÅÅ£££¢¢¢«««¡¡¡ÖÖÖááášššžžžÛÛÛóóóÇÇÇÕÕÕ­­­¯¯¯›››ààà”””–––øøøõõõùùùúúúööö•••÷÷÷ûûû!ù,(éÀ’pH,ȤrÉl:ŸÐ(TdÁ@†v+( !‹*›ËF§ó(Öðx üX3.çü9’‰ 6RêrLÕù"¾õ™iTß@Ú·™’Úƒ[GGpúúúÅŠe£ê²{]¸|aÉÉÉñññཛྷëÅ èèèøÒ­âl‡˜§åMìZ|SEþþþR+2“®÷ЫƒI&*8™áöööúu»‚aëmÔZŠaLönëëë½UêU¹ƒ^„Ëüy‹¯Íöɲùyþز’¡²ƒU:½º½,Âõý|ør·KM4&ðʤ-Æ§ŠŒÓt¼öqäI´óµ€]åååÜ;ò̦Áªša¢àBìb{‹'uŒQØú¨RâF–xf5-(·›„íÇ¢©ÃÚC'|Ã|I7­t\¡sUmmnºôªñf“QPPœpSûÕ¯¥IGÒù§¦¦ÈB ±òáDèR¾¡†Ä½½ãeöy¬ñ®zZ LX?Í÷ðdåÀ’@Á€fã½¢£©´‘gO6"ðv½ˆ^ćf…P*i¯ÈÖâeG6Ã…e±²ºÈŠNñhðq>FáááóͨÈfÚ¥s›…w'gyBÇë}>$ãG¡mWÌ_ÓCƒ­I#Yh·p,ƒkYçPµµµõtݹ ?ÀäZ@1ìŲðnôkpz„M3à]¿†bű¡#r`P;¶Ù-ƒ›wQ=ªzXЯ’­¯µZfp³•~t©èÁŸ¤xUÁÀÀ¦qX¯ò®€ZìÁ¬·<³ë·¶½¤Štß«yg9òÈ£¾~dÍ”_ûÔ°¿y8Ò½±½ž…È¿½Óšc·¸¸­]ú{sA!‚€‚§vW¯¿ƒcùÓ¯r^Í?ñƱ`$^]]¡Õïʧ´gmN=ÚFÍQ6¡Àª‘€ §î«ñŸç·óÃfôʤöÏ«CÐø¸†^߯‚ᲆ»Îß>?A&«Ø–nPb}"“ºÄ€?羪 zbÝ<lµ!ù,Ü‚ÿ§H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(SNôDz¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JÚ³Õ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·ïÙ € L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ‘¯¨^ͺµë×°cËžM»¶íÛ¸sëv=¡[7O»ƒ N¼¸ñãÈ[S*I”çQ’€ú¦ Û„䨳kßÎ]woß’´ÿU+­LChÝÓ‡‰OêÝãËŸO?w7ð dñ©E „-@G<} 0Di´ó‰$I(ÐvtD(á„Vhá…f¨á†vèᇠ^Ø1€’Ž$Z$àß,Æc` ¶“F ‘Æzèã(Ä\â@)äDÉár DÑ&çdò‹p A;Á¨¡;.¸ÀŽê¬3Ç ê¡/ï©fä™h¦©æšÞ^:¡¨€J€Pö1D;s¨ÁN:0ñÏŸ€’±„ x‰§:.´ðM9Eváè£F*餔Vj饘fªé¦œjê 1ߘ¸_OB`çëìÙ' €*¢«ÿÿQA¡sÌ¡ |sE9>Ùé¯À+ì°ÄJz‰I¢xN-iKK…Ì€;ônp„ë0<¶ÁŽÁïqˆƒ#Ø µ“©ÁÿpÀ(N1Œaôà…0Œ¡ _hÀÚð†šCà¾ÁÃ( –“(ÿT‡-ô¡'œ¬¬¥´(ðÍoP« î0ر÷I@4Àâ%?/äBÆ0†#HEÔÏJd°B!NÁaxc†p„a œ0Ç:ÒñŽvÌ#÷¨Ç>òñ~ $ )ÈBòIQyjQ LHâ= ÒB<¶0•P›9$p; ^°w¿ãÄip‚Ršò  .a !¸RŒ¹‡È0<üýC``áãÇøò—À ¦0‡IÌbó˜ÈL¦2‰Y°7Å ñ€ìt bhAo,B€–(ñEÐiQ¼?É hP”4°À ÊÀÎv²“'‡F0#ƒB:˜°ÿ„ûU …+lã.yÃeô M¨Bù©P¥cTBsÑ&Š d"[@ÀþI±0m‚âgî¨è1tªsîƒ&Vª‰2ƒh=_é| èç ÿqTà‚Þ*Aå¸Ð¢õ¨ËDV"µ :É ZURƒô0‡vÔÈ@O`ÇŸP[„S¤é£š9­ˆÅRº³ šP)K“‘‚B<'×i=Å8ˆ|¶¢˜*;˜`…/Tn(A‘JØÂµ™‰D˜“œÊ½)=le}b‚…²Z剛Vˆ‚B*Eõý£IÀãtèà ¶²ï%ª 6î÷ÈHN²ƒ—Ìä&;yÁˆ$¯êžô,׭쒘ĖÉ¡N‘-@\öÛë?¢`öyl”¦lçwYºÒ¶þŒÿ<¨ðÏ[4ðÙ89¾'`ß%ÜH̲¸4ˆüŒBúЈ~²¢ÍèW<Š]]ÃðtˆM,“c„8ÐIª  `Âð4?YpÌŠ„8)JËð]Ò&ôQàCŠ¢éÔgEËVo4ð FøÆ7ÐÒê-s1€I0ÀÀ –Íìf/»Ð޶´§Míj[ûÚØÎ¶¶§]@àÍA+Õ©æ*†‚L£ÁáŽF4âv1X†9É~Þ…-`'P¬N5¯y¥âMì9ú ãÖ=v XÞj wã÷–Dzxž€BEÈBŶÁ ’í쎣`Û ¹ÈG.íDXÖ ÿ`V­tk%V+oNì»ÛÝîw»CT³âPuXi HGŠW¼f¶ºu<1~Ò4ï4u|ïÙ²:v}‡;#ŸYÈZဠÿìk:0‰ [ÙhGAÚÑNò¶»½íˆ•²Âœ%Ç" á—¶Ø–9ˆ¾×œæ.1-p°cbbÇð·Ù´&ÕöNõ„rgøOHSZ!Ž`Q0<íuxHpÓ|H ˽~Ql³'{íj½²ßNûÚS Ï3Û½&üÞ$ŸùÚwÿÝÚD¼K¼o³¦ÂsHC0Ö±Ž[] …HöÇ;ëÕÙZ¯[¢ÿìb.âÄ »}¯ùLútÜ£ÐÀŸ€†±OÂg—½þÑŽƒþûÿÿ€8€X€€Ä ’n“g#•§*°ƒyè&A`|Åw|  Ø;TV(5)pR%´%Uá| wE%1¿‡i_°IpÚàw ~z–u­@ºà÷'²0Ðzg÷zJ¸„Ø„Nø„OH *à}RÒrøL4;}ÓxÆ—|8W5Ùµ]'à ­–úb2U_"#A¸‚t¦'æv7è¦1Ðw}çnÉgƒ8èJïµgYp =Ø)7j 1}õ GxIÿ¸„…’8‰“x|0I ã0.˜wƒà…zX|`¨c¸{ ]'¦j®€†­ -@pHt%\ V5` PU7Yˆ7šÇyfŠ{X|hƒýÀ °$ˆp „Èù‹(”B­Àˆ  °qx”˜“h$r>ô%Ð&ð |PD¶R‡Ýd1ß´ À¨‡Çׇ%¦]üVJ«X,ÐjÞU² 0Ú„kd ³¢æR+zàtÜ+ãw¶Àwï†hƒÙ5 ¯[ɨŒö Ì2z°\ús¬7ÕxØhâx’8`’)‰’*Ù’,ù’+“.™’¤ð%r"˜ÿ Z ô Fp_À,B¨ Ù*èÆyëö8ŒbeEétAP®úh mk%„ÏX2ÿ°Ð%UNÇQ[ÅŽ…°I1 ”aXƒóxb4À)y öÐ ÓO@jÿÐhÀˆdgvÖH’J“39˜‚Y˜2‰’F`0ÊM‚‹Ö”Ià$Z ; i À€ðŽxsÃH†%õ”R9TÉb)$@C -Ò¦?²°d@c £tÿ2Q6’΢š€¢4ž¨ JIƒLiƒ6È›œð”SYt¦¥)"MÛ3q–—ßðmK€#ˆB- © ˜‰–¨–e8x¥d .e G—×Àé€ Òw?ŒCk öÆöÎùœÒ™¢*º¢,Ú¢.Ú¢%ðE´ 4”§ë2Uåu·ˆDv– y¸ ¸Ù æG†¦¸H𤀠ûf«è]'eGwW¨b¹# hz .@-p4 ¤ð¨›Ë…ä©xR«È¬f špÊö' ðG4}REUˆ Ÿ —Çv¢€ù¢‚:¨.Š?i"(’rVhaÒÿBIYTdÅó'- •˜Šº)‘{PRœÀ À°A{°Hzf¤TW‰tq&nÒtŠÇ*Xú ¯È¡Ò5@*¦ÂXƒ6Ø©½ù”A°ŠS9šnz…ð²°€5Ê"׆RE[`òVrh &Š€º„„š­‚š˜ß p} iרÌ%.v?Ü´_Ðw™š«1`¦{€¦(–NªDÐA¥ Z` ¨3a ˜\©‚k ) ßðF÷@ Á ˜º®9&¥N¿º¦¢ù]·$M²:s“'WâPZ‚2Op—. ­`¢×ª„Úº²Òi€_°{¬š\aù{™ÿÇaÿ jÐ…—` îV|° –zl)±APi@ :ªÙ%ùC€‰ß~/×IpÄð“’€p ž©Æ²0+‹óOŠAÒq€ º¼µ, ¶vZc‹ß»øú«¹›VùbŠUpL·‰çuhõ°‹ º V j÷SjÂ{‹²€Œ‚<È„\ÈX02úf*ÿ·sh4ç¦yå•p©1œ™ß Lú|ý´8K ?¶`Ÿì›»l½Q¢è ¤ ¦H¿゜y9€€Å\ËF`¸l ð ²ÓS ´K µfÌÖ Ä²gÇ5ntÈ¿vÈžò4t<Í‹Põ  -ÀOãûO RМ€È&€ã\ÎäLίp¨‘ÇŸ†‹aÃ+Å´“œ—JÉë:ÆØ€Eä [ˆg%:€®Œ` ¡ü¾à)cCœQ€ {`¦ªÌéVkÐsˆ’B>iËr0À¹ŒË30Is#y¦}7ÆM:•.¦Ÿ¾»rÐra|7²ólp qÿzíEÍt\b 8¥R…Bª7 ÔøÇá|Îæ<ίp‹¹‚¬ÓÒVÛ* y¾PÏ÷\É%=»·¡¶ ë }Ô§°QÉ`t§E£6ê€ÛtKêæÐ¦H´4ð|'“*|•V|ËÝÑ3€¯`Q qYE„{ b¬ P°õ•…:SªÂV†w¦Û‰q\uéWuÓ€Ó:-<PÓ‡B}…„ጲXà¦}Ú¯p:qžu2%Mç±/¨w1ˆö<Éø,Ãb|Éoíëh ²C'´…œù -€r×Ërxzo)ÄPЮ§Ø„°ÕÀà·\Q@°yý {ÿý &ÞæÐs€Ž °ÞЮ؀éTZ ‡½W³P·4åýð 9HuUwŽ0ÍÖ¼Ó<°Ù- Ç Ú_0"IÔ¤}Ô€ ˜€Qýª\¤yM#ɶmÏVÞ”û®=l¹ÅÌ) B‚‘*#ÌÔuge°× ]{ÅUÐm~ªÌ¤(¶OøK¾-px=¯À×áäX`-  2SéÍá´[ݲ}Ðby»8êv©° èWÙU'Óà®ÙN<ÀuOpäa—GøÍ n¢§íX ép äÔ¸¦½MÄyôlÛ|ùݮKJ´üæÀAgœ QÿÐP}`?Ápæ¶8žÞSº€¢ì€FúÓÐÑp p<çs: ý à}΂ çD¾TÚ…KÞ®žÞ¶Ð[Ö.ÕZÆ7·á@ØZnÓí%¥PS@ àÎ<æƒ|0Qk­^hvmçp.çÚƒHÄ‘íD¶p|þí~´9pØØ@Ý ~´‰`臞*@ Yµ:0Y„BÁxˆ›yVÐOŒ“—°éã>Ý„Àà•Õ—FIpæ`ê„Lí¦}þµ|…ݺJî<á²í´ÃßNÉî®4 ¥P 6Yì{¶ì$Ðïêð˫חÌÿ Ȧ~M*pBU>>å _Ï•Ìᜎ pM迚îgÌâÕÖ{޵šñ’ïd€çÛ  p8¼S 9€^î©× ~Ü$ oàãã\Új_ó3  ÁP_ú³]ãnŠ£ÊÄ\|‘üó”,Æò ÊÜ@òu•ò<¨ì*Ïcö€ ñíðŒp !9Ô/°·'{Ú ßš¶$NPà÷@Ÿ©±þïûœNè®î¹kÐL2g9Ï¿ÚòeãŠiY«|€Ãt-ãþèX”¼P°ìð¯êonÚ& öoO”·DÐ=îÐýÜ\O…0>ú~ÃßÿËéýг‚˜0ˆ„˜øY€Í˜àˆøº¥ÀˆBý§–ÿ¦Mä^;¿³c½•˜¡R„°Â:#F(Pö`ÃGÃBD‰Xl´–¢P’¡j¡‚aË–>iÔéø÷ï¨Id9¸°Àæ…Q’|;`ÄçÏ7²*°Ó£elPr,•x¡#*¨QÃŽÉKs3^añÓÕ«WP¼\èQãâŸF{"B\›Ca ¾Î5ˆ0¬P6ÜjSÑ›,Y ¾VøZ+YtÙKòœIs*´tNȯB0ðð¢³ç]hAÐG2å#„æÒM¨iDذ'¶±˜qcÿ²²øÔJÏäñ†´Óã‚IËIùtT’$ `¾ùùóÆ s7’«nr JsäÝ€­ !r-*hX§Œ¢(Y·rýêUT5íÉ,(tëÖž `së„V+¨5X ºÅ< ,:Á[RÀ0ÃZÇžÒ‰8~b³þ±"Š\„è`€I6ëì³ÎüÀ"Šbúˆ@ƒ–.HåBè%š ÿ P6§.J&…$¢D‹s:µGÉPT@¥T®mgmk©pJ¹ìD)Tôàfœýxã‚v†Ðc²ލKGX~eÖ†HcŽª*`É[/ˆâêŒHw]´×%íW´z­fˆb(=V³¥˜šè©¨¦Z‡ý’0`O‚ /Ø.ÐÁª\С…Ô$8beׂm/óüºˆc4â·(Bª…Ãß°Öšk ¼öÖŠØ(eQ”BVœq† žHãç³a”Ç_'­È¢Í3ÊS¦ñÁF­ˆöˆÓ‚xBÊ•µ]Âe,YÀYvZÎìqÝn·]ñÛ ‹ó» «»É 'ïË;Ï¡4(ê¨fà“`Hú÷¹‘A Š×¢ 4­X;C…õ”JmÌx» ’D•€RAIJTÒ€ ®ÿ6+8 h˜ì^5€šÑ®v¸ÝÔ@³Ø("ÂØƒ/žB<ÎM‰°Æ’ð œyMÁ‡Ñ¬# SUK´wYD&ËÓun0¸v¡Oã"¸ˆ…‚ù/qS©ÊUØ41Q* ‹«Ûwô´þý¯XHâE(&Dá–²”E˜@>æ°c³ ´Îч’œÄZhG¶<Ø-o-'¬ŠÃëL+›­ðfxƒ4 =Ž?·ðÅy,‚)Œo#„üHHô´§)  ˆEÖØY':ù ÊVE1©ëm`4ŸG9A=òr|”"IQê gJS ¿0dÿÊÑQP\ ²XIGÂæ6‡Ê v̸IÉP᛫eme]ûÚê.À½/€ã¹x«N8‰jÒv… ìçC1Bc9Üám>¢¡ÑÁ¡í C|!1Çúâ—Y°“¼¡ŠàÓàØ…¾lB‚¬ðK]ªR–BbncÑÀdAˆ‰ÉãM¥$#à%/Q&a]xàßKcЏüÛjå¶Pk¤2dÁ‘d² –N8ixB{¼†½–Xa{²øZ‡–P3;Š6£Â®t;K Š:–`…B¤â":´ª,–Ô›ßl4º©0r Ö°"©¸]ÿö€âÿKà3@eM:ƒ¼-`-]ig=ûYÏB",íby”aàËB!ŠQþ#d–³Ÿ…à¥2.,S/Z„#XC‡„LÒ’š”H N©Jô–ö“/ Óè'ì.óª¶46`\kÇŠ$Ž;ùéàôø±ŽçÈD`¹5’C<:…Oé·ýÀ‡ ”-ÛÌ·ÙþVÀn¡ß¬²€/6‡8Æ*’o¶ñ,ÿzLA;0¤à¹UG0ž0=Ìá|H‡N “¤D«½¿±¶´Å-°Av’e:.‘V!ø»m•Ýv9ã]œ­4Q ÃxõÐ䣲ÿ‰Éà œ¬m ”i²ÊŽ`Xà9˜·”p pE“fÖ‹^üß*,<`4wÖõ»|„!/¥†ç™æªy•ot¢Âh±áàwí t"p}èãç8Yé¢Ì5v¨„÷$k*FqŒ]dÚÆ¿¸n<™ÌLB»Üí®@¿ËÒÛþƒ ìPÃ>ÜŽJ«Z{BU¶563 P€sœçLˆi’öß0@'0;f<”9ÍËpØh×´€¦=jK‰#ÞÑ=#:ö™=[HÈoøsK¸ÃÝE`¥‰‡oJ"å²Ãq`ÑX£ŠKdZß™:<ýiP‹Z 5#õÿMä•â à°‡Õ݈A¹d®¹¿ í›Rµ|ÁG*~ú72XApÇc€™}rc_ÕtI*xÍ`y¤V£sk­Mß0ƒdˀϵ½Á7Z ‹³ÚÃí0tI%ëAKÛË (zù†7@ß`4¬ntE­™»ûu\ìa¯A X± #,¼%‹#ànAœô‡p:P‡¶JËàCüJµ¬­ÛQŒ€s<è¼à-{á xÄ'¾ð«èäEYjÇü7L/* a^¥Šg… j€DÐk¯€ ØÁ œþ‘qߥ÷ö{ƒýráU‡†ì ÜW¡ [x|ÿ_ð¯]ød/{çߊÑ3aKÐÒÃ:É8€ ì9p‚{Ý`aØI æ/^ñã'âÀw×Z±ˆÍ¾_¢â‚%Æ¿øöÏsᲸÐcü]ââ+²"³áÀ=%ÀlÀ*Ð®ß > œ@ ì®Åƒ„è9Y`¸ÿ«7Lº ÐÖÒ7»>k;# ¦²À³N€p+?œÁØö9‹†²¡ kh è*³ˆ¬ <ûC<3·Wèr °+) Á¼¸"+„¤.¤€S8…lðº Ã14¼U`/P˜ ›°ÿ±z®)„*Ô;‘¶ëÓ;§È6fz(86 AAT¼X€%'3òRò ŒøÁ9Ø I=3Â&(?3ó¢è„PÃ$a²øÄ(r:9¬BË*6cëT4@àÂhÅVüÂX>2œÅà;¼ÎÃLŒºç€Q$)+²,•¶T¸¾[ÄQ˜©¢°9ð“UDg,<.ø¸mK_ ”ÚȈdpuÓƒ;‰¬b ¼f´Ä[ÄÅè„Êâ@HÇð%$ÅÊ:EÌz…˜Çr|ƒøƒ?|Aø€X E€”À&ȬU7\4Ç+œC03GT €wq¼ý€<̾ó(ÿË#” [Æf$HüH I‘H<@F„’rX¨ JÒ5¸’—06p¬‘$Hƒ†;y-.@L· N4ÈËD¶Õ¬Ì1״ʲ³Jœ4Ê^(€øL~ôÇÑ È¹¬J×JLìÎï´Ê&(ÄŽ2#bŒ9í£;Á“7ïTÌàÐÅl‚ 2Tƒ¢`‡5èHI €ƒv(L—…ÊâH%PÓ¼Lï¡ QïdFñôHªl‚ƒ£<ÏÏÍSÍõ$ÃH«tM%QšôH.X¦yI‡²4ËjÄŽb¹a[Fš$P$•ËúܰZ‡9†ux}ÐÞ¸š4З‰9,Â@ÜP$õÈfO1 S-Í%ÏÝG´ÿ6mS7}S8S6µÎŒ„&ˆ;µÓ·ŒK ¹dÄ“3øQ™ë8xQK& ÂÄLRE•Ê&Àƒ$€BtRXD¨Ðnq€¸¢ ÐEUR‘´Î3}ƒódQ¦lÅX”SU]Õ9Ð,ÐÑÂîc>.€?@K`†} eí„N]jRîçžé ”†xꃎê?HºÁ8„A‚‰žY(†Ñ•(°\ø‡i´i“žækJxë·¶„m†äÔ h»6»6…<`Ÿîk¿ngøg¬ígèd£Fê}Vg×Öí„}xj¨ŽêXîâ/ ƒû¬ ­Þj`I@€N)„ü€0 ‚³Fkf†æµŽæ¶†k¸fPÖq®kpýg½ÎiøkÝÞíS^lÿ¦æz`Ê"þdÄ>ê~öíÖåe€ìW–lXÞ†Y0D²+EHÄŒÁ¸„V(„{u€I{í²>mÔVëÕ>ikví×þ—FaÚ¾mÜÎmÞžoŸ^ì€Â.êÃ.nQVjSðfÇfîævn-Þ%h £šZI@ì¾4°-ˆ …<…ñFmiÕ–æ¶nmx‡•–Ù†éH0ç<ÀmúnñžÎi¼nÝx„áþ eþîoSìÿ¾[dp ‡ìƒnø^X5pÒß*+{ø‚t¨“ˆ€—üø€ñeæðöðf.é¿fõ¦„^p†\…ér®mÿùvq5ì¥NîG¸ÇýÎñ%&:?å<0oæ‚ò ?h/ö‚`‚Ucª%1LР–-ð™ètŸÛÃÒ¦‚,çp.ïòónm×ViJj0€qNñ)5®ïz¯ÿz°µyÇz.€ù˜ö‡cˆ °¡·,™…Ú[À˜ô…Oíjgë¤ó¥_z0qD~ú¨Ïxª/üs·z¼FÞN8þeÕ±ßõ²7ûÈöóm€qÀrà¿~m.(bƒcˆ{Œô³þâ/.úJø/Wï¾ïû¦ïr¾øœöx©7|ÚGuÇúL<Ï88ÿÞ?¸ÇyÉ—l7 rJ‡rX~8L…K¸:Ü“ã„iÒ¿û†GýWýÕï{K †˜m¼†úp}Ù/ó?ôOõ?ÿœÆ}Л•ÝÿÏxú¯û¿ÿøýy–üÉpãfÛ q >PÀuiÔ¬ˆ^ÀØ©¨D . z‰£´B„ˆm!A’, rÊ”*á±d à%L˜”fΤbóæMû¨uñàçCB å)jô(Ò¤J—2]*ôÁˆ¬yxQÕÃÕ«/¶nÅàõ+X°DÆ©–ÇT.?Ö²më– \nš!Tø§!®‹zõâÊø„8GŠi²¤ÊÄ+ZÿºŒ“&dš8m"Ås„O C7sîìù3èÐCFít+êÔ¨¹‚Eáú5ldÇžMëö6î·çnƒG%̆}‡×ø°Çn6©x%cÇ#Cž|Ó’åN0Cêý;øðâÇ“ZzjêׯgÀ`õ‹¯±cÏ&R{„ÚÜúu僚€8a,ÄF|ðÁqaPI6Rs'=‡cðH'u’YGÅ;H ó57ð¤f%šX"T>q·â‰-ºøâ‰HEÍ“Øx£Rè(EzïU%ß|®ÕW ZøíwäZq$<”½ôeâ,HÒ6-÷ —ÎM¨Ø…F¶ÿ¡MH˜‰=Ò<âÌ8ÔPÜqÊ9'uÚy§€pH qøù' q”"ÄRØð^W)YÕiˆ‘HAt‰ðŸ•âdJ <¦å–Ì=ˆØ—‰…)ݘdžIÅ™­"Á*È:+­µÚ*k¹ ¸+”½úú+{àÙ„p,²É†0ÀBÄÑAî%äEæ'inJÊU©„(a *¨]ŽJj©)êXªºº.»fêúî» ìZ€¼ÀöJ¯¯·Ê*lpÅ*û/²”ò‹¡Uŧ(}ùÓµØÞ¦-AàJ´áÇ·š¼òËCéú°C‚“äB9õ¯Õ¬ûæ½s®÷‡=~MNg>¡O}&»•óÚ÷>eIar1³œk;TT_v224_html_docs/images/glass/orange/logo_grey.gif000700 000765 000765 00000031575 11222361074 022124 0ustar00abwabw000000 000000 GIF89aÜ‚÷–1ýÖ±YXXêÃÇX·i5íííÞ>êr¬««¦X%¼¼¼ÑÑÑÕ‰`ÚYß@Ú·™ÕŠ\´´³…S2úúúº¤•O' Ô‰SñññƃWß½ëÅ èèè+ øÒ­ämP4#åMìZþþþ•••÷ЫöööÍÍÍúuëm¬{ÔYÈÈÈÍ‚IÒ„^Ò†NÒ„Tœ†vÙõJFD}||sssönsJ0Ѻ«šIšššëëë½UêU¿©›üyöɲùyþزlkký|Ç{Uør·KðʤÛÛÛÆ§ŠÅÅÅ<85Ë´¦öqôΨäI¥¥¥žžž›eFË|K‘‘‘åååÜ;òّ̦_àBìbedc©SâFíÇ¢Œzj¡UÀv;¼p9) €€€ûÕ¯¨HÈBÁÁÁ©”…   ŠŠŠ………ÛcáDèRcYQãeÂtBöy*%"µ˜€zgYðdåÀ²e.×^¶vSợÉ}EÅyBðvÕ¾±Ó`ÞiD@=¥lGºxJñhðqâââǫ̀DÚ¥s­`*e)4+&׎SOLI‰EãGÉ_ÓCçPõtªzUz6»k>k6œC«\/õΪìŲ61.§ž˜y;õÏ©ðnšŠ€ôkPà]ÄtH\>«h5TQP¹®§|+Я’óͨƻ´èÁŸÁ~O²qpol/¬sN̈]ìÁ¬Æ®¡gffpml¸<™c¾ †ÈxM¡P%‹‹‹ihha?*²a4ú{ˆ‡‡£¢¢yxx®}_™–•ƒ‚‚“’’ïžùÓ¯]0Í?Ï€XñƱ] œœ›‹ˆ‡ïʧ¿oC¯`¥£¢ÚFÍPš˜———·n&öÏ«ôʤ···©¨¨‹‚}Ï€O§§§Å~?°o7£NŸO羪™”’ùШ쿕¦qS¯¯¯à°„Ý<aaa!ù,Ü‚ÿ¯H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(SNôDz¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JÚó€Õ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·ïÙ€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ‘µ¨^ͺµë×°cËžM»¶íÛ¸sëvý [·K»ƒ N¼¸ñãÈ[ƒ®ƒ3Î;4 ÛƒäسkßÎ=w-À4ÿ4Þ(~îÜñK'.!3Ի˟O¿~în 5*3‰?'x K¬±€zü¼3 pvqD(á„Vhá…f¨á†vèᇠ^xÀrt0ƒ/mx',±€ ¼#ã;üH£9RÐ J|!öèã@)ä.Ž¢pÏ,0à$ /Ê# Uˆá†büB‚RD‘€<á¨óL°AKYFƒ‡PÁÕÈÆ&äA·˜†:²‘É2àa†zäãCÀÌf:ó™ÐŒ¦4§IÍjZóšØ”& ÑòÄ)v:?Ìq Ÿh:8ƒŸ\Á4öi•¬ñ^FYÒ²øÄ'-?1ÿà`—kÄAxQ†!œAØø‡(òpÇ<*s™ÙŒ¨D'JÑŠ6óm¡â Þñ,'µè@é?°,@ ý‡+º…A ºž¿ë`ÃKZ* Ÿ9È©N›ÁŠ}4ៃP#êƒ9ôGPüÇ f dÖð¡8´¨T§JÕˆ’hY¾Bì†&-CéOèŠz^D 1ôie˜@ÖúÒ¶Æópˆã"3ÀËYÞŸ:Õ))¸ÑˆçD"? ªPÊ 0ˆêи°ÒX4ô©PBU'KYª"ìHIʆÃÈ¥)Q¬CB u.)´aJ4øÿ¦O˜Rmž3­ë=ñš×ÿP¢è€Fqô3œ"¨À(/|À33¿˜¢*ÐÔ{„¢†Ð®t+KÝêVóSúùÙ„æÑ:½#‚ØHš¬úD10O޾Pè ¤öV©ÁÀñà", 0ËOܵ¶9%Es²öŒt0©E pƒ+&!ØÁú n¨²Š`6Üá ïˆÂ/^UTÀ(êWÍê5²ùÕ°Žu‡åpÙˆb¿Ø,ÌGg /VkZ$npˆ ¼Õ¬ˆÄ$za®l £·+‚ÉA_›Ò¶¶¸uŽ!†Ag5°«1ž±) ¡éMc™ ø¸ƒ$PÖ>•! XÄL@ ŒàÞøÎ÷½åÀï~ûû߸ÀNð‚üßçð„~4O:‚_Sš!Dá4¨­õâU+ÂÌ`Pý½áw˜]e©€Dãw¯ÎÿaB/ð!g@‰`ÊF- «˜AåÆ/*0 Óš! î †úd†’Ê›ÞöÖ·ÒÎô¦;ýéþÆÄUgÀmº¹ÆÖªÆcUE3ÎûÅßëAr€ÀgÐÁ0«áŠ2ÔôÈͨ-%øª089yhäµÎ ^X±³i“`C¹Ñ,§ãë©ÔYGP&¨÷ìMùÉ[žPϼæ3Ù¬õâÿ}Òìb>ó;£²wb{Üë *¬"–Â`‚Ú v1Tƒ @²m³­QR5‰EK@•ªòFÁW± ÜG¹[|˜C%K:ž½TÇï ò’¯¼öG°ùî{à=èdÿ7 Ž»wWï|OŸ°7fìÔG «_= ÞëzrØU¢hC„·7Ì Ð Ùf†U-GgÖ‚-Úò7^7X¤ ` ƒGxv Qw KÀUÐ'¢PÖ‡}—7‚”×&x‚(˜‚*¸‚,Ø‚.ø‚)>LP ¯°|·*­R|}bcÄ µzñ7CÆ uPS‰Æ “ ü ‰…$0 KcJ¢k.· âY¿æwxÖ;ºpqº0†he„wnð½À °Ôðq— ´Wovx‡xƒz¸‡|؇ n7-³C-¶S ¥dJL°;ØBø~ñÿçFhh²uS:ÕÓ …a’X…"#eƒ’f'm@H#q‘ÐMOÓ~a§ .š`eDe l ð ‘Á§ã ¢À$ñv}xø‹v؇Â8ŒÃ “0', C1l_è;}ÀˆkňŽH„ø^ñµ u@mödr:e»ÈQ@%¿h]2V’„8 z+>ˆ|ƒÒbèûÐK;‹§ðàgL"C§PÃÀ$I°€tÀ˜‡ÄØ}(  ¸ °!p‚°à *ò„2Öw5Æ4¦8¨ØŒHÕ(ñ±ed‰¦hyeeàd n0 ¾PØÿ? vZá Š4ÀƒÿpJ ˜ ÓH’FI„ðG„ÞŠ3œ‹É 1gƒî ™Ä? °'V ù‹= &H–cY–hy–ji–l™–m¹–nY–˜5\à C Bf G ¢`ƒKUZ|s|äÑH’‰Ù'I„óñ…„œPm%× Šæ’¶Ew“À•n8%ó\ƒTúó ê´N3l‡†%Y’Ii€Ì€äp¬€`x‹R3p\¹Ôàlÿ ϰŽy –õ—Êù–Ì—Ëéœ" ›p$L`€±ã"êA ¾P°-B ÎP|Bÿ™g¹°š‰I’D˜žë9)IÛHr `˜¹{†vã-Q`Vª.3p çÕkͨIe §Èš‰©žÖèž\´Jx¸)•ɆÀ†òÕò @M"opœÈI–"@¢&:–'Z¢(º¢*Ú¢)ú¢èÝô¹ö0’¨’ @ Ñ"üùL 1©iž¬© 0p×ø˜ï¹ d 0ŸyE ¹e"Õ`žÈ"îЋånEÔ4`=é{3È·òx¦è©žî™IH_w9 Q9•10eð Âû§?$P1:á€& ¢aY¢†z¨ˆš¨Šº¨Šÿž€ ð3gÀ]¦"|á :Vèa ï@͈|p¦hj¤Jš’¦ ™ñÔö–™JÆ_êÐr/G }ê'‘`ÀÐÿ0;:à {# 0¢Ê˜ Úž‘é |`W7• ¶u[1y@¦“ð+âD™¨‰R°`ÃpC`!ŠœwȨâ:®‹Ú}Y"TG WZ7ü@ áF5p Ãp‚Â%\¦ÓÐ'w Y0¬iÚžÉEÀ KT`ªKKöÐ K6n`~Ds'>Y|;¢p‘à0 –f Æ&ÿúš‹„aä¦%7ŸŠÆ¬” û7T— äÔ§ÌÓ%ê(G†ÿp V0¨@¨xH®>+®j  ÔÙ :z.7ˆµSzãU =6L©5 ‘0¬j²:™œÀ u° ‹°ðY `@ó¿÷bFC|°‚VàÀÐr¸9âÐ ªé ²*mê¤ö¥a@Ÿ9À¬®Ê ΑY¡w P˜ VòØ0 æÔð›Óp³!ª³#ú³–+è pÝä°›w»wÙ'ì$ ¢ cÿ0æ2LI ¬ð~Äj¬[wûoJ»|Pukª]ûµJ‚H;Y·u5wd¢¶°`Nöü9  ˜Ñè˜I°Ô–¬Oª·|Û·öé3pò»xW'„ÿøY²2 ˳`+L“»³…z¹â:—5*…ƒ©¢ƒÃ”ï  2ˆ?$œw0ºÀžîI°³›·{Í  ¸»»[ôÕ¾@ ÂnjšÞÒ Gp ‚•ýyòH„¯IªÊ |ð¦•IŸö€²Rª[“P 5¶ÁcyCc=è ®à'g`+:€ ÏPkà­ƒª³ô–ÄÀ¾ŠzÓI€·"¿'ˆêX-×B¼~2‰èuƒÓ¯Œ¨ ‡:9Ù NwÀ ¨J½`½öµ·.Ü··eÏA’/ª*Ü †ð—*ŠÏö‘ëÓà° j›|iPüÿ°Ìë7p¦íÙµ|ÐÆ/̬̊rØ,ˆ´¶£€¹Ã-eP¡e 5 ¹%bp †Ð `ÄJÜÊL\¢™K\ \ÉYÊ8%+Cs¦yzûÐ^\Âówe Ã@½ö L ±Ù¦´[ra ôé·1\3PÙÀ7PÇñw¬ª0e€ ¶BgcСÁžÐÁ|ÈG€)'Åxf  %|ñÁOêÆ(Kw¢ðše£¼æk,ºí4Õ ]™kÐ ÃÌΠ?™d °Ê“{ĽѽÑ[°ÚM®0 Þ{~ß%ŠáEŠì£ Y°Ò}ðËŒyÂpL@‰ÿ• ©eÁPp½/üÂ}‹Éè,C“uüî u@|`Õ0 :@ U€ ÊÀÎì¬è°ÕèÐÕà€‹š·òxÂø<Ÿ©Ǻ4 `ƒÝ…*àõÇ…ù7ý| üx×Nò<\@ÆœP¢ jÑ„½"`؈}ØŠ­ çªQ5ìQ7ì®9쎆 „,ݯ.½fMÍPέrD“À `_•œ™}ukU€…Ɉ üs°ÜÌÍ®Gœ`vä ¤àpë|jÐÁ\½Õ+  îðrªÙñÅÔó ¸ÔÌbëzu’ÍŽX¬ZZ|? F2ÿ0 y­×.ÇÃÕ€Tùjà•¬LØ&Øî­ B›5¾`‹²C;|ˆg…g  +Ýß-Ù%¯ ÂÑf†›X2æ fÀ ¤@ Ù¦]”ê@vêT­0¯yÇJM±9GÓ ®Ð† Ü\½è°+Ъ€f`î`üiÑ8àÀÔ9`ÛþUߤGºœßëL¶°|jÞáM'ÎpX—:tºoÆÉÞí­Vnå[  ›`¸ÆÚ/"±>§w¾Üßf.`ÂöÜ(¬ÂùL w…™*GTÈ‘PÍÝvƒ¥ŽR v§^Ü|pÇ(\­ÿ`Ø :@L½•Î)Îâª0é"0éèpmÀm0tPDH¬0ÐK]à cë]çº*ÕNÃ&’e8xI¾ä%$p$@-œ~]ù•}ÑŠm؞н0 |þpG£'¤xA"iæîÅðÒvKkü¤=Í ®p P…˜î`´/¾gpo Ù ŠÏà¼ÛLèk>íPoÕ u›âªàâ%ª Š}µh¸ùºR€ã„ÞÍdð ï¶8|;HÙ‘ ìЯdˆä«6 N|/Â à ‘À‰áPκ~×GåWnå›Pm04ƒnZGE ˆAµÀìÌÞÏÿ. êñðᓹÂΜ 0 ÿ%\–­‘ ü@ée®Pœë}ÄWÎ? ü o€ßìd¼¨©ÒØY:èCPÒ… /âªC¦ŸG „ “Ê¢ERÜ:Dºvâ¿*¾þÙ«Fµj5z‘$9CT3ªABÝ´LnÀ@˜ð•@c ˜Á&F‰jÿ̤Y¡JÕ–-zôD•ºeE™_RÂU¢4COŸ [Ü(ãj¤C‘ÌDº1E—@¸q³ô‰ IW†\8p4á壂-[lN%x…Z›6R¤Ìø·„E7##Ys"‰LhÞlBªHÃ*' 1Œ¤—eÊ@›’AîkY:áÿ‹Ÿ>ŠHñb*Jܙť#ƒêjŒ„9‰åsWL`6‚¤ìÈX¢ª‘Ð!fˆ«2/À¾hÁL™^o޾ù' :§T?aæM•pÙhü+sH|OÜþ›@5Õ aŵ×àŠ® C´©à¯ÀØHæxKL 7zåN@¹‘Ìpg .ˬ³Î¤BçŽX€„åþ™á3@`ÅåràǸ 6_0¢‰.¢¤“F:¸C€i$‘Öx§´‘ id“áD1d’If0Ç Ù$ëÒLÃŒ3~Ñ!Ǫ́¬ Ê ª“ÎPG1z™¡‘š’o>©yF=pÿe'ÜnëI’A¤G º­¼†Z™À<ذ0™B…GŠ*n™äŽ'¥8¤`/'X"EVäL3© ©a5¤8c$&@8„Ò ²í¶ÿ’%O7>’L… :(cÞ qÕ–pçpœéêŸI:ðäˆ4<ÁE¦±`“qÓ¼ŽÐᡃ¦9ê×HX¡ÓÈ &˜,ªXÎ t¾Mò´IàI"i!žÒcKðÇ>ˆ+† hånP!PCŒ< åŽIª‘gÊÜ‘§0#iµÕ„·0Ü5øÉ&KhÞê±bÛpkai@–0,@„z$¸Ì0ÿÄ—pX€™…ø‰"¿7j´ÑŒMÜåሳÝEíxÑ! qå Ô‰Ìhö-o 2Ì Á£ö+à ýŒ‡2Î0Š„7¸è€*œþoÈŠc³\¶Œ‚˜!¡ê-•„19†<\Åê!tXcJXpGu°! ½Y``‘Z1ÐL÷Íá!’w †f3ríǃ²³¾É#¦#¼¨ù褸lb\µõ$G œ9ã–çDÙòÝxß~;^öÑq;Ð@òD”3¸ûÅ:xTy@t³àº%ª=¸h ¢’= Pz0Ã0h`“lT£a€^ÓE±Ê9àXÔ ŠCøÿ‘GP¤"Àæ 9ìcÁ¼¾i|ëO’¯,ƒ»ÌèN‡Ѓ'f „ãW3„ä“þñí!ü`œgÁéí¸гw$  |†iž#&˜hºÎûà(¬ ðsŠ*èð”Å(T "…›$ ÃõãÓ&ш4>%ƒLõ‹ÔÀ {rC î1Ô‚ÑkT‘ì¤Äòf"¾±È’,`†;¸ü`]¶²¸Å_¼Á‹#Ü᎜©h‡;L„2&!…èàW:éCÆ2†Ç¨‘Áƒš”ˆxÃ2@Ob{+7\цîE|n Á3¾˜3ÿ@¢]ðZc½ùÍ7B*SiÄÅQL!É£Þ‚‘¸*¼)NGXÁ8 yÏ{ÆñÃÈÆžÞp 3C˜Î{ jP 6ÏsÙdE*’‘ªâmX‚G³„$àkU˜F5¬É0šá€eE“€ÃYê°–3 At€èBy-èàB%"B.© Üh *i¤1¬cw˜†:¤ Ž*üŠ%“NLp1®³Á‹i$ÄS ¸ÒA«Z§ï™0=ñ‰ D\§$$ÑN2t`ö"Á¯î ŒÀá€ø¼§paˆ!ð‘ØB@ ðW':Ñ!Y"CqÚIᘠ\ Ae¶Ç5~|/ÿ|4 tÆd†¼ã•²ZJSª»D¤ bÐÊ/Lå0@Ô“ mh'™´ˆÃИÇOiJ>˜¡€ þáŠË–Iiˆ*ÛÚÖ”§la‰§rH×Bá_»…Í&–¼¥¢¬›¸ÀHð¹ÐM0Û‹ip'QD˜Bb6 žt’Ü ¥íÀ…ïh Ä€ ±&-e…ÞÀW–tU—ÉÝg1€ ”á>ëy†&0z@“‡Í´¤5·´PÏè€O×¹,¡X@Ø8Jd˜ÐpœimQ…—«ªUòÒ‰Øqyì³3ðVp‡(«ò‚B &ÔO÷ÿsEàÆçúxÇÜDþñ 7 Ýyƒ(,@‰b§#ôð´ªa-‹š2ÔXòªá[ºU® A K^U4E8ÌágQ z=PúáÏ "BŒh¤¥Æµ®X¥äbb·éôÈG1ب3–*<(BÜX¹÷üs©M}êS'â,f\{n`V³òo ­°Ï“b†#€L8¤ Á2t ]2_Ë?~¡=*qMïŸøÈgYEby¸Ðg­QiÏVàº1 îYþ™f‚/œ¡e¤ºA‘ plñK%ýî¼ [V‡ý‚Àú¬ü½ØêÖML•ªp€Wé ãˆçÝÔ&ø›–vX'çÆ$°±'gpÁˆ«r#^È4X åŒgä!(¼ƒRø…~Žæ×…Zäâ*|‡2ÜaDǃ T€‡SÜŽÙ^l¿¦£;ÝÖa©qÿñ!_ˆÁ¨æ°| +Š-m­yÉÓÀÆÄ ̺j|À·K7»}#DÝ~OSè]ü¦NDªñöCígmAÀý… €™Öfq½{ÞS°….€#Øÿ¸Å4F@0¤óýÊ(6«7[‰8;ti„ÀŒÀNaÚS:Û;)ÜkºtË ¨[·?£ `ŒgH¯pˆ7,²¶lÀ6m»…,#![?òp?ú±_h²4ò¾‡?45H샩È8³šA¡`[û‡H]K„x¼D €„; ‰xƒ_`9y@~à‡w †ü &m ¦š\®4Ø ăehÃÿe°…»½EÈ@ ÜÀÝãÀ§ËC´ø³4hçø‡Ýê'Å‚7qƒñyŽßb‚I¨‰VÓ *Z+Š7¹µ\ñ?ëC>ÜDNìDOüDNDOH2ûùŽ2 Bö 8zh„ô8 Ù‘ÃDPDSˆB8À«! .†3˜1ƒ_ø1˜†D„& “ê ®#èrQC6T‚ePiT‚ C¦ã€:´C<ÜF=|ºMD…øÃý6¢jø9J 3(“Hð…*à“‹‹X£ €k»[ø¸9]KDEüG$„ÀÂJTŠ9Ѹà›u€†xƒpPöX¼¸âGTðGZ´Åÿ.€«EìÈšQGS†z*’\Fe˜ÆXHÉ”l°‚kÌFmŒI™ÜÀoL˜ÂiñÈšq‰u\—‘ô„2†9˜Áöh˜„°J¼ÅÓ5:H€ŒJ©´¸GWÌGV˜že!ƒuàJˆ„*`3öø#K¨»'üÇZL:€B¨‡OºC0 ED—ˆ v!ÉN#€©‚ePIøKÀÔ˜œI”IN4S ƒBð„F °pp…hªFx*¼ä3¨—{I?£œ‡@x?€)•ù«;S˜JÓÅM0º£;çô Ø]QêÌÎí|Q;t•Q0 uNOCN½TÎ 5e Å%3Åy,£\µõhXLÒœQ&mR'}R(•Q: Þjœ2¸02Pа_p! ŸÅ{Ч\Ò(¥QĤP¶|ÎÝËÿõ4è 5ݪØ*ºóZ¸S<½ ø…Q5@5‚µÑ9eKBàÑ}N8¥;­²„À7©‚[«…ÎDÊ<©¸gø“îSR TOýTP UQ•QV4Iu h !Šè3ˆ‘È´|Ü1åTQ ÔíC›,TC}N_UÔP+Q:˜S›¬EUL8¨<]Öëä?õÓOÔc]KC…S­;bµÉªÄÇ|iO÷\šyP€;8ƒ‚€ƒXÒ[]WvÅU'˜¸aÈ2uø0 V nøý ‡ýPŠ.¨USp‚veÒµÉa¥Ö]ØBЪ°É'ŒÐ3]Ke€ÿÀÓ= Ng}Ö U3ÝÕ† YÅVˆEÌMÍ¥TËSÐÊ@Žˆ® /›ª²|Øâ5Þ¬}Ò‚ÝÚz¸Ø®¥…ŒÅNÕ-_ó-]§uÒ›5”sj Ø]³×V87¥àtØìÕÞu}W3àHs˜6м.4ˆ$‰¤UÚ»M×ýå_ãÕÚø®¥…®UQÑ=_ N]Ø`îà ÎÔLáLˆREP†K哳ƒ_I×¶Ó̶š!e¸ÛÝ2½a' áöÔÎEØ3Ë[21¨‚_ŸÊ ðë-¼Uö`)žb*®b*TEˆ`ÏõÚñÝ þbÒµâ&áÖ}ÝØ=ã×åÿ;€¿ÿ´TlÙëë.ų€î{XØEcØ5c=Îc>Ž]&ÕáVPÅÒɳ¸HI.„€b1~dH¶b6…(eýÜ.c0~änÝ;®a%MåQ.„— þ8„Jÿd²Û\àbeRžeåZå,6…;ÎãîdJÆI&àÈçh3ÀxQTtMŽdfnf(á¶dL®N/Öd –ä¾ãQŽà–Zoþæ°€9 Ûœ¸ 8†!©ß5Û¥#3¨KpbFgz®çoææªE€]&aح䌬š;ˆ®³K©òU'®á(vf…–ä~–f¯¥fkÎà*îdÿØÚJ.ŒÎh.„b˜8>ú…xÌ€ Ð’Ö…¡z(sºÊƒÜ~i˜ŽiŒ¾ç¾cŽæbhK ÝÐ-èæ_ø¦F ààlÎb©µè‚zÈj­Þj­V†Ä©ß8ÙMë±Î…C†`°¥TOCè‘Üj¬Žëzkºžk»î¼îéxžg›ÜeA®äœþUÁ.¶cŽê§vjÅNlÆ^lÇnlÈ~l°ƒ×=jŒUQjÆFÍÞlÎîlÏÖìÅFìgöáQþKè‚1p}@†hm×~í@†m¸ƒµÚÌ;ˆÈíAЀ&ÿ[ƒHPîè(%€ ØchænnçvncˆnéŽn}Ðbp„c˜‡røÐ~X}®h©åhB(†_%l'þ}΄¨ŽêÇnïÈ~o÷vïlNBè ]ÌnÑÏÞoþíøïõ~fA¦o(}€mmd@†9B¶žƒAЀ½e`3pÅß2ƒãÞƒq…ð/?qgWqPhqYhq}8†uPZoF€ïÆñð~i©ä ÿo!r"/r#?r$òÉ&íè‚~ÀïñÅÎþžrÏò¨¶ƒF€JæIØ!Hp0ídÒ_øŽHÐ ÿ½ÐxC )gH)È4.0<€€=øF`÷ïóXqqAÇ,G¨qKZ‡]}ÆñÖrQNïò$¯tK¿t§&çcØñÍoL*ul$ò Àò¿æô/ÿò0Op ¸9œ ІÞVN±0ƒ(p‡6 žeˆ…;=ßsbïs@?vvtYXö?t(E×gAP„i¯vAa;€jLßvn?òSÏ„Q¶„1€òÌ&õQ7õ,7íyvgõV‡ímk1ém Æ I˜C8:_ù­;P‚XHî<'öbOqd_qe_ög,8†.°ÿF^ôkÏ,·x ‚nßxŽÿ gr'ÿô(usŸr+×ô¿îchwww×Þ†< –~"´Û 6™dnX‚é 1øävƒßscOø@wq†OzYÐ2xvE§vlÏxJïxª¿tMŸvÓƒßP/y*·r,ÇqKXw–wyx_†H¨¶Eª3ˆ0¸y’¼ÒÈŒ<ú ú¡çs??ñcô'üÀ_vBˆç§¿v;Èøªo|«ÇrAÐrÐÕ€®÷úþ{pÿ –ÿüÏsdð€Hà‚[¸ºCì…;0‘Ž3ðˆž/‘hø¼ñ½ï{¿tA_øÿegY€ypzô®øÅw|ãOòoäú΀(¿|Ìßo"ˆ~‚ÈG€.ÐÐÏþ–m4Øàî…[>­0*à‚gƒY‰•Œ9˜} ÀsÛzÜ7ñc/û·Þ—‡ÇÈ.–>|@ H;A¤ýøAä!Ĉ'R¬hÑâiAìB€àrŽ4h€ Ê”*W²l‰â?tÉ'ä&Μ9ðìÉ ²“füóåL”( $,`Á€Á’:hüû7IÔ²eJ ìù"«„‡°bÖ(kö,»´iK±e êí[Yre1ªËH–¾y<ŠD ¡B†.\1£Ì™–êÿÑ;¶L›—’'¿„(ãÇ.:7ïôéM¾e¢\ýëõ&›Ž6ïøI@Š˜U˜É£5Zã@í}ö7ð¶nႚk\.FÇô x¡4ÃÒ§[”¦‘ãÌB<êy² ï;øðâÇ“ÿQæÇzœ×{þ¼­3“ªúÂæ¬J¶l¿¦U«úÏ•sd¥D,lÀ;½ƒe W qÅ7ÉåµW_%uvhÝF˜}PŒ%–l²Š)ª¸"‹-¢Ñe3i¶Þfíõ”¥ÄÀþUÅ…URÛ€¸u X *Ù`Yj¥á„V˜Ür¤a`Ñy¸¥aÖ%äш&î0ÿ&™ešy&šcÂ(âŒ4vfchlÃÎ8±ÌQù†”1I Eø‚amãÁ¡J’Ť“ìDø¤O7å”òå–A@g—RäåL$n‚©¥šz*ª©’º¦ŒnêçOÈxðÄà1‡eˆ" ¢ÜaÆ ¸•ºñf(¢Š.Ú`£F:)¥"áH9<4ç` ij·Ýzû-¸áŠë­¦"S̨&ª.ìªk¼ñÊ;o¼¬¦çê›6¢!§ŒlPR,1ä1Çy€GVZAnã|…l¢Ê2YB³ÄE*©qÑN‰ÄótQL!þ…eB%›|2Ê)«¼rÊ}$ÿê»ëÊL/5Û|óÍöÒ„/N°Æ:§¿%A‹E]t,¸8ÎIú´²LÜèƒG)%¥ý¬Ãƒ•a:2Øa‹=6Ùe›í2A¢ªjj¼7ð6Üq ›<»ù2@A‹ÐIû4Ã{là0XÛ ‘lÄŠNídÕÏ^-‹ÆH`áÈ:åXÂWA}y½9ç{þ9è¡¿,jšc`@©ðÚ,·Üt·j7{xúÄ8ìAà “$8¡¥ˆµ/Ô‰+¸¸ZCú8äcñÄ´PN\_^HÈY=öÙk¿=÷Ùr®%åœè¢ås°êí®ÎúÛIó:ì5¶Ço)ŒŒóŶ0ÿÀ_Œ³¼Óöu¸à!Î7;‹ñ.v¼Œ)RHèÇ1^0†Êu¡õè3¨Á r°ƒü`ë!Âz(CÞ)<ÞÁX}í2AÍØ77˼/3ñ㌾€r¨<Ç8îÂŽÂ!J€, Ôt@³$PÐR¢¸±(R‘Šû»"³ˆE}ì‹úÈÃ(Æ hq¶Û5p’É$ xÇ 8p:ÕQ€}îƒß {'ÊÊC”š¡ gD0‰J\b šh5B±ŠŽ|d¿ ÉIR²’c¼¤˸¿= €$j<e8~¬¡…/Œaë"ò¥å1_{Þ69ÈY"±ÿ€‡\¢"‡µÈA²—‘¬$0'‰Éa’Q“´Hã'C‰+,a IØúê˜JËౕ>»Ñ,³iÄB&Ë€ˆÌåw-_’ Á<'11©ÉóvÉT&JXPJÔÁPšp£›lØJ=^S›þ<"7oy@pbLœ,g/ÏÌt^rí$Éቒ¦p šÓ|H Y¹O!\ó'ÿÌ&7…'5D&R8 \¤A§ˆÐG*˜ £C‘Q‰&!V@*ï©Ê|jtŸÓGiRoâÒ¤' 'r¸RH¶Ô’/ cLÝ9S‰.àЄáE‰Ñ6ù´£AåP‰:P£õ‰¼\ê/›*ɧBÕ˜2Z•¨JÜ(ÇzÆ ŸúÜèO¿:ÈZrYEmËQ‘š¼F¢•Šj&[óUˆÂu™‹àÇMéªSjÞµ«ýÔ+!ù:<’Ô¬ã,¬a‹¿Ä³Œ}'\­ðŽ›b §#;TT_v224_html_docs/images/glass/orange/logo_orange.gif000700 000765 000765 00000031303 11222361074 022416 0ustar00abwabw000000 000000 GIF89aÜ‚÷ýÖ±áE²nφQÿ©8äkõΩÕÕÔh]SêÃö…(íííÞ>Í7¨s,Ù¸šß@ê“Yý}ëqºWÓ[³Húúú.ñññó”KëÅ ÇÇÇélì‡GòFèèè¨EøÒ­åMÒ½±ìZí‘Tþþþÿš$÷Ыøyÿöööìx"úuß½ÔiºUöɲȘnÿ½QËdŠX0önÿ“Äx8ëëëú’:Ûcy5±oDõ‘DêU¸¥”ºººpK…8üyuJ,œBþزÿ¹LÆ§Š¨Q•e'ë‹Qørò–RÁ­šðʤøÃ—ÿ±A“<W%öq×£vÁQäIÌZåååÿÜ;ò̦ó‹=õxàBìbíÇ¢d+ðuñ~#³—€åŒZK#ûÔ¯ÈAâvõ¹…Å}KíŲñâÓÔaèR´dädè°~Á^ì˜ZB5!ø”C§§§ðdæÀö‰2ó„2ÿ¶Hô­DõuÞhõ™Kâ¹¥®:î‘Lë|4ªWl[ÁZ‹Aí·†ù›Jí‚>4.)Q7%ñhñqáááóͨËaúË©ôÞÉù/˜ŒƒÊUl1âoƱŸÿ…ÿˆ ãGÓBçPì§Bå‰VùÉ¥Ûrÿ¢.ÿÀU„xns-Ý›&öÕ´[. òÈ£à«}øÍ®ŸMæq ÷Ž:¶QôÉ©¾ …Ú«…Þlñ˜H÷–IúϦ§N–0úÇ ¡cÎ>ెx= ñƱ_ñ.ÚEÒMøÊõ̤á)羪°¯­Ÿb:óͱâvõˬä€ÑmcBÝ<¹K!ù,Ü‚ÿ»H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(SNôDz¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JÚ“Õ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·ïY€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éӑè^ͺµë×°cËžM»¶íÛ¸sëv A:Q»ƒ N¼¸ñãÈ[æ)RÎ1àqwN]òëØ³kß|ٹ淆9ÿ ç+U)ô¢ †:÷÷ðãËÏ­î+éý´ˆ†@SLA@*( €Ã×à! ×ààƒF(á„Vhá…f¨á†vH!ËáA0L4H4¨B ˆÃ‹8˜ \€Âx†‡<öèã@)d†Ë0G .ÃôŠª¨Â¢ŸHFLR̬ /~²B í©6ä˜d–iæ™ÖÞ½øÒ_“I ˆ(”Q@Xü£çžZ 2A–[‚¢ÂU¸ïìŒÕ¤At–Ìðÿpk¬¡ÎMnøáY$®øâŒ7îøãG.ùä”Wnyå¡CÊ&2é$¯Ÿ03°û‹)‘ØàƒÜr› ÏMÔmŠ3³;S z6»Â$›L¼Ì2/üðÃ_nüñÈ'¯üò˸3„/*Ó‹C”vêKj¿iü0Ϭçìº)M„/~ì´;ãLÁnD‚»`H (-Ì9ô×oÿýö/¯ÿþü÷?¹!îp@šÄ«—Å!f3kÛͺ—³×Ac|ˆ 1A˜¯`hXG#ÐN`¡î›Ò ˆBÃ2H¡ WÈÂúï…0Œaã°wØç€GâÖÀNÚÿBµ¶ÓEâpc !ÁG<P„¢A°b¤ðÈ$, H@Z8$Pc´£…hTaF°Æ6²ñnŒ#ç(Ç:ÒñŽvÌ#÷¨Ç>ÎqEr’à€t¬‡îX˜U¤â¨¨©#©ŽhX"Å´€ %sp…ShC—8:¤ ˆkh¡Y}ûÎPˆzœ1h.wÉË^úò—À ¦0‡IÌb˜k Ù-ØT þh@JGÉPD€ bOGèAöæœÉ à ç&ŸˆOrC0¨:aPæàè8Å%æ©J)#‹„û ðÿ*”Є·Äå IЂô åå£"•‡I(lJ…Dg„‚@”B?ù…‡%Ðàœ\©:Ýû^™A¾–lÀ’Tö¤ÉN`lÿÞ0 ‰j_û”Ç. €ZdtÿˆŸÊ­t«ÛÝ@߷ЇNô¢Ë{f¶UÇí³ «ˆ¨Câ§ÎðZ˜à¤O #‚úE¿Ýb½-…iÇCÀŽmÙsÒ‹ufÍÏâ ÕÆ‡>¾Œbd#žÐ.P@€OðSŒ(7|~u¾ðˆ¿€ÑÏøÅ¯¹çJ®f”—ä©óÕ7 të*U'ÊŠ(œ†[ßKèk”Ì¡ ^tÙJ *µú£>À‡,¨A¹cC m¸‚'<€aHtøfÁPbðé>¼ôßøê[ŸÞ@hÞ¿˜‰v9©ízÊæÿ6o½y«[ýêWoÂ<  b+ã ˜žVÁ0•s‚PŸjç¬Ê«ü*å9g:o7Ï€ øÀ{߀ ÈÐë0žy@S€* 'i° G =—n‰÷†"8‚$X‚&x‚(˜‚*¸‚%hU€ ú‘+Š6##Ö)Cô¶§@P~`~&ðƒMpêÇ~í×èôR=À%Zâ>ùð ý@fJÒ}PBYàÇ/•„ —´p9ó “€Ôð ÉPw–&P ‘@SÀ'K{°Ð}r8‡À‚vx‡xˆ‡rÀ yÐ –rUþm 2,næ6nP~µÐƒž„B¸~ºÿ   RF¸c1•ÑP^â,[#jh],3#Ùµ]´–@y@~TW€9ã½·€ödig A &B /b$Øt¸‹yØ‹¾è‹¬Ðo3:²¶/µ¦…«³p=ØŒV?xu‡°~_‰Æ^;6Sdp S@`àEŸÀ(ÐUÐÔ+¢ãtµ÷Z…DЃÏÀŒæ§p³ãúð{”fi3 0 ÃP)\€sÿÍWn À»È‹¿¸½G ¬À Â#0‚d0”(-Hƒ@ÙSŠÝ$ïøŽ‰&Јðˆ‘èI,Õ^1õ^®W q²PZPÿ€*Ï ¥W'×D*˜:nЃÌèŒ&@Øæ“þ• 3°ýˆ S@©°<ð´…‹p[p I‡@P"(–a9–fY–hI–jy–k™–l9–£þÒÃLð ®@ d` •—Â*p•ƒÈŽ5D™ˆ#ùŽGi’Óø)Ù~f€/ÅqÞ@r•›+zÂ0ÿ0̰Yî?~¬0~«C’ˆ™˜Œ¹~EÑÐu W0¯Øy ™køk‰y=‡_)‡oé–ÆÙ–ÈYœÉ ÿp˜©ÝøLc“§S )BÒæfB©š«9’&ùƒ‡`ŽÿùÕø‘¹ZbW…6](“"?I x@Z š÷2k=ÐQG’‰éш’øg¨‰P›û•³ šé+À   €š‹ œÃ™nbYº¡aɡڡ ú¡"ê¡$T­=%QœØN‚á¦'lÃMˆÙŠÉ˜‡£ИŽYž“˜žÞl’âaµ2õ£ç¬@ ƒ€ŽØ©|P >p‰xý‰”àÙ˜Õ‰fðIí¥ ¶ •À"Þ%À ƒ°¿€ ³°Èz¡Z§vz§xš§zš§ñ —E]%64â%¿|' @d=`ÿ`¥W Xš£<:ž”ZžfÐRî%z§£…’Gr´QýT. -²%£Gä¨WÚšä ]j„ì4™Þ`¿ÀŠ0 &Ó î)›•*Ï2y ç6§Ã¹§Æz¬z |9¤û§hýG<`“0e(5B“z‚Fð¨Xz’ZZøâJ©ä‰ÜPe·}½ “* Š> *U ª(FÞÈ ÖSŒªªþ©£Ž©’æé¥èyl´š‘@ =MR/hšUãH#› аrzÄJ‡Èz±Æúxbæ à r®&Y•€{.Ö WI¸°ªÿ9žÈ¥æù  ãÚ£_ð—ÿº9ú‘±—)/fƒ´Ö!?8Ÿð“×P *˯[ú¯’)v<¦ Á°©Žbà2* Ð0Õº\˜ «P¡[¬{¶%à3dõ‰.S=ÈÈ d,£² Õš¦ÉW6Àš'9ž[j]šc¨À -`à_ð? ¸5k0€(ÐHhF6¿rƒ@Ùà ¢Â Á@¯0ª'DP ÏÀ·Z ™‘9 íå´æÀ†Æ&)Qˆ¢¸'ð'Ÿ1°²­Ê¥ªåV5UâÐ0+®‹ÿ+®~`l‹ÀU[ƒWHI§£ † *²t‰Õt@Ÿå¬Ù˜¸æ´2õ lƒ°§+ˆZƒ´·'Ãr{2* U@¤ÀÃ*§9Á{¿›§Ê—=ú'ƒ“ˆêhÀAéŽÞ‰7CBj:÷ðê÷·-ÀÜN.å´–É×ðï¾áë*õ œà[BUÉ~?Ö=ð¾¢2*†¹?Vý´­#ùÓØ¸°J‰§©c¦tMrU¾²f——0 × 'ú´)ZР\Á̬¡&*fH2…ѲA”/¥sš–¤y#é¨}›yqà>Å CÀ~\ÊûÿË¿þëÅýûÀ À€¸?PÉÝ  `v€9Ù —ƒˆÄ A{ÄËòXÀ ¿ÐU•s¤P Ž Ååzž“é^«‹™ðòXu k>y…Ùt ¤0 «@np Œ.Þ@ ,ÁÐ,Ò<ÍÔ\ÍbPý2]mÒ¶ØU'³Û™ ÄM£{äl¥VÚ à™’¿p < UjlÑPNl°U r @Áð•\Éäé Ð` ¾å ‡¬@¤ *X€ñ½3²úÒÕpÎ&ðŽi³ç S«ëz—h‚ª)ÚÄi33y¡gà ÃÜÒp€ ˜° y€<ÿ°O© [œÐÍ% =ýÓ>íÓ¶`ù ÀÄ+ÀLGb7xb:HÎïhÎÝ °¼¥KzQ˜úlaWÅedñBr©P!€‰ûPÉ_à6{ ÛPB…ss{Ä ÝÐ °U{g¿€Î@ž vµL¤˜Ô‚hÀk“Ò³  ž ² ¹àÒà ÓÖ€Œoý쀔Е¼»ÓA Ô=m T°±X<¹[L:@©oSÎPwÐ ð¸}’Í5€+0'ó‡_¤ Ê  ìÒ€:d!Ö+ׄ9 ¸pÖÝÖ dB+c¿¦ÿ\×v]£P@°  G*n†™Û`ÝÜ@×бK6”':–” ‡ «»'Ùþ]Ù. ÓÒ` g€ à%8'F‚7ÚÑÌîàb` =€lòXž(Y±†Ç×sšÿ¢:´-ÛälÛÍ Õ¸­‡Ã]: 5`y€E¶Y^ Oˆ ·Ðaͺ"cC¨îSqd`pÖgýÝ Öl€Ì D ãЛÞ¶¶å%€x ™ày°˜¸½¸Ý$ÒHDö¶k‡ŒÚ¤=Ý4þæ’ à—=àJÐ+  [)Ú;-§¥íÓG€60ß3(Ü%mpÚsÏâåÿ,⸠Ż-®É? Sœ0’‰Zòµ.ÞžZ…PƒÐwûWD€ ?>Ý–ìO Tü”=€M^R.å?=Ÿ€Ä/·%.äj Jl_ŒFb1³¼…I¥Ïð ¸{ÔÐß²0¹Ó˜ cðp·@ŽŸPq€Ç•:½Óîà+×Öõ¬‹MDlC ÇŽèµ=â$>Ý'.¾™L¾óÃîõ ¤°(àáè,äØU%æàWš¥ÉG  Û¦.äÎŒàÖu‚°å¶ÔbÀ?ÁëTp 'Ùë?ÖÑ€àÈ fsƒÊ§HâìÿÀ{¼G ß0Ø/ Ò )°/0|gØÇwMŒ p˜ ÎÏñ+gE6ø"²AÛîþî#¾è¦žÖÞ¥Š Ã³LŒ€½ \@š~"Ž™Hì&63! O'L½f­äpê 0UP4füYX ë¶0ÍM¿ñb@ås1ü’‡PâAÞ CN Üõ”„™™wõ1óh¾€ ˆ  mëPQÀ  ôP‹ P,ExÀùÌüàX°ï(Òï€Øc+sèîï$Îø%ß ]Ï*ÃNËÃyp ~H~Ïq –ûZ¤xÐBÿÀ FÀðÿ ¾n³¤Pe`²²›ñ„ßô^·^ñ„ÓÝýýÜ 6€Ì/e.ÎWÍFˆpè™lȤ+Ö¦Mlà<ðJ‹³†Mĥ̿·Vqà@iË‚ ,RªdÁÇ%«t€’ `Vä¿Dª`¸UÍÇ€;A…XôÉÑ'žûñ£›-ØÀ¨QÃŽ Y•±KC ×°ITÑ@!Áæ? ¨Üd ’ +<¤ð¡bÁ+2q$¬³‰Ê­C4cÚí©‚41 ¬Ðá_VlÙ#Æåe—bHMPñ‰´9fªç‡r6òàÉ“§Ú= C…m†ôÐÿ!Îr4|XçÊ•3XÄäŒ"HÃhÐHeöŸRB88p2åÊ”.±ä!¨ùY"q#Ýs#{6m¤G“Üô0TV)`5ÇîÏ!½|%¡1v  ≕*zH«@*d%‰¡­0(ŒTgÌ´§üø¥‡ö*‹ð6‘Ì2Ì0Ã#† ›à1ùAƒÈÑ5Ây"72=õhüâ ]hi!ˆ~ N8†;c•Y Ĉú#”@ºéJ%–Xr‰Œt˜KȈÄóˆ2*HÁfÔCÔnt ª¨Êê—kòÀ Z‘©?¦H‡OÊØÿÄ-µ,øç¸ðÀ4z8¢­°Ð ,週,Ó¸gNÒîT †4 P¡B- Ãb²ÊR¼Œ÷C‹¿¾hê4É!ä(Úš¹Ȥhü ›/ 2>YR&P$Ê< «?URåEœHÙCºL»–4Ãa T©‡jž‘-X¤âtÊ0ÃxE퇞2s‚‰Ë&t,@@ Ï:Ðâ&"Hé-,2•¤ˆ7Åb7!ƒ‘Å$˜äŸúÑ0= ƒŠ”AZdf´Ž8EY±Àc2ë€Ó{¾è¦© #DGGЫ-Èy¡R`YT¨šƒ‚_˜œA"!àÿKU¼0Kòà\J¾Ìàºë$Á" àâEèÊsS xi4Ùhüððn¼1ߨ~¹e˜^¬Æ6 ýD‚2Y˜-2ð ‚â‹1ÞÄâM1Ö¢Ì';¢ŠùÚ$„<#ÌÆ|¡ºf‰Ž_$ƒ-l¡Ã2Iøˆ}v>H±„ $`&*pñCgÃzöõ×_"DÞÃŽ–*骰¢ ‘_ˆ:¿{)…?¬ 7œ™  ¯IªNì±ËÏ@’#Øá"•O²$"’·kCÞnåÙ°¿3ê^o„)dÏP8…ÀP€³°R¤¨Âƒ2u1ÌE°›Ð#8™É¼®¤(@Í>ƒÿ7¬ÇF%ƒ 08Ñ9EQ›€•ì\H»ô -’À*†!ÔÍnx«Q¯vÕ!D…YÍ»JVaRäa’ Ö • €‚/ÐMŽà5{lÖ1_ù$Av€+ȆQùÉ-yHc^U`€Šüe¢zãÐÑØÁP QˆãAÄØbÈ1¸Øå0xHDÒáu¯ãƒe𰈎e© L¡L† t€B*° )°p"I„R”¢Ô)0·ªÆhÊbý‰»Ñë•Êb#U®RD (Ã_S X±V°ƒUh}„H±Š,vi|(éâØ$ÁˆH€ +x+Œp÷ÿÍ -@ónyK`p…¨˜cÏò• 3Ì-:ÜÛB…ÆÉ…— ! ™ÁEŠA‘ûÔgef'Ê!Dˆ#‘+*©‡d" è Y†*T€°¥(ùÀ‰`aÌU H¡ 3„4¤­ bHíׯoÚa+]ùJÕ°—5=nŠÃ8q R `É_ؘÙÌó…€ `øÄ'+\|`HÊ¢U¾Yý-ŒB7ò6Ân,´¤8 ?bHutqT þaÏÈIÆub $`ÇVÙU4”ÿHGoR†$#a&‚q„Ôýƒ@’¡C\å*‰M"SØK -vØOÿ²'MUœzË#Þçùñ 7À–˜:B hâ[ZT¦IÈTIhaj §ÒA !Úò›Ð»™8.,å$YBvm–¨‚ƒÎš)´Z®qp]aC‹ÃJ»ÛÕ®v5C3Æ€9ÐÀ^GhÜt¡s}9ZgÝîr×­=ÀÃb%ð‰”¡׸F"``Ùª\¶ˆ|Â@µ˜ ¨åøŠÓCâàÇ›ä¤ y€Ä,Vñ­dj‘$Ó¡„OÚÌXÄ¢S¸ÓÝ ¶q‹9Lå²sÐå¿z‰½B-ˆø,ÈáˆeU&Dá?ÂSOBr¼œD«kØ'YÉKÿ^²$ª€:ýƒ 6(¯¯`Ь²ABÚÝ?Ej—ÉØ¥'X‘©2Ü·€ÌXBðÀŽD¤4-æ¥À®Óƒ}BÃôÞM,Ï<«Ðk Ý¥é„+l:XÀ‡»âj±+`F¶A vcÎ\ñ à¦ðR¡€€/ª‚ pDˆ+'Ô¨ÀÄXååÄ€DŽ ªæëŽY×M†& ±Ð; Œc¯8>§ò°ˆOI TD([u;-4×¾Ÿà(>Š9°ÃO«‘)ªÏf/¦ˆ£i[ŽÀ‰®TXš(ô¡èpmŒÎ€£Íâ8ciÆïžUξô‰Ä/ÿcFDW fØ5nCAõÇÅÀ‚q°5?é ÊíîZãIÞÄÌVÅIèBØŽ GªzÇŽ¨Ux¯˜ÇJ $ƒX•qpsÐ#½èEJnЀTÄTL‹u à K?C»}€DwصŒn4PïbNá›H3(¸À¤¢;W{bù2t  Ì€ ZEŠÁܰØABý Xa@‹¸øÙI¼Âå'|ˆ_AŠ88â> DãQP…ÎsvÕ^µà÷ìZðˆù™ÿ!iŽ‚bŸGø“CS æ‰@ È% šP:Ó™®‰ Ã[êSo4JìÿýèÓAÚX˜3¨=úÒ§a{æAŸ?ÏØŽWØ?3y&qõn¢½ôûÅ?øÂ‡?dHn”­©‡Æ“òèä Aƒ€9×/ï°@†48êóš¼ï×q€Ä„ážAp>·ˆ'<à„º0ºÚ[:p8px@êP4©“·yë½Þ«7 ô½ ¼ˆ…W4X‹H¼U¹6)b†ÄY¢‹ `;ÕÇ›;ºK¨ X‚  À 1 B!B",Â"<õ²í˃é£AãB y¸éÁ4«?àRð<¨€˜€21,ƒ™bA+‚‹´Ø ˆ%ø‡ÿ%0ºŒ@%˜C%¸ Ü ¤: ä@>ÜÀz ÂWx…#H.Ä‚8à3 £Û‰±ª‚M ¶ô›»õ{¤d[60£ƒWˆ#üDP4Â8Ø2JÓAg9X »…2ƒé™ò±4(NôD#ìD,\ØcýÔ¢[¹Y,5Y F6$:ÜdDÆyËÃ=|Fh|Æ ÁˆÆ!A^¤ …J‰µöŠê¤C¨ÄT´»_(ƒ#‘XN Ew|ÇWx$ •t‡’ƒ¼£A…DH0˜¦¡<¸¼¼P”,Œƒ¨n´”l|½Ø«”#FaÄ‚E¨ÈEFÿ*HƉØHЏÀhüHÂ@¤`I!"8•|½¸Àƒy"FY[ÄS<<ðqpœœ»ºË„9¨+¾¨½Xö¤ÕIhMKÇX‰¥Ú­\ʵÚs}O‹MŒŽqŒIÚVµM(-Ó¤ ¹E×L5\sF€¿Åª¹ÿ@.XÌ©Ý<Ä€[ÔÍÝ…mا}Ü;Üÿª­\áÅZ(^ã=ÞâQAQA€OA˜Zñ5„#YÍKPÔ4`„}]Zý^+xÞæRåmÞhzÒ‚/C0Hã„Äâ/Fb/Nâ!bX'ßÿW(€EÈEb *PHNÐÍEÜ _Îc=^Þ~Sa-V㤈öáýCÛ$6â5í‚mä‚­”A‘›à 6 zв2[´Ø-.XGN;i ePnÍ`ä#^ÓD[CŽ^´k LÀmɈÉ:¶cûÝc\–aVöãèÈ•KO˜·A®ÜBŽÞVdCe^ff^f"8!ñ‹[h…g äh…/ Z¸…ÈÄ+­ãc8†fgr.gOFå h`´;é\h²Ö%xÐ¥_~½ß\¾çüÝåAX@6Öäa&æ"pVä=ä$6TK`Ã%؆†~h‡ŽèmX]ÿWã$/sƒÈèpƒÈhˆ†`@GÄñ1 `„m8é%Hi•^i–n镎É-X%f`´+v¶œvPœžß-Nbå5h‚êj¡.j¢>j£Nj¢v0#. •SãŒK(«¾j¬Îj­Þj«h‚êÞå°„%Èlh5µ^k¶5HHÈ^Æ`™[€y(‡(y‚i˜†:€4h‘ü‚+BÆ>ØlH†yXìdhlÇ~llˆlÉÆ†((†>ÈàÈ9ˆç8ÖTNâNøßpž_ÒŽq–Õtþi¥^m¤nmÖNê°~ê%Îßܨj®ÎmÝîê"èmÿƒVC&ÃÖ\„9h„¶>n¶V5@Ŭ&‡»Ök¾~ˆ+ …2°6AxR^ †JHïoò.oó6ôNo˜ôn„˜ƒ°Cí„Ïž€ÐþßffdŸ„ßîmÿþopp÷oî^‚uèåß•KÜÞmÏêÿ6è¦.áNpå$@n€+öœ€y(qyèëFÀìȃ| |Å€3x€>ƒïo0o/oõÞq¨ô¾ˆoC­o%î#Oå20d(‚%/p'r(/hAî˜ ÜxðßrW¦&ÃNX„@2ïpÿ<Èä€u¾ök%R»mÑnpØ…'ð¶q>Ïq?çñJðñK¸‚9Xú¥o0œ„2(E_ôEWr‚ŽrIŸtWàNbKÈ+wpØrOïrC¶ïEÈ ó 7óãH€$Ƙ,¸Eèkê^Ep €O`™+R‚]x Ðs>ïs?Çñô@Gïy˜x.DôU0Xò&§tj§öŸr´SðÚŽË,÷ôO÷oKÇöX‚y0õSGõäFFب³H˜$ Ž3€úé«o¾ã¸ÿ>üï¯o>ä¿@ÑFpÿ€{p‚Ï‚¸ÁN!ÈK^â–Ç<©8s̜ǰ—½ÎqOlä» /H¹ rr“›œäÚ¿ºo~ àE¢v¿åÏ"°|§¨c €Æs1-<°‡>„ ¹$£yN<¢;¨Ä ’°‰ò›äRx¿^D[à€(¡ƒ¿ hÅ“@]˜Chíð‡f"ª„È& ’Ì‚H|ããèD'š…R„ ©h,‹^,Lj„JëŒ>´^󄨽"ÒèpŒ£çØÄ:öáŽz̈þçǃÙŒ´Ð ÉCCö‘j\d?çÈ#B2’’!%ï˜ÇK‚€ {ØÂÏhÈÉ/”9%)Ki½S²1ln\%[ÙÁWŠ•Œþhi‘Ln‘]4X'ÃèK3˜4¥"‹Y‰î™äS&™¿XBs–´äßï¬yMâòp¡$¤7¿9Ìp1•F4gÑ)Bun€S”fE¶@ {àRž»,`Ä(Ènæi"f?Û¨J€†N $h )K„&ô–¹œg@;TT_v224_html_docs/images/glass/orange/menu_body.gif000700 000765 000765 00000001526 11222361074 022110 0ustar00abwabw000000 000000 GIF89aÜ ÕëÅŸøÒ¬óͧõÏ©ñË¥ðɤ÷ЫçççöЪ÷Ñ«ðʤïÉ£îÈ¢ÿÿÿéÃÿçÂæÁâp§§§Ü¼ûûûþþþ¯÷÷÷þ~§Sêtñx÷{û}à¿ãÀâââñññêêêëëëòòòãããÿÙ³üÖ°ìÆ éééúÔ®êÄžëÄŸý×±þײò̦èèèôΨþزùÓ­íÇ¡ûÕ¯!ù,Ü ÿÀ‡0ãép6ÍiÉœ9ŸÏ—t*uY¯.”vkëz¿Ý•xL+›Ït:ÁfÞo„\>¨×eø|^ÀçÃþ€€ƒƒ ††‰‰ ŒŒ 5’“”)–—™š-œ,Ÿ ¢ *ª«1­®®±±&$% »BDFHJLKPÅTTXW[\`ÍcdgÑjkm pqsvwzz}~„…‡ Š‹ ‘”í—˜š™ž Ÿ¢¤¦¨«¬¯¯²³BØÂ¥‹×"G’ #V,ʱ*ɲ,CÑÌÙ³ѤM«fíZ6mÛºyûNܸræÎ¥S·®»w)âÉ›×¢ž½Q¥N¥â§Âß?ÿ€Š ¸«A¯_ … kèðaD‰Ë*‚¹ˆ1£™i8^3ðqÛ‘{H–ü3ŽÊsV®cà²L™hÖ´y/ŸNž=}¶x 舡¹ŠElá ¦NBL6‘¢T/T­^ÝXmk×`e|0–ìÉrhÕ¶l+ fL™rm²¨›sO½{†øKÔ / "ž¡øÅÓÆ!_”\«VÙ¼fÖ,vlÙ³*Ó­%]ú-jšªYëÛÉv ¾~4zX{ÿž<ÌpâÆ+#Ÿ£<óæÎ0žƒŽÞh:uÓp¥FNÛáåx³‰'XyI¶›z×^dðQÖ†eÉaÖ}éwsHhÒF€×Í“w½‚´fR…é–žbëE5á{’Åwá|th(‡Î}ö!ŽˆØ‰ñXv)v·¢l-Ž7˜yJ51£S²wã3ÄÑ £<‚dÇr@–ä!"D² u5 ¹ vâÓwýèÅ¢‚»;TT_v224_html_docs/images/glass/orange/menu_foot.gif000700 000765 000765 00000004135 11222361074 022121 0ustar00abwabw000000 000000 GIF89aÜ÷èèèþزþײý×±éééìÆ êÄžúÔ®ëÄŸëÅŸüÖ°þþþñË¥óͧ÷ЫøÒ¬ðɤïÉ£õÏ©öЪ÷Ñ«ðʤîÈ¢ÿÙ³éÃþçççûûû÷÷÷ý~ëuñññù|§§§ýýýܼãÀçÂû~¯æÁà¿âââêêêëëëóyùùùú}üüüúúúü~õzíííôôôóóóø{ðððäääæææíwôzøøøõõõäræsöööÕj?ö{ápïwðxòòòòyìvÝn©©©ær²²²âqètÏgðw¨Uçs¾¾¾ôy×kìììào¨¨¨ÝÝÝÚÚÚÌfp8S)ãqÇcØcétòÆšÑÑÑá«uòxí½ŽÐh°°°ÛÛÛŒE»»»{=£QªUÔiïïï»]x;ŸPÍfí½àªtü}Ñ”VÄ;À_ƃ?ÊÊÊÃbµh”IúѨÏÏÏÈd}>~?¼^¦R¼¼¼ÔjèsßßßÌÌ̺]©Våq²Y¾_t:Å=ÓÓÓÀÀÀÙlÉdív°XÑiòĘÜnÇÇÇšMÎfºººÆÆÆýÖ¯½½½ÞoßoÍÍÍò̦ôΨùÓ­íÇ¡ûÕ¯âpêt§Sû}ñx÷{þ~ÿÿÿÿ!ù,Üÿi œeâF %?àºÀa€‡! ˜Hq​(ØÈ‘•Ç =IR•É“(¨TI¡eK0aN˜9S‚M›©rêÔÙ gOT@ƒe@”h…£G!(U¡iS P¡®šJµj«XhÝŠ «W`Ãb[‰#NXË€Û·o5ÈÕƒI,6zlXP«¯@ZAXÙÑD§†#F¬X1#FŽCJ&Y¥å•,]Rˆ)“æ„›8wîôùS¨Ð¢F‘VXÊÔi„¨R«ÊÆšu«V¯_‹¡ìÙ´lÛÂ…;WÃ5:hÔp±·o­¿d€àaÊ<ˆ/(^ÌØ¢cHÿžLù€å˘5oæìù3hÑ£I›>ZõjÖ®_Ö=›v۷ᆀn»‘eZjGÀpÄÍUFȱ |ù%P¼@D,ØÑGvÛIÔßÙx!•gÞy'aö€zœ9ÐhÀÇ“|ó…ö±A~°YÀŸUþ˜€€È›o*¸ ƒnWÅ),|D "TøÜ…À"K ™üðˆ…øÐˆ$~žx(~¤"‹-¦§YŒ3¾gc*¤5£Žõ©æ#û 9•ÿˆ$,y p B¥\ŒØEƒ l¥sÐ6ƒcBI™f¢YâšmºYœ&¹#{žÑx'ž8æÿ¸cø¹¤ ƒi¨€ˆ*ú[‚Á9 À\¤xB>0·€–™Êð‚,Iì„$b4df¢ª^©"Šªªs²J“«wæ¹'*³úY«S·âJ¨‘‡*ià¯N +—U$‡1PÈ,t˜Â .1…£hꈣnËí›ßÊé­Úi£¹{¦‹ÔŸ¶*è»»âÖë¼M6ꨢh±E•ÉZªå–Î",7ðp„­ðÈ×fë©{ '¸‹[“Åða,kŸ¯û”ÇC‚l[¼ºùZr°Prá„%*°€C zùëÌ´dÌÏÚì]L±‡hlçsF@— ñпd´{7½ÿªô|'å´~QẊÔ\ñ*oo‹+Ü[kT’ˆhàu üúûò_1œv,;¸ÒDŽDòÊ騧®úꬷîúë°Ç.ûì´×n;숼QÇ'°ñEÀ/|N„2ˆ+Ððæ1¸ü2Ù›ð D´pÄ@Ä?<ñD+à‡/þøä—oþù觯þúì·ïþûågÑÉi„qˆ*䯿þ9ä , l„4/Kσ^ÙÎÖ™@3hA,¤°%xà‚®È 7ÈÁzðƒ ¡GHšð„(ôà" aŠ+Dá“X g¸Ø ü€ |ÀæÀ ätÿÌ6 Ï=3°B ’„X8ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.RÑB) :|àŒh<#`ƒø =<ಖ56L qˆ³(¢ `ñ€à²¤ IÈBòˆL¤"ÉÈF:ò‘L$Á<†K€Â Ȥ&7Ù¸ yΣcíxÇ ±ˆ ” ö‹Vºò•°Œ¥,gIËZÚò–¸Ì¥.wÉËYÌTXÂ& ±bó˜€Á(ÊQZ¨”œ3›4óHÍjZóšØÌ¦6·ÉÍnzó›à §8½™‡œÁYˆƒ!æÈÎv¶Ó™£„¦<çIÏzÚóžøÌ§>÷É:Ï~Ò¢ hŠ „!Àó %¥?ÊІ:ô¡­'@JPƒ&ô¢ñŒ¨F7ÊÑŽvt¢-(FG꜀;TT_v224_html_docs/images/glass/orange/menu_head.gif000700 000765 000765 00000015354 11222361074 022060 0ustar00abwabw000000 000000 GIF89aÜ‚÷òföööðbî^Ü;×WìZôôôùùùêWèRðɤæNñƪíííò̦äJʶ¦òòòëoϹ«áDüüüíÆ²ß@çççêÄžöyãHúv—3íÇ¡ïïïëX÷ɲÑCá¾ý{èÁžÊBÝiåÀóhýÖ²ï`ÖÖÖ¤MîÈ¢åÀ£ÿÿÿ¶j2çPðwÑ—iÉŠQ§§§òq§Rê »»»ælºZüԱܼþײíÄ¥éránôuCo7öÏ«îũᾢñDZӼ°×¦wÉbûxõΪÉÉÉôȲúÓ¯åª÷ЬãpùtÚbâ[óͨâcøÑ­óÌ¨íÆ®é¹ùÒ®ÜJéÂ¥ý|íqôÈ®ÒLõrú{°:îtÿ~åLòÇ­ÞEôȰ¯¬UêÄ­ÚEêÁ™õlþ|ôË¥ñdûÔ°à¬|ç¨âââÂ_í\÷zñmàNòȱêééTíeäi÷wè]÷pájðÀ¦¿y8ñëèÑfú|øx×jèfåUàUõɰ®_àF²dèaö̦ı ìÃ¥ösßQãªŽïÆŸÞÍÄõp«ZÜÀ±àBàCÞ>âFönøqôj÷oùsøréééß?Ý=Þ=Þ?âGüyãGèèèãIòeæMõkêUùrî]ëYôiðaömèQûÕ¯ûûûëëëþزðððúuùÓ­êêêôΨ÷Ы÷Ñ«úÔ®ÿÙ³üÖ°ñññý×±ûÔ¯øÒ¬úúúõÏ©öЪýÖ±õΩúÔ¯øÒ­ùÒ­öЫüÖ±üÕ±ÿسþسøsêsëã©UõͪôΩ÷ϬôoÖCäNçíókèVçÛÕõÉ üûûûÒ­ÂuPÄAìÀ˜ùШúøøøöõöoñØêÀ–칟¤H᱆Ý<!ù,Ü‚ÿ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(SNüDz¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´)RXP£JJµªÕ«X³jÝʵ«×¯`ÊÅ«¬Ù³hÓª]˶­Û·pãÊK·®Ý»mMéÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹r_Y˜3kÞ̹³çÏ C‹Mº´éÓ¨S«ýªµë×°cËžM»¶íÛ¸sëÞÍ»·ïßµ1N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàËÿï”ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ˜^)hà&¨à‚ 6èàƒF(á„Vhá…f¨á†vèá‡V âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)ä>žbä‘H&©ä’L6éä“PF)å”TVi%”–d™%Wvéå—`†)æ˜ZZRA–m¤©æšl¶é&›³Ä)çœtÖiçxæ©çž|öé矀šg™kÊa衈&ªè¢‡Öâè£F*餔Vj饘fªé¦œvꩤrž¢ešˆªcꩨ¦ªêª¦ràê«°Æÿ*무Öjë­¸æªë®¼öêë¬qjyè©#kì±È&«¬±·4ëì³ÐF+í´ÔVkíµØf«í¶Üv-q‚ц¡¦{¹覫îºì¦ëí»ðÆ+ï¼ôÆëjœãÊ¡N±h áÁ¿,ðÀ ÁÁ'¬ð 7ìðÃG,ñÄWlñÅ ; †¡üz C žD!‚È$lrÉ(Ÿ¬²·ìòË0Ç,³ËÍ‚aÉÆ#œ€F?!‹àóÏ@-ôÐA¯aôÑH'­ôÒL7íôÓPG-õÔTWmõу³Îó°Aô×`}õØd—möÙh}ð-Z "‡-·Üi×m÷Ýxç5ZËÿ12„%ƒGaøáˆ'®¸á¹4îøãG.ùä”Wnùå˜g®ùæœwî¸Ñ}à?_Nøâ¨§¬·îúë°Ç.ûì´×nûí¸ç®ûî¼·ž Z—øÐ§ˆÈ'¯üòÌ/ßûóÐG/ýôÔ?¿ð`ü]CÐÅG¡üJ\ þøä—o¾ø3¤¯þúì·ïþûðÇ/ÿüô×oÿýøçŸ>׃QF£ Zá¢p¼ðï€DŸþÈÀ:ðÌÿ°':EˆŒ§ ÄñÄÇŽQ,რ¡G(šð„(L¡ ÷׿ÿyàgÅÛàF FàÃ8Ì¡wÈC ã‡@ ¢ÿ‡HÄ"ñˆHL¢—ÈÄ&:ñ‰?œÁ::-ƒáÅ;zÈÅ.êP` £ÇHÆ2šñŒhL£×ÈÆ6ºñpcú:á?bƒnpò.ÀPÄË€ìaIÈBòˆŒ£0fˆ*ÚñŽyÜãÈJêp˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨Ä$éèÂ;b ’¼‡%g™ÊZÚò–¸Ì¥.S©IP±•¯$C ØÐ…8,ÈL¦2—ÉÌf"s—ÐŒ¦4§IMUúÒ‘¸#`Ɇ Ó™à g2wAÎršóœèL§:×ÉÎvºóðŒ§<çIOr—æ6ÉÐÿÍbSœefJЂô M¨BÊІ:ô¡¨D':Pw bùà>ÉàbzóŸ )1(JÒ’šô¤(M)EÝ! Œæ³df ºàO‘ŠT¥8Í©NwÊS‚ºc“páFÙ@Ì.°c ÕHªR—ÊÔ¦:5©!ˆªT§JÕªZõªXͪV·ÊÕ®zõ«` kTÀÒN  E`Ã>‰JSc>õ­pUª/æJ׺Úõ®xÍ«^÷Ê×¾úõ¯€ ¬`KײžÕC%fØA8ö±¬d'ëXÂZö²˜Í¬f7KØ$ ¥ùô€9ÖªXÆRö´¨}¬VËÚÖºöµ°­lgKÛÚÿÚö¶¸Í­nw»Ú¹¶ô¬0Ý&QKÛØÔW²¼M®r—ËÜæ:7¹¾ÀÂ$KZâ÷ºíƒv·ËÝîz÷»à ¯xÇKÞòš÷¼èM¯zµë‹Cü¸Ã%jŠiZì^w½øÍ¯~÷Ëßþ®×î.Z V64`¾‹-®}Û‹;øÁް„'Lá [øÂΰ†7Ìá7¸îÅ| là AŒ €ŠWÌâ»øÅ*€ŒgLãÛøÆ8αŽwÌãûøÇ@²eÜ‹CBÄ(ÂKlâÃøÉP^ñ§Lå*[ùÊX²v± b´¸ÄHè‚ ¦@(›ùÅ,H³š×Ìæ6»ùÿÍp޳œçLç:ÛùÎxÎsše|ä$yÉn@Æ\æ3ZÅzN´¢ÍèF;ZÏ|F²’„úЇ~´¦7ÍéN{zÏès’AiK“Ó††ªWÍêV»úհ޵¬gMëZÛúָε®Uf#ûyÒ®´ ôpjT›YÈN¶²—Íìf;ûÙÐŽ¶´§Míj[ûÚØF60Xpd ¥6™`ì(gûÜèN·º×Íîl³@¢v¥OLìàÞøÎ·¾÷Íï{ßá߸ÀNð‚üàO¸ÂÎð†;üáÿF¶‘½ î`AÜöî·Æ7îoˆ{üã ¹ÈGþpXÿ¸ÂŸƒ-ìzsüåü&¹ÌgNóšÛ<℘øÊMŒ„‹»æ@¿7.†Nô¢ýèHOºÒ—Îô¦;ýéPºÔ§>ô;œü*ÿv¥ƒÐóaà ãA‡9ÆNö²›ýìhO»Ú×Îö¶»ýíp»Üç>v\œåI‚Þõ¾‰0èáë¼àOøÂ>ðtO¼âÏøÆ;žîvÇÖó¾÷ ôýï8¼æ7/xxþó ½èGOúÒ›þô¨O½êWÏúÖ»Þó Äɳ^yˇIÈ<çw_ø×ûþ÷À¾ð‡ï{ÙcB ”ß{ß§xÞ;?ðľô§OýêÃ>öZ@~*ß÷Ûç>à¿ÿøÇOþòƒÿèO¿ú×Ïþö»ÿýð¿üçOÿúÛÿþøG¿çO®…+l¿òaàwßg~X€à§ ˜€ ¸€ Ø€ø€8Xxˆ€¿ ‘ ý÷zG·‡{Çp‚(˜‚*¸‚,x ø‚0ƒ28ƒ4˜ž Çç•Gä$Ø‚@„(¨ DX„Fx„H˜„J¸„LØ„Nø„P…R8…TH„ª „à:¸ \(‚>˜{&(„b¨‚tP†fx†h˜†j¸†l؆nø†p‡r8‡tX‡eØí…¨|^øƒcø‡'h‡‚8ˆ„Xˆ†xˆv¨ y¨…ÛG›ÿÀƒ#˜šp P‰–x‰˜˜‰šÁЉžø‰ Š¢8ФXЦxЍ˜Šª¸Š¬ØŠ¨ Àýç<èˆ:‰%¸‰º¸‹•ˆ ¾ø‹ÀŒÂ8ŒÄXŒÆxŒÈ˜ŒÊ¸ŒÌØŒÎè‹ÁðÀˆµH·ˆ{’°ÜØÞøàèÏ8ŽäXŽæxŽèøŒt ZH‹Õ¨ب á8ôÈ«pø˜ú¸üØþø9Yy÷ˆ ìXWà: Ö¨&õX‘àˆ™‘¹‘Ù‘©íÀ³‘9‘I ‰™’܈,Ù’.ù’0“29“4Y“6y“8ÿ™“:¹“<É’ùÀ‘Ð&ðù…? *™’©Ð”Nù”P•R9•TY•Vy•X™•Z¹•\Ù•M‰@9 éù&‰’Ki‘^¹–lÙ–nù–pé•`”CéEi–0I”ii‘­ð—€˜‚9˜„Y˜†y˜ˆ™˜Š¹˜ŒÙ˜Žù˜™ ¡ðbÙF)‘y¹—JÙ—ôÈ žù™ š¢9š¤Yš¦yš¨™šª¹š¬Ùš®é™’I™ci”&`) —IY º¹›¼Ù›¾ù›ºÉ Â9œÄYœÆyœÈ™œÊ¹œÌÙœÎùœÐÒ)œ­`²‰di–·©™ÀÙÞ¹›Í)âÿ)žYžæ ™ã9žÓ¹žì©œÕyÙY›Û™›ßYŸ¾iø™Ÿú©ŸâÀ þùŸf : Z z š  z ÿùŸâ¹Ÿ¡:¡Z¡ŠŸâ`8 –ØY›i›$Àö9¢º‰ &z¢(Š ù  Š.ú¢0£2:£4Z£6z£8 ÿ™Ÿ)Ú£>ú£@¤B*¤VÀ ÊØI›¶™$@Ÿ$jŸAŠŸþÙ¢8ðc0Xš¥Zº¥\Ú¥^ú¥`¦b:/j;jCš¦jº¦Dj¤€¤vY›òIMúÊp§xš§zº§|z§ð§€ú§*jDТWŠ¥<¨Šº¨ŒÿÚ¨Žú¨©’*©oŠ¥c@¦8`D@h¨žú© ª¢:ª¤¨Èà¦p*§sZ§}Úª®Š§ j¢›ê¢‡š¨‰p«(«ºº«¼Ú«¾ú«À¬Àz( (@¬ºš(p«‰¨–J¦šŠŸÈPªÔZ­Öª§Šcªªštúvúªâº§NP®å ¨†P¨Úú¦CÐ=.¯ò:¯ôZ¯ôš.øª¯ùº¯þگ˯k¯òZ{°òª¯p=ÀW0<`©™J†¨æz±›±»±Û±Û†`Ûšq*ŸÞZ§®²*»²,Û².›²‹®†@«‰Ú9ÿ°Là>°<˳ßð³@û³>0´Dëxp´G› J»´™`Nû´PµRk €V‹GµYû\˵æðµ_û õàyPôp pÀÍ:ÐJ±€ê±p·r˱ +²9àrz›ßú/û·€«² ²éšWš=p ^ŒÛ³=´¹H‹´RP¹–{¹•ûš»¹[йK º¢«µ[Ûµ¦ËµYºY`\Ày@pÐ{©›Z±s{»¸ · K8 ‰þ&Û·[¼.;¸éª­U€=`ò޽‘;½?;¹G‹¹Ø+›Ë¹ž»¢û½Tÿ@ºGpº§«º©Ûº\ y =±€k»¹;¿ô{®DoÚ5°·Þúàj¼¬²´0À´àP¸B0úk ½,½’k½Ó0ÁŒ½Û«¹Ý›ÁÞ;ºâKºåk¾æË@=U@¦ûN@À,ÜÂ.üÂ0Ã2üÂNP¸Ð‹ Ÿ ê¿~À̼©ÛÊôÀ¸ üÀH<½Ö‹\Á˜{Á_ ÁÝû½ìÁ¦ Â!Ìv`í˶i@±å:Ãb<Æd Ã5|¿09àÃËÃ>üÃ|Ɔ«Æð`ÄЋÄIÁ“ÛÄlÁ,ÅžKÅU\º]‹Åª‹¾\°]ÿüÅD ÂeüÈ,Ü®C¼·y²<œ¶°ÉœÜÉžüÉ l |AŒ¿MPÄv, ª¼Ê«œÇ; °Ë|< ~¼½ÛpË·œÁßÛ ¼ÌËâ{ºçÌÁœÅ­k—ÐC _l@ gp‘Í Íð÷+Uм|Û¤àÊÞüÍœ\â\À”œÍy€ vœÎvìÊÔû³³\Ë›Ë ò,Ϻ,ºÌpÏ÷ü˦› üÌÏÄܺþ0ã̼´ Î ½Ð ÝÐýÐÑ%0À|Í(6@§Üüš ÎíÉ íÌÖ<Uú(ÒêlÄHì .ýÒ޹ÉÿPÓ6=ÏôܽͰÓ;ÏùLºÖÔAÝÏþ|Ȉœ 5оÊLÌ ÍýÔPÕ -Ò†@iÀ=P L°ÑÐÕ^ýÕ`ÖbÝÕ!}UÀ9`)­Ò+}Ç Ó/-Ó|Œ½6}Ó8Á<ÝÓ>-¾B=ÔDýÏ"œ‹ÀÉüÅðÌ -ÕŠ½ØMÕVÍMàÃ=Ö–}Ù]-š]g°4€ÖkÍÖ+Íʬ ×.-×M¬ ª½Úu]Ó8Í ¸|ËyÝ >Í ½ÌË}m D †œºŸP MPã@°Ï\š½ÜÌÝÜÎýÜÐÝÒ-œ}~àÙi@ÒÐ9`FÿpàÞâ=Þä]Þà½ÜœíÙ Úm ¤½Ê¦Ó;Ë«ÍÚ­ýÚ±½ ³]Û·Ý ¹½Û½0àLÐ(@ÜÆÜg ÜÓÝàþàÌ]Ý×½W=Ð|`{°áÞáþá ¾áu0âœýžàâ*ÞÞï­ÊØðâ0Ž ¨MÁõ­Ú؋߱Áü}Ûâ ཾ[ܾUÆ}Ø Îàš=âJ¾äLÞäNþäP¾ä›-áÝM`»9®Z®äbÐÙŸ­Æ*®âÆ0ædNæ-. 1ã‘˱\ãÚ@×ußx×ýÝãD½ x¾ ŒÈ0ØC0ä îgà„á†~èÎÿ]ÝêmáW.ш~\îåhæ)^æ˜~æiþâkÎæÃàæpnÓr®ÓtÎ㤻Ûy®çÿüûp „MÜD~Üà´þ̶~븞뺾ë¼ÞëÏìÙã`á`0‡j“¾è(né˜^æš¾éÎæ NÓqžã¤ÎÓu~êwžç{Îç^àê®ÌDND ëä^îæ~îèžîênîÍèF€ ýÖb°Tà¤ø.Žà4ì9ð ðËnæ-¾éØ Ÿðžþé5î ÿð­ßÔ0ñ?Û×®µ¹ê.àÐí= >î4Pò&ò(Ÿò*¿ò,ßò%OÒCÐÃÿÞ‚à'ïäŽU ;<ßó1€ïjPûÞïjð?ð ¼ÒŸð ïé³üð_ׯMñŸ×µÍ×}­ñ>à° 6»Pb/d/"öhŸöj¿ölßön?Ø,ìÎÅ §»¹Ç 7Ä€C>ÿ÷@/ôüîïFðHŸôê¼ôL ÿôPï ÷ÓTO û½×@õÚ¾õ\ÿþ@¢Ð°MÐ0úCPú¦ú¨Ÿú¥/öU ú®ÿúª Vžá!¾`û®P p äVï}ÿ÷=ôj0ô$ýï…ømÝâ‹Ïø ïéù­]ד_ùø| ÖoýŸêZ¯º›ÿÏõŸÀ6@2p • æoþúšþê¯þ Ûþîÿþp°þò?ÿó¯EPßmÞà½;Pl)sí@€jÄ,Ä`Ø0†ˆjù¡1®JŽg5ãØ±#!AJ#YR4”)‡­dÙr¥3˜1“ͤY“ÚÍ›ÍtêdÖ³ç5 @­ ºÌèÑ£Y”*}ÐÔéÓ§ ¤N¥ZõÅÕ9YµnåúÁ«°aÅŽ%›‚‰ÞdpÕ¶­-¸¶2´h±ã” ެ¶Ð!È)ZĨ1£GÄ"Eš,™R¥KÈ1eÖ¤Œ3çÎf>½F´(R¤K™Bú`骩§^eíÕõkØ_ÉΞmBƒÿÙkÝ¾Û»îŽ Êö"Pø÷aĉ/>Œø£â‘ŒO:†9²dg”+[ÆœY3çΞA‡MÚëì>=ïðEòóôò<÷øCúûüþþ @ ƒ(T(¤¡C‡"F B±bÅ1ظцGB†¼A’$‘“(SæXɇ˗;bÊÔA³¦‚› "8`áŸ@JW.]ºvìàÅ«Ç_>~PÿX  A„2|øPâD‹3jäxà#H‘JšLÉ–eË—.ÿeάI󦂜;{Ý;´œ9£êºSÚƒiS§< F•JµªU¬YµríêlX±dËšE›V-Û¶nsÀ+wݺ8uòô¹W(Qr€#%\Ø0=ĉï“J ±Õµ"˜ ±²eŠbd6kƒ³ÚŸU†£´éÓvñ®níÚoì‚+µ}±îÝŒ©þ.™¸¯Ž#ÇL–¹sÏÑO†=ÚúiÙ©¦w@ôUTláÑFÞ<¸§o¾=†•pî½gÜqÉ-·ZÏå§ßtý•ö_€y±Æ°!(˜‚ Ñ ƒª'!BºŸ|AdX߆"uèá~Ôù‡]j%Xàk– ÿa-ºhŒé ´Þ„íw£|:rd‡øådˆrHäv¢˜¤QKŽ×â‹çÅ(åŒ U9Ù•Ò§%#uÝ—p I‰džˆäwi.µ ›º¹9œ‘-T!–eÙž•ä!|Â$âw hbkfº"“k>Ùf”‹Äž£6^©“~tŸ¥?‚Øç¦Ž9  Þ©8©‡šš(ªŽ©J%«Vº –¤šÉÊ%­^Úªi˜œj·+¨ƒúÚ‹Á:åàŠ{rré²°6{Vz~–)iÔæÚi‘ef«ä¨jvûÔ©ÿDh,¹ÈΩìeiè,»Ðî)-¼sÉkí§|Ù‹&¾†’‡¨ÿbáN ðVÉJ„#³["¼V´n‰«MºBT¨Ú&¬ÅÂbL¬ÆqlîÀ¥rž »»pu'£6o Øözï¯ùÂì-”ýÊøoÍ ì1–:Sê#ÉoÝ/ÊC_±Ñ#]±m/Öô›O7õÍS×YðŽó<²Â%ƒÙ0×ÉòÑÛ¾LvÌfO…ö¸P×jÛ¯¾}gÜ•ÎísÝZß-tÞõ‚}Åï4Yv?33ZcÇ_¹=ÖâëÊ ]­O+9€)ë-ñåbg^êÒü ž*ájz|T+k韎õJ&o=¹§®[ŽN¡²ë{Ï·{^.eˆ£ë»ºÍ=ë8h©3“˜]«ÜÝÿ|»œôß´{öíÀ»6õ¡'>úïÙ‹,<ÝY«þ}µÈWN~Ø};Ÿa6‡žõ‰«}ÓÔâg½ùaoVÛ“N÷€f<Ö…/yÿƒ]Ç6@Àq΀4ËÝ£p6Ÿëí,x—zW(¯­ìuËÃ\mœ—›ÚõÆi¸ûÜy':åÀ xWÃñì¶?‡õWŒaìf¨´}©Ïv\ÕûŠS=‚9ð„A|\þ¼w#Ò ‰)*ß:¸ÕÄç1 Š!Ô!ÛhE’®~¦KáÏü„·#-‰²Ù`óÊXÃ'Þpp,Ü«˜3Z­]ÜÛâ ‹XÇ/Þ1Œ4“>™Pz6ƒåçFúAðÿ~Zbäyz³w­¥8oÙL.‚¯¢l©@Å3ÉzðA+&7cIÂ%S§ŒèSÚBñýdo‘ÿÌhQËÓVÎ4Kµ!ŠO,BôCœhU1ÐT.¦õ*Bç9H†:ÕÝ©TÓJÕZTTo]\‘zI¥‚”©c½kNKºLž’Ó™?]©4Qɼvn›~œkMë*Òo–5œQE+J+¸V€ Õ­ì„+f‡ùÕWÚ4¤ÈÄ+T÷éØ~’R¥¦œl[+«Ú>²V³ ällûI9ò•´~ *`S+ØÕ‡ 5&lqúÙ¼†SSEîM»Ü—6×·Ï$]ÚY²Ò’±gÅîqý¹Ý¿¶L«À,¨se \A’w¸Õ­qGË^ ²´»ðµ¬QYIXF7¬²ôìy‹{Òž.Òœ¸fÿ:OËÛïB/©…¥Xí 2ÐÒv¯ü½miÝ+F¢Æ÷²à¥/tÇ»;ü.XŸûu°Z“ûß÷šXÀ\,¸0|àÃn¸¼ŠÍ/zõ*Z÷µ½Êµ1¯™b¹®x³÷¥î‹íãÇú”¹0€oÜÛ 6ïE,‡Ÿ:äëJôÈþÕ-…Uiá3¶Ö°N°yIÊàáYùÁ‘ÍòUa8Ô%Ë·É~3˜…+e:øÁwž1’k\b?£ØËfñ]lh*#Ú¶q’MÐG»¹¾ mq¡ßXg!&Í’Õ²’;=à®ÔÒ3;lÝùÔÚM³ª9­ÑVë8zpó)MêCÛÓy–ðž§ÿ‰ZïÒÒ‚îqœ›Jký^šˆ™¦±š·ìh_Ï×Éâ…²¨{8å8^»œÉFç²)ËægúÉÁ2¹+mîcc;ÝV=³+ìîlÂÛ¾ãæd¹MjotcYÙúfw`ûÙ‡zÒ£ö¤±M샫;á»m7¡ kS›Ì¥%®û›êug|áw¸ãð{¼± 6r®KŽñ5£œÉwx¬‡ñ|Zºàµx¾±ŠQ.·Ùß+8Äç]ìŸSüÞBg«Í™ËðßêÜ㉭v™m­Þg{ÑÛ^u¯süíW_ÝÇròËÓ{æ™ë¹æÜf5Ù½ã/K[Øi×zÈù u/"œè. p—U.Oÿq/]àô&øÓ î÷‹¾ÏrgëiÃדØwºÈ+Þø¡ó¹Ù‚?zÓþðË÷ܬDîºÌIþöǃÞèUoáY~x—'æ·æ<4ÿy~§é³Wºé™žùz/>è—zÜÇ.yWS>Ú’>â›nüÍ÷}÷žß·ÆqNxšÒ^ú¶§¾â­Ïxì+_ì[mþ¯yý›ßçÕç{ùÏ™}…Sý÷£~éÝ?ýâ_þÈg~Ü…~'æmtlƒ&oýÿW[×GçÇkég“‡€wGhï‡zf–]¬÷w½·}–s¤·syrG~(8w"¨$øq²µuU¦{*HbYÿ{øgu#ˆuc6ƒ{ç€óa¼§}7‚ÝVh'ƒÄu‚xeÉ·‚9Øm.˜„®… ¨\×vX„öçl;({Þ'|ü~þ‡{ª7r"¦m»6…‘GÎgí7]èa5ø€DX'wÜ|c¸t˜…vxn)˜‡è†Ì‡ëgws(k˜Ç€hÈ…kvmXtT¨~e÷|·„Yg‚š÷„xuRh‰oè$qÈ~–W†#%~‘È“¨k&7u`؇ù÷‡1؉@è„BXˆšÆhˆ8¦¸ˆ•÷}ª¨`·Çv®øu°wˆc˜x€¨HŒh†ˆŒëõŠ4çz¾G‹<ƒ>8kž»-…ˆƒ¤˜ˆÁ˜‰r˜ŠÓ¸Šgh^‡o‡xŽÀxTšxvÓ†‹Mø‰ãŠQx";TT_v224_html_docs/images/glass/orange/menu_item_foot.gif000700 000765 000765 00000006560 11222361074 023143 0ustar00abwabw000000 000000 GIF89a´dæçÆ¥ãâéɨåĤâÁ â¡èǧèȧáÀŸîέܼ›»«›Û»›Õ¸›Úº›Ñ¶›×¹›Úº™ÇÇÇØ·–Ô¶šÉ¬Î­Öµ•Ì«ŠÒµ˜Ô³“Ò±Ð¯ÆÆÆÍ°’ϱ”Ú¹™Ö¸›Ù¹˜Ö¸šÉ¨ˆ×¶•Ê©‰Óµ™Ç«Ëª‰È«ŽÆªŒÊ¨‰Õ·šÈÈÈØ¸—Ǫ˭‘Ò²‘̯‘Ѱ̬‹Õ´”ϲ”г•ΰ“Í­ŒÑµ—д–Ï®ŽÊ¬Ð³–Ë­Ë®‘Ó³’Ö¹›èèèÆ©‹È§‡þزõѬàààÙÙÙħ‰¿¥‹ÑÑÑÌÌÌÉÉɨš‹ãÁŸíʦå‡Å¨‹ì̫ܻšíͬ߿žÄ§‹Æ¦‡åà޼›À¤‡ÕÕÕËËËÁ¦‹ÔÔÔ¼£‹Ûº™ÚÚÚ³³³ÏÏÏÆ§‡½¡‡§–‡ÛÛÛâÁ¡èǦ޾߾žÝ½œÞ½ëʪíÌ«îͬîÍ­ÜÜÜäÄ£æÅ¥êʩ࿟ìË«!ù,´dÿ€KCƒC!†‡†#Š‹#-Ž‘’“‘'–—™š›;<  ?££8¦¦7©©¬­­9°°³´´3··Aºº1½½@ÀÀ>ÃÃÆÇÈ*ÊË(ÍÎ0ÐÑ+ÓÔEÖTY`LbPÞßße ä tçèçsëìsrïðzòóôòq÷øxúûüþþ4@ ›ƒ(Tx§¡C‡"F´C±bÅ1ظqGB†D@’dž“(SºYɲ˗pbÊ|C³¦‚› @hð`AŸ@JW.]ºvìàÅ«Ç_>~Pÿx  A„l2|øPâD‹3jäXà#H‘JšLÉ–eË—.ÿeάI󦂜;{Ý;´œ9£êºS*‡iS§q F•JµªU¬YµríêlX±dËšE›V-Û¶nÝÀ+ݺ8uòô¹W(Qr€#%\Ø0=ĉï“* ±Uµ˜ ±²eŠbd6»†³ZŸU†ݦ´éÓvñ®níÚol:‚+µ}±îÝŒ©þ.™ø¯Ž#ÇL–¹sÏÑO†=Úúé7Ù©¦wuôUTláÑFÞ<¸§o¾=†•pî½gÜqÉ-·ZÏå§ßtý•ö_€y±Æ°!(˜‚ êÑ ƒª'!BºŸ|vdX߆"uèá~Ôù‡]j%Xàk– ÿa-ºhŒé ´Þ„íw£|:rd‡øådˆrHäv¢˜¤QKŽ×â‹çÅ(åŒ U9Ù•Ò§%#uÝ—p I‰džˆäwi.µ ›º¹9œ‘-T!–eÙž•äa|Â$âw hbkfº"“k>Ùf”‹Äž£6^©“~tŸ¥?‚Øç¦Ž9  Þ©8©‡šš(ªŽ©J%«Vº –¤šÉÊ%­^Úªi˜œj·+¨ƒúÚ‹Á:å Š{rré²°6{Vz~–)iÔæÚi‘ef«ä¨jvûÔ©ÿDh,¹ÈΩìeiè,»Ðî)-¼sÉkí§|Ù‹&¾†’‡¨ÿbáN ðVÉJ„#³["¼V´n‰«MºBT¨Ú&¬ÅÂbL¬ÆqlîÀ¥rž »»pu'£6o Øözï¯ùÂì-”ýÊøoÍ ì1–:Sê#ÉoÝ/ÊC_±Ñ#]±m/Öô›O7õÍS×YðŽó<²Â%ƒÙ0×ÉòÑÛ¾LvÌfO…ö¸P×jÛ¯¾}gÜ•ÎísÝZß-tÞõ‚}Åï4Yv?33ZcÇ_¹=ÖâëÊ ]­O+9€)ë-ñåbg^êÒü ž*ájz|T+k韎õJ&o=¹§®[ŽN¡²ë{Ï·{^.eˆ£ë»ºÍ=ë8h©3“˜]«ÜÝÿ|»œôß´{öíÀ»6õ¡'>úïÙ‹,<ÝY«þ}µÈWN~Ø};Ÿa6‡žõ‰«}ÓÔâg½ùaoVÛ“N÷€f<Ö…/yÿƒ]Ç6@Àq΀4ËÝ£p6Ÿëí,x—zW(¯­ìuËÃ\mœ—›ÚõÆi¸ûÜy':åÀ xWÃñì¶?‡õWŒaìf¨´}©Ïv\ÕûŠS=‚9ð„A|\þ¼w#Ò ‰)*ß:¸ÕÄç1 Š!Ô!ÛhE’®~¦KáÏü„·#-‰²Ù`óÊXÃ'Þpp,Ü«˜3Z­]ÜÛâ ‹XÇ/Þ1Œ4“>™Pz6ƒåçFúAðÿ~Zbäyz³w­¥8oÙL.‚¯¢l©@Å3ÉzðA+&7cIÂ%S§ŒèSÚBñýdo‘ÿÌhQËÓVÎ4Kµ!ŠO,BôCœhU1ÐT.¦õ*Bç9H†:ÕÝ©TÓJÕZTTo]\‘zI¥‚”©c½kNKºLž’Ó™?]©4Qɼvn›~œkMë*Òo–5œQE+J+¸V€ Õ­ì„+f‡ùÕWÚ4¤ÈÄ+T÷éØ~’R¥¦œl[+«Ú>²V³ ällûI9ò•´~ *`S+ØÕ‡ 5&lqúÙ¼†SSEîM»Ü—6×·Ï$]ÚY²Ò’±gÅîqý¹Ý¿¶L«À,¨se \A’w¸Õ­qGË^ ²´»ðµ¬QYIXF7¬²ôìy‹{Òž.Òœ¸fÿ:OËÛïB/©…¥Xí 2ÐÒv¯ü½miÝ+F¢Æ÷²à¥/tÇ»;ü.XŸûu°Z“ûß÷šXÀ\,¸0|àÃn¸¼ŠÍ/zõ*Z÷µ½Êµ1¯™b¹®x³÷¥î‹íãÇú”¹0€oÜÛ 6ïE,‡Ÿ:äëJôÈþÕ-…Uiá3¶Ö°N°yIÊàáYùÁ‘ÍòUa8Ô%Ë·É~3˜…+e:øÁwž1’k\b?£ØËfñ]lh*#Ú¶q’MÐG»¹¾ mq¡ßXg!&Í’Õ²’;=à®ÔÒ3;lÝùÔÚM³ª9­ÑVë8zpó)MêCÛÓy–ðž§ÿ‰ZïÒÒ‚îqœ›Jký^šˆ™¦±š·ìh_Ï×Éâ…²¨{8å8^»œÉFç²)ËægúÉÁ2¹+mîcc;ÝV=³+ìîlÂÛ¾ãæd¹MjotcYÙúfw`ûÙ‡zÒ£ö¤±M샫;á»m7¡ kS›Ì¥%®û›êug|áw¸ãð{¼± 6r®KŽñ5£œÉwx¬‡ñ|Zºàµx¾±ŠQ.·Ùß+8Äç]ìŸSüÞBg«Í™ËðßêÜ㉭v™m­Þg{ÑÛ^u¯süíW_ÝÇròËÓ{æ™ë¹æÜf5Ù½ã/K[Øi×zÈù u/"œè. p—U.Oÿq/]àô&øÓ î÷‹¾ÏrgëiÃדØwºÈ+Þø¡ó¹Ù‚?zÓþðË÷ܬDîºÌIþöǃÞèUoáY~x—'æ·æ<4ÿy~§é³Wºé™žùz/>è—zÜÇ.yWS>Ú’>â›nüÍ÷}÷žß·ÆqNxšÒ^ú¶§¾â­Ïxì+_ì[mþ¯yý›ßçÕç{ùÏ™}…Sý÷£~éÝ?ýâ_þÈg~Ü…~'æmtlƒ&oýÿW[×GçÇkég“‡€wGhï‡zf–]¬÷w½·}–s¤·syrG~(8w"¨$øq²µuU¦{*HbYÿ{øgu#ˆuc6ƒ{ç€óa¼§}7‚ÝVh'ƒÄu‚xeÉ·‚9Øm.˜„®… ¨\×vX„öçl;({Þ'|ü~þ‡{ª7r"¦m»6…‘GÎgí7]èa5ø€DX'wÜ|c¸t˜…vxn)˜‡è†Ì‡ëgws(k˜Ç€hÈ…kvmXtT¨~e÷|·„Yg‚š÷„xuRh‰oè$qÈ~–W†#%~‘È“¨k&7u`؇ù÷‡1؉@è„BXˆšÆVp_z±§b=ȉ?Ø„Ÿ¸‹P(€­¡OlŒ:H‹<ƒ>8kžÊŠQØa`H0z°Í‡³ˆ„~¨„Ó†‹È¨1§†_§kJàIpR€lPË7¦¸ˆ•÷}ª¨`·Çv®øŽ+E^àJ@GpH°\‘)Y‘"𙑰‘Ù‘Y ’0’$Y’6p’'©*¹’,).é’2“1¹4Y“5I8‰“°“<É“=ð“?iB9”D©Fi”5”I‰LÙ”N™P•&0•TÉVy•$•Zi\yZ0]€iàdI–_ÐI@D;TT_v224_html_docs/images/glass/orange/menu_item_head.gif000700 000765 000765 00000006365 11222361074 023100 0ustar00abwabw000000 000000 GIF89a´dæãâèǧéɨèȧâ¡âÁ áÀŸåÄ¤çÆ¥îέܼ›×¹›Úº›Õ¸›Û»›Ñ¶›»«›ÇÇÇÚº™Ø·–Ô³“Ì«ŠÎ­Öµ•Яұڹ™Ù¹˜Ê©‰Ø¸—×¶•ÈÈÈɨˆËª‰Ê¨‰Ñ°Ì¬‹Ò²‘Õ´”Ï®ŽÓ³’Í­Œèèèȧ‡þزÚÚÚõѬÙÙÙàààÌÌÌíʦƧ‡ÏÏÏÜ»šíͬåàÕÕÕÔÔÔÀ¤‡ÑÑѽ¡‡§–‡ì̫Ʀ‡ß¿žÛº™ãÁŸÉÉÉÃ¥‡Þ½œâÁ¡èǦ޾߾žÝ½œÞ½ëʪíÌ«îͬîÍ­ÜÜÜäÄ£æÅ¥êʩ࿟ìË«!ù,´dÿ€,,.7E‡ˆ‡‹Œ’“”’—˜š›œ&žž¡¢£(¥¥%¨¨«¬¬#¯¯²³³'¶¶¹º»)½½$ÀÀÃÄÅ!ÇÈÊË"ÍÎ ÐÑ+Ó3?D:<=ÛÛ1;0**,2@G>OèéèNìíNMðñUóôõóLøùSûüýÿÿ `Á#"X¸PŠÃ‡H”¥¢E‹2f$À‘£‘ ˆi dI*(SªL²%’—0—Èœ©¤¦M80XÐà(@¶Àã… Aª$H N»vñäÙ›šO_¿«`ð`Â# B„8‘âÅ‹7v$2äÈ&ÿOªœÛÒ%Ì—3iÚ¬‰SNž>ƒ ~ñ†#K™6]÷ô]Ô&S©VerkÖ­\»~v,Ù²gѦ]˶í[¸qçÒ­›ä.Þ¼Köò͹³çOÁAsШa#ñbÆOCŽ\o2åÊü² ÀÜ5Àæ°IÒ›ßÅyW•{ÙhgŽ[Â×”—RuæŸc$(g hhhkz¤(j&ÁH…£1Ñh¥_⨞\j¸ç}Vâ€zjP¡&™"©ˆš ‚©J)㣮FZ'…”îhkp¸jê'r½fö«™Á¢9ìY¥–v¬›É¹l«s¾Š´³VÚå­_Z««˜¸í‘„Ž5*¸ÅŠë”ŒªÆêké: +–wº;­;|Êk§õyï Ýú­ÿh±8.Àå6z.Áz¼®¬¸Ñj©SðfZߦØvª­WøV¬ïÅõÛ&Çr™[•ÍÞô,É‚™ü.µñ®|meÙ–³XÞN´d¸7/Ú±À×ólOÚ®´z­2q,#í²Ò3m±ÓjÚ|j”:ÛÅlÁ>gÍnÉ wÍpµFÏ ±VN ªÙ3£}hÆNn,uÎï,gÈqœ%B/ Þ`mYÄ}Ã\vt N,቎*âT+þ6ãX;ž0×—¦ U„}9ß¾jþ7çM›5¸Z¡ÿ{¸wÊšŽ.êþüxävO^tåz·ŒyíÎq øgžó º±¾|Û,ñ wê±_wÿë^¿žëÃÎÓþrôKã~¶îŸóŽývä’¾šð ËD§Ü@…<ùw[^ddç±} I¹PÚ®ç/úál{‰sÛðô§®ð­.OTÞ×h¹>o}ÀšÞtª‡1ù5Yöþ¬ö½âñO|¬CYù†ã0|ì*iÌõàg=FM{ª ‰'©¹m|2 à%Ó<±}l·ÍÄÀ²-‚Ý[EfÁha0‰4_ ³·åHÌv|Ÿw‡Âe“`þÊÃE„y±VÉcGÃò†>'ªŠi KØÆÞ9ðwA¬¤×Å­}1˜#mH¯?æPf;\cü 9?B0ÿŽY<ÝiGGâ1ƒz¤›8;3fŽ}›“" kVŵì~râ(ÁWJºÅ’®£á$ɘ>WB/„î¤&{ÈÉÖ åéHJ­ùò‘ÀQ¢$™×ÇVÚ :á iéC[N-š %5yiÍ#þ2›a&7)YÆoÂ2Š'Ë):8¢Ó{D4ÞO ÆT ‰Ýô %ýÈL>Mmý¼¥ s¹HvÑHæ aGÀü<ñ’"tȾ©±7J4%B¬¨ UwÇ“iT›ò\eB=ºPpbRœË$© ÄàQôj+mä5 úÒxr´ƒ45&¥—L‡.Ÿ&=çD¥9Çý±Ô”.ÿ…§A—hŽ†È€ §H§È$ˆF5…(U$P‹Ø?-½³GÁ<*+ªT@ŠE³Üg3­xÒ­P¥l…!6áºÑóѳ˜öD¦,õYÖZFTªiýëZÚÒ¡ÁT®3ýêGÃzӱ浱På©?§šÎiZU¨îl$cŠÐÃú±® m*NêØ³B“´ÝeP{™Z¢ju>\µÏ\“šX¦.6§äÜ«9Ñêן¶0°Í*a/kXb¾¶¸í;.mCëÉDJö¹”ŪeZ݂զ!Å+c¡¶ÜÛFÖ¹}atÇ»ÕmÊÔµÞ<ã=:Û§*÷±Ì]•ZÁ+ßÊJ®¾¬í*R5[ÓýÞu¤É-©ÿhû*àïÆ÷ªC•îj1‹_ºb7–ùD®^%Ü]ŸRU—ëÜm;1úÖ —·’°ålz!<â–˜{¥­jyËbÕÆõÅõÔ¯bC¼ÝÿÚÖ»ðÕ-t œGàÚ·µÖÍï+‡œÀ"“ø™H>1`Ûaú:9ÁÂÍ,¯ÎëàΪWÄ 5ò„!Û\-O¶Àâ=ð—9e Ù¸Döï•˜å£ø´r³¾ão;¼Å”–·¥ nñ3g{× ïu·;îî:à"7ö1‘mpe£œÙ 7-Ëþ¿‚ÎÈä>6ªÏÍÌtö½nî7°ß-mUR{äB7wÍÑ­mu«œÝ;l¸CNêyWüÁ÷f4¯AÉï /Ýå[wס>ó¡O½èU?ú¾W^G÷¼¨¦³×IöÏf¼Ñú®p’Ÿ êÿh‹Úé3eœh“Ü™8¿:ÇëÞò»Cñaî°©£^pežá‘';Ý«Yù‡;ï@8çKNã4ÂVz ÑpbÇ<èm—ºçÏW6 >éfŸ½åOÿsK9÷wªÍA¿mÉëœò<7½¸o¯zä³>ìµ|ŸGoÑèƒ\í´Þûêû¾èìýŸX‡¾ÖkzãÛyüfnýßÏÛô“Þû/·ýÚe¾T·ï~ù×|¢gÝ·~MwP‰§yÇwñ‡}Ü•r8y÷g€‡‡€™WkcvhõÖxò'vˆ~X€óUÁå! –ÖFsÿGu7'€ ø|8‚²†y&8q(Ho×¶ÿ‚pׂV0(‚L†JÅG}Ç׺§|,È|=ø‚:¦~2(„wâg}ä‡qzLøgY÷„>…5¨xd–ƒH¸ƒJ(w¿WvJmÿv€%$6¸x¸–jI€KX!¨b¥÷}0·¸g„É×_Ø{Ž6`ÁgwÒÇuáÇv~x}~w….h‡?ˆ‡ø—v{˜ˆügW ؈æ÷Ø„1„]Hƒn†(†€8‡‚x±Wˆy˜íG„ïG…™X~ˆ…¨…NŠx7„|X}‹X…ŸG‡f¸ŠiXxkH‚O–€‡˜kØ^ÛG€’H3h_¨€7øu³h…›h‹H‡†„çoL‡RŒ`vˆ*8†:ŃÃHˆÅ(Ž´Ç†É(…Šˆ‰ö¦‰µøˆßÈ}ÓÈ…»è…£ˆÌhŠŒ©wk¡Vm;'8éxŠd(Œ°çŽáxv;TT_v224_html_docs/images/glass/orange/menu_warm_body.gif000700 000765 000765 00000005322 11222361074 023134 0ustar00abwabw000000 000000 GIF89a´dÕðÚÄìÖÀðÛÅñÛÆîØÃôßÉèÓ½çÒ½áϽãнåѽÇÇÇÚº™ÒȽѾ«Ó¿¬×Ã°ÙÆ´ØÆ²Õ®ÐÐÐÛǵÛÇ´Ò¾¬ÙÆ³ÚÆ´ØÄ°ÔÁ­ØÅ±ÔÀ­ÔÀ¬ØÄ±Ö¯ØÅ²ÕÁ®ÛȵнªÏ½ªÊºªÄ§‰½´ªÌ»ªÎ¼ª³³³ìÖÁì×ÁðÚÅí×ÂòÜÇóÝÈêÔ¿ôÞÈôÞÉèèèíØÂñÜÆòÝÈïÙÄëÕÀéÔ¾!ù,´dÿÀÓh8ªF‹riÉ8Ÿ‘¨tÅX¯’¬vêv9`ðg<֘ʹz½¹Ý“¸\.ª×7x|g¿÷øý‚ƒ„†‡‰Š‹ŒŠ$%%*)&(—˜˜+ 4 ¡ 3¤¥31¨©8«¬­«0°±7³´µ··ºº.½½ÀÀ9ÃÄÅÅÈÈ6ËÌÌ/ÏÏ-ÒÒ,ÕÕØØ:ÛÜÝÞ2àá;ãäåæäé  5ñòò œž¢¢¦¥©ª®þ±²j Ä•k—_¿‚0ÆX2eÍšA‹6­…µkÙxÛØ-œ¸s Ë¥3°®Ý»y(ëyú„o”¾Sübøû†À D¨paCÿ† D”8±¢Å‹5räè\ȧ;F–t%={ZºÔSæÌV5mÞ¤Ep€N„.zþúp¨³¢/²Hº”iS¨!¥²£jõêJ­4^Âä÷lͱdsD«ví±¶nmL|aT.ݺßîâ=§×dÕ¾*ïiܵ0«°ˆg•=ËS¡ãÇÉ"K†;ÍrFÌ™=næ¬nïɾ5Bgý²´i¨S¯^Ü:Øk‡ÝN®Œô6nnMeì6×™/pá,[’ŽyùaåŠw1výÛ%£$ùVÿêt®èr½®__‡²¡Ì”Âr& õ¶95Ä=£Ü/fÿZð´ÃL ™ØVZ3ÈO󨳬áRV+¿Îòá×½UØx7®·¶Ÿm¯Úù²-xæ+ãÕ2»½Úý«Wy‹õÿ±YÅŠ|zɳ.1­Cõ:݉#]°Ø4ÑܪÙ}Ç _ÄͲ®5ÀDÃØyñ`zÇŽ/_zó“?ï{ôÀOoxõ]Ãþ²ì1Ó.ºíã¾0Ô §Íûɿ㪮èÏO»Æ[¼Æ¦¼„Éïf’“ÚΧºü½mqS¯Ö÷9í¹{£»¦tç·®ÍrãºZʼ§ ﱫ •–¼îpƒôCÛOPg2èa®|B£žÜ&è¹ÀÌ.XdkÚ÷ºµ»¿}ðP7Ô_‹\Ô?b} » ]X¶!rÐy³j ù”È¿í‰* ò\Á4ÕЋˆ¤Õ@h5·e-‡çó"âü“½ŽÿÑ0¬â#—3ª‘llÐÞ·­Ið‹t„¢˜G!îÑtiŸ“øÀ%žCôaûIEGÂ0ö3bê¹:R‡‡œã’69³Nš‘yhÄbå(ÂÁÕEs®ãœ×À¨É(r2ƒñûdCéÁQÒÒ$4ßæšˆÈUú²•ÀôÞ#ÁçGI’Ò„„ !‹¦J=Ùq{SŒæ sÃ"³†ã£d6-©KõõðnRl¡8õ(̨óG¼\-¥ÇeÊñz‰ #ã0?iÖ³~3¼Ÿ ÷iJm¢’›uæ"¡YÐqΔ %:'ÉP.F¢» h/'Z»½ñŠáËâ5·XÉ.¦2¢ÿÞ#8åYQz’£ ¡aï8ŠÌ[–0/í$žHáùËšzò¦ÃÌè9wºRu&³Ÿ¹df7'Óx’1ˆ¯´b9#©Òcò©§ŒãKC*ÑoZ®DÓI·*Ë5zk`u¨XAêN^•¢&…%J«ÙU}öt)¸^PQ˜É»–”tÓŒeJgéׯúT™Qý'Yc:Ðp5«‰Ýë=­ùÖ>ª‚•*L©ZYšæU«8e‹F™ÚY[ö§ ¹$ëXÕ¢ž6³l]¬[ ×φ՟c­ëPˆWÄT†9Uh:;ÚÒZo²¤ i‹T{*ŸÆä­g_ ÙÐJV¸e­mq5X]„&wµøcÿé:]JW¡†·´Wm$fkNìn´©Ì]¯sÓç^ÊJ7¾iå›bùÊØþÕ.Ý5á`1ùNâ–¼Mêy—š^§úV®Àm/aÌʳ¼ÈU-…zàVÁ¢…nÅëaƒ‚¸¾œÕ®k Z·¿Ñe!€çyÔ[wÂöe­ŒùùÛÈÇ+†/Zy<ßsµÀmt,wk ԃ׿:^òeÕª×Üx·–2‹ìÝ#oØ®~ßméûd0G¹·S&³ÍÌ`4wXÍÔõ±yEä ç7®ì´2’i«äÓ`•˨•0Ÿcf8ÃFÖp‡{g‚®ÙÉmdk‰ é2Kz¶Š4«mÿóŒ@EC§~.qn¨ÛƒZ ÿÕò¥õâS+—§b61ly#è3Sú™-¶h©¼è¾6z»ô}ýÞXZ¾ˆÆmjm^çzÕr®ò²'Ýì,?;Àk6lF¼\Uwd×Üqu G*êñ~˜Ö06ö›‘­ëk›Î¯f7‹ñ áaï™Ú䯵£ëÍj^o;߆å÷»ý]ëq÷ÙÚÇv§çüéu'ÜÒ¤æ#±þðr_ûÜönu¯¹å;~›ÉÑfs¦óyì<Û"?¸ÅÓŒñ~küßgô¼].qeã{æ•¶ì¬o( 2â /xºGŽpš =ã\yv[ÎiŸW¼°NŸ®Í£®ï[M¹¡Vî•slòWZÀš½®ÎNïž³Wìƒõ¾k¾ð›7:Õö8ÒírƒÿëA×zݹþe¯Sìoç/³K>Óoí^Þ¬¼ÙÎó¤ÃÜïWç0°îbx·Ùð;¯zâýGr²7^ÖP§¦ä^Jnî‹7ýYOþøp›:ç“o}s_¯øÒ'ÙÙf‡6äÅ÷€ã×Ü|WºHÔ øÍÓ½óDÿ<ËCøý’¾éwüÐí^t7S^ôÖwâ¯IÊyas_úS§¾ë {ßøæ¾í7Ž{ÖcУ·Ëpw™øÃ€j×v–7q÷öiA;TT_v224_html_docs/images/glass/orange/menu_warm_foot.gif000700 000765 000765 00000006130 11222361074 023144 0ustar00abwabw000000 000000 GIF89a´dæîØÃìÖÀðÛÅðÚÄñÛÆôßÉèÓ½çÒ½ãнáϽÒȽåѽÇÇÇÚº™Ñ¾«Ó¿¬×ðط–ÙÆ´Öµ•έÐÐÐØÆ²Ì«ŠÔ³“ұЯÕ®Ûǵڹ™ÛÇ´Ù¹˜Ê¨‰×¶•ÙÆ³ÚÆ´Ò¾¬Ê©‰Ëª‰Ø¸—ɨˆÕ´”ØÅ²ØÄ±ØÅ±ÔÀ­ÔÁ­Ñ°Ö¯ÈÈÈØÄ°Ò²‘ÔÀ¬Ì¬‹ÕÁ®Í­ŒÏ®ŽÓ³’ÛȵнªÈ§‡þزàààõѬßßßϽªÉÉɽ¡‡âĦ§–‡ËËËÆ¦‡Þ¼›Ä§‰Ü»šçççíÔ»ÏÏÏæææÎ¼ªóÝÇÑÑÑÆ§‡À¤‡ÊºªòÜÅåུªÞÀ¡ãÁŸòÝÇÙÙÙîÖ½åååÌÌÌíʦ̻ªÃ¥‡³³³ìÖÁì×ÁðÚÅí×ÂòÜÇóÝÈêÔ¿ôÞÈôÞÉèèèíØÂñÜÆòÝÈïÙÄëÕÀéÔ¾!ù,´dÿ€I:ƒ:†‡†Š‹#Ž‘’“‘"–—™š›*,  +££2¦¦©ª««0®®±²²6µµ.¸¸-»»4¾¾ÁÂÃÄ$ÆÇÉÊËÌÊ;ÏAAO`TWרØb Ýkàáàjäåjhèéoëìíëgðñnóôõ÷÷úúeýýÂH°`A¶YÈ¡™‡ÉH”8¦bÅ1ÆÙȱ£Ç4 CÊI²¤I’R8°Albʔɀ›7qâÌ•K§ÎÏxòê Å—oŸÿ0È”`B… BŒ8‘ŒÅ‹xÜÚ1¤È“`K¦4°²åË™hkzû†sœÎs<ÿÑøü ôŒÐ¡DEªtiS¦OD•:µªÕ«YµråêdØÇrÆ–u -M›ÝÚºÕWîÜvuíÞ¥G”€^¤eúþüt°ÃÂU¯ŽI¼˜qcÈa%³¤lùòZÍkÞÂåùtÝѤóE­zõÁÖ®ÛL5cX6íÚoã>©ÛlåÞjojÞ¹8»ÐÈç•>ÍW©óç £K‡=ÑzVìÙ½nç®r÷ÙÞl„—Ùxo•gÞ襷ÞríôžSй6]uˆÝ‡G¥±ŸIÝñ €lµE^\"xœ‚ÊíÜ{˜|ÆVaFb¨Ý†#uøx˜…ˆÓˆÄ˜ r ªØ @-¾]ÿŒõͨQqdˆ#Jýy`€=dOæ 9Z‘üé׃JJHEN*V£”SFV¥‡<þF g$ y"‘)†éOsdF8“hZtÝš7â¨ãw–¨euvyç—yîµ'‹}Ʒ䙇 j!¡úµy蕊ÎiŽŽ•ž`Jš”ƒIú ™bE#”lNùé‡YŠºS£ÅyyWª+²Z)TfBD¡¦³rú•­oî˜h®"2d©Aá‰{“ û^™bj_²Öjh³ˆ¦íÒrÙ룿F,’à v©±2"û¤²ŽyJ.¨çæ”.:%úŠ×µ f ï¶®Fo“öªn¡Þ§xÑÒ9íÿº¦¢H°‘‰°¥ÅR۬÷>Ü)³dùWîL¡V<*¯Ÿ l»b¶èb¯-(Éã'nÄûâ*§Ë»^3»Åñª;Çí«Þ¦ e”ï'ñ³C£k±ºGgl­Òz2í±Ó8/ë·%û\õvW››µ¿[l§×nvj”~Ll·:Ç:Û¦&/;nÊV M±Ö/=—ÌÉÙ­*ÞÚ’ 2ß"ïü7¸jŸ<ødκ}8܉s½8Ò3;þîØ«=­på~x¾(s¾²oŸ‡³¥ÜÔÂs*°5·:9Ô}£Ý3v?[ôÄM©W[7Øó©·¼!SW/ÏSÏöñX×¾Yè¸7¯»ÿÆÐŸn³ê9³.|ökãÖ6ËýÚþ¯g¹‹öµi‹}~Ùó/5­íƒÌûh—<ÄMtt¡[»L×»xÁ(j cŸæ€F88u¯€ ;`øºæ¼–¯Ó{ ÿ"À ¯‚ƒßÛä7ú‰Ï~ÏÃßÒ ×´Ôñïlÿ׆ô…ÂÙŤe\ÌF§À¤ÉðnÒ“ÜÞ€§¾¾n‡±S¿Vø= ºƒã»¶ôç»%®Îz#»\ÚˆÀÇ ð‡ñ«¢—Àq‹4DÝ_Ðg6b¯„‚£ ì¦è½àÌ/`¤kÜ;¶¿ß}ñXwÔa›ÜÔC>b…à»"ÝXºArÑój" ÉÃ=îÿ‘jÝÁ8õÐŒ]¤åÀh9×e.'ô$ò|”Á5ŽÒ8E¬ä£—7%ª’‰¬là^ »ÍIñ“´„¤™KAîÒ|©¡&ùÄEžKTôc ™IIgÂ1‰64dú‚¹><Sǜ墶9·nš’¨Ädõ)ÆáÕF{îãžç@©ÍHr3‹1üf/ÃéÅqÒÓ•d4áö‰Ìuú³õà3AèKi’ӉĄ¢1 §N]Ùrƒ“ŒèóÇB´Ž#¤fF­©Oöñv’l£Hu)ÐÈô—‡¼^=%Ë…Êò‚É %ó°C‰Ö´†s¼¡wjN¢“£@uè2!ZԑΜIÿ'J§ÉTNFªû j?§Z¿Ýò’!ÌäE7YÍN¦3ª%HeZUš’«M¡cÿ¸ŠÐ{–17-% XaúϺzó®ÍêI÷ºV•&´§ùdhG•'ט’2ï´dI£©Öƒó±çŒå[Ã*ÕZ—îDÕY7+ÏUzs uªhÁêR~–ªf…'Z+ÚYöu1ø``јÍÛ–•|gZçéÛÏúU¡‘ý)iã:Ô6³ÉÝíM-úÚ1>²Â•,\)[]ºæV³xeVÛ]{÷¯`¹&kYÙž7»¬]®k› Ûï†Ö§£­í`ÿˆ[äUŽyUjJ»ÚÖ¯Zpºä¢ÿy ŒX›*§å¯wß ÝðJWÀ¥­oµXa¤&x½8dëJÝJ[Á†¸¼—m&vlR oµ± ^±ƒSèbêJ8Æ©åryËÜ0þÖ66ãp±ùR—ÄWM쉛bÇúW¶n1q›ÌÎ'´ÄV/•—zä­WÉâ…pEìe£‚¹ÆÜÕ°{‘ ^4¸Çf#gzØ([xÊ6f¯œyúßèÏk†1jù<ã7s¶È­t.‡ë Ø4ƒØÇz^ôuU«Ûüy¿F–4 íáCoÙ¶N~á}iühPGº¿“&µMÍdTwYÕö³‰Åè*ç8¶,µ4¢é«èó`–Óè•2¯ãÿjXˆÖr­|k¢®ÚÑ­f{ íRK{¾Ê4­}sDeD¯¾.s~(ß%ƒ[¨?Öôµuæs+˜¯¢63|ù#ìSSû¡m¶j¹ÿ¼ìÞ6{ÃÏöýýâx[ÆÈÆozíb2ç{ݲ®ô§ÝðL?<È«8|Ƽ`uweßrwÇ*î™Þp6ø«®ï$kœÖïf9›q åïšâ$Ç·³kÎn~o<çÆåùË}^ï‘÷ÚâCÇx·gýí•'ÝÚäæ%Áþô’_üä6ow¿9Žé[~œÑgu¶szð9=ãb?ºÕSõžkýçNgöÌÝ.u…ã|îÕ¶î¼™sÿH 3ê`/zÊÇŽtº >ëÐ\{†ÛÎm¿W½¸ŽŸ°Ý#¯_mº©–ð¥ólöw[ÈÚ½°ÞOó¾³XôÃ÷Îë¾ô»7B÷:âmv£ÿó×|í9ÿiÏSô¯ç1ÃË>×=oõžÞ®ÌYÏ÷ÄÃÝ÷—ç2À•îf˜·Úø{¯|ò}HvÒ7_Þ§¨ô _N¯nöË7ÿiÏþü›;ïÓoƒß¯üò'Úá¦qÐ'r¸t8fr¼§xbánJÚGVÜ'p¶Wx®F}â·c>´B\ð€-pvå}’wcÛ†| @Ð?€Z`kÛG{ÝGxßÇvág‚ü7;Nàµ>Ð_@LPWz&"€ö·uøÇ~lã‡]°lÐ=ðV€p…Xx…°…\ø'ð…`b8†d(†!p†h8j¸†l˜n膇r8‡9P‡u8xˆ‡°‡|ȇ/ð‡¨‚8ˆƒˆ†hˆˆŠ¸ˆ7ЈX‰0‰”X‰&p‰˜Xš¸‰ Ð‰žˆ Š<0ŠRpa0CP1°Š«hQà1;TT_v224_html_docs/images/glass/orange/menu_warm_head.gif000700 000765 000765 00000005737 11222361074 023112 0ustar00abwabw000000 000000 GIF89a´dæìÖÀðÚÄðÛÅîØÃñÛÆôßÉèÓ½çÒ½áϽåѽãнÒȽں™ÇÇÇØ·–Ô³“Ì«ŠÎ­Öµ•ұЯڹ™Ù¹˜É¨ˆØ¸—˪‰Ê¨‰×¶•Ê©‰Ñ°Ì¬‹Í­ŒÈÈÈÏ®ŽÓ³’Ò²‘Õ´”þزȧ‡ÌÌÌàààßßßõÑ¬æææÞ½œåàƦ‡ÏÏÏÜ»šÞÀ¡åååîÖ½À¤‡ÙÙÙíʦå‡òÝÇòÜÅãÁŸ½¡‡ÉÉÉóÝǧ–‡Æ§‡ÐÐÐâĦÑÑÑíÔ»ìÖÁì×ÁðÚÅí×ÂòÜÇóÝÈêÔ¿ôÞÈôÞÉèèèíØÂñÜÆòÝÈïÙÄëÕÀéÔ¾!ù,´dÿ€%%*-,‡ˆ‡‹Œ’“”’—˜š›œ$žž¡¢£"¥¥#¨¨«¬¬¯¯²³³!¶¶¹º»½½ÀÀÃÄÅÇÈÊËÍÎÐÑ&Ó?.74;> ÛÛ'B(MM%6AC9LèéèKìíKIðñPóôõóHøùOûüýÿÿh¤`ÁFYȰaÃ!:™H‘â‘‹‹hÔH¤cG AJI²¤I%(SNYɲ¥K–b8@‚árÊH¤F1p( N»vñäÙ[šO_¿§`ð`³2Œ(±bEŒ7ñø1$“hK¦Tù²m˘ÿfÖ¼™³îŠ(tÌJ´èº£ï’&YÊ´)’§P£N¥Zõ*V­Y¹ðú¬Ø±dÍžM›v-J· §À•kgÝœ)^ÀèÁ×ïߣ‚®gø0b~Q ,®jÄ1äÈ\)[´,–,Íœ;{ív4ÍÒ§s®àÁ€o_¿€'MÛðmÜŠ§òöýûapáNÀ¹lyò“Ë™¿t>×tô& ª·v=6wzµ}·On»5vUyæE„^zÄmÔžYïÁ·–|óÉô]÷á§ßP®1ÑŸ`ÿÝ《g`Bnužpê±—„’䙺Dtæg]‡nb€$†7Ðx¦…d ¶XÜÿ‹!Å(c|5®t#†÷é¸v€ù÷ãˆß•8ä‰ ‰$zJ:ȤHNJ1c”0YX_†îÈ_– nÙ”€OxI˜¥8&‹ rtæfN®É¦hnâXå†×Õ£RÿÙ¥{DžŸ+RV¦ ¹W(”QNi_tVr8'luFÊåmz2fi‘˜*Hf ˜u ã§**œ¥6j>ªzgø*ŠbfêÕ¦µ–Õdš†²¹kŽŒò,¤ÜIÊ*¥®Z…l¬]Š‘‹¶>‹+[Ò&J%©ÕžêŽ–Â:5i±&&¸“Í:î’å¢yîgºª;êi½Z‹j°Ù®ŠX«D~‹àŸšÒú ¹1FªÿÀ¼¶‹åÁØÎ¦íÂÜ6|ïÃÊV¶¯™ýZ1¨5N»¨œ¿›jÂÃÎ+Õ—ööI²¬â†…²³þ®œkºq]8p]»‹ÔÌ+œ½8{;ry/+ñ iªÉ2….³ ³£×Â"?}s¥RëLuÉÃÌ)Ð*GhqËSûõ¯‹m§¼ÛBvo°înÄn7{Ü­B£{qÑoÚ}%ØyË/>x2̧‘G²=³-÷ÖòuM°ÆËŒpÓ5÷}v·€;¼6Ï„ûüöá>ô⤭;úÝé<ª÷ä¶Ù¬[½ic^µÉ²îiâûÑ9%óÒ§V¶?!_ž,ìVÞyÜïÍÍuÿÝ/?Ž·é[ï4ö~³~©àùö¼¿pg-~èä{m~ïaKN3ß kŸÈÔö›ãµ-yß³è˜#:¤‘î|ÔK_aRÀÕ Ðxšc÷°­†¦Ñ{ ÿ"7¶ëG€ÚÃW’®–2ÞŽnŒS”þL5=vÀë”#–S¿n°…|áøb¨;òî5èûƒ§ºáE­uS+`9ÇÁÑ(`D„^8¤Wº*u4›ÿö¾× ®{¬"ó®è<£eìˆê_ ×wÂæ ƒÜCÞü~F;υσ áEˆD/úŒ9ž±Š·½3ê‘\õ ¢â`ø¼7î¯6dšú((ÆEB‘ÿ€1àæXI+ QY´$ »˜ÉêM0Œì³##U¨¯4Ñ”X¬¤ãV ÁVJÐ&PöîØÈøÅn³[ží&9D]–—#Lâ!7 Ë:ŽÑ}3£1шLå!n™ÍÃwé«hrŽœŒå5/XLÚ²”k<¥ ãtÉ8’po‰l¢'Ë(Å<°› ”d8)9Îg–“ÚùewÒiÍ}f³ŸŽü'$û¾äÜùÛ]=}7ÍW泂ëä¡6Ý P5‚“âlœA &MtVS˜($&-å7QeþQˆøK%9YzN|2¤uD·ùHúQÔ…ÌÌ©3gxP{¶Ô§•æ,{XË’Þ2ž¹ÿ,(SyêË/Ró£$Þ'ñÑQþž'•gF¸Q9BU‡!•)UijT›ZÍYkáÈQ—‚UAb(§HÊ£ ¥UéV•ÖÕŽ“Ž0•åXÛYÕš~ó¦IŨNWÊØ„zÕ£? ëù9Xšõ†Åe«Qh"ô†ˆ -`ÅJZ­ˆRƒ¨µ+g.úA½’¯n^Tc:Õ‘V¶®—½+N5»ÔÖ6µ¯oU$mZÚ²âÖªhÅì@›©UçrÕ³Ž]èKó$ÕÉÎô˜–­vË]Ö²ÕµNí©páXPÚ–°gM-VW+Cïv¶_•mC§+ÔêU¢ÈU¯r3ÛÛÍ.¶†àõ«ÿ€#×╤éõã‚·«Ôî¾÷¹Á]âp%[[à˜öº®ènñÚ–yr±—Ž®> ,Øûž˜ŠWMkVÝ»×¶Þs¾Ò-uml]gwÃìí0ëã§yÆB.0‘|ZìêWÇü-bá Ý'•Æö5q‘ «[å,·ÁÍýðw ÚWؼsEo‚5¼â3Ò·ôärˆcëæú’•Ê(ž³ŠÍÌà;;Ø¿fócJa?S–®|,3Zxkè4oÄ?1}Áüg ©f®‡/½fM¶yÓQ®±˜mä+¯W­‡VóM½èñZN®Æ…t2“[çBç5Ö¤žµ+ký×§:̹m«%ÿ-!_·Ï/6gc%ÜgN?ZΑæ5¡CæQ3YÏ™æ3ªÉ8äU{:Û î5·+ííz¾?Éïd×|íá]wÜ·>Ζ‡ýÁgß_Y þß„·uyúÄ·]ê²ßqóƒýü“­å†—ø…¡~ýØ—¾ñÁ§}“9^ü´ç~í/ÿòµ¯å”ëü³Ä~xø©¿û¯[™è¿gzotÃÇ~Çz"5~lPª•RÛg݇7yjWy¯§xó—eZx¬”uh·uïg¦|˜G˜z¶—‚®7‚X‚¨J·tZ7[”ׂUfDDD555nnnÚÚÚÕÕÕ!Y,~~~¶Æ¹ÝâÞêìëfff"\-ÄÑÇààà8•IÂÂÂÏØÐHHH5Eçêè$$$ U*1?@«S²²²!!!»È½ŠŠŠ===§ºªQQQmr6‘GÜÜÜ^^^:fB)))ÎÎÎ%d1ÆÆÆ@@@:™Jb…i ?¨RV{]-x;€œ†:::|™‚,u:'h3RRR¢¶¥ccc3ˆB©©©èëé*p7@¨R;M™™™¯À²³Ã¶$a0S)ÑÑÑ,]5=¢O‘‘‘ÌÌÌÊÊÊÄÄÄqqqˆˆˆëïëqw¨•*r8ÙáÛGpO*^4ËÖÍÉÔ˽ÊÀ```¥¥¥sss:›L®¿±>kG!X+>¦Q>¥Qïñððòñ=£P<žM888ÔÝÖ+t9/}>NuVLtTw•}nŽt¥¸¨$a/SzZ3‰C1‚@j‹q-[6#V,.]8'X1&W/õõõïïïúúúóóóîîîB¯UA¬TB®UA­UB¯VA­TiiiA®UèèèëëëÖÖÖhhh?§R×××ÙÙÙ---åå寯¯žžžãããØØØÓÓÓ®®®B­Uêêêãçäääätttââ⪪ªÒÒÒóõóééé§§§íîí¦¹©ÒÜÔwwwÑÚÓéíê¾¾¾0>‘©–„Ÿ‰ãè䑪–3`;7“H%X/NwV.`7÷ø÷˜¯œgˆlûüû4ŠC´Ä·›„*[3x—~ÈÒÊõ÷õîïîh‰nâèã#_/¡¡¡“ª—[€bØßÙA®V¤¸§—¯œ¹Ç»áæâòóò@jIêëêz—€r’xt’yt”zkkk.{<°Â³ÇÒÉöööøøøíííýýýñññüüüùùùôôô÷÷÷òòòûûûððð@ªS!ù,F2ÿí H° AƒÐæ¸Y§2D-ŠgÚÁ‹3jÄ8@…G¦@¢–C[¼Mr4ׯ—ñÉœI³¦M™ÚÊUòvH Z :}úЧ>@ ñIWâ¦Ó§P£Î †h$?¡>ÙøÇµ+× ŸH z"¦ ©hÓÚŒ€á Nž¼Ê• j‹#DT¨uÚ¯¯ß¿€ ¨¹ˆåvJõÆR‰À#KžÜœ˜G¡2$ÞÜUT†)׿PMÚ/kBmåÌÚS†-Ø”žY …B¤V³nêÈÚÀÿJñHÔîãÿ:±&x?MУKŸ®)˜¥G vgØ®{3©BxQÿO¾¼t)GšhÞL«Ó¿T©lÀå *ÏŒxæÉçÛÏ¿¿ÿnË`Êf6€¢F*©¤çÈ‘¢ryR%L:)2VbùO($¢§¨¦ªj¥—"¦)§ªîÿꕈ‘jj¬¸ªÊ§ŸˆÚÈ1±nPÈŸs)êÈ<¹&;éež)pê0—Ä™Ò(é<Üvëí·K69—(‚ŒÎ·ÜbÂM¨þã€5èÆ+ï¼ÜÎXãµÔÌp :Þ& yéj‘ŒÐ/&'¬ðÂhÈá\b‘Bà ¬Ç3G° 'bÀp8 ‡,òÈ!'ÓAj2@Í%. ‚d·™([,A2Éúä¬óÎ<ë³Nzë!Êè|Î28K—}zôìôÓPïìY.9;·Á.ÄBÀAÔ`‡ópe`êU't`ËÎæÌ ±g3#Æb× õqlJÐYÚÿ@…Ý=Þ=Û:Ü;Ý<!ù,ÿ€ %85D‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›3:% 49C¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼°21,! ;6EBÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞÐE70 !,¤ Eìíîïðñòóôõö÷øùúûüýþÿåm`,Ã…°ÀÀE‹@"JœH±¢Å‹3jÜȱ£Ç CŠI²dÄ-\0°`€ÀÁ (¬ ¢‰ 8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê'‰"*´„ð`…Š1 œ0P!… xˆK¶¬Ù³hÓª]˶­Û·pÿãÊK·®Ü,¤z‚Õ*hðƒ& @!A€Ç#KžL¹²å˘3kÞ̹³çÏ C‹îÜ…b`øÑà@€×FÆâ°=rëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_Î<ùíÔ V7á:@’ë¯ øð°`A‚?‹O¾¼ùóèÓ«_Ͼ½û÷ðãËŸO?þ÷î|x}=É€þI¼–v>hà&¨à‚ 6èàƒF(á„Vhá…ZXÀ~8À‡ÿ(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ0‚¨Ä8æ¨ãŽ<öèã@)äDiä‘H&©ä™’L6éä“PF)å”TVyäXf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæ©çž|öÙç€*è „j衈&ªè¢Œ6êè£F*餔JŠÄ¥˜fªé¦œvêé§ †*ꨤ–jꩨ¦ªêª©áê«°Æ*무Öjë­¸æªë®¼öêë¯À+,°;TT_v224_html_docs/images/glass/orange/right.gif000700 000765 000765 00000000136 11222361074 021240 0ustar00abwabw000000 000000 GIF89a ¢óy?ëuÕjápù|ý~ÿ!ù, #Ce'Ê)sêcÛÛZ‡”ø‘Õâe(§Ž­{­É¢v|$;TT_v224_html_docs/images/glass/orange/show_menu.gif000700 000765 000765 00000000714 11222361074 022131 0ustar00abwabw000000 000000 GIF89a(ÕÙÙÙåååÉÉÉÊÊÊËËËÚÚÚòòò×××ÔÔÔÞÞÞáááèèèÑÑÑÓÓÓØØØÛÛÛìììçççÏÏÏíííêêêÍÍÍÈÈÈøøøõõõúúúùùùÆÆÆöööÇÇÇ÷÷÷ÌÌÌûûû!ù,(é@pH,ȤrÉl:ŸÐ¨rP\’v+x$/ ÄB˜)W,I¤Ì.Ððx¡ÍŽHÐú'Ž˜Ðÿ€lq‰Œ‰”Œ‘•‘‹›‰“›–‰§Ÿ¡§Ÿ²Ÿ§Œ†®§£¥¶—ª¬žÄÇÈÄÈÏÇÌÐÌÏ Úàáá ÏÙéÆéïéÖÈðïÇð ìÁ“g­žÀt0pw°¡Ã‡#J„È¡¢Å‹3jÜȱ£Ç1ˆI²¤É“(I;TT_v224_html_docs/images/glass/orange/show_menu_roll.gif000700 000765 000765 00000000714 11222361074 023161 0ustar00abwabw000000 000000 GIF89a(ÕŸŸŸ¹¹¹———   ÒÒÒºººììì···®®®ÓÓÓ¸¸¸ÅÅÅ£££¢¢¢«««¡¡¡ÖÖÖááášššžžžÛÛÛóóóÇÇÇÕÕÕ­­­¯¯¯›››ààà”””–––øøøõõõùùùúúúööö•••÷÷÷ûûû!ù,(éÀ’pH,ȤrÉl:ŸÐ¨‚±ˆ’v+($E D*?:Æ¥Ì.Ððx Í¾0Ð: ž‰Ðÿ€lq! ‰#Œ‰ ”Œ‘•#$‘ ›#‰“¢#— ¢ž‘¡¨ŸµŸ¨#µ²• ¦¹ª ®žÈ‹•È ¹ Í™›"Í”×ÝÞÞ”Ö$æ æíæéñòîí éî õÜÁ“—Ž^@s8`w°¡Ã‡#J„(¢¢Å‹3jÜȱ£Ç?ˆI²¤É“(I;TT_v224_html_docs/images/glass/orange/tab_cold.gif000700 000765 000765 00000003533 11222361074 021676 0ustar00abwabw000000 000000 GIF89a (÷×××ÀÀÀÚ:×9Ò8Ë6Ã5^°0j-Û:Ê6Â5«/Ü:Ñ8Ú;Ù:Û;Ó9Ù9°/Í8¬/Ä5Ì7Ø9Ö9Æ6Õ:_Ó8Ô9ïïïéééÙ;Ø:Ð8ÓÏÍÊ7ððð×:êêêÎ8Ò9Ï8È8·2¼4Ä7Ô:Õ9Ö:Ö8¼3Ó:pÈ6Ê8·4'±1ÑÑÑîîîØ;Ï9Ñ9Í7±2Â4a···Ç6gµ2¸¸¸²Ÿ˜èèèëëëÊÊÊÍ9¢„VÀ5ÝÝÜÁ6_æææ€P=Ñ:ÝÜܳ2°1¤¤¤x#¾6àßß[#d•*ÔÑЫ”Œ»»»~#“)­•Œ|#¸3Ë8ÍÍÍÎ9¯2¯1¼¼¼«1‰(¯¯¯r ¹3¾4ho¢‡}–*+´3”o`µ1s!`¬”‹»5€#½6Æ5Ð9”m_Ÿ.¾5ÅÅÅ”n`«««Ã¹µÏÉÇÇ7Ã6Å6£ˆ}f8$²2{$¸2¤-yyyÒ:i»3³1²1œ+ÒÒÒ½3Å7È7«¤¢‡‡‡|"eÓÓÓÚÙØ—,w Å5ÕÒÒ{#wA*e¬1µµµ·¥ž¾¾¾¥0Ä6Š`NÌ8›-µ3ÇÀ½^¦/Ë7Å»·}#ÇÇÇÔÔÔÎÎÎÛÛÛŽŽŽÜÜÜäääàààÞÞÞÝÝÝâââáááßßßóóóòòòñññ!ù, (ÿT   Áƒ*\Ȱ¡Ã‡#Jœhpà@3j$H¡# ˆI²¤É“(Sª\‰²Ë—0UºD RƒÇ‚7 Œ@bà >| @´¨Ñ£H“*]Ê´©ÑP£>pJµêS©S 0ÄŒ $"D€A‚Ù³"lA D‹!2˜K·®Ý»xóêÝË—î‚¿€÷LxnàÀvãfÒ¢®`Å–•–ç„~åàÀ C‹Mº´éÓ¨SƒfÀºukÕ°c¯vý:´çVä8aa… RŒ KH‡¤ àÁ¤äSУKŸN½ºõëØ³W¨p¡÷ïß/lÿÏNžüöîàˇÞàD™Ä»p #ò§èÀâ P¬$aÅhà&¨à‚ 6h`F(aVhá„h*œàp ™¼`Ã-¼ ! )Ð  ìRH#hÁÌŒ4Öhã8æ¨ãŽ<öèã@ ª˜ŒXàÀÃ0ÄK›ÜpCPp -Af©å–\vée&¨¡Gw`ÐÆˆaA$0$ÒÌ—pÆ)çœ^šð~Lá‚:¸Pe4#è „j衈&ªè¢Œ6êè£::È+q,Ã(’°a‡2‘vêé§ †*ê¢L¬A!_bÉ£¶êê«°ŠÿJI0\ì°Ã$£ë®¼öêë¯À+ì°Äkì±È&› .tȇ-¹*+í´ÔVkíµ¾º’¾(â3à†+î¸ä–kî¹è¦«îºì¶ëî»à>ˆ.«| ï½øæ«ï¾üš»‡}ÒïÀlp¾ËÀrI/Ê4ìðÃG,ñÄWlñÅg¬ñÆ?ÌK,at,òÈ$—lòÉG!Å2,·ìòË0Ç,óÌ4×lóÍ8ç¬óÎ/ûP Ï@-ôÐD]s*¥£ôÒL7íôÓPG-õÔTWmõÕXgÝt(rãõ×`‡-öØd—möÙh§­öÚl·¶g ÷Üt×m÷Ýxç­÷Þ|÷ÿí÷߀^·K cøáˆ'®øâŒ7îøãG.ùä”Wžø³£ùæœwîùç ‡.ú褗nú騧Þ9#uãúë°Ç.ûì´×nûí¸ç®ûî¼÷{-Ž üðÄoüñÈ'¯üòÌ7ïüóÐG_ü]cýõØg¯ýöÜwïý÷à‡/þøä—Ÿ½)š<£þúì·ïþûðÇ/ÿüô×oÿýøçß> *èïÿÿ  8?þð€L È?h8ðŒ 'HÁ Zð‚Ì 7ÈÁF0"ð GHšð„! WȺЄ Œ† gHÃÚð†8Ì¡wÈÃúð‡@ b 8Ð!ñˆHL¢—¸Ãˆ€‰PŒ¢§¨Ä8á ÈÈ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhìb@;TT_v224_html_docs/images/glass/orange/tab_pre.gif000700 000765 000765 00000002211 11222361074 021533 0ustar00abwabw000000 000000 GIF89a (÷Ú;îÆ²áEàCÞ>ß@áDàBÜ<ôȲñDzÝ=ÖCèIJ``Û:Û;ÐBëŲ_ßAÚEϼ²Ý?ÞEÕ:éų²4Û=Þ=óȲÌ@öɲн³Þ?ß?êŲõȲôȳöɳÉA•0Ø;²5ìÆ²Ý>Ù:ßDÖBïÆ³Û@Û>íÆ²Ö=Æ:ÞBßCÏ?Ç<ÜCÛ<ÖAÎ>Æ;³6Ï@³7Î=Ð;õȳÕ@Ò9ÛAÕ?ÞAòdzðDzÜBÕ=Ú<ÔB±6Ò;Ѽ²Ô;м²¿>Æ=V[Ç9×;Y 3ÙC½4¹;¿<åòÎ;Ä7’.æÃ²ìŲ±8”/Æ6·:ã²Î:s çIJïdz´3Ö;È9¾5Ó:Ý@³3—*Ø<Ú?Í8Ã=ïDzŠ,Ï»²w&É?òDz]«5â²òȲ„*ïÆ²Æ9Î<ÏAéŲÉ9?.Ñ9Å9ØDØ:Ò¼±Î9Ú>Ï;õɲÇ=Á=Ì9Ü=¶3¸5Ü?Ù;Æ?¦4dÄ?®6Ç@Õ>òȳÆ>`½;ÒAÛ?É8×<ÜDÓBÓ½±÷ɳÜ;Ý<Ü:!ù, (ÿo 8Á‚ ÔZ¸0‚C/6‘’­‹¶  ¸BÆŒ=tD‚Q#€PðYÀ²S(\ìXZã¡æ‚PæDz†€OôTqS&O@aMáTç͈§ hØ(âè)X1H-BÇ…`1¸z‚i‹œ¯a/=!£… pïìAµH ò.™¡„È òØÛ÷q$9ò‹Ã‰7~l r'>tì⠲˙7;@B4 ]ú´UCVe˜ë‹,}¤8°À{ ‚6™"Ä x”V °°*¤E‚sF D‰a3ªKŠë§J] “ÆKàÕ˜fôQ G´Ò£0r‚‰Œ "ÒÓZßþ}|ù(N¤Š?„ÿL | @ \`ÂÒD &àà‡(àG pX¡À…M$@ %ŒH P%4ÐÆ¤8A 4p†!TÌ"ãŒ3V;TT_v224_html_docs/images/glass/orange/tab_roll.gif000700 000765 000765 00000003434 11222361074 021725 0ustar00abwabw000000 000000 GIF89a (÷×9Ò8Ë6Ã5^°0k.Û:Ê6Â5«/Ü:Ñ8Ú;Û;Ù:Ù9Ó9°/Í8Ì7Ä5¬/Ø9Æ6Õ:Ö9Ô9Ó8Ø:ïïï_Ð8Ù;ööößÜÚ×:ôôôõõõÊ7Ò9Ï9Î8È8âââÄ7ååå±1Ö8Í7³›’Ö:Ê8¼3€#Ó:Õ9'·2pÔ:È6Ï8Ø;¼4·4Ñ9{$µ1_èççÇ7Á6µ3ƒR?ÜÜÜÒ:g:&{#V«1^¥0¬1ããã°1dRÀÀÀ©”о6´´´“)À5edh•*²2|"µ¯­¿­¦Ç6¹3¸2¦/¤-ìììŸ.o²›’ÖÖÖÉÉɾ4¯1³2s!˜qcœ+ÎÄÀ½3È7~#Í9yC,}#Å6`gÆ5Ë8Ð9Å7±2ººº˜rdìë먎ƒÃ6»5ãáàe˜seº§ ‰(²1w i©ƒÏÅÁ›-µ2¸3ÛÕÓÈÈÈÔÌÉa½6Ñ:ÍÍÍÌ8ßßßÅÅÅÂ4Ä6ËËË|#Î9–*+—,x#”””r ³1ÐÐÐË7´3âßݾ5[………Å5ààà¯2»3Ú:äääáááëë뜜œÓÓÓÚÚÚçççîîîúúúøøøóóóòòòñññùùùððð!ù, (ÿ<« Áƒ*\Ȱ¡Ã‡#JœhpàÀ3j$¡#„ ˆI²¤É“(Sª\‰Ë—0UºD ò‚Ç‚7 |ÐAŽ 8p@´¨Ñ£H“*]Ê´©QP£2pJµêS©S a ²6Ì7Ô9ûúú¹:·¡—}#Î@£.ÝÕÒÖÍɵ3èijÝDØDÚCÙAÔCÄ5×:²9È>Ð;Î8Ì8Ä6w zD.®’ˆu$”.Æ6‘.Ü@Ú>Ø<Ó=Î:Ë=È6¼3¥5z#Ú@×AÕ@Ø>×?Ó?Ì@Å@f¿<Â7(µ9¹7³1Ú:×9Ò8Ë6Ã5°0Ý<Ü:Ü;Þ>ß@àBàC÷ɳáDáEÝ=Þ?Þ=ß?ßAÞEÖCÚEÐB•0ÉAðDzÛ:óȲõÈ²îÆ²i.¬/öɲÓ9Ù9Ü<Ú;öɳÒÁ¸°/çIJÙ:ßCØ9ôȲÛ;ÞAÖ9Ý>Û<Ó8Ð8òDzÛ=Ü?àEàDôȳÞ@Ê7êŲëŲÝ?èåãÜ>Õ=aØ:ßBæÃ²õɲ·2óÈ³ïÆ²Ë?pÙ;Ã:ñdzõȳd±1àÕÐÖÇ¿ñDzÑAŽ(ßD¸ —ìŲÚ<ÈAåòÐ9Ñ9Ó:ÛDÜÐÊÓÁ¸á²Ų«À­¦À7õɳfU²›’„TAøø÷Ù¿³Ë7.ãÝÛííí¥¥¥ñȳëèçÏAѼ²ëųÚÌÅîÆ³ïDzïdzØÑÎÞÒÌ›0òȲôòñòȳÓBÒ@ÛÀ²»6Ì;êåââÙÕÆ5ÙBÂ4÷õôsA+ÜÀ²êųÓ¹áÁ²Ð<Ñ>Ü=îëê×¾²ÊÃÀ£Ž…Õ?×=“)µ1ìçäÚD×D°2³2×;ñññ÷÷÷êêê§§§âââûûûýýýþþþÿÿÿ!ù,¾(ÿß|3¥ Áƒ*\Ȱ¡Ã‡#Jœhpà@-3jÜȱ£ÇS•“(Sª\ɲ¥Ë—0cÊœIsfI@# ZüȳgG?˜mØ`çС*H“*]Ê´©Ó§P£JJµªT£vì %„ÉŸP2B+¿€²J=Aȃ,´ØÃÃ+Š 3Æ”TViå•XN)@.;véå—`†)&˜”´Ê;¬°äö¼bÈ”eÄ)çœtÖigø3æž|öé矔ð N@òÂ<(RI!…páè£F*é¤Èüi饘fêb+CÐãD‡&ºh£“–jª£hªêª¬z©Ë Ÿ¾ÿ`É;,2 ¸æªë®¼òÚê¯ÀËb \À€=¸³C%¸šáì³ÐF+m´ÂVkm¦½¬’ ²aë#t!î¸ä–k.¹×¦«î˜é4Â.˜3ë·çÖkoëæ«ï# ‘Úô€„: 2È'¬ð '¼ïÿXƒQ0€A;DT0H&™xáñÇ ‡,²Ç— 1?4@`Áç ‘ñÆ#dzÉ4ë+‚ ˆ‚A)TPÁ|!ôÐDmô5'­®OD¡Fôœ ÐGWm´ÒXW‹²4+'QD&üÑHd—möÙhg­6°7ç µ7a726Út§½öÝ«2… ÿ‚ ¬0ˆ„nøá†û£øâŒ7îøãG.ùä”Wnùå˜gþ84HÓÄ'×ø øàˆ—~8?¨§®úꬷîúë°Ç.ûì´×nûí®Cƒó窤!O-h/üðÄÏñÈ'¯üòÌ7ïüóÐG/ýôÔWo½ó¾<Ñ‚.$£Â<'¨!þøä—Oþ=觯þúì·ïþûðÇ/ÿüô×oÿýïÎ Pp‚*Ö°† Ò@Àð€̇ÈÀ:ðŒ 'HÁ Zð‚Ì ×A!@¡ p’‘Œ5˜ð„(L¡ ÷Áºð…0Œ¡ gHÃÚð†8Ì¡wXCvØ@-è@ÿ–@DXÀ¢ HL¢—¨&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈE+cx†1ŒÜàlH£×ÈF6àí­J`€QTäЃÀÀÇ>úñp ¤ªâŒq4cÀ£ÿÈÈ> ò‘˜ŠF–ñŒc$’‹lä5ÇÉNzò“  e'AŽrHBnH‡8lbuˆ¥,g)ÊZÚò–¸Ìåâ¨AœÒ ©Pe †ÉÊVÓ˜ºL¦2—ÉLÆ€¸ˆ„œÌDLØÌ¦6áÐÌnzó›œÀ-ÄчH¸Bžð„ÖÉÎvºœðŒ§<ŒSP }(A$$áQ øS ¨æIЂzs§P†:°‘ šÐD&ÚMÄ¢ͨF7ÊÑŽzô£ ©HGJÒ’šô¤(Õh° nØ‚¨ØƒLgŠ f;TT_v224_html_docs/images/glass/orange/top_grad.gif000700 000765 000765 00000001575 11222361074 021732 0ustar00abwabw000000 000000 GIF89a ‚æÜ;ðbåLàBáDàCûxß@èRéTñdäJî^æNûwï`úvøqçPâFòföný|õlùsý{óhôjúuÿ~÷oÛ9Þ>ôi÷pß?Ý=òeùtãGí[êVæMëWãIëXßAáEèQï_ørùrþ~êUäIömÞ=í\î]Þ?ì[ìZêWëYõkýzÿüzçOìYþ|ógðaéSñcåKâGãHÜ:Û8þ}üyÝ<Ú7!ù, ‚ÿ€S‚ƒ„…†‡ˆ„O‹ŒŽ‹“”•––N™š›œž™¡¢£¤¤R§¨©ª«¬§$¯°±8³´µ ·¸¹ºº;½¾¿#ÁÂÃÅÆÇÈÈ.ËÌÍÏÐÑÒÒÕÖרØÛÜÝÞÞ/áâãåæçèèLëìí'ïðñMóôõ,÷øù6ûüý ÿ ¸¤ Áƒ*\È¡Š‡#6˜H±¢E‹D2jÜ(¡£Ç AÂI²$‚“(SªT™¤¥Ë— bÊœI“f›8s¦ØÉ³§Ÿ@ƒ®J´h‹£H“þXÊ´i‘§P£ö˜Jµ*«X³¢ØÊµkޝ`ÃêK¶,ƒ³hÓªU£­Û·ÚâÊK—.’»xóØË·¯_¿J ¬ °áÈ—X̸1…Ç#K–|¤²åË2kÞÌ™sˆÏ CoMº´iÓ@R«^}¡µë×°aߘM»v…Û¸sëÖí¡·ïßÀ‹N¼x„ãÈ“+W.£¹óç3¢KŸŽ¡ºõëØ±›ØÎ½;‡ïàË¡¼ùóèÑ;XϾ½{÷âËŸOŸ~”ûøóëßÏÿþÿÄ€˜Á&¨ ‚4èàƒBhÄ„VÅ…f¨á†^HÇ †ØÁˆ$–h¢‰B¤¨âŠ;TT_v224_html_docs/images/glass/grey/col_blue_in.gif000700 000765 000765 00000000626 11222361073 022073 0ustar00abwabw000000 000000 GIF89aÕ444iiiDDDaaafff888f…MMM›Ú³¹¼¶¼¿BBB¥«®µ»¾§­°´¹¼XXX]]]FFFµ»½¥¬¯'O_cccddd¤©¬‚±¤ª¬š×$$$$JXl˜ }¬ ~®k–#JZ777¤èœÜ¡ãp–Ô•Íå–Ïç˜Ñè–Ïæ”Ìällljjjooommmnnnppp!ù,³@…cE,G‡¢AQ9ŸÐh”Ò˜0Xجv»eLš”xL.—5¦Ån»ßoLBÀ îø¼ïá"# (ƒ„…†„"%‘’“%&žŸ ¡&$¯°±¨¹ ¿ÀÁ º/ÈÉÊËÌÉ.ÏÐÑÒÓÐ1ÖרÙÚÛÜÝ×2àáâãäåæçá0êëìíîë3ñòóôõö÷øòA;TT_v224_html_docs/images/glass/grey/col_blue_out.gif000700 000765 000765 00000000647 11222361073 022277 0ustar00abwabw000000 000000 GIF89aÕ777mmmlll)SdIII000]]]222\\\iiiddd666???fff;;;jjj¶¼¿ŸÞaaa¤ª¬µ»¾¥¬¯...444§­°DDD©î‡·EEE³¹¼µ»½¤©¬hhh´¹¼mŽ"""¥«® ŒÁWWW¡ãVVV áJJJ)Qb çì©ïœÜ•Íå¤è–Ïç˜Ñè¡ãp–Ïæ”Ìä–Ôooonnnªðppp!ù,Ä@fF,G „R‘9ŸÐh´Bñlجv»%yB˜xL.—'¡ÎçÆn»ßïO'3ªÙïø|~”1Xp€‚ƒƒ/Š‹Œ 4”•–—— 1žŸ ¡¡ )-©ª«¬ª'  ,.µ¶·¸¶% (;ÂÃÄÅ;+&"ÆÐÃ"*Ë Ñ Ö:åëìíåóôõö÷9ùúûüýú< H° Áƒƒ;TT_v224_html_docs/images/glass/grey/col_green_in.gif000700 000765 000765 00000000626 11222361073 022244 0ustar00abwabw000000 000000 GIF89aÕ7³=iiiDDDfffaaa888MMM4S5³¹¼7§<µ»¾¥«®µ»½¤ª¬´¹¼$$$6Œ:¥¬¯]]]XXX4m6¶¼¿4¨:ddd¤©¬FFF§­°BBBccc%u)7772ˆ52†51N31L3%t)4446®;4ª:%y)3¤8©Õ´¥Ñ¯¦Ò°§Ô²§Ó±llljjjooommmnnnppp!ù,³ÀŠ&E,GMEa9ŸÐh4¢`,Zجv»]0•xL.—FÅn»ßo Bðîø¼ßy$(ƒ„…†„ !&‘’“&"%žŸ ¡% ¯°± ¨¹$¿ÀÁº/ÈÉÊËÌÉ.ÏÐÑÒÓÐ1ÖרÙÚÛÜÝ×2àáâãäåæçá0êëìíîë3ñòóôõö÷øòA;TT_v224_html_docs/images/glass/grey/col_green_out.gif000700 000765 000765 00000000647 11222361073 022450 0ustar00abwabw000000 000000 GIF89aÕ777mmmlll7V8III]]]000\\\iii666222jjj???7t:8‘<...¶¼¿9·?¤ª¬¥«®´¹¼µ»½444§­°¥¬¯aaaDDD9­>"""EEEhhhddd³¹¼¤©¬µ»¾;;;fff8—=7U88™=8°>8®=JJJWWWVVV9¸?8¶>©Õ´6®;¥Ñ¯%y)¦Ò°§Ô²3¤84ª:§Ó±7³=ooonnn9¹?ppp!ù,Ä@ÈåE,Ç D„¡9ŸÐh#ªLnجv»T(’™xL.—%P(Æn»ßïHÑÙïø|ž£)÷ÉÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽzô£ ©HGJÒ’šô¤(M©JWšOôà 8)Lœ38-ÎK4pÅ<3ž˜'K‡JÔ¢õ¨HMªR—ÊÔ¦:õ©PªT§JÕªZõªXÿ*h€É6/˜ñûÈMsJVF YÌÚOá)ÏÐ3«p«\çJ׺Úõ®xÍ«^÷Ê×¾úõ¯€é|PƒŒ³L¬)GÆZÖÆÞ }Të& ¾@?Àf7ËÙÎzö³  ­hGKÚÒšö´¨M­jWËÚÖºöµ°­lgKÛÚÚö¶¸Í­nwËÛÞúö·À ®p‡KÜâ÷¸ÈM®r—ËÜæ:÷¹Ð­Ka*Sš†µ#Œu¬vqÖe9@ ˜ì* ÀËf6ºèM¯z×ËÞöº÷½ð¯|çKßúÚ÷¾øÍ¯~÷ËßþÞw\µƒWéDìB”ÛM0"ºðŠ—¼10¯ÿ'Lá [øÂΰ†7Ìá{øÃ ±ˆG¬\Ö°äTlF²«à²2ø» ¨le_À DÁ68αŽwÌãûøÇ@²‡Lä"ùÈHN²’—Ìä&;2xiLgjGÒy-β^ ^µÆ7~²˜ÇLæ2›ùÌhN³š×Ìæ6»ùÍp޳œcà®~µÀa±–ÓÉåÏ8A=A ‚0çBúЈN´¢ÍèF;úÑŽ´¤‘\‡6±×]ñ±¼ç÷YÆ„ ô 'MêR›úÔ¨NµªWÍêV»úÕŠ”«[åøƒ@„B8„DX„Fx„H˜„J¸„LØ„Nø„Px !Ð- GtTkë÷|3˜S}^¸'-P fx†h˜†j¸†l؆nø†p‡r8‡tX‡vx‡x˜‡z¸‡|ˆp]µIX(2¸…vÓ…_†cX†}ØˆŽøˆ‰’8‰”X‰–x‰˜˜‰š¸‰œØ‰h8>†%ª§~Qˆ†H7}†`E'#à‰²8‹´X‹¶x‹¸˜‹º¸‹¼Ø‹¾ø‹Žh91 D¥èl¡…©hL«ÈŠ®°ŒÒ8ÔXÖxØ˜Ú¸ÜØÀxSstÿŒÈ˜¨¸ŒÓŒ+ð* -Јò8ôXöxø˜ú¸üØþø9Yy™ ¹ Ùù‘9‘Y‘y‘™‘¹‘Ù‘ù‘ ’"9’$Y’&y’(Y8€22%B¼Ñ爎ĢŽìèŽ")¹“<Ù“>ù“@”B9”DY”Fy”H™”J¹”LÙ”Nù”P•õø(`' G°+ Ò+÷dAM Oà ð#@“̘x0öjÙŽbh!€—r9—tY—vy—x™—z¹—|Ù—~ù—€˜‚9˜„Y˜†y˜ˆ™˜Š¹˜ŒÙÿ˜Žù˜™’9™”Y™–y™˜™™š¹™œÙ™žù™ š¢9š¤Yš¦yš¨i˜€. ìÓºR¢ õöM°F –dif©qh ^jy“mù–©YœÆyœÈ™œÊ¹œÌÙœÎùœÐÒ9ÔYÖyؙڹx)8ð-ðv0t°%]â%ÉZ€> 0#p!½9E}¦öÙŽ0†ÐpПþùŸ : Z z š  º  Ú ú ¡:¡Z¡z¡š¡º¡Ú¡ú¡ ¢":¢$Z¢&z¢(š¢*º¢,Ú¢.ú¢0£2:£4J¡€ÿ 2ð0ž¶B@¤B:¤DZ¤Dš%ràP;  »)ŸóY?õyŸÒ¢ŸüY£Xš¥Zº¥\Ú¥^ú¥`¦b:¦dZ¦fz¦hš¦jº¦lÚ¦nZ *à8Ð ó01 {zº§|Ú§~:*²R KÐ7€¥QJƒ¿ÙT*ðoz©˜š©šº©œÚ©žú© ª¢:ª¤Zª¦zª/š<`:`zàà" P«¶z«¸š«ºj«&à/'€LPL  À€ñ‰ =SÊ–“*•ŠªÒ:­ÔZ­Öz­Øš­Úº­ÜÚ­Þú­kúÿ °0€F(®êº®ìÚ®îÚ®VÃ`@W`8@¬)p¬ÉzËj:}v+©-`ÐÊp°›° »° Û°û°±;±[±{±›±»±Û±û± ²";²$[²&{²(›²*»²,Û².û²0³2;³4[³6{³8›³:»³<Û³>û³@Ë àfðS€,@ùª¨¼Ù¯§ó¨2µ’  ÀZ’µZ»µ\Ûµ^ûµ`¶b;¶d[¶f{¶h›¶j»¶lÛ¶nû¶p·r;·t[·v{·x›·z»·|Û·~û·€¸‚;¸„[¸†{¸ˆ›¸Š»ÿ¸ŒÛ¸Žû¸«% !zP] J{¬‹Ê¯N«ŠP+µ“ZµW¹¦{º¨›ºª»º¬Ûº®ûº°»²;»´[»¶{»¸›»º»»¼»¸“[¹ F>À €¨Éú¹ ë]àU-›à)лÔ[½Ö{½Ø›½Ú»½ÜÛ½Þû½à¾â;¾ä[¾Z’nÀ`-p=0«¬Ê›Žê¼&½Òk¾üÛ¿þû¿À<À\À|ÀœÀ ü!諾ì;-h0Ü @œLëÆHü¨q¼ÁTu|Ç«ÌÂ<ÌÄ\ÌÆ|ÌÈœÌʼÌÌÜÌÎüÌÐÍÒ<ÍÔ\ÍÖ|ͤÜʯœÁÇ.@ÿîiÜÆ¸\!}¼ÁK°V+€ÍîüÎðÏò<Ïô\Ïö|ÏøœÏú¼ÏüÜÏþüÏAª@¹e¼! H+¿ñYÎirÎè¬Î ÀÎ=Ñ]Ñ}ÑѽÑÝÑýÑ Ò@*ÐÝÃèÜB¬ÐäÌÐTô¨"À½.TÓ6}Ó8Ó:½Ó<ÝÓ>ýÓ@ÔB=ÔD]ÔF}ÔHÔJ½ÔLÝÔNýÔPÕR=ÕT]ÕV}ÕXÕZ½Õ\ÝÕ^ýÕ`Öb=Öd]Öf}ÖhÖj½ÖlÝÖ°MÆë{ÒM:–EÌÒæìÒé Ó2-4íր؂=Ø„]؆}؈ÿØŠ½ØŒÝØŽýØÙ’=Ù”]Ù–}ÖprmÒ Ðu½Æ+×ÁÑg&PÚ0íËn@ J¬ÝÚ®ýÚ°Û²=Û´]Û¶}Û¸Ûº½Û¼ÝÛ¾ýÛÀÜÂ=ÜÄ]ÜÆ}ÜÈÜʽÜÌÝÜÎýÜÐÝÒ=ÝÔ]ÝÖ}ÝØÝÚ½ÝÜÝÝÞýÝàÞâ=Þ©´à¯L«¥m  b Ú¢m!ºÞ§í©½Úäßú½ßüÝßþýßà>à^à~àžà ¾à ÞàþàÝmÞèê]ÚíýÞwß(ô¨·Ó 3@â5â$^â&~â(žâ*¾â,Þâ.þâ0ã2>ÿã4^ã6~ã8žã:¾ã<Þã>þã@äB>äD^äF~äHžäJ¾äLÞäNþäPåR>åT^åV~åXžåZ.^40 Ù´j«^¬®á£Íá¶êá .â[Þænþæpçr>çt^çv~çxžçz¾ç|Þç~þç€è‚>èTÞå_.×bîÞdÚfÞ}–æ!Ð×.p„^é–~阞难éœÞéžþé ê¢>ê¤^ê¦.^7«šM቎áŒÞè{„æ§-é”~ê¶~븞뺾ë¼Þë¾þëÀìÂ>ìÄ>©׬^«cß°^}6«"éö-.^víØžíÚ¾íÜÞÿíÞþíàîâ>îä^îæ~îèžîê¾îìÞîîþîðïò>ïô^ïö~ïøžïú¾ïüÞïþþïð?ð_ððŸð ¿ð ßðØ°ŠÞ@ᳺìeÞìŽþ¨Ð.ín@íÖîð ò"?ò$_ò&ò(Ÿò*¿ò,ßò.ÿò0ó2?ó4_ó6ð/Oñ"`ñ¯Žñ Ñg!0ô‘þáP0 +J¿ôLßôNÿôPõR?õT_õVõXŸõZ¿õ\ßõ^ÿõ`öb?öd_öföhŸöj¿ölßönÿöp÷r?÷t_÷v÷xŸ÷z¿÷|ß÷~ÿ÷€ø²@‡Nÿô!àó@¿&Šø2ÚÕ.ø’?ù”_ù–ù˜Ÿùš¿ùœßùžÿù ú¢?ú¤_ú¦ú¨Ï÷Þ«NôŠ¿ø£ÔøDÿøŸú¶û¸Ÿûº¿û¼ßû¾ÿûÀüÂ?üÄ_üÆüƒñ­?ô¯ûwñ¨ýàF9ÈýØŸýÚ¿ýÜßýÞÿýàþâ?þä_þwÂ.`ø àÒÏÍïü ÑgíOûÕ¾6æÿøŸÿú¿ÿüv‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ªŠ0.n ³³  z½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÿÀ  ´ 3 &qàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹/šX0CB„ØhÙÂ¥‹—³“(Sª\É%4ivX›…-›36 x±§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JºôA‡3"Ä Yk„\»ZŠK¶¬Ùg>,ˆ9“¶l(Ì`PªÝ»xóêÝË·¯ß¿€ L¸°áÃð*0˜Aáã[‘^|{¶²å˘Ÿø EŽo³ÙÜ6£FŠTLb#@ÏX°„! @kË¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF®Q(ÂX°J̉˜¬Ó’x† UøÀGIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì%)?P&ć)˜Ì3ILˆIŒVœôdœ„#8ZÑ¥4§IÍjZóšÿØÌ¦6·ÉÍnzó›à §8Ç©18à@pBXLa³˜ð”Õ1GÀÉÀÀ:@Ä„øóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽzô£ ©HGJÒ’šô¤(M©JWÊÒ–ºô¥0©LgJÓšÚô¦@ À ’“ ãIÔÌÌ3- Ð `è9ÈÁ@ÕªZõªXͪV·ÊÕ®zõ«` «XÇJÖ²šõ¬hM«Z×ÊÖ¶ºõ­p«\çJ׺Úõ®xÍ«^÷Ê×¾úõ¯€ ¬`KØÂö°ˆM¬bËØÃî ª8Ðÿ h€A}gQ7¥c"““XÀ `À$ȨM­jWËÚÖºöµ°­lgKÛÚÚö¶¸Í­nwËÛÞúö·À ®p‡KÜâ÷¸ÈM®r—ËÜæ:÷¹Ð®t§KÝêZ÷ºØÍ®v·ËÝîz÷»àÝn‚J ƒ,@ÁDÀÂ<ËÙöæÇ³üQïh ´ ȯ~÷Ëßþú÷¿°€LàøÀN°‚Ìà;øÁް„'Lá [øÂΰ†7Ìá{øÃ ±ˆGLâ›øÄ(N±ŠWÌâ»øÅ0Žñ‹ïkƒ`V½B½¤{w<+ÏÒS½ø€@ä"ùÈHN²’ÿ—Ìä&;ùÉP޲”§Lå*[ùÊXβ–·Ìå.{ùË`³˜ÇLæ2›ùÌhN³š×Ìæ6»ùÍp޳œçLç:ÛùÎxγž÷Ìç< ùP/rúñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉENà’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™Æ,…4§IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎvºóðŒ§<çIÏzÚóžøÌ§>÷ÉÿÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽzô£ ©HG*ÏQ˜ô¤(M©JWÊÒ–ºô¥0©LgJÓšÚô¦8Í©NwÊÓžúô§@ ªP‡JÔ¢õ¨HMªR—ÊÔ¦:õ©PªT§JÕªZõªXͪV·ÊÕ®zõ«` «XÇJÖ²šõ¬hM«Z×ÊÖ¶ºõ­p«\çJ׺Úõ®4%^÷Ê׾ ¬`KØÂö°ˆM¬bËØÆ:ö±u«_I°‚ÊZö²—%©f7ËÙÎzö³  ­hGKÚÒšö´¨M­j9jR½^V°­lePÉÚÿÚö¶¸Í­nwËÛÞúö·À ®p‡KÜâ÷¸ÈM®r—‹ÈL–¢µ+ˆ- ¦KÝê.ïºØÍ®v·ËÝîz÷»à ¯xÇKÞòš÷¼èM¯z×ËÞööÎyàâžKYP÷øÍ/~Åßþú÷¿°€LàøÀN°‚Ì`]!k`P0_½ÚwºúÍï6Ìá{øÃ ±ˆGLâ›øÄ(N±ŠWÌâ»øÅ0ޱŒgLãÛøÆ8αŽwÌãûøÇ@²‡Lä"ùÈHN²’—Ìä&;ùÉP޲”§|cH$˜ðs£‹‚üNáË_&…˜ÇLæ2›ùÌhN³š×Ìæ6»ùÿÍp޳œçLç:ÛùÎxγž÷Ìç>ûùÏ€´ MèBúЈN´¢ÍèF;úÑŽ´¤'MéJ[úҘδ¦ûL°à˜„–I`_0O ¨Æ‚VÍêV»úհ޵¬gMëZÛúָε®wÍë^ûú×À¶°‡MìbûØÈN¶²—Íìf;ûÙÐŽ¶´§Míj[ûÚØÎ¶¶·Íín{ûÛ෸ǭl!dâ ˜À(V€‚S£z ð¹çMïzÛûÞøÎ·¾÷Íï~ûû߸ÀNð‚üàO¸·3ÐEl ìþàm…Š[aÓϸÆ7ÎñŽ{üã ¹ÈGNò’›üä(ÿO¹ÊWÎò–»<Ò¯ÆÃ!@‚vcÁâ[ÈùËwÎóžûüç@ºÐ‡Nô¢ýèHOºÒ—>tYoÁ£Á©­ó/XXϺַÎõ®{ýë`»ØÇNö²›ýìhO»Ú×Îö¶»ýíp»ÜçN÷ºÛýîxÏ»Þ÷Î÷¾ûýàOøÂþðˆO¼âÏøÆ;þño{™eí‚GL`Sì~†ÎWàó ½èGOúÒ›þô¨O½êWÏúÖ»þõ°½ìgOûÚÛþö¸Ï½îwÏûÞûþ÷À¾ð‡OüâÿøÈO¾ò—Ïüæ;ÿùоô§Oýê[ÿú¶Ïú˜a}†¬àšï<ÿÆŸò›ÿüèO¿ú×Ïþö»ÿýð¿üçOÿúÛÿþøÏ¿þ÷Ïÿþûÿÿ€8€X€x€˜€ ¸€ Ø€ø€8Xx˜¸Ø÷g ‚Ÿ‡ubkG€$y_0~^Ђð‚0ƒ28ƒ4Xƒ6xƒ8˜ƒ:¸ƒ<؃>øƒ@„B8„DX„Fx„H˜„J¸„LØ„Nø„P…R8…TX…Vx…X˜…Z¸…\Ø…^ø…`†b8†dX†fx†DX~"H‚°–€yV°‚^Pthvx‡x˜‡z¸‡|؇~ø‡€ˆ‚8ˆ„Xˆ†xˆˆ˜ˆŠ¸ˆŒØˆŽÿøˆ‰’8‰”X‰–x‰˜˜‰š¸‰œØ‰žø‰ Š¢8ФXЦxЍ˜Šª¸Š¬ØŠ®Èˆ'a&P°}¬V‘@?°g0‡PŒ 0ŒÄXŒÆxŒÈ˜ŒÊ¸ŒÌØŒÎøŒÐÒ8ÔXÖxØ˜Ú¸ÜØÞøàŽâ8ŽäXŽæxŽè˜Žê¸ŽìØŽîøŽðò8ôXöxø˜ú¸ÙØ 5€µx‹¤àjÀ‹Vð‹…ŒPÀù‘9‘Y‘y‘™‘¹‘Ù‘ù‘ ’"9’$ùŽm0Y‚­ ˜·d°e“¡0“4Y“6y“8ÿ™“:¹“<Ù“>ù“@”B9”DY”Fy”H™”J¹”LÙ”Nù”P•R9•TY•Vy•X™•Z¹•\Ù•^ù•`–b9–dY–fy–h™–j¹–M©O’Éj’°Xà’PP€—l¹—|Ù—~ù—€˜‚9˜„Y˜†y˜ˆ™˜Š¹˜ŒÙ˜Žù˜™`*¶—¬Ö2€_àxY )™¢9š¤Yš¦yš¨™šª¹š¬Ùš®ùš°›hÙ6)¯ ›N¹ N`™·¸jWð›€cp…uÈù ʹœÌÙœÎùœÐÒ9ÔYÖyؙڹÜÙÞùàžâÿ9žäYžæyžè™žê¹žìÙžîùžðŸò9ŸôYŸöyŸø™Ÿú¹ŸüÙŸþùŸÊœ4P-@ ©@Z¦àÊÉ@&° Êœ —Ùj‰€V@Ppœ0¢Z¢&z¢(š¢*º¢,Ú¢.ú¢0£2:£4Z£6z£8š£%ÚÊÙ À ð Ð) Z`0€yÀ7PZà:à9@0'€9 ¯ Þ ` :Z‹˜¹j‰Ð‹ž n:¦p§r:§tZ§vz§xš§zº§|Ú§~ú§ü ¡;PpP´(T@‰êDÿð'P¥ACx°ie ,00 «)Ph0HWà <Š @mðD D 4­§3¼y¦‹0_PœmÚÀ ¨Â:¬ÄZ¬Æz¬Èš¬Êº¬ÌÚ¬Îj¬®ðU; P:à p;²zNPbÐ9@9€I 3'ð `pBЩoÐ< LÚ/° Ð鯦@ª5 bð@bP®Ð &€®à9j¸º¡¬¶Xp!ª}` û¬";²$[²&{²(›²*»²,Û²è)ª€€Zÿ€T  #@ªZ@p ð€«N€)  W@W`%àZàÐ;@5`Z ið.Àx@Z0ª` «Tàâš>P)€Bà J )@¥5@ €–y 3j±f꛿I c@e{Œ»Žû¸¹’;¹”[¹–{¹˜›¹š»¹œÛ¹žû¹ º¢;º¤[º¦{º¨›ºª»º¬Ûº®ûº°»²;»´[»¶{»¸›»º»»¼Û»¾û»À¼Â;¼«‹8 «Z¡ú‚#a€Nð›/ ) ðWàQ@¨' *ÿ `bà   ®ª:`J€¤°s@€{ÀN`Dp%p*@/ÐÀ½>@P ;3PKP!07P>à&@MJt ŽÛ ¦` Äk¹·š«­¦Và€ðfp|ÐÂ!üÂ0Ã2<Ã4\Ã6|Ã8œÃ:¼Ã<ÜÃ>üÃ@ÄB<ÄD<¹¤àyPŽ aPbPt mP&@ap¤D *à @tv0N`¨WK@v€.D°Ph'L 8OÀc`qÀ3 #ð*C`\0KsÿàGP@°*Càb AÀ0-PFD.t`=0 p €¼3<»j‡pÂu fÀ„p˫˺¼Ë¼Ü˾üËÀÌÂ<ÌÄ\ÌÆ|ÌÈœÌʼÌÌÜÌÎüÌÐÍÒ<ÍÔ\ÍÖ|ÍØœÍÚ¼ÍÜÜÍÞüÍàÎâ<Îä\Îæ|ÎèœÎê¼ÎìÜÎîlÍ;ð@¼G@ «€ ª°­0µ.°½D*€ Z¤0m@µ¸¬Ð %`°¨#PvXP`10? @p7€4Eðpb-0#ÿ C-P¯BоMP@ð!H0Q8°lE < Щ ¬ ðλìʽÉj‡°… ¸w@RÖV=Öd]Öf}ÖhÖj½ÖlÝÖnýÖp×r=×t]×v}×xÝË €:À O?°¨° ;p«Ð¬`@ nàÆZð: &ÐF j»m@ ÐW ªàN`1v4 )`Q rØ€ýL&Ð2 G ~0ä:5ÓT Y ¿'pF€7`YÀPAÐfp3MÀyà-`¨`Ú„ÿJÖX}¦ˆðP Â| Þy½ÞìÝÞîýÞðßò=ßô]ßö}ßøßú=×"ðp^`o« nË­`¦` ƒªö¼¶N@h6PZ  :° #€¬ÐtUP;PµWT°rðwðw!àâY`„ f.ðTp@À¤5à‘­ [6pÀBÐHpÓ@_=À\1°@Ð`P.`¤4@T¬`Õ0€«U,ÞgPzðÕ l¾ßnþæpçr>çt^çv~çxžçz¾çÁܤPdÀ<à„ «æÿ t° ðpuÐ]€„`EÀ0K  v@v5 aðØJ(y Ñ Bp6°} €ÀlÀ<@63ð8`AÀŒ]0p1Ð@ WP¯/@QGÐTpJ H€PðNp0ð-àb€h1ï<æ$ÌjŽ@€Ðç-‚0ï Pïö~ïøžïú¾ïüÞïþþïð?ð_ððŸð ¿ð ßðÿðñ?ñ_ññŸñ¿ñßñÿñ ò"?ò$_ò&ò(Ÿò*/ñAà’ Ü®@0ÿ_ï@ªQÐ~ ¬g°j0>Ð1@ L´mP&  UàŽp€4@PlÐOðx@~0\PQ`áj€YÐt;YÀ3€\°å–C0D7€F€!00H 8àFP'P5wpCM`öûK 4 ):@‹Y½jŒàu`„‚0ž¿ò ú¢?ú¤_ú¦ú¨Ÿúª¿ú¬ßú®ÿú°û²?û´_ûO kàR`ÐK õž ¤€ çM|€`pyG ` N0&®  §ÿn Ù¦p…I E=] (ð쪰sÿ–@Bï/@àË4 j¢„£B‘A~Ôø)áÃF“#oŽ€ÙÒc #JB I“DKŒ"(ˆhPÒäI”)U®d™†Ž (PS€¡BqîH‘3(ÏÏVA…%ZÔèQ¤I•.eÚÔéS¨Q¥N¥ZÕêU¬YµnåÚÕëW°aÅŽ%[ÖìY´iÕ®eÛÖí[¸qåÎ¥[×nW/uPÈÓÊŽª "´£Fa,„@AÇ @”$¥Lš'@¢\Aç*"$ŒH!AšJž0ò‚T=áÐ3ˆÿ>Ðà¸à %-N9äD 6‚ˆyb •"%šì!´‡G.=xØà#( —$,¤€Iƒ†=>jˆÁ BBÜ—L̤Ys”?|(çÓÿîp@ 4ð@TpAtðA#”pB ·J2ðb‡V\*4J!&Ê£ŽJ@…5~˜…ÇøB‰/ò˜ƒ0p¡Vž ŽR©© ;žàC„H‡"ž8ˆ9’È¢„NPA7%€@#‰†¡‡@˜ÉˆX£RÀƒ ²P‚…(–B‡&ò¸ò?Œ8bA‰Â‹#¤ˆC…F€•'ª€ÿë¥ æ«Ï>@ú Dþð°´BL3ÕtSN;õôSPCuTRK5õTQa¼ã‹ZÃVR9Å*¦“ øê`ì‡Î(….ØØã†=ž@Õ0T ÂÄÈ€Ž J˜A‹|PA lB€ z@" 1"‰Rpâ¢@¢‡'TpaÌgsx!…%T° Þ`¡â¢P'Ð!5€HB 3N”CŠ1˜ðc )Þ¢ž€£TÞ*Aù(˜©& 2©Ã )4ZFõe˜c–yfšk¶ùfœsÖygž­R)È„V(h…RHQ ýPø…/nx†]ÿQ /‚3!8¨˜ª Â‚D …WL˜A!`@!€-€0‚‚¸áˆL ¢„+rˆ`†%j ¢‚&lhu zÀ $šX‚9XHá„ÒÀaž¯!ˆÀA @Ì$‰.¤¨£ü`Á‡t0Ö¶>ùQ ЃJY^ãw‚~xâ‹7þxä“W~yæ›wþy裗~zê«·þzì³×~{î»÷þ{ðÃ|òË7ÿ|ôÓW}öÛwÿ}øã—~úë·{;da $€€pK]š dP,È@ªÁ¢ ƒBŒá <`ƒŠÀ'àÀ Å ÿ…öÐ)D!.8 „p„SPáQ Žl¨´áOxAµŒ‡0 DBCÂ…a0%PB²pƒ0ð 'HBT`‚ ´LjAÌ0›.˜Á`ð:PÁhŸíL “ú A}HyÖà<ÞO{äcýøG@Rƒ$d! yHD&R‘‹dd#ùHí…@Yx@þ‡ ¼¡ gxƒø/ü@S8ÃP°)Xá€<¸‚ rð€<àWÀ@XAU€ 0 Ái*Ð, ´% ÔP¦¸€ -¨‚Ü …+°70H ¦…ÿèÀ ›Œƒ.œ yHƒ ”ƒ6„€T` Ôð†A!]àÁ ߀5xèÏ \Ðö¹±êxGN<ªA¡`hCúPˆFT¢¥hE-zQŒfT£åhG=úQ†T¤#%iIMzR”¦T¥+eiK]úR˜ÆT¦3¥iMmzSœæT§;åiO}úS Õ¤^Ð_\!†Ö „ðB~0,$0Fuø l ƒ#Ä O¤rPTá&€)P„H@ #°Ã ž0A1h°†Tá-PBì`Tà pÂìp<Á`@p€ÄÔ `ÀÿOhÁ †#,f %ˆÁ NÀ$ˆ¡ L¸Jðƒß$! ~88¢.˜!p+‚lZ&ùÀ‘5(‡5(” Ãjq{\ä&W¹Ëensû\èFWºÓ¥nu­{]ìfW»%ƒþ € ÛÚaFX ð,ŒÁ Vx ±ØÞá*ƒ@€WÀ®x"ІS€1ØA´°„6à 9ÁZpW¸8€ ,°ÔàÈ R'È® ¦8Án ‚hLö|0À€ m0ÂZ„X`k(‚ F`…¼  ]pp„$øA\ÿ@‚ö UX³¦-Ù“&€>ü€‚®†;0§BÌc&s™Í|f4§YÍkfs›Ýüf8ÇYÎs¦sí|g<çYÏ{æsŸýüg@ZЃ&t¡ }hD'ZÑ‹ft£ýhHGZÒ“¦t¥-}é= à +PC*XA‡Td KˆÃVpÊ-ü`«> âñp!&ÀÀÂLË Ht TÀ’#pANA¨X ` à‚9Œ¶9€Ð`:Ô h$ p! EÀ@Ws0PÁ -(mœp„%˜à'ðAâ=„@$¡ž„pBZ‡p²álðÿô.!%pâq“™(ÝÃ)7‡=dÓçxÇ=þq‡\ä#'yÉM~r”§\å+gyË]þr˜ëÙ«æC* jTä`ÕP ª°ð´)¬ú~x‚b`ˆ ð1ª”໦ìS\¡3 C@Šˆt€|‚09HA0 ƒ\A+j0‚Œ ZpР\¡ ÈÀ \ÁƒTàT@jЂ,, Ô6B–À¤ â fð‚`¦a …ÀÂà(šÊ¹5ð9T\ ßÃlÿ†˜ç^÷»ç}ï}ÿÿ{à_øÃ'~ñ|ä Õ-H…Äì R@aÕcXuTW0…-|A0hAHa"ÔÀN@E š†á nˆæ܃Sd€ ¬pC @¤Tˆ€+Xá$0‚è+"ƒ@?p-@ p H:·*x‚6p…›  ‚¿&p;pv+ `‚/à°*H,'X‚.øƒ;˜&°)¸ƒ3°#0SH´2É ¸X;ÙÃ8Ûë&ì‚ä{B(ŒB)œB*¬B+¼B,ÌB-ÜB.¼3=X2‹S[>x)(„ [µP‚¡ÿ0$0‚>p1Ø%š …hƒ P…6Â2WÈ l‚üDRHH=P‚"@ HR8Ñ‚Tx€ W‚*ˆ€"8*H(hK¬%°!˜²q†Ó%i½ ÉÁ?0£O|ƒ. ‚ØAðŠ©ƒ4À‚3Ѓ4X"€ ì$(P°‚@ø-? \d¨ÆlÌFmÜFnìFoüFp GqGr,GsØ=<È z*2¿ØØS040¹Z>à.àƒ H$ѯ'0…"èð| xÃ!ˆ‚þ¬V@…ßt>†úž·Ð„2¸ƒ<ðƒ7 ˰lKµÔXÈ\É\Ê­\˽\ÌÍ\ÍÝ\Îí\Ïý\Ð ]Ñ]Ò-]Ó=]ÔM]Õ]]Öm]×}]Ø]Ù]Ú­]Û½]ÜÍ]ÝÝ]Þí]ß­ØÿSh¤q…+ØV;ø2Zù‚ Ì*ƒ WÛP5â<ƒ3°^ní0@8˜N,0:.R‚&0D; P0 €ð,03È‚0¢Õ%4È& ' ¯(È7ÀÙHh…X…UXŽ` ž` ®à~ Î` Þ`î`þà ¾„?„4˜uRK¶Maæ‚ßma~aŽaža®a¾aÎaÞaîaþa b!hΉU ,AðÖmmÐ »ƒ70&öV/âáÔR,˜=°‚AЃ;AÈ#8õ@‚H‚@ÿÀ¬™ðCâ̸ @¿ÀA ‚Ðbt h€ÀàPHB.ä 8dDNdE^dFndG~dH~äKÐ9Hƒ=ðÊ1ÎdMÖäˆídOþdPeQeR.eS>eTNeU^eVneW~eXŽeYžeZ®e[¾e\Îe]Þe^îe_þe`fafb.fc>fdNfe^ædŽ€ p&pƒSЂ0¸£"‚Qp ²©„dCƒˆ‚BÀ>…;Ø‚QØì#1@‚… (¸ #9€Î™‰@ƒS…Q°ÖAЂå €€˜f@p7P…l…ÿUx…XdXÈhÞhŽîhþhi‘iX¨„>Hˆ.`$K–ni—fifŽi™žiš®i›¾iœÎiÞižîiŸþi j¡j¢.j£ne H!p(8…`h"è/ƒ¨‹6€ˆ¶ßQN+ ªBØ‚0BA€=0Ëuxxx¼8)…R#¨! @ƒó¤€˜¨; H…VX€PHd’^lÆnlÇþèJ05) ˾l̾ì£ÞlÎîlÏþlÐmÑmÒ.mÓ>mÔNmÕí6ç€Ø_s:È(8?`…õd/ÿP‚(ƒ1˜‚QÀ=…:˜H+9ˆƒ40Ä£‚tËÀ1p$PxP²‚!ƒÀ"h@ pVˆº& ÿÃNìC~løŽoùöhL@\6P.‚%Øoþîoþ^mpp/p?pOp_poðT–…/ ‚!Ð5 àPN¶>(20ƒQðt–.ðQÀ&ðÒc‚H‚hhPA1¨¿B(q¸$À€h ‚$@ƒ*ÈÙöFäùnr'wlLЄ·,¨r+¿r+7 -ßr.ïr/ÿr0s1s2/s3?sÿ4Os5_s6os7s8s9Ÿs:¯s;¿s<Ïs=ßs>ïs?ÿs@tAtB/tC?tDOtE_tFotGŸóOgTH‚-¨ƒQH@…2_°‚Q82à‚A`ƒ%õô=`,>ÀÕá <Ð$ 'X7.< …2…>؃'é"˜.H&¸ °ãu€Š¾è xrfov†BÀƒ=`)k¿öktmßvnïvoÿvpwqwr/ws?wtOwu_wvoww÷8sN°…&X&0s<èƒQhg(ˆþÀâ…@ùA8 _AÈ‚A(hÿ6ÐUHX6!…¨089`9à6x*è:àãTh‹~ogoy—‡îŒÎ @‚z¯y›·ùÈyßyžïyŸÿy z¡z¢/z£?z¤Oz¥_z¦oz§z¨z©Ÿzª¯z«¿z¬Ïz­ßz®ïz¯ÿz°{±{²/{³?{´O{µ_{¶o{·§ú6¨‚ ð170z5@05%°Þ‚@ 2Ø.U0¸ƒ)0,(…3¸ƒˆ­°? (…R(XA¨5¨ƒba"HröFl–wyÓgv˜O™§ù›o}x{Ø}ÙŸ}Ú¯}Û¿}ÜÏ}Ýß}ÿÞï}ßÿ}à~á~â/~®+¢‡Õñô°‚(…ç¿^„1(…à %(…B°~( ƒ¬ê°Ð-Ø‚RÀƒ;¸#°%@ã ¨h&?}ûoòG”lIˆê „ 2lèð!Ĉ'R¬hñ"ÆŒ7rìèñ#È"G’,iò$Ê”*W²léò%̘2gÒ¬ió&Μ:wòÔé*K+2È”óCÆR£J1%ÁÊ”?V¬0•qÊ>rXÈñQ¢ÍžRqJ "Š #=@¸:•jÕ«.Àªk÷.Þ¼z÷òíë÷ïßGü„à’ґĊÿ+îéø1äÈ’'S®lù2æÌš7sîìù3èТG猱D e  (%C†kªK™–tVF!Ø+J‘P¥T /`)u6–>„ (!R•ˆV BÍlý:öìØ#ÉQ£ä#MÆ“/Ož4úôê׳oïþ=üøòçÓ¯oÿ>þ‹\ØŒ-Tæ‹ +ŒòƒT•ò‚6ÔðÄ+ÌñÅ +lÅk(ü±Ç€ÑE ¥L!‡ ^ÜE7ìÀJ ¬B]uÚ¹ø"ŒE"ˆL$aCQè¸#;æ÷#A 9$‘Ey$’I*¹$“%ÅHQgŒÅ?P…¥È±PÆAál2°ÿ 2ŒØ‡,´áa!_Ô6ÈZm½W‹1Úy'Œ’  Aø :¨ z(¢‰*º(£:ú(¤‘J:)¥•Zz)¦™jº)§zú)¨¡Š:*©¥šz*ª©ªº*«­ºú*¬±Ê:+­µÚz+®¹êºë­U€ñ† è1}LÀÛÔÐ(HQ eZ LajÔPRœÑ…sÐIÇ"žåš{$yÌÁÂFàмñÊ/¯õÚ{/¾ùê»/¿ýúû/À <0Á|0 +ÌjD¸ñ DCGüámŒAÆÕ’@Ê£c|± ŽÑ QA±D ·6ÿA&¢¨"‹t{3Îx¥»n»ïÎûs¬=4ÑE}4ÒI+½4ÓM;ý4ÔQK=5ÕU[}5ÖYk½5×]{ý5Øa‹=6Ùe›}6Úi«½6Ûm»ý6ÜqË=7ÝuÛ}÷ÙªtÑEf¼`¬'h•FXñ› £p<M·áÅ2 @BÇSLÀG”@„·$ pGœnÁ%—Í9›~s#yìÁCMô0ì±Ë;ÞµÛ~;î¹ë¾;ï½ûþ;ðÁ ?<ñÅ<òÉ+o67Ü0 ŒQ†Uk°PÇ^xÝtuž>?žüÊQ ÿÿýûßÿò(À°€< ¨À2°| #84 ŒaYPÁ¶ð‡?¤ ÉJ–qÈ@¹ @ajVøàF…Ì‘À s„¤³¥hEs)ýr£Dà¡ G°„ó‚!±ˆC” “¨Ä%2±‰N|"£(Å)R±ŠQ³€á&€‡ p,˜À( ±2Œa NŸ¨6‚ P®(`£¦ †0 {ÝœH§Ã=î°‡? ¢yD+²†<$"©ÈE2²‘Ž|¤ÚÖàƒ–Màw D>H¬8” ŒY¸š“BËy !P+Há>qŇ||¥u‘†$Áÿ=xAr©Ë]êR¾ü%0ƒ)Ìa³˜Æ<&2“©Ìe2³™Î|&4£)ÍiR³šÖ¼&6³©Ímr³›Þü&8Ã)Îq’³œæ<':Ó©Îu²³î|'<ã)ÏyŽ“0  ~AlaXÀQH0TÓ Á(‚5€3œ¡ ~PE dVÚÁ²¢ÖYÄ”# ¡Bø(HC Rz’´¤&=)JSªÒ•²´¥.})Lc*Ó™Ò´¦6½)NsJNàÁ£8h²ô…dS @)ÊpÔp9ÀãèägÑ©êe~`š!Ä «^ýªWu*Ö±’µ¬f=+ZÓªÖµ²µ­nÿ}+\ã*×b À vðf:Š|B(YHB¸àG.ª¶ªWÍêVÁªØ®º¢±Ž},d#+ÙÉR¶²–½,f3«ÙÍr¶³žý,hC+ÚÑ’¶´¦=-jS«ÚÕ²¶µ®}-lc+ÛÙÒ¶¶¶½-ns«ÛÝò¶·¾ý-pƒ+Üá‚ÖEê ¦°‚ƒî¥Ù +Ý»PâªYˆÂV§Ýín—¸Þý.xÃ+Þñ’·¼æ=/zÓ«Þõ²·½î}/|ã+ßùþ– (VppTÅ `PTéäÊé–iB^ƒ0¸Án0}#,á S¸Â¾0†3¬á s¸Ãþ0ˆCÚ",u¹£2’“¬ä%3¹É²}ºÀ… XêQ×;@ÀЕªŒ©JcãXÇ>>s œ¬æ5³¹Ín~3œã,ç9Ó¹ÎæÁ¨ˆ¡¿¥`c´Q„ÂQp˜§ªˆ9pÁCB ` éISzÒv¾4¦3­éMsºÓžþ4¨CíÚ ` _Àƒ p> @Gõ\!T4@À‰&ð!öp#!%˜°ƒ-ì` ØÆ>6²“­ìe3»ÙÎ~6´£-íiS»ÚÖ¾6¶³­íms»ÛÞþ6¸Ãÿ-îq“»Üæ>7ºÓ­îu³»Ýî~7¼ã-ïyÓ»Þö¾7¾ó­ï}O; s€40:Ô!€þ0„ ¸"‚î­¥›ë]÷ú×þø ø­ñs¼ãÿ8ÈC.ò‘“¼ä&?9ÊS®ò•³¼å.ù¼wp€!à…€BÀ5Ї!`¨0E+ñéâ Ih n 0½éNo:Ì£.õ©S½êV¿:Ö³®õ­s½ë^ÿ:ØÃ~m7ÔàxÈy¹P ¸âç*²õÐ%nt¤+ýévgúò®÷½ó½ï~ÿ;à/øÁ¾ð†?<â¯øÅ3¾ñŽ<ä#/ùÉS¾ò–¿<æ3¯ùÿÍs¾óžÿ<èC/úÑ“¾ô¦?=êS¯úÕ³¾õ®½âAІ+h:pAZp×xYèq—."Þ„&¡3pò“¯üäþùÎ>ô£/ýéS¿úÖ¿>ö³¯ýís¿ûÞÿ>øÃ/þÆï üæ?ÿù _~8€.ˆ`@àÑ94¢KDta QB XÀ  †& . 6 > F N V ^ f n v ~ † Ž –  ž ¦  ® ¶  ¾ Æ  Î Ö  Þ æ î ö ²¡ áa ÁÀ@È+ðÿ^*€åŸþ½ÿù  fá €v¡~!†¡Ž!–¡ž!¦¡®!¶¡¾!Æ¡Î!Ö¡Þ!æ¡î!ö¡þ! ¢ "!¢!""&¢"."#6¢#>"$F¢$²¡ì€T¨H@¤4ÀDáJ—#„Àà@ À€¸+¶¢+¶â\Å¢,Î"-Ö¢-Þ".æ¢.î"/ö¢/ÂÓÐ@*D'š‚'6\„éHá(òQ)žb*®â+N£ €5^#6f£6n#7v£7~#8†£8Ž#9–£9ž#:¦£:®#;¶£;¾#<Æ£<Î#=Ö£=Þÿ#>æ£>î#?ö£?þ#@¤@$A¤A$B&¤B.$C–£)<¤¤‚0@Ð…¢2Þ36ã9‚dAÜÀ œ€ Œ$I–$I¶J¦¤J®$K¶¤K¾$LƤLÎ$MÖ¤MÞ$Næ¤Nî$Oö¤Oþ$P¥P%Q¥Q%R&¥R.%S6¥S>%TF¥TN%UV¥U^%Vf¥Vn%Wv¥Wæd ã*„â+\$Äidaq¤G‚¤Hš¤[ªÀ+Ä¥\Î%]Ö¥]Þ%^æ¥^î%_ö¥_þ%`¦`&a¦a&b&¦b.&c6¦c>&dF¦dN&eV¦e^&ff¦fn&gv¦g~&h†ÿ¦hŽ&i–¦iž&a†‚2.#˜¡åT1 á X€ ¤€mÞ&nÞ&Fî&oö¦oþ&p§p'q§q'r&§r.'s6§s>'tF§tN'uV§u^'vf§vn'wv§w~'x†§xŽ'y–§yž'z¦§z®'{¶§{Z§k&lÊ&mæ¦}Úf|æ§~î'ö§þ'€¨€(¨(‚&¨‚.(ƒ6hÜ1 Ø´€¨@ \(†f(†:(‡v¨‡~(ˆ†¨ˆŽ(‰–¨‰ž(Ц¨Š®(‹Ú„J(…Z¨†Îh ´¨Þ(Žæ¨Žî(ö¨þ(©)U øÀ ”À ¤äÀ4©“>©“©”N)•V©•^)–f©–n)—v)‡)’*)“B)™Ž€—ž)š¦©š®)›¶©›¾)œÆi|‚i’.i™’©œæ©žî)Ÿö©Ÿþ) ª (ŠéBé &ª¢.*£6ª£>*¤Fj•ªj”J*¦fª¦n*§vª§~*¨Þ ¥Ž©¥ši¨ž*ª¦ªª®*«¶ª«æè¨–j“¾*­Öª­Þ*®æª®î*Îάò*°«°+±«±ú©¯–ê±.+³6«³>+´F«ƒ&«¥J«µ^+¶f«¶n+·Šê‘Ö)©Zj@;TT_v224_html_docs/images/glass/grey/hide_menu.gif000700 000765 000765 00000000714 11222361073 021554 0ustar00abwabw000000 000000 GIF89a(ÕÙÙÙåååÉÉÉÊÊÊËËËÚÚÚòòò×××ÔÔÔÞÞÞáááèèèÑÑÑÓÓÓØØØÛÛÛìììçççÏÏÏíííêêêÍÍÍÈÈÈøøøõõõúúúùùùÆÆÆöööÇÇÇ÷÷÷ÌÌÌûûû!ù,(é@pH,ȤrÉl:ŸÐ(ô¢@,†v+x Å™)›Ë‰ÅR)Öðx¡\YK"çüy‚ˆ4zqy‰Ž•މ–ŠŠ›‘“£—™£Ÿ§¤Ÿ±²š§Ÿ¡£¥”§˜´–«‰ÃÈÉÉÏÈÃÐÄÙà ÏÌÚáÃÏ ÚéêéÈÕÉéÔëüý ìK7¯š=v `ðǰ¡Ã‡#J\Ç¡¢Å‹3jÜȱ£Ç1ˆI²¤É“(I;TT_v224_html_docs/images/glass/grey/hide_menu_roll.gif000700 000765 000765 00000000714 11222361073 022604 0ustar00abwabw000000 000000 GIF89a(ÕŸŸŸ¹¹¹———   ÒÒÒºººììì···®®®ÓÓÓ¸¸¸ÅÅÅ£££¢¢¢«««¡¡¡ÖÖÖááášššžžžÛÛÛóóóÇÇÇÕÕÕ­­­¯¯¯›››ààà”””–––øøøõõõùùùúúúööö•••÷÷÷ûûû!ù,(éÀ’pH,ȤrÉl:ŸÐ(TdÁ@†v+( !‹*›ËF§ó(Öðx üX3.çü9’‰d™ãŽod± AÈCæj¸CË œ"{†/«ü^"|ØÑŒ²ÿˆ°;·„‘)µª²zîÃG,ñÄg Â$[ʧ!‘± ¥f²€4H,û¬’ˆ&“(B +–’(ðÙñC§ ¢Æ- ܰРàé" DmôÑH'­ôÒL7íôÓPG-uÑ4ŠáöD)©(yi¦"˜ü¢ü²b.–pQ‡Ú\´Ï7ñt0 t*›jh †)ÿmÜÔ€.øà„îƒ)_4’aaþêH; {o¾žþÐŒ¿4’8¬Ôá¹çm‡ÎE<ñà‡%*´° ÎnrƒpAß¡nûí¸çÎt `xéFZgAfÈ=Sîé¾|€!¤|¾öÚ¢‡Nú7–˜ÎJ&ðÑ)-N´³?ƒ WL”oþù觯þúì·ïþûðÇ/?üOÈðJ%ZOZiìŒö²(SËòç.zpû†éhºLt@ *ȳá×õ )p€7ÈÁvp~ ¡GHÂnaš¨E˜.цKëÇ[ÙÎf 0tßP 2Âᇙp  ÿð‹;Ô`ˆ4ØáZÄ@ @BáŠXÌ¢·ÀÅ.zñ‹` £ÇHÆ2šñŒhL# ²$ƒ6¦`0àâ41€¥N(Þ²úÐ _$/ èœ oÈòpJPB0ô ‡D*¡*èÀ `…ÔÀèÜ&$Hax¬¨ÅRf1¨L¥*WÉJ32jK]ª…,£Ñ€@#ÈBq Z”ìXgH4Š| òs8üÆ1|¨HJl"Єæ&²A m£VÈf $! {Ø ÜsÝ?!!à€Š¦L§ÖÉÎvºóðŒ§<çIÏzÚóžñ„A£€ÿ„TÂ]!’E‰zŠDØ¢WŽPƒ4<%²ù§eñˆÀ1¡WÈ‘zà4»Ð…xt G°`ÉlVR'¨G#”èv(àv¸€ DYÅt–R 8Í©NwÊÓžúô§@ ªP‡JTBGÒ€ô+Y8bHMhC% „K„á¥'ãÃR€¶:HT¢6\A!xHEfã™"ýè ìa ¨•õ(©6%QlL7pBÿÑŒáS¬©M±XÔÂö°ˆM¬@`ŠYèhí꘼ w&½ª! ðhƒ#(µƒwtê _GFëÕAŽÕtÏ€ƒ"õ€VŽz”­h+Lñ[ÿ€ | †$äzÒz!¢P€ÔðŽHá !˜é9«ÈÜæ:W±Ð®t…z qÉKÓÚ˜*u ‘ICHˆ¤±AëRÆúrñU°~N¬9\æE9‘Ñgºv­°•m 4‘\Õ¢øà€M“ÖàØ0.A‹vÜ¢¸$€ ÌIEçZ¸ŠdȰ†7Ìá{øÃ ±ˆGLbû Vêç†ò×µ&|MS&óÔ ÞÁÄNÂt_­*<ße>‘Á8«HïËÖ¶¶•¶Þa—¶¿þ‘Ìd\™òÁÒÖṘÅb°'¸#l‰è@/éÖVúÛlÿÝo#˸= rj¾Ž÷‡~°ûÀV tVÝÐÑ6$àèHO:Ò Îô¦Ç™ HB- en¯a ÆË’¡ÙL¡ˆˆF`£•è ¾‘ {€¥¦úÇ*0€Q*ãä(G2—Fð¥w{xÝ™±=ÕŒD°Â攬A=N¡ d#½ð9-þчDK8GÑ•Nù£Ëáò˜Ï¼æ7ÏùÎ{þó ½ÈÀÆê¨ŒcêËé%sã1¾¿À ç öÚ‹]<äÄÎ v éu_ȆF]‹òIˆ[ÓóQxþ@Æ¿w|âhP™)âÑ›gSF@* Xhö/ýäÿp0q‚ èO€Ñׯþö‹þýð¿üå OÌ]òv„M¼ìý³<2 ¤@{¶v¨€ Þ0v™iüÐða ˜r¾ eiáÆ_þ•îÂTÀ",Äb,Yw9fÃUùP}€WIƒ7 ` “ OÕaÓWæT~çÇ~:Ø~l@>øƒ@„B8„DX„Fx„CÈ)ÐüäO£?–ÂÎC åPT´ ˆ€ €u ß0p ¦`aÐs"9¸Ð*÷X‘/“E/ö2sú‚l€Ä Å·‚Ûdˆ0+à Ð ©Ð‚Ð)vEäÿ—9¸ƒ;ˆ„”X‰–x‰tpK° !»‚Á²hR,bc‚+¢– …Z´v_§€ ¨Lbi›ðvõ¸P"gâ` ´äصp,D<@)“Ø<µ·6¬Àn'eÉð J° àŽà;°xöæ´è÷àŽ0ŽäXŽæxŽè˜Žê¸ŽìXŽ)` u¤5uX/“³GÈ#{¬€Šúøu`—€ ¨Çp ?F %÷v3€lÕôˆ8\˜•YÕ&\cu`}¢ðP”…©Ø…u7¤VI'àŒXФ _° Bâ%#šky…àá8“lÐŽ6y“8ÿ‰“)ð º´Üå]ÿw2ÅX¤ Šú˜ŠÓ”þ¸ù Ï@ÛÀ³øvYdš ©x$\‰0) EY¦‚‡•CŠ\e qp”ZvÞ°6x@ ½eÉ0’d ‘ »Ø( >à@`EG“3™“†y˜çhgÄS@Ž;©KUÐB/$65 “@qq°™j J©€L)ƒÀ dÈÊ@‹šl…šð •P µà% @A -j …$xlÉ£l¬°™i Á¹–Óš Ú€`§† ©ÕаàU€í^``¡t ƒI˜âÈžâÿžä9žæYžèyžê™žä)¥×¾8#@Kt“ òð+; »Ù)|„9[• ñœÀy”IYœÞðsð”¥yš]šª‰áö`ð †Pò° Ð)7ów£Wä|ÇqPÒ<:œÄ šM9šÙ0WÆœ?äœ-` š ;pa³ Opæ´ã2éßÈDZ¤Fz¤Hš¤Jº¤Gzpð¡d»©@)m€¡` €?Ö¸”sø›'Z žy þøÇ0ƒ@Œ€ T¡mµ_ý%u®Ð+nžõêÅg€ÝSAéÖ)hÀ³` ¦Ãù™+š?F_ÃÿXZpàœ¤ª•jp åÁ tç“B ŽL:ª¤ZªP·„óšÚ• NE"GR oà1vê)¾°2$@aJœÅY¦ ¸ ΀¦TÀ˜ð ªiH–¯0ºÒ8Ž 0žÂ2` °j—Ê¥Ÿõ )𛺺«cª¢g:iÊÆj3` 1êœÐ‘Ð+Y †-u$3°4˜ ¤¡Zªþú¯S „_` RWn’âJB/íà`˜¥Y#‚G¿ô “Àºú­'® Ê”:°±¬Â:ÃÀ kº©‰i tçvç1óB¯žb22 ƒm ÚÿúÔ’¹ ®Ó@ ¨¨Ãº¨Û`®lºÊV3Ðp@ ͦ8ûÐ+w4'–…›· Àæ“üê ð]ûµ^¶`;¶b[¶dÛµ Oð‰z$Às27›äe^¬Öظ “«;[ ±Ð«Þ ¬ù Ãà”sp ÎÀ±ÃêdØÇ·i '‘Ìçpdz À »Ð‡ðK¢0±zË·ª¨~@D{šF ¡E6£üå¢5Ž@/ Ú=·' (°¯°µ3ù¾û»À¼Â;¼Ã{Tö‡²u<Á˜wþcÿpåÕ=âtšßú­±à³ º¨T° Û Tÿ@ ~€†»±Î€ƒ° Ê»T¾‚a0,¢8¢¿ 0`Ð ò ·°P0e Ÿ»™Ù«€ ²åº¦lª $ ¡©‰à]²1vW²àb÷   @ ï 3LâЀPºË»àH¼(œÂÀKY„É÷„‘›ÁTØ)(c¾@hÿÀqÒöq0:ÀLé Ï0ºjÊÙ€ HŒ Œ° Ä0 sp¸0¬é»¾(àA2/1Wú² À70 ^p Zy§} Ÿ;Àp Xàœ0´Glº ÜÀpJ°XÓi[2õâ?&#´`^=#   »Þ©Â† ¼ÿ•ThnŸØï@ 3Œ§¤h à )h0A”£ù€ 9¬Ã¦nœÀ{pÊ{  ˜ Û0¾P¬sàÛ ¶À ;ð‰õ¢A@`ð“p_° 6D gü³Ç0 ÄPÊ ¼À¨k šÐxÖ¶Ž#,‘ügú"ž" £Ò$“.@$¼»ä\Îð4€ÎêœÎì¼ÎîœÎàÍìâ¾ñ‚Å­gz– ·@ ©S7 À.» а±g²¥Œ ¨Çʺ%`À Xà PÑ «¦-€´ ¹ùTØPÙåÁ¶á>À¿Ðuz§vàz{ Å©±<´EÿëÌ%û ¥ÁƒÅwèzÿL*ÓF¿à Êr7Œhðã Î%lÎ@PÕR=ÕSmgÇ‹]a²?©w7”DI ·º ¨ð"ÀD\ú¦ ¸åúƨìÌö€1Ò̺Öà 0Ñ:` QŒm<¿P›í€©”Œ9"m çQÒ>,À“P ( a°Pd½¹š½2íŒ Í ¡Š|¬]Ì”Ч2) Ð€5¿ðWAÆ’°Ô$ÜÔäLÕºÕrP¹ÛOY#)çvu“¬uÿ‘¸Öb}Ù?+Ä“à y5ØÒÐx{ ¦GÜÐj²`PÏÃgÿðm Þ` ‰«¦‰ÀÇ—úR‚úF%mÒ‹ÝØ[ S ¡@"*ùhÀ$p q@ Þà ²œ §ŒÐlP¯0¨5U0Ü™uh€9Ä$I°Ú~÷йÀ1W.õ¢‚ŒÛ»»ÛRýU3 Œì¾Õ9Ò‚Íe  \IÖaýË} ˜} ~@áð 0¿÷Ý3PÓrìX“]b‚Ò ^‡[PÅÃÐ Û  C ¾·x¾p'x‚-ðShFÐÖ,îÐ)« ³û} Ô ~½¦Ðu] y¦oËzZì)|äG¾ÌI`sý`¾Ú÷P ”d gÿWM„ß°뵃ìÔ4“^é”þõ#‡K/Âf‡yîŸ÷Øü\ã`Mê7ž«× ãÔ@ÞÃнÙЉÐj¸°Ä"É6 ˜bÞ!{Öbô²P¿0@ÞkÌ @à KÉÆÕàŒßò-bž ‰°>·¡ãÄqê±P:ÐêŒ0šà%K¶ÓÃ&2Í»,Á”<š€Ü*X}¤fƒ^èŰMÁ ´0'Ê’B'#îÔ9PðŸ à‰ð¢½?¤ @ÑgŒXê5~ê8Žê±à ¨@Þ±¬¦Ú€ €|€$—â`íà  ° ‹“înû8; µÿ´xv€Æ0ìÄ.åÄ€ ‰ ïP/Æñ=Õ^¤¾K[° aÐBúÀßà^Î0 ÜÀ0v…èö|‘PbL–0ï*Hj5@è…NeØ`ÃÀìj°xŸôGðè·=Èxðç~¡LÅàXCdó ˜iLø`ý8®êÄ.¬Ç>´”¨üÕ P¹xY;`$( Æê.ŒÒàóÒV\Ô{óÔà Ð×=þ à”›/Õ¹[@rž¿;ÕP ·Ð½t2³ ±ê£@õʼ ¿Ðn CÜ®g92Nq; c?ïiª€ïjoFð J ™~xÿú/˜ç0âx?È/Ðo 5,„çd韰·7]§ ‡øŠ¿øÙ[ì¢Ü ÝË”˜ì!¸g˜@ûHŠÑ‘VÐ:+5µH€dšLä¢K’J0BlöêK¾Ác–eäiãÏÐp`ƇœÇ"ƒLµ@h—*Úp‚®ºBP %UŠ\µÖZƒ­¥—lÓ#Ýx+ þh}JÉÑÏ ü(n¸‰AúÊ—_ÀÐD4D`gÇ™¤OFecʨm0X@C û傊2•ÿ€Ž_¹å–ôNZ¡¿QX2FL1øEŠÑR!!)2µÕ”Œ•:¨+/lL8%Dˆù0Äojm!7²ØA©VabƒŽXÇœeL4…ZÜÈñèþù¡;~™e’|êuÔ#“HòkJˆMƒ2†áæ¶Ý¤$ƒf–HÞÈ,G'¢ãã—3  A±fIa(XpÀÎ{'¦è´3ªýèÄ^Pƒþ±Ã9 ETQiƒGýç—¼™g¥–*PÉp¾àƒ/Lɇ #<ÒÔ Vpæmê1ÂÕd|%t õ›@Ñ$Qˆ÷Ÿ“zpa‰•qF ´°ÿE–]P`64±ÈŠçÚkKU²„kʶ³%pÅÕC·=x³ÇMˆ\Á1ˆ Ribiœdpà‹_ìhæ ÂÑX%‘/dXo<ƒ_¤yPù¦N;+0F¼™¤q¢bhF“ŠƒÂXQMx¡¥9Z$ÆÀ•F6c;¯¹# RÌÛH$¯¹óÒ9bbd†dz~æç’WA‡riá [€pW³0"þÇ—Eˆ`qr¤žR¥¢0´»þ&vç­$}¿sä‘=‘ߌ<±à&JI¬üå•ZäAZ BÜ€5„.4_x‚ ð„hâ ô[XÀ„Æ1a [ЂÈÐÿ$¬b½RíV??ta pzL‹Ñ|3„€Ϲð ³Àì*`†:•àwP_R“¤XŒB6zò'¶ÁL(s€C“—<¤«ÜÇݪàˆ[´ÎY`€ã"M­5>RÑw| ¦ Òîz÷;L•Aðá<̰D?Pèú¼0‚7 03AÈ‚,Ú°@A$̓úÅ1hA bØà˜ Á-d’ S耜A6QÊ1W%&Œ`¸ÁŸ<ö ¼‡24¤¡ø ¹v@,¿@@œÁÇŽBˆD$âú”t'L!C ô@ mÿ(cüë’€Ihb]ˆtÃÝéÎXïcO°€  ÆÀ¨ó¤'´Œ&Èb­; j¦-náQ@ ëD'ü0 D”føcx:Œ°K†0ç..‘[‚#ŸéŠ/fÁ/ j”r˜ÂÈÐA–”'…zÏ@`ó G=XÉ(|g†ð £šÂ*áä‹ô„àå %†0½É"8ƒ&°€ d(vÊâÛW)Ù ”TÆ5£D Àƒ”Á•"1€J˜³ÍÈ!hÁÑ^9 pÁ a€ÆDžõä€?à‚[h§)pûȦÄÙ "&\íª‚Anøÿ e¨C©ˆe¤oUH š ‘ç4ë^ 㘠ÒS2@µ`mkYúŸŠ‰PÀäÜa˜DdÂN°ôDž†á <"‡;Ãèà¢|À…à„ˆ`-8¨.žZcÀ®£¸jCÍ®R›úÓAÞ·è0 ¥Øl*ñYôHò^¿kÜÙ¢u # zÝk! ð\„¡ jÐŽ/0@n=àwÒéý«ë²ºÀ.Cé*´à a¸D2ÂŽl4}€Ö/‘ †t …ŠíO`ûb %Q5œ…ê1;€#ˆ°¬3jƒ‰_(@jXê?À C%ÿ“!0 Aqt1 npà~ÐT½<ÐNlU^-y÷P¥/$â ނ Gû™K(‡~ùÛ_\Àï`Nzš:˜lµ«Q’4Î+·HÐC -H†ÿ1Ì0Šn˜¡ ºØ*-E¨”>”qûbÁ&7ÙAR²x¨Ê-ª²‘ÍäúÄ4=ëÙq 6­ ?üA 5¹É#‚ºñd+[æ þZ°ƒuHHD Æüs cSÛú+zÏêŠ,,²ý¬säë#OI à³ü,€5àUÐûå:× >pìÆ1H„=bòà~óÏJé`*àAö2T`»&×€b©ÀSŸ*úÄ€A(/žÒRj|—2'|á ïq0HÖ‚ê@·vÝ+v0eG;Þ)4¢'9ø¸á!à>Üü¹ÌY€ì  {ÂC7ˆÿ˜öÐ ïÝåi!‚2}äYÑúÂ$ ÿƒ?Vw^€uŒêèzó•݈¤bG?°Å ¼*i4«yl6ç%ñ±˜¡ÏÓ4ƒ›C¥4c«îà(¯qÓ5ùðó7¼ xÁòÖùT½ƒÉ™!MF ­Éñ˜D`øè<ÓSxуˆ08„Cà…Uh{ /EB2$DÊ‚]p³F’3w¨³ÜcSà€¾à³:(¾ÀBƒä;rPæk¾ýJƒ4p€6¡…Ïq«!ƒÀ*á6Xo[¤]¸ˆÏR Q@3ص]3fð5 222ƒQJ­–ú D‘?eÓA2,C3,Ce{áúâÒÿþ+nø„2@„N!a‹QX„C3ô8f¸¹œ‹ˆ0Pƒ0°…Dh„ j0†HHB¼±(Œ7¸­Ãñ(ø€>¼‚ 8€x<‚%˜Á¼AŒ¤Dˆ$x.5`Zˆ`øHD«õ›¥ó¬0¸›°µfÀµ]ë¿n(??6aÓŽUX2à‰÷ø‰Ã3¬Fk$C:à!#²ª€bÜ5c`ÅÒ0– œ`ÊàÃ3d2H4øi„vx¨Ç&hƒV }|ƒJHºöòE§-Ýó”_ø¸x5" PQÄR H¾t0‡ÿT\E®ã4 €ù‡Xt‚0ØzDKpƒØ3 Ú³= …8'à’“ð„b¼ƒ„G]P9ŸR —;%äR2™3CJ¢,J£xO{!±hi¿)¸€_ n4²yÐÌ …Ã*Ô…Îa¥ˆS…½QMÝU^íU_ýÕ^Ê/¡ëèd­P:$†`°Q„ÚkBÇ%Ê_MRÈð€ƒU@N1Ct€ Ô’)S¢9 ©'¸ÐKQ<€°H•TJÅT}ÅÔèMåÈâMø_h)8Xét€ Hב‚¾¦\…§œP ýÏ.(ÿó¹D8@ÅÑ~íXýX ÙÕT8ƒrŒ4hÍùqìNP@>05ˆ)øC©VŽÙýM  ƒEHFH„_X¤0˜¥t-%/|±Õâz%E«Å ‚HÅ×IíZ¯ýZ°õÚØ ë” F˜Ëx1xÚ÷ûC)È»ØtU ¥B:L¼Åû˜ßÃUY¿ý[‘-Í‹h=’ÊNP%ÐÀ;hÂÐŽiå;ÜMU¶ÉÚ &È€'X„Ex‚ h[•zÛ/Œ²ý€ Hx]Ȭ [Ú­]°¾ŽØŸýèÜvý]ÿSb-ÕŠ-ð¨¼Ëc º5ÆX­1¹¨V>SAê­^ë½^Ü…ÚZ€vÈŠaB€5UJPòÕ„è,'HÈʾÅÞÈ]`²ÍåÝÞíÜu=%áM]ìt²ŒØ%ØÅZ"°]®Ýêí¤ÌV ßú}-0”!(SÊù‡DЉ=ÿ<]˜bÃh*Ëu_aÜMë ‰M Nò%_•…,hýø‡< €è=P>öÙù•Ú–Š­0D¶\_&Ë %VâוÈ.`(öZ ˜â)ÆÝøŸŸ 0b>Ö.µaE˜ÐÀà`YDà‡²ÿ’8‰„Ôáá£b8Žc9žã9>5t®7y‡@ƒ?@€ñ%ßa°¨[0 #Û‚œMƒ"xc:®bÜÝÔ߬!µýÕJkõØ+–€$^bŽÝ¬ÝZPeQåP–c+6b,ÆN"¾ä"(Ù“MÙ U2®PÛt8@Ñ>¸¢jßFîe_†ã €D2Ap‚9[€!(È?ЄFð‚<¨‚]€‡ŽS÷ˆÞ4ÈÑ_VAEÌ™s² ¼äéµâ4¨¡M^â&þdRNguŽÔ^~_æÈ2$ÊŽeä-°X«l1ã ÎÉ×´‰ü3ÎëÛ_h_î`@Ç_l‡ ‡¨…}ÈŒRhÿwè‘DB è¹"hSî×MEÊy¦ã(‚:-g&–]"8•^i–ni—~i•nH™–é8ÆÝ~õÄ8& HƒíAÁ"Òç2f]À€5|Лµæži¦nj§~jš¶ ˜N‰yLNH…wѧôø;HŸ”¶:¨~ê:VÁ9nj xß:õNîd†i¹žë•.ë¨nd¦žbûËP‡|žP#¨Âm²!+20±^d²¶kÆ.ëDøAtCTÎGª2@ƒ ƒBQêÅnlÐm @`·æäsNiº^m—í†ÌæXšøœÐÆ ÎÚôL‡-ÖUÿfdŽîeµéEH„pEÅCQŽ(—›Ö:@>מnÆíø5mԎݸfmîŽéÆfî9X¡Zc0°‰õOÏT¹rĉ°Ü›Þá†cš0 Ñ=ýUHH-λæÏ¦nÏkûf2(xëÔîîî¶pPëµæaVM ¥¼ÅLº…UÏœ¼ªÍF ÖS£äUÅiÖéH:0…_xÉ3…JÂ߬,²†pßqïq×ñ†´ïqNpsÖî°€tHr%_r&or'Oò¯oýèkìJè)¾ Pc¬ÍaØ%@¸ÕÓ¬r3/bÿ]^*Vñq&¢=ZQ>H„YpG.NÔßs>ïs&i rsFé'/tCWrí÷…dÂã¸RÃáú`M n‰%Åâ -VQp€ÍS2Gÿôc#¼\ÅÑ\k²¥ÝE-h­á a=ïsYŸugó@WpÙEòCßõ&¿_÷õWô&-pdOvÂ^U0è¦Lˆv ÑLXÀ…¬Õ/à€ ð€~¹ O wqwr¥gì ±¶dRŸð¤œ_Õ^Ø‚¹èŽõ_¯w{¿w|Ïw}ÿõ·n`ìÎuqx‚/xƒ?x„øE]T~íþ&Èÿ „Áe—N‡q˜…`»å^É+(€b˜‹¼Ø…ÕQýø/ ‚wòË落y™‡ù%¨y›¯ù# „¸‚È9ƒÈuçÌ­!¡ˆ±ÁèDõõ…oz§z¨z©oú+ˆðg¾„k¬µ×„ïz¯Wx§¯z>pÖ"„t¾xqX„~†“GÀ€¹x{Ih•O@†D …_Ô“(»úÎu(¿ÿ{¿_Á|(|Ã?|Ä€9 Kç÷Màc[2M7€×©Ï|Íßü…ï÷ׂø¬ýzÒGø§ïwû~²4s8{—‡0^ÑļY¨ ¼„ag˜ƒÿF€†&üˆD €wZƒŠ|À|ÂG|åWþ ø€)pü¡„ü~-ÊuoÈËç|ìÏþ§¯úÑfñ(r/}ñø (ÿÎWq`È®]çP>h„Úòi îIˆûÜ?†c€0èˆ0´þõÃcŽ#ÖkXîáÃu%¨hñ"FŒ†G,!9r$6®¸héb̘2gÒ¬ió¦Ì–6ˆ„(Bƒ¡ àÀñ‚¸¤J—2mê4éL;Cðø ÁÖ¬Z³¢ëêݹq2(hçdA ;°1ÂÌÙ1ÿàQD$‘”*WºÄiù2fœWvöH³å…P¢F‘>-mªÌÍD:o¡°õ5Ö¯^ωã€ëÆ!'‡nôùÂɳ2qñtø²L vHþ5KÑ7! Ç \˜0âìÐèø1DˆÈ”]¾Ìlþãœ2 z+®¹êº+¯½îÓœ¥Á€ ŽV&²É–x³Bl UbŒ³(µÿxN:ë8ÐÌ?Mb O(Ȓŧn´ÑΨÿœ!Eq€kPŽRó){¦«±ÙH´Æ„+³ <0Á|ðÀ·:UU,´8’²'°³.¬·EµyN9È Å?1(àŽa4Ñ (4qË;"løÿ0ð ‰8N½òÝÛj¾©¹âi<–K0åŠ0ÒI+Ý,¡Ï2LLLU[}5ÖYk]µÀÏ^¬ØagÌè‘ÙʑȒµ€ ‡"-.o(E"¦º+t 嬪™<÷¬¯@03IEo ÄÒ‰+Žp¡SA 8`€š•[~9晫ٵãó‚ð`yÍ{#õžw¬ ³0¦2•ÉÌ(ró Дæ©™E®`«X´ Ÿ…â€GØÈYNé’o2´ß:-w€4ЇV>â˜"д¦6½)NsªÓÒ´ŸË‹œ4g‘uˆc Q8âAÙPd.4Š^‹æ4¯hAko÷£ÀŽ Õ­ŽADë(Ç8¢'PS–FŽ%Re¾4‡"¤!ÿ Ã¦ …¹’¡®v½+^óZ×¹òµ¯~ýk_·ÀÀ T“ÀÖG¬#戂AšÐ¦rÓbP¨T§êŸ$¥ƒ:ù«\E¾ Ðtt¤Ñ3Yug˜jîrKxík·*ÛÙÒv¶c¸ír«ÛÚòöî) š¢³./(: {Ð¥&€²O…¨%ªYEÔÎÄZÚ±šs~¨DZ]ÕZ×¶¼æ}ímÓ«ÞõâV·¹ímmu„Òœ³>Gà på*u² ­,.ÝÌNW+`Ù®@g³]²z—L©Ü]ZÇ[¹óR½ì½p{Ý _Úþv­Âµ²7†ý6@²Lýïÿs£jEÍÉÀHú ‚ ÃïÎÂâ•°š*La cؽïݰlåKß½Ñç!°A9ÌQˆå*Å–…n¥;Õ×¼Æ îîŒ ^£ Ç9Ö±yy|a¯ÈAMpKZ䇼K5qs`(#Pʤr•“te’–•Ægå2мL0‡YÌë%³™·*ä×"w4€’™|âf¦³+f1žóc,3šD5^-ïMèòúÐ>N´V;œæú6"6x‰û;i§>YÅ”ÄôVò¬çÒʸÓ×Ý2¨ÿ&êQ[¸ÔÞ-ª­f9®uê(q“)]kKߺÀ.ÖôžOÛg-š"¬Å1±‹=mlD';¦ñ°s”XÖq–öœmÍ=“íÚUÞ4Ÿìé?»gÃ&¶±ÓKîD+›ÕkŽ €Ž%»; ;TT_v224_html_docs/images/glass/grey/logo_green.gif000700 000765 000765 00000032524 11222361073 021743 0ustar00abwabw000000 000000 GIF89aÜ‚÷ÈÈÈþþþQÌW𥛕••Šœ‹õõõYuZ¨¨¨¥¥¥¡­¢GHGtttââ⺺ºrrrppp6864¬9[ÕbÄÄÄmmmxxx™™™kkkjáq‚›ƒ¸¸¸-š1LÉRq!DÂJ6±;‹¡&~~~˜³šÍÍÍvvv¾¾¾ÑÑÑz”{¡¡¡²²²6¶¶¶$'$“ž“zzz”©•ÆÆÆ¼¼¼´´´ÚÚÚààà€€€eÝliiiž©ž|||ðððŠŠŠ0¤6bscÀÀÀG†††!|%a{b‚‚‚WÇÖÈC–H[m\HTH„„„ž­ŸÞÞÞˆˆˆ”‚j„k°°°@¿FRcSÜÜܼʼ¥°¦²Å³úúú•€ŒŒŒTºZ®®®VÑ\;A‰Bbcb6w:œ®™©š÷÷÷Ž¤ØØØrŒs+5+ÔÔÔr‘tóóóce• –¬¬¬&Š* ±¡8¸>•¥–[\[M©R(S+ZÈaŠ”‹«À¬¡º¢aÚiSkT¡‘|™}#H%2j5>½D9ƒ="g%‘¥’‹‚l}mƒ¢…—©˜"&(,r|sÁÌÁ{„|nŒp7µ=[d\H MS\S—£˜s„tHÅNf„h<¼C$†(ª½«V ‹ªjrk2™7f|hakb˜¬™/ 4©³©v’xdÜk†‡›¨œ/c2¿Ë¿WjX‡ ‰IdK›¬œK¶Q£°¤¤µ¥¯Â°´Éµ“¦”@J@Žœ§²§_ÒfcÜj¹ÇºOfP6§˜K·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±c» "KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍÛ4H¶ON¼¸ñãÈ“+_μ¹óçУKîf½سÈpÃôç‹ÿO¾¼ùóèÓ«_Ͼ½û÷ðÝŸàq&Bf´–\#$F !]K¼qJ öœß&¨à‚ 6Ø õÁ  mx±;ìdÀN,ˆ¸3t Ê#DÀ°€ƒ(¦¨âŠ,&È0DÃÈ#×\˜A< 2Aˆ¢ôØA„øÁ;ª4cO -&©ä’L¾WÝuÍ4"È0;ܸÎ;ŠRÅ H <€ÀI;U|ÐÁެ‘L cœà  pÆ)çœtÖiçxæ©çž|öéçŸ2TP_ .äGÈ…ë¬ÃŽ;hù‡®°aÉ?”VÚð€@¦–œÀãBâ*ꨤ–jꩨÊÀ@ cÄH¡fÿPÏ¢btðÎ !i¥¼zÀë?}¡é;†WªÌ6ëì³ÐF+í´ÔVkíµØf«-µ2’lc…}DøjDc:ò§|àÄ<÷ìóÏ@ A HẌ́Ē¡¢Œv°¥¿—œ„ јHM!1d­u0\#I5A©+c¶Ä%5,ð:¿ôÛpÇ-wÃ2À8á#^“a9ÖÿúA;¹îÚkDT=+’챇֌ÇÐu!c2† cÉ ˆPk‡6÷ç ‡>ñ5HéO•ëd@L–¤tº.ÉðÖA ý4n{×];ãL!RH1F4ÿÏkÀÓǧ<üæ•Ì7ïüóÐG/ýôÔWoýõØg=TCH†õtì(¤QÿZ2ÖàL гß8î ûüÎHaF(“D ° ¬q¹i;ƒHÀP{L È@ºÁmØÛ¹n%]áW˜ZÕ@ }(c×âW¿ÞõÎ &¼Ÿ3riXƒ–pÅþK¸àPÁÐ@øð‡@ "ÿ†HÄ"ñˆHL¢—ÈÄ&:ñ‰PAu"@Å iˆ°ÇØQwˆ¢x˜Ôà Ç&7$„ía0ä×;eÔ SˆãB¡ eÐñÏÐB/  ðW—Pƒ=H` !ˆˆ"ÉÈF:ò‘LÔÅÚ@ÉF0Bv<Ãb‘18ìâÕùf×4‚pkkÔÌ Œ)èÁˆe,Ë =¬Â½ð=ôhŠCd×€‡ÿ8ðh$&àa"—é„f:ó™ÐŒ¦4§IÍjZóšØÌæ4WU´B!màÔ‘A/¾‰Ĥ”¦F &l#¦üàÖHh?eÀ–H„>aÿŒ}æS†è…Ú‹i¢"¸ÔþàŠ܆ìá2ƒX„ŠZô¢ͨF7ÊÑŽzô£ éE}P ½JiP”Žú¢ícë˜@ê.XM ØCNM™µÜµ±®”å>a +Õ¸H.ôpˆ€T †˜F JЄSp` ÅûG`˜`‡¨EJÖ²šõ¬h-¬ó­p3¥ªšºRTAÃŽ> u …`wzJÇCwö{ã+c¹ÏDX¡¨Vø„šÐ*ìˆMè. qP~ŒÂAøC;$` 5À`EéÀÚÖº–µi­lgûQÿXì>oÈØÒ®”¥‘¯¥¸$À »¾cKÄ`*KØ4®±õÜÄ(ð™Ï}õºŸ†j éB4ƒ@é±Ë^–‹¨0ÓU ò!ÈÜ¡jçK_úFá¾øÍ¯~÷Ëßþú÷¿°€ù+VIÈPþX­´´H±¡]•.ñp52"œA§ƒmßsÁ7•±LHD6 {]n语‚׆: 5,@ ψ1TÁJPBªàØ l€…”o}‡ „"ùÈHN²’—Ìä&;ùÉP62x`·WÙ(uˆðàt%ÆJeÐ`¾×?òE<ÒóŒÌè)W`ÏÅ26ÿ¶ ±Q) Ba,i\ÔÐŽª0²hì XÈ£TQA À@CÚq1»pƒ! S‡wˆ´¤'é([úҘδ“!tp âtË@,öê×…R”±‹@'Rá†1Ô@ ÿ`'¸Ä®èc„òc³t©b»cØ®Ž« ÅcÁ ¥P‹@ka5¦-Š€`RÑ@B¨à€!PàÛàw¸5Mîr›É š¢ä‰}(c½™+ʇj“Ùõ ìâÁ {¨ÁÂÁƒk Œú±™ zeu³áXìjWßÂÛ[qD ¿¥‹Ë•RÃjÑìgô‚Æ”XDð•RÑÿàÃPl!0¹Ìc~îšÛÜÉ:hµÑ–`!»C ¢¸•¿ŒA ÂÀ…€Ò•žÓÈ/5ˆá8‡~ÂÃø ±-Fœë6¡h¸„<0”:ñ•"kWj Žc†8ï"dQ€|@ j`ä€.Ÿ¹àaÞ…ÂþðˆO¼âÏøÆ;þñ]ˆB¬Ó]‰W‰âZÎU‹NÆÃécéKE`Aátg˜¡vPƒ+Úá?6˜ÖͶ±ºž :ÊPW^”Ç5ïvy€&[@02Ñìb<›XÄ/BÑŒ¼ÎÔ]ö €  ðW+BgAEG5& ýpÄ×lpW!Ì` Ðkð`[%}Ôg}ÛW‚Ü·_‚*¸‚,Ø‚.ø‚0ƒ2è‚“w¸çs»G>RcoÖ€ {0ôÇt { ÷ç +@øÄUÐi8ð0 v0Àpb3r İë€#:‚.êrj•B87fÔt’ ćÅðq„¦ Fº€”Ò @Ów$h‚&8ƒ~ø‡€ˆ_€Ð m@ –R´b+¸â€ƒÿ …гP‰A8zÌ ©Ôaó€O¶` cp Aò„iòÇ`IŒ€1S¼å1 “vîg2ð š zL·8mhôPP5Æ¡ Àb€PuÅ„x˜z(×׌ÎèŒ`Ò8ÔXÖxؘÚ(_°"à UÂ7]øé‚v`H)bÈ&ˆC‰”h‰ 7„ À k$ R oä ž¸uÙ Kà@ XÕïðx5ŒÃ4@÷4½g>to' ³ÐŽ¡·Á`j¨G ·J¡ 0€…b°##HŽv—ÌøŒ(¹Û¸’,Ù’-¹ƒpyÇ)!Ó~õ&;´ÿ íX‰@z€‰kÄ\P›ðJY÷‰Ù”vÐ î@ ¢À% ûRð!grv‚ãe„S5À€ŸÇ“ùŽY¡ Gƒ¦«t?ÀÐî°¢ w%$hÐãàr)‰’i°—|Ù—~ù—€˜‚9˜{9eg° p{  P UÂÐ/g³ƒèƒ1К9;鎔ôhè eKLÀ[§Ù`"ð=çlЗà ýcWUP¤ð(pA¨q`Fì‘; zi&?f° Eh`?f`cÐ ˆÀbÐ@)d8`耗y錄ùàž|ÿÙ“gÒoð´pIc`[Í`Ä€œ·AWœš‘`9€÷' ¦„¤išŸˆ”Ù` •5Ã#—¾òÀ Xå?þr“ö@‹{ ™ŠŸî8„ŠøWz€ 6æŸÌiÀ ð(À æ<xxàð'ÙÍH8š£:º£<Ú£>ú£;jƒ.×€Äp¤"ïð·ì@ŒÀ›î;d( z¥ „€°¥™è¡R°›€epšú‰ÙeôR ‡¸1ˆ tø$Ip 2ô–6•>Á€¥÷É“À¥ýYu0]ù„ ËyB÷óœ)ê”­ÿp$+G&i£Î¤˜š©šªÆnû€(êç!,…Wp ñ ¢ÐW”B:ɧ}ª¥\š‰Fè¡ WšdºuMÀš50x“`[(凜"@:®@Ž"FxºV «}ú§ ù¥m†bÆÀ (Ôœf` 0Ð ÿ¸Pœà } Ͱ(`—P£–ª©ò:¯@°V;ç(Å4!òÙŽðùsOY>ÑЙ©Òj‰€Ú¡! !ð°ZhY”GpšL`{æ‡~pµ:&w®•ò)op.£%FÈ‚ ; q@­÷‡–° ]¯tºú‰‘Å­¡ÿÐ c0l^R^”&I,ÿz .€ã`’ðÚpI»´JÛ´Lû´NµP›´i`[h ¬øÊ7X–yAÀ—Ðl0\cRÇÕpég ™{¥•¸²?Ù²h)”\ tç¡¶Š«ÞÀÀPgÞt(à£{ã³›Ôðœb@®œÐ~.`°»¶ío[þ¹u01[ºŠšHi{»]X++DŽ 5CkP&g‚+Œæð®rp´(y°»²;»´[»µ;Dvò~+ g‹íÂÄ…U—}j›¡•¹þid0£0›P+Àu{·£p5@ ‡ˆ(Ɉ#¥îÿ 5‡îPé„¶=à¸í¹ppÓu2;¦‹š[YQ2%;PÇv.Uà?_L\¤0Tw ¬ëºÎh»üÀ²™…Ònœ”(€»%:È.@Ià+¥0¼çP¬À¶Û¡“«X1+¿Þ £€+ ð° ×[€åRq&WŽ›÷+Sc"‘qŒ0¨ªªI0Ç«™q‰K¹£p¹˜[¿§y¦„r4„²¸íÐ) É+lÅU7ó?`¬Û¼Æ² `ÃV!¹÷sÞëˆZ Mà8[÷ÒR9Â.€º¥-»¸ÅÞ0¿Lÿ0¦BPG ó tz«}pwg²eô–q±g 'žðsÔ §5  K‰€p\€–+¿SLŵgžÝU!ùÚ7§8]F) °F)Ú퀮5@á À­»ÌÌ,€ÏÍÐ<ÍÒ\ÍÐ|2P2B#ãr#qÕÃêÒËpú.cØA °¶Ðc@F CëÔаO\¹µ$ËB@ÅLÀ¹ÛU›@½Š0! I¨Àp ®@ íð(DçËÀWÛqÀÁ6S"Ðmªª.ð 뻾³ÐÊ–¬2{ÏTl G¤Ýœ:«ƒ.¦;ñ2 bódCaIÿÀâÌ ÜÌr€<ÝÓ>ýÓ?í­†[º%+­è»¯h“ž,‹ çüÔ; ™ 0àl0C¤EMð¥¸ZϘ+Ò› &/ÀšD€ \p ÿ¬·°ƒšÑ@›]\u_&/Âm#>0:ÐÕ WÏ@jû­€£Òõ›]uæ©Ü+>¾…®°C5c€²™Ð ݰ ` ÐzÿPh8ÓË Ô¨ÝÓ]`¯"`(œt# ¦Á_ìeÀ ÷ÖÕºÝ?éŸM@ ZÅ[B`¹‰,Ò`m ufÒXòI@É‘À ·p«WaÜÅ %ö°nÿ@pB0:€Eð ²Q£Õ ³ Å" ÚUÃÆsz£ˆ+t‘â{SÃÝ Y ŽÙJ ÷À "` ÁÍP• pglÚ­›Ú>MV;!r¼4ºü˜•¾ltM  ° çŒâPMØ• M €›¸Âj@€2Ë"ÍØvfÁ¹bà $ ! ¿À sàŸ°là UuDÐ&¡"Þä]Þ@ð` Útoê˜ð=æ•¢›³¿*Çé—e›¬yâœAðÖ  YàvË@àÒ`à÷€½ÐjÀX¥wIpW E‹Æ:ÿ, èŒ¾èàöA¤Y¸±ç‚&+í~å,à `â›®âçü`> -^`J¨5@ N¸[ ²ÓÖÀ ÂvƒLÇäHLÑð‹¿3PÉ/ûÛ2Ô`¥%n²×U]€åi€£]Pï 'Ú{ê¿`ª¶`¦ªëgŽ,M Û0hXÍvçyÞ ŽZp›ZŽ`¶ÐW—ß0á:Íô^ï,@g½í†:GÙJ­N }$VšOð'®Û„}Âdž„‰}B`=™ªž& p êêXûV[{•¬÷äÿ@Ÿ ¹^ Ó. ‹€Þך¢¡]#@ÞWÉÿŽ£°‹HàU0™zç" ™`¿p ¥.²œtlŒ2>³­NìT¡µSá.îj¸ æ~à÷à qÇ+  ¤°ó0`8`è ŒÆdoöNï`oळt¤+þ = _ð(îéO qP Ìзº ±Œ BpÏcP â³dòf"m º£Ö(gç Äõ(–vÀ ¿P •IÎ/ Á’Ð …¶:]ì±ûÓ#àŽà4zgZš™ z ·ðÊG Д»lÇ!ŽÇ çÜàôáÞljH¦pî¾ UüÀ‘ . @ týõuI^öfÿoï ×j•¾e §[™6©ÂP÷¿ Y° *ž÷@?OŒÍ[K«PƒÏ`^buXà ˆ?Ž>t3ÁÝ¢ªü‘àêÒ?Œ/Iøâb€*Å©)„†›Æ¨qµ†¢‘$ŠtIsÅM,têáb(Gþ©±7kV®\q~\qDÄAðؔʘ1 5€¥*”Å«°=ªU –bZ ™jåËСüPÍQ¢Ó 1bÚq†ŠßÐå1PØpˆ‰ ÄnÝQ9ô©ŠQ 5ƸÑçÕ«0Ï^wVð$é¯9²ÁÚ4o”žUG ¡ÍJÿ«&0–ì@ô‡Kl8Àã´†”#Rƒ°1RÙC8üáÄWÄ$‘q”¦^„ǘ WœÚèã¡F”/.ì܉8œ> cäÑí·Tרœñræ:‘$4вإ´Y-z´èe¸øÑ€ çR$˜` €áDà„ª$Π@(À ‡0à K`Å"jðbvX#ªªò³hì D“²æÇÐD#­´\Jbªµ×b£mIÚ¬a‡È«Ì’àØ¸Ä’þ®Š¦{ìIâ’?Ö€ç"šÈ.Ž"¹EXF©Á Ú©îŸhƒ€œVôÓÏ/¢ÁGÈ3Oí´kÿsŽ9Bø$5,ƒ.Ç3úàG C;ð‰YQÄŒ^L™¦„P¡„’ÕP‰¤. 3¦Dbù@¨\ÐpPgSôs6¡’62zÎ`°“=0uÖ³ÑHóã Ó¶“%¥y`›I!>†šyCÊubüã" ºþ‘„œo tB#ˆ*Ð B¾†4Œƒ‡%ˆŒJ`­KÑa 8P'‰U@=‰¡à„zIÀ%®°D4˜ ‹7º†px‚Vç½iå¢M'Y È0 ¶hÂÍ€ kˆ‚Ç3@Œûÿ­¡z‰† !0'ÊC9͉€"¸@ø@k ‰2fê†FRÍ ðpOX,B·háèP£<ÌÍh„'†±Äz¬c‘'*B™ªAG>H`*Ù ! ¤d%1Iõ\ ÍÏxʃ_Ä)­˜wð` ìg"ÂÀ`“´Ò•5¸ÄtÖ6…vû A$fЊ\ô2Z»¸ÆB ÖÁ5« ê’–Ù„I|‚}]Â>ü‘¶…F¤ œDöàŠ ÌÌyÎ BpDõ’0M‡ăT§ð×ya+Ð@QG×R€NAÚpÇ:âÁw ÿUpœ+Úf#"h†~³èÒR¤ £ígCzÀa¨,V4¤ R¤”¤|xh\BKèë 8Õ©ÏpŠKÀc fº„ €±‚è³°ý„!Iõ&{s çC2¼6;Ô@ÕX‚¾ºŽr¹C xÇO—S5ˆà /Ø8I¤ŽrüÀ­oÍÜpŠwt Õ#Â'ÀB¤–B›8&u©JÕ)Ìc‹¸…QE—š¾jò u„d¸d£IÕ`@à$°'›àä#1Ntâ'bNs«+B 8Œ’)GˆÆÃ÷8O9}àc§§lÁp Yƒ&lŸÉÿ¥,œ¬EØ“ÀÓ=°ug3'‹¸ŒæW?1ईÊTœ“Y°y&Xë7Â!_úæ÷ýƒ(ÚASkÄ¿pÓj¦üWªZÙÊVøÖFÁÏ£Ê6%ÙppñÓm²++öh ©@‹ÒÄ&•[{8Íã#à·{Ü]Uúðµª5`<ìT=¸aÇ=æC­m ½$¬8³D ¸aLcnBØÃ–. «{e!\âÄAÁJa‡N¦?wsÔLˆSñ/}ùð"H  dîQžªC¿ZÐÈè0²ÛŒ²A”˜ Y‚E˜Õ®~ÉP0ã.xù@’“Ì4ÿˆQêÞŠÐÖ ×ÁÇs ó"©0–íj4ÉI#|2 ÿñÂo þX‚8›ëC4Æ0¿¦<嫘ı­ÌL±ÁÛl_dï7‘ŠÒX8Ò‘ÂÀÞobûWH‡›å{t¤‡! "°1Yk™¨Ž¢åëÆ û¶Û]b ⥨Á-~TaÎNd€©Li ƒ¼ $x*éYõô©ã§;Âp÷»ó!¦D%_¢a†\ð2Æ38 ,paÛ?˜T_5aAÇñžwŸAÿ°GHÑŽŠÁV8pç×-kXý}Þ• Çûó²áÂÆJB3’u$`³ßÀ7I@ƒl_¡à(:ÿþû»Ã §eªŽ`` d»[OŠÆ–»,¿&ºxRÆ ã>ÓñŽ;¤=É@·[ò£!f%~ô£Ÿ0‚L ÖßYð2ª^„œwãŒ`=?N|¼"ø‡R€‡„+NH†dá†Nø¼OÐ#>º†X@¨kš€3N€¨ôj—¨€  ½ÙsHÛ@(Ø=rtð½ß“/*à‚ Ä#+ó†O`e —Fh6 +‰8ȆJ€1Ó@¬ð†ÀÀ1p·»$*1…é1¼£,ÌB-ÜÂ,¼»ûj ÌË­X± „ÿý³;.Ì»LJÊ#@Rø€q«U„¬ (áAO؇?R(†«‡š¶³Ø»0 =ø¦! 8AÈs‡lÁ<:,¼€(…>°¼Ÿ:H@²1I(È’¬w¸<—(µ1¥^:ÃÕˆ6ˆ NhÃ( ‰¸;¸zž+äBb,F,ü¸? Â1f??`) –®R‹H >0Æ0@€:ü‡û{QGQè]ðt¼†³I›“Ç9/ç˜8ƒ Ä`HH¤ D¸4ÀLp8‡q`AìÄh*ƒ3ÀR¥*ø€˜« ø®ÿDzŸ 4/W à„Ž€¸(Â2|Fƒ²ؤႇŒMF…»»-lš¬I›¼IœdH*á ¾pL(2„£„Р’2”رl¤œÄBó1À胑Gh‡ð2›«ÀñXŽÕÈcù{ˆ€.°œ¹I4JD:Èhu(Èr@È„THš¤‚ˆ:´„ Hˆ…wÌÓ‹ ÔÀª$À;MJ3¤¿ÃKÊrƒô`%8ÄœÌLÍ|Êؤv04±†\(É»E ƒ9é;<‘ƒËFÍŒA肈x˜„ÇèÉ CM:Á?¸€œ ƒÍÌOý¬IØ>òÐ+É–¢X˜Ì!˜ :ûD§|MC3¨ªü#`W€ € À@³Œ{7Ð"pâ„ø s>¸‚lspør˜Îê¬ÎìÌQìÜN>`€˜ÐR`³b½Ìx(…ÁÑ¢Jh˜?¦PC6¬7Ì©ÝO,ÍIXBü 2$J|°Å ‚G3˜˜Ø?üÜÌDŒÿX€h˜Ðu‰Gˆ´ ˆ<ÅS‚$7hÚK$AmtP¥Ñr˜Îq ÎmTGuÔ¸¼äÙo\—cÉŠÐ 6¨“&¬@(ClxLÓ\œ– ȉ€mÐH}UXUYÕYmá›R‚VØÕV;<¨2`4ø€v0¢¸Fó£ÉZT` ʱ©Lõ’xp»Œº¨/ØÖ.è‚(à! IœD˜D@TEeÔG]×u}ˆT†$¡ @""¨Pƒ«˜´3€ŒÊÖ.Ø7;ùILxl˜!øD&p8¥Ü?§TQw}XˆX‰ØˆÔÿ3PIÇ `ˆŽ S›[*èR0Và“duX‰…׆$!¸ p=’˜S²\€ ÀÖŒ²$¸ © ©4¨reK`Kp€DM×E]Z¦mZ§eÚˆmmÄÇ8{°‡à$ðWñû¬‹ûL<ë%hà“< *ݸd­àÙÃß–í´—%±Ì%¿`DQfe €_:€_4¸ƒ¢%Ýúía¦}D N]ðuYœ@­ÊÆ0ÀÂ[EÐZA†æ³S 8ð`°G>ðÓÚb.îb/þâ/ž=Ûm5â€Sˆ[èàÿI†žáá C”¥‚Øb0~DL\Ø$¡Nk`”Ie…XðM€Æáø-Z¤MZE^dFndEöb!–ZãcP“a‡=ƒi|‰$†'æl Ê9 PSâ7ëx€œj½cU^e<枺„" ð:$b/`¦•˜HMåUÎcIeHÿ«µõµ»$dãb* ¡B6d>ZGžfjNZUö^üÕÉ,¬É‡µc'¨[“òP€²…âgD…ò)»ÍA“h¥µeLÇ,MÕ0†ºý©ÉDÖ4ÍR›„Uˆi.~*7%‚¸FÏÌ@˜ŠàÁø¾p ?ïônæÈí£=qq/qïê~×a6F, ƒ1ˆ©uî¯5Ã^UyX-üÓ¿ûdqßæšŒTãíbG€(X€¸©Yd¡Ó@è‚ñkM?ý¦ r)O¬†hnôp0q-ßò7ï—Ô†,æ„!7`„Ûrœÿ|±Ò‘18Ù8Ð?HPÆC¸1s «5@NÑ ßðf}V„@°4Ñ2-œ*j(ŸrDGqò‡æŠærH/ñ!˜ôIGoï%fè‚"èNïôÀ€®e"g°:˜o8;`±=$€°X$ºu\Ïu]_»^¼©@Q­½ÙS\ÄØßæ8 >tJ_vfovgvh§tùÆ_>htÖaDþmßvnïvoÿvmTA•ö°m*¸` @éTä>u°‡V{µZ‘„gÀ‚{xµ(T˜ÐÌ3ã§;HçŒK„Ox„φox†Ç4€ÿ!xè'Hæ`Ÿ=IÝÆ{41V:\ Ÿtq/y“?y”Oy•/ù!(wë8Ák¯hp¯y›ßö“oy¬~yÑBƒi~÷opŒ¥©Oð_x_è…C¨ ¨x¸g hޏlsNC¬ÏzqP®çzsøú¯O±{²¿ƒH @dŽnÞÆc^û? וŸ{º¯{qŸv*(¸áømï›ÿûo?yù¶n*ø†qøùþ† ðÏr³‡^ˆü·‹9(€ˆ†c˜,Z©>€¡ƒQ­×ú®÷z°7²?ýt@x €Yµ§I¶Ïæ@Þb@•{»¯}ÛgùrWð/ØÿGÏvÀÿ}m§á¿ûÜo}\Új^drPd”€ˆñ»€– 8u.z"wjÁ¹ïýÑW‡ÒÓ'{…§ÑJ€· m.Á }q~ùŸú¯û¿üŸA¥ò‡(ÐDsG… ¾1lèð!Ĉ )P¤H"… -.$çñ#ÈåF’,G\„>AÚýWÊ“üP¡*PÀ™³NŒÄLpÄá$(¨ÀÑ@¸¤â–.Uçô)TsR¥¦«jõjƒŠ\ÓâÆ6R%;„ÚŠjײmëö-\µCR8xA‰‰‚.”è÷ïD¹tí"iò°Ç’$Éÿ}« †§?œ~ÂØ„*Ä-œÎ4Á¸FLÀŸRÿ’,Ø@Á„QsIÁ1m õõTªWggmp˜TZlk-ð¸Â‡g{1ãÆšP¸ú9ôèÒ¡¯½X‚pÚµ#N¬xä¹.ظú³f2¤Èdiž4æ ±¢àýûç‚iÔ9T+mívlÒV[AÀn/ˆ•ÂYÅ9øàpÖi”Ë!äÜtj˜Tu)hÛq×Ýw#dO2}HðG;œÀ“ŒpÓD",ÁN ‰æA a UTü±æ_k8Õ€âÀ |å[ iA8%•0W] À{a¸!˜ÐÑ0ÿ¦Etµ"†Ó›Œá‚%*®Q…#s¶ñÆžø“Abò“}´ð£QHI÷ßkQÅ–$ Ø‚`9@–”y)¦™jº)§nZÑ•ƒQA@$$¤‘©ªº*­Ò`¥‡-8Žšµn×9ç¨sFÿÈY…(0A,ÔƒHkªFTÜ`w\‘Ž8 A·ª8FÊ6[U.™†“ ŽE‚¥—¶z.ºéª».»í¦{i™È]0‚8€-¾¬º «FHØú/‰'…ÿX'í¼¬tà—ÔÇ#¼ ‘Wé€císØjk·V5š• \9ë[ƒdê.Ë-»ìÿ*™°"ÇH009ë¼3Ï=ûœ3ºü¶€:Eýïš$êÚE ûêŠ p ð°Qß?jÔà†³Ð$RO‡èSG.*òÈ |ë$Êäªü2Üq»kÑE!À¤“6ß}7tÝC}4À‹Ócu}F0^5@°›$äµ3¤!ÙN™$Ú|?zA /´]‘Ü©«þ*CÔF(BíçØ~;î¹ë®{ÐÄêÄàE#]x9ºæ0„ÑáÁãÿxD4gDºA €”D×™hÙg‡<2 €ËÛ¤QªEƒêé¿ «- {?È??ýõÛÿ½ÿÿ<:ÃÛšØIÒq…;„!5 ˆ@ˆ gC J·!XÃ^ö:¶=î©C@!Û[ÚHÐ…é-(eU:a\¬ã>¸!.|! ó`€Ò†r¸!sìËLEà…÷¿q€çp8HH p7¸á]àCo  옫Ö7p÷í©êcÞëß €€/°@‚ bPpP¨FP™én-Œ! kxÃ-бŽv´ã{ؾ‘…#b®Ô¡¶;˜€êMo&uš¢`.l¹Û¢»¨(³1*m&ÀM¥–3–¥“žü$(C)JQÚÀ7ÃÝ?ù¹Ð†t ,c)KXòÿ‡h)‹`¿>þºjè[-èS,hŽj#WZtç6Ƚ/r‹o4@ÁºòÓmÒ^Þü&8Ã)Îq’3œxA ø»@ìŽväð+ ‡WÎr–;´%.o Ëúñrˆ"É•8Ò‘ƒ+Ð9Íi2­¤5Ó™·ƒäؤ™(jVòoTøÂ9‚€0ìæ+7ø(HC*Ò‘’´¤&ýh ¨ Nä­oUQÇ7ÞùÎs õŒåAyh¥\î2ˆþ»UñÀ¡Ž½AF=*rpq€Ãvî|¤_¸˜*/‚.t~SA ¨À‚ |@(X£ Ö±’µ¬f+XÓªÖµ²U­Hÿ N$àg9k T ŽsŒãò¤g=sJLžòÓ§?ÕŽ‰ÎÁsŒ,ê`¦SŸúÌ ®Æc“>>555NNN,,,QQQ999LLLUUU&&&;;;XXX///AAA"""+++<<Q dðÂi˜Óê€d KxB  ®1C¸Å9Ráˆ&xá‹_ä`ÌàÁA %X)@¦‚u1¡ž † ð'ˆxÌ£÷ÈÇ>ÎpÖ`Æ6@¸=Äà/r0€k¹øD0Ú± L€‚`#;†2²Kr ‹QУ3‚zõ9âp@eF@ËZÚò–¸Ì¥.wÉË^úò—À æ/ŒlØ~`Áœ(4ax+¤¡ hp`C2é…Mvòƒ!<ƹ@¡ AP8ŽA<LxÀ-äá _À‚ˆÈ§>÷ÉÿÏ|‚àŸ ¨@JЂô M¨BÊЄ҃#Ãö€†,”á7¨€(¸Ö ]Ð"áØrP†’n“›á– )@ L`ÂKÏ© XÁ\ˆ…:&1(À`‘(G>0‡BÜÁtHªR—ÊT8õ©PªT§JÕªZõªXͪV·ºja¯HE- àT p‚~˜ƒœ ´ \»…3Œ1 vØ"Tè‚I÷zR2‚ðŒPÈAšÐƒÌ T¨R…øájXë%r€+Àà @„*„JÜ!©}­hG;Z˜ö´¨M­jWËÚÖºöµ°­la+€SÿÌÂÜÈ…`QÈBÜpD3,ƒ:h€ 3¸×|!Žp¤#·Aº@Ýé굤aôàJ¥°"P  pA ð€,@7X6ð?|`JXƒ#8€ À`  Ç7’¸B •´í LàøÀN°‚Ìà;øÁ @1ÄÑ dQÀ1øÃp°†/XA H:¸ , dˆh:„A Xd` ®Œ¯Û×0|žåJ§ 0 8€s”@ P2!ÐðÜðŒ‚%0' *.È!@*S·œTxùË`³˜ÇLæ2›ùÌhN³šÁìKèâÿÇð† Ž°´¦á ÉH@Âа ¬!h0ƒ @‹K„ÃØÍè—4¥gÐB`«@ô¶ €¡ˆIt¢DMR°!¨!É1ÀDð…XxÃ0€A豎gü@ u0ª–¹¼Ôøú×À¶°‡MìbûØÈN¶²S oüâæ€W+Éqd€`p/¤Á ~ž@ª²]¢b£×-ã/Úð$À+ƒ À(@$áiQX"ºø4Ü- áÈаРè€4€¢0 VÂJ¸2!ŽêŠŽ{üã‚ÈGNò’›üä(ÿO¹ÊWÎò–¯<ˆ@…;PÑ ƒ¯xÇK^–7‚@(˜p3xa\. 3Ø!t§›Ý&C¤…Р¨@pN󻢨Ä.ŒA bQ ^ØÄ6®pj?¸WÚ®1-°ޏÅ6Ž€†ì¡¸ƒàOøÁöðˆO¼âÏøÆ;þñ<ã[ YŒB½(à)&‡¢À‹àó@Ö‚*øO=Œá 08]Ýzí&€À]Jë`õn€¦% E|½Ù%›qAú18Ná?ÈáùPÂö<†a,€ axÂ#©± áÊ¡ „ÿøÇOþñ÷àüèO¿ú×Ïþö»ÿýð¿üÑOE(ƒ£àEj D[51 ]E:ƒ5Ìð Æ@ ´` ¹@>EW“ M@]1Vf u8Öé„uàc]§öi½`ª  Ñ U77É4fà<Èàxrð\ /à]   WOàô@ Qànð{@ …°„LØ„Lx.P…R8…TX…Vx…X˜…ZH œ0ÍPÆWm‡”H‹ÔHÊ…5‘ —° Í@ ©p Î@R€w¹  P0FD{9=@ piº'¼ç{“0    œÿ@ á *Ä4p HPÕªGðu€r,‰`¥°>8„*/ n P‹¶x‹¶¸…º¸‹¼Ø‹T˜Å€ Ý0 ›ð"Ђ/ÈLP@#Ï Ò@ Â0 äPí¢n蜰 @R ÐÐåW0o {øV^·ˆ–P ¨0 ×+²B+¶²!ða@pSTE S ÒP¡(ðáB{ç+Q2Äp¡ À‰`•p‘™‘IÙ‘ù‘ ’"9’$Y’&ù‘#` ¶p ¥À *ð•˜@˜¨‰5–À5äÿ Ñ ¤P i”c0”`Pd°а °ð”–P –p‚¨.[w‰ØZ ÒðÀ ’J@8Þ.iÀÚSˆ5Êp ŠpàBÀGÝô ]`]0k  "€i‘Y˜Mp˜ˆ™˜Š¹˜ŒÙ˜Žù˜™M\ÎÖ ÊPõX+u°ðDûWXS Î0 u• ’@5”¬ÉšbÐfLPâ #PN9`¬  :^ ]×{¾W ë p¿P T`-h1cP σ²€ãð K—~ Êlà 0 ;ÿaôè°qðð`†Ÿò9ŸñöyŸø™Ÿú¹ŸüÙŸþùŸþY½0 Ú ‘ –dù-Ip–[Ð.°–!ã ˜Ú€ ›iPš¡«)”cðšf°9@*Ü^oUðâ Ð!’ ‚ô0vÉpŸàt&Lã46PRC5Ð \S ËÀ Ýphx°¤6øB >°cŰ !€Z0ôð Πž|ОïIŸbjUP¦fz¦hš¦jº¦lÚ¦nª¦Ð Ä`aÊI/KP)° Ô€ ΰ Üpã`0m…¤!°b 8Œã8X »€ Ç` ²ÐTP”¡Ã¤r (hð`ðÚg Vp c  ëÙ‹¦c:ŸDЬÎú¬Ð­Ò:­ÔZ­Ö ­’0 Ü „¢£Mó4>:5U#¤X ëÀ Ä/$½Ò®„j¨ið¡zg9Ð*Ð`  ¼à/mKmL0·` æPsÂc§9Wd°<Íó<§ =ãð  pb ¡òUMºh0i°=  ?€` Ó 5`¬€Ð  ‰`6ÿ{³8k³O°³<Û³>û³@´B;´DÛ³© D`Ö†8¨úª2¬ú ǰ ºàU€XË+¼Ò+…¯´ÊK`ŽMЛ-Ððs‘p3 ;P¯‡25`!€:z§žç£¢‡5à` ´ð ´€-@Y˵iP”aÐrà1°p"«8)`ªÀjÀ0à<Ù€ GXm‹@³9ºvp¤[º¦{º¨›ºª»º¬Ûº¥› »ðu@ 1ð ±ÎÃ5ÙÐ Ó ;Y[¸íº¡c0¯õºU07€{Vy¶Ž ‘ð œÀ1äBWd0^²k€Yÿ H‹c2ˆ €¢ ÀÁ‹µíš z=и,àDb¨Ÿp Bði0kô@ °-` Àï)º9› ÜÀüÀÁ<ÁÌÀ7 Ùð ÊÀ @ œ Ù »rap7°·!Ó·¿@ ¿ ->оÁ˵50ˆ PðTЛ˜iðsŽð¼¨0 < ! ¿@  DØwtŒ.°Q!³†m«MÃY«Å[K¨Å²Y)^ ‚©` 8H° tÚppxÐ@«À |³[°Ç|ÜÇ~üǀȂÈM@Þ  çð ÿp¶Ì Ð à ¨ x€cp-`EÏE—à >Ê¢,ÃN€«iÃF¹[Ðô– €op?' µ°Ø ¬Àx°`À½2 °±o#€5°Ð ~c Ì ` Ê¡Ü¾ï ¿eKÀQ PiP8œÍê ¤€ àHª ,`¬y€‡ 5›Ç7Sò<Ïô\Ïö|Ïø\Ïà Ó Ò a 1jh€/P p ²Tp5ô`ÅÚ«QPEàÌÎì¾¼Òµ¯¹¨y˜#Àc°,Ë` »0 ßp ¬p4äF·àÃÿ€hªOTM c À°`lpÑÏü®6ì³—Ã= 20›p”P°;º€ h€1àŠ£à€ äPz hÖjÖ3ÕÖnýÖp×rÝÖ ° ²€ Æ@ƈŒŒ¢<ðEp? q5Ð ƒ € ·@c`Ñ=ÔîK¼*¯^Ày¨.P@² °€ ç Êb D” 6PQ@ÅÇÀ Õp #g°<þÈ FÔÙ>pÑ“-Ífp¼É›^<掀£DºOP — Ü“jNLÀ ¸ð l`ÀŒ  g½ÖÞÿRÞâ=Þä]Þæ}ÞåM  ¥0@ “p`‰˜è]°RK Mß&‹!àPM›0 ÙG0à»ÍÛ½âµEi]ë6ÍKpAPà ¶@ ì€ Ž€ Õö?°]0Ý!3 ÓÓ` ¥ TP€¯€ pnÑE]ÃÄr”L Ã) X÷›£¢p îÏ0 ¾àxk/±G‡}   À‹ ÜT^åVNåÜåZ¾å\ÞåZž å@ ÏP§m›Ù™§(E- 0 @[fÐ^°32á€ÞçãG-u ´g@F×nÙÿ&:  Ñ ´À ɹœãÎÙS2œ€ `ѰP9@ C Ù`}ÎÛ¦,Íôú“¹¼õÖc•‘Ð Õð ;¹ `p`+6pªÚÞZ°½> Zð¶@ R>åWnåZðìÐíÒ>íÔNí%P Á¾c¹áf‰– ¡X“MÀ0 [ÉŸ0 .îç¾íªŽÃW0XT. :e°hF ðé*°uÆ£š(®AŠ5§@ ¨@ c \@%2³ ~îâEÀ+G/³Ù<ü˜fqdÀ ¶ ñ0 ¢nÀ-”Pkàaÿ`¯Uàñ4Q@t]@Î) ðŒ°ìÍnåKPôFôHŸôJoô3кpZÒ é@éδ§\C¸` º°50töAÑp½ ã¦\¼fÀ÷Uó½9C# )@)ùcd°Œ + ž†Sª§êà „« ÎùgGÕ ?ð(€Ø©°(àvjŽA@ˆ¯îæ d&= Ô  ±0°yã›ð<0D—¸-À 0Œ° šÀìÍ>N¸Ÿûº¿û¼ÿà èp §P9º£àú£: Q\ EJ ¤p ŠÐ Ë ¶Ð5Dð@¥ÐïÿZbÊP oéTˆöÆCV)ÐR@ù®n3ß4  ÐPÚûx:ðâp Ö™N ˜¡].!–D WËšŽ,øp"Æ -M‚¨pñ B  à¦QÈx=pòAΞ8upð8Òe ÑãɳÖ)X¹x.ȱd ˆ Ô”$xL MQ¥F=SÕêU¬Y«jyÐ W²uÌÄðS'Î5!¬ˆ9s%H I=yÞÚõêØ6]rX±2Ñ TÒD©€²e½L º”ñBFKŽ&3nŒèX!@HLòõÊÝ»gʈcQË“ »lé8J” rÁµR5nÿ&pTˆá€sI„ ¨ÂsV¬ˆ}ÔCFJ T`!3ÉX­J¥“%€ Y³{bˆØ1æLŽ2 È¥—«š¸L×dëLè&KªhåA‚EVj*©Ø0ð@LPKšÙ&˜I˜pÃ<æ˜ã4V¨ &((öè9ERÆáÆ ŽØa¾úZŒŽ©¥(¤ "LN9C &ˆl"@ 2s@V¸IÉ™ PgÑÄHcŒ2ÎØ‚†Qá‰%˜ÐžX–á$™oŒ9E’ÒìíJÁ—l¾X# ²Æ‡äŠ@AŒ0  @…†4’eh‰gz®øÿá /da'Â`‚Š‘YС&•œˆ£W”Pdf&¡&  GBþ[Ÿ’U2jµõV\Ɉ¢€eŽÁ¦— <øŽ9⃋/PðBŠ(T DOl¡%™h<AŒY\±Å#PÃŒ%È ¦–Ø¢„\®‰ Š\È êŒ,Æœí¤!€Œ>`AŠ]š Œ4jH ç|&ƒ€`BzÚÁFKÔÌÀ€ZpahH¡c"àa, G_’;¢ˆ¼Ð¢  €Fª1&™KX¡á…a‹…C $|ð†*h DrÖád\èyb…<òÀ P!¡$ËFdÿ †i¹bˆ¦`$ÖY cl²Ë† ²¡å˜Odð!†—b𩦛rÚI®bž™e”K¼iˆ²|Û,ºý"*@† 3΀áŠ>iÆ KŸ¡eDeÔÂ?¾¡j¼£'œà …£à†–"zPi…·‰-.at¢*ˆÈ˜4@á Kè)e䲨“Œ-‚p!€TŽIFÆ€Û¬:6Ð 0€x"…"a¯e^i'Dnx9þà¢é¦±p… ³9%`˜žTx"'`@SÀ&+3$P „A'¸!ŒV€ j(ËYÆóó G=ìÙÄ'¸qÿ mè¢WxA M¸À±È …CAÊ ¾MgðA´°„'èï°E/˜ñ‰it£žpß°`²3$Á<  2R0'ø5ƒ ¯P L€ Z¨‚"`‘Œ @ PïzЄ*˜€¿9màÀe!žÑpd",¤Õ(F+.ñ ÈYȈ6ÑE ÀÝzr ^Lî˜'R(ø˜ðDŒuî‚=Z*hF@oH€0 CÀ r¼‹œ£ ØðÜb`h7Eã)°4l‚ˆà 8lñ‹o5¨¹Íÿ­s*V\`A¸ëƒomáªë‚H†]€b1C)é(á¨|#lû1äÞÀ²ÿ°…¡ñ$Lœ@h[Ð… $_ùËß´§Y4‘tÁJMHÁd T€Õ °„3~ñŽ`(B U­C¤ð¬&vÃ!êÉ)0q v¨b¢hÓ)p‘üT¡§øe%â-/èlP„p/‰†l¨ºÜkÀÜ#ƒtH+0¤h¢ ,Ú*Ø@ws„L¸„QÈ„jÈ3X¾ä[³pžÕ9б‚=‘7™Å0=3 €Fà„Møƒ:ð0)PÐ$P‚=@ªº½ÛKƒ4¸R?ð(0)zp†pØ0ÓÈB˜€-d¾1+¡lµå¾ŒRëÓ¾ˆ_0jÀÿr˜/`”8˜.@(ˆ z0T`…KH†YÐo¨^U€†v…Zˆ€XÄ ø }Šq ƒ'³x5)ðeƒjEx†hP16(ƒÜSBTœ\ˆ„)zÀQx§v«¬Š²‚X )ÐÂäëBåÓ´$XÁ³¢p€gÚ&(¸"ˆ‚0ƒ+p€](Uˆ3¨ƒà‰`¨…‚9È8B$d„¨g4à3¨“ÚiX/ø-ÌBæ#3;Ú¢(kŽIé€^P‡s†¶y›¸‘ $@3 ‚•û„RèEp†Yø@ÿUàD€èÈè ˜n€ p:A‡p7+ØÑ«"-hRP¢¸ ¸wè((Å1˜süÉ4`†eÓz ð…r ¨E(ËE-œG{ Æ+³g2—¸2KTÙ‚+x"è^™…sð†¨ÁŠ $0ƒÿ“;Yƒ>{ƒÿ¨½r¬m.ØH]ø˜GzôÅƳ«10´žthC À KHRH‡Vp2  ðò8BBqpXDÞ¹ÐTÒÍH8#‚²Xˆ…Vø–\AÐc-€‡ …ѳQ¸€-1@ÿÔÎÐ剂%€‚h„n°€q£Å#ÀÅ$ÈB¨ŒÊ²b‘“·Ìª‚¸éhˆ…èÊ'ˆO@m†‚?ªL¨`ž †IÐøBhƒ`ŠEèOÿtˆø.€ÅMÐ"¨Ç.,0ìT2 ƒt’Óú¶ÓAŠZŽŸi_˜†NÈ5øœ ÉJ±”žÈ…i …ZØ¡€&h*èHMM*ˆ5b£%‚0k» ð„s ­–´”©)˜†MPÙETp.é+áN' Lxˆ»ˆ™I-/(r·H©L°PsŒ-p°  ÿÊ0€(O(Mhb˜…MhQ?x”^ ‚ è‰!B‚P8p#´CxFmT€eƒ `ƒÃx]д`L‚2£¢0è’'h °Ñ*øÍ2˜,wC™ E-à‚ŽB"¬ šà“ OÀ„q† Àè*X#(`‚ñ|`½2&(_ ƒ"ƒa (ÀUI&€²q˜Ì¢ä"I¨†R -è«ÔAoõÖÔa…e è Uð†%ð5pƒ" …²fj¡*JÎ+ˆŒS0! I8…i€†L`Ø—€ <(‚2.<ä DO@@ƒ ÿ>8 ˜‚EmTFõQø3( ¨n¸…eÊN`Ë( €`Ó¸H(`2ƒw½…­‚g`/@Bê hýê ô™bH[°€Èºo³6h=6 p·žl¸€TNzàIˆÎÂÄÕ‚Ð’'ЧÈ…‡‚0ÄÜ@¹•¢^ƒh(†-`#!³Úp«A“‚¨–eÓŽ0€ H“¸s¸a° ðrªƒ´X‹¶‚Ð2¹`†WØØoÄW‚ý<„åØ"èg‚1XrÐÀ)â“ÇPÓT{ƘÿIøUx -³ð¹È„Ð̺wä ÷†c°ZøG(ÍÞéÆÒ‚0è¼q_Òx§¸•"OàO„&h„e°±F”é‚Q£“d‚ÇN€‚·…§Êú_Šø]üÐ) °r V£-x`®|‚• ‚Ýí]ÆM“NàZ€‡ð“ 9¤$Øù¹·q ]!€HÈØÕåØ#uˆ‚08"p€OÀ…1ècÄMX€ŽðÝ©s„jÀjˆ†Z˜OØãU#ƒ>‰‚yp *…M`ixÌRXK(Íøÿ&x(à+0¨oEÔNo­Åÿ=ÀšÄ!`v(é|çá“%0OpÍ…f°&`0p[äÇ“ñ*°Kˆ„ hãW´jà…ødPž hYÅr@â (Xx°* ˆCb1dA3`g9)s€<\¨°$° XƒBÈØÏ)ÐXÕ]æCÈ‚+h‡H[&¸H †H 5+ Cb¾a°‚‚4(€o@.!œ]‚+˜†[`R)€(onfˆ€3Fã‘tQá‚% ƒ.x§}”d¦¨æ)œ4؆ÐM&z~C+ùu! ˜„ÿWТ›D…ÐèH®-“éD¸zp^d pFT˜†IPìHm>e$–€b†s8‡Ox(X¹¡ ›À‰ ˜öÈ\R8…Hj5à5ÀBÈ#@ effÕ]!dh€,…st(€Jµ|­€MH…LØ”è‚Ëuƒ'€»'8ˆ&Û0‚b0-9ò>Óô¸Q+Û‚-bƒï…[¨­IlÅVìÂK€gÚAK°‚L[A¾(6 €kÀ'}â'h (ƒ`IÆFoÀz^´Z&`I lðGxÚÎWî[†BŒÌ0 "ÿ šX¹žØo° k@Ђ¤¶Xê`%  9¸>˜jH°êdÞîdff‹0­-¸P°e° †‡Wh)àžAZe(°Í‚\œAŽ>6Q .¹‘±†¸¿®‚+\ \)‰¢èä‹Á‰p ç‹N°OÔ‚(p„âÆE\º^‚Kp€ÎÂzÀ†[Ð/¨èŒð2»YHzP„LfƒÒû6Ø…K¸†K …L8mEÏÑ%4€ý%ö€…fÀ7\ ‚+`î¥4pJ¸,h@€ëÎnîþòÀ9h¸ oÓ‚ÿ+ €^ˆ†aàW¶œ‘e@Q[nßgh÷½N%†¸ßÃ(…[àÞÒZp3߀qph]eztHC"¸¸}j€ELK¾(‚4`^ðÈ1*˜]À)0ƒ4(G_¦Dh§‡¸‚%Hq'HØ3x*x6€óX†dyU¡[P…oP_hƃ-5pÞ2¢P¸:à=0èÀníþòíN¦8c hø—. <4Ø€¸Áƒ¹ééø±Òp‡ë øý~¸*±…CN' i…ÆZ38>lh=¡‹xÿ‰Ç¹èH&`¢Rüö€$È‚Û"€hP-À!(aàßU߈¦øÑsiž€ Ø €±$@ ò?€ƒ:!ø0À¡0E8e0Z•â†*È;ÒèÉ%Ø€‚¥Hp,x=0‚øv ÷q'÷dþ·e Lnd11kç ¸Lôn¹p\hz8* Ó,ÔÔ牄ŠÎ"p@†'€3ƒãut³<Å_ü[†XpͰuè§üG0ø;m¶Û‚·³x6@ç1µ¹ë|¸&PU¨žè6í"Åüó@¤@4êe‡hø„H¸¾ÿX8Lpø–ì‚9Èv:È@Èú­?€À€pO¯Ïnè~¨¼TØžˆ€]s^3`°+Y•‹là†fg#ÚyzÀ{ß"X*ØìeÝ~†ãÍ‚ÊÞ4Üþˆ œ°Â‚8P–¹ ÛŽ¾L°‚¢Ë(¿éE=\ˆ€ˆñ± À+vIãÅW:YôfŠbF“*DˆD ²ÀÌ ôXIË4.Ó³F RÜQ¢³"YvLð€„‡†Eò¼Ñc„ƒ ``àljײm›òőƚ•Á… @…Òëe µvËÊ ¸¢%Š#o¯^ÿHDân2g2 è…½_·€€1©%èТ®`CŒ 9"лf†±Ê,5ÌH¹’mY60tÐKÅMK'V>T™dG— t%“u‹/ô äRÑú6LÖ¦3¶o¢ƒˆ\x„X z%Lœ;CYfÑÒ¯o߃ƒÈ›8;¶+úLÌ<3 1É`K=HÐMQ¨ÖÀ&é P_¬`dTóÉZÀ@Å$©`²DgTU…Š)ª¸"‹*”‰)x6X±Ã •¡ETHòË],‘=Ÿ`#…­p¢‹A&Ù­XCJ+ˆä]-¼3Ê;¯xÒ@aR@ÿAQèÄS=(â†|àÇ~À©Á{ñÍgžy~ñ~ÇùÆœ 32°x /ÁÃÎ,°0æ˜TDAMAÁÄôd _ áØ EŒaF娰ÅOPŒ0À¡@ÕD{Ê:+­µÚJ+~¬d‚‡LbÎ.>[ƒR<Ñà ”FgÜ@/¥@F V$k­øMðBN€†TÐ#Í(ã sI&™“Œ5åT#@JªSLH¡¾0@‘o±G{ ‡ðÙ) +¼pŸVh!†lpÊ,Ç3L9ÎDrC¤eVñD½Ò£Â0ô`I3½tŠ„ _$ÑÿmRh3@lÑ=ݸdDž:ü3ÐA =ô%àK\@/ÃŒ!Fd@E *”ÊbQ=»üÂid±2Ñ|®”\º1ñÄ42S$Ðб™ Û«ÅaxÑß^±DsPJ!…„BÉuüÀ0ã/läŸR´ b„±W Ù„ÇD€  K°†#˜(ÄЬ ³² HTTy³LBÃRð†‹'ÔZ1Ëûþ;ðÁ <(\£K0qÃ$Ý@†[4qÃ%¸€‰nL …ô´" Øbó>|äNð2 c”ñ·LäðÄNUèôÄ9€¾DÞ^€1ÿF (á Òð­ ‚„€! Å9®ãy¹m¡Q«¶ƒlá~£+ƒø'…n F5¬¹F<9$AT^èÅ2FƒÃD‚œ`ò0ÈE°‡>ü!ƒØºY(ÂR€A TDá  ^ Jà‹o¬á>¨ÂL~QŒ-¡Z; b}Gnù `ðÛ–à¡#â Ü_ |p„%¡ŽÈ± îpWÜ¡ˆÃçÀA&L†4$[v¡2ž1 d`Ȱ70¤Á r´Â ^#}„´¨€U ˆ„t« (… ®„¥m‚0ÃV`¬²ÿ–¶¼%.q ÁH´¢=8"J` Y8€Õ+7¬!?¸ .˜‰6h¶ì`<¹¬eùtœ#øÀ Oßø¶¿J^òIˆÏ,”€!zì#!þX‡‚¬žö¼'>ëyËDR$ V( œ†:Á’s4':¿ŽSð ¾ÒÅ.¬b Ø`”ËÐ;ZЃKqíè‚’ðZ^³¤&E¤„a «¤À&F‘ L ºÈüà„(Ì$Á¨Øœ°ƒ‘ž‘üôÀ Ž“…#üOX> &Ï«Yò³">ƒ;õèÇÒ3Ÿ^ý*B Ö±†à<0_^°ƒµ"t>ÿ#) f´T9€Ã¥xà²#ŒÁ ͨɤ0zpã^@A²2¶±Ž}ìX)ŠuLbOЂ#—Ð… (ÀÃüP„Db&иÀ`pØÄ.²Œ­eë“â¸õS$5¤X)êäˆáï„$ ¸yB ¸Æ=.r“«Ü⊠¹Îm.YóZ¾ÞM´µ!A¬ 4Áf 1–pCº®”¢h¤°„*ः^ð…¬<·¾ö½/~[Öôh@´à…d \€C6†'\`&œÐErÀ™#ìðºùÅïk¥ËCÜ’Õ¾!Ð+\ÆàÛß*¸Ë=1ÿŠ‹ûƒ³¸Å?€®kë[ÖW(â¹¾0ËØ`·ì¤2J˜ƒ Ð#DƒÆcá 39¿/.bÐC)ppvð21ì&(­hEž ….õº.>3š]|á4¯X@ÂËÒЂwÂSž"H1ž•Ëæ'˸¬×„ %”!C-4AÊ0‡D)jÑ«†a°@@R8 !%jQO*VëÂ`ÅL |ŒTAig¢ŽV4€¨*ƒdiæ=ÓºÖlv3œ³ çß&qx¸sžƒ]Ü5»ØÅvqnó*Aò!¡ èPA”&[Xc¨,sÝ®j†e ¢¡…,tÿÁñ}Š|æ^9,‚óx’`]4“^" Â``j*vÅÆþ7À.ðûí¶B d@çà†"qÀvžÑ ñ‰£áߨý°–Ðr. À¥žyŒ$Á­«$1¹Až †j…sŽF4)ÚS¹!Hßë¾ùDðF7RjDã¬ð\`@†z@?XÅ£.õ©S½êQ_”-êðZ¸sÀC: ö±“½ìf?»ØY öµS| /Ϋcº‚LÒ½îjµ‚46Ø Ð#·ÐrUüÉN244pÐ Кœ (˜ŠÝ#/y»ŸS%øaV6Ýsÿ'ÁÈèF&Êñ‹vCÅÀ÷˜€Ù1P˜"øÚc/ûÙÓ¾ö¶W;~ Ç €ë$nØÑ.üá§]ög÷Y‘š£,á(x>ôŸ_ÐN´b÷ª‚$ª1 ©àÈ >èërPŠØø2žì–+ýõ³ŸýÂjþ²ÕÆÌÒݺÀ†8â (@*ÕÏH˜ë­€ëÁÞí- .`îiÀ¼@ï-œ×ÕAð–là®Û}ØePÍD‘ ž  J2¨À¨ÆÐÃ6PÁÁ €ÀH/€@ÉP€%¬C)@€ ,ÀŒ&¡.!ªÿÀ àÄÈAÑŸtm‹ ‘À€lá A€pL@ª–¡ž!¦¡r ¬AÀÙ”pW¯}]æ¡î!ö!¢z°!Ö½™EÁ”Á@BØSru`C¥\ÊÐ:\Á¿|ÝÁx€¨@9ÈDÁ$ôÂ%¬Á„B¼Aè+¶¢+¶bÄb,-ö!0”AÜÀ”ÁT4F!•E¤Ax„ހ̱Ö°À"4F£4N#5V#4ºd]Œ%hU‚†£8æ¡”£bîñXElÁ@‚W5âˆB/ð ÉX‚,äÿ‚ÀÀÁ¸´PŒ˜TA'€Â8xÜ A{(DF¤œER$\äEš€Fn$Gl„A0†ŽU¡€SýâU¼ž¤‡9¾$LƤLÎ$M¾$´a|Á¤€hÃ%ÎŽ£Pò¡MÞ¤V \Á ¼cr˜ÎB´"Ђ¨A l èdþ™A74A˜AÐC.\C|@!äÁ€…DFdEZ$FrGÎ¥ ]nÀ„¤µðN™AT…Ži€˜GKrAM&b&f9r6¾¡ÏÙÀ~# %eâ¡\æb¶á›%AˆÂ€#RÿÂ(Ð@Ø Î|ø ˆ€ð•°@ƒ  (¤Ã l%`C"€o¶å[ž@\§\r¤]'°côLua×ʼnÕH\KšãeV§u^'vf§vnçu–# üx„7zLfe%¬çeÞ$xN€¤Á á @08À Ô8'Àfþ œtB3\dŠ'„ƒà@ðæ ø&gp¾åpÒ¥q ¤€ ‡Ø@<¬Ýt*Au®§‰ž(Ц¨Š®(‹ªèeb£ ÁЀÀ“yez ¥‰¾h6Ê( Á|Þœ‚ l l äÿB)TäP:A x4Ø2¬ƒÁôp„Jè„Â%FZèFg!ÁˆÁ |Ñ`:#L¶(Ö©®h{~'LÀ„ ל'„*¡ª¡ê$êzr¼!|ÕGãäSLÀ/d Q”+´‚ x€. èÄÀŒAÌ6xi´˜þf[Jdpg\ÎåqÁˆ@ HUô´¤œh¢+±«±+²&k²²çMBÙ lÁ yjÀ¡V«µBè°â€pÁìéĤ2N>Õ''4‚È Íô@#\B0d+pÃ1Ü€ÔÁdÿ)=PÛté€é«Fh¬º%…ÒjF^¨]Áд鵇y&Š*+ÄF¬Äëz*¸!ø€  áøµ^+ÈêUªÁl+hÀ Ì„+!1À¦6˜k(è[ (‚#T œ ÌD40à hÀ4ho*™–i…ì­Á T“‡6¬౎,Öf­Ön-×vm×*ªÅöè0Ap Áü«Ú®m¬Æ€Ûª0*¬À @žØã@@œ Ñ4 „AÁ  ÁÌÁà@hÁ3ÑC5à xÀ e˜€ä!¡²í¬Ö*š6-ˆÿA¤Á ôÛyë`­Û¦®ê®.ë¶®ë¾îêŽlɺ瞞 @Á ”ÛîîÚ¦.ÜrëܪÀÝâ-Ã`(À,ÐC#Ü–¡€|M€„AHÀLC: @Ø€,$ ˜€Xàaæ®íæžiçÞªÁ>­Dn+d-ìÆ¯üÎïÛ^¥¶Òî A¤5€9Ô€ÿþ/°°ÿ~€Ç(A·® ´ Üm¤îmá}ÂL€ PÁlÁA°ÆLÀÂ5ˆB䊀íƒbnµ&­p lqjdÓççnATذI°b¥ê°ï0÷°ÿ0ëpên@ï  €Àÿ@,˜€Á6±?1G±Á q/p·‹ëñ˜&ðÅ$X_È‚5À›j€À$¼å†ïX« ³p ×å çÌ€ˆTûV­Õ¶nÿ1 ±ê­¸AŒZÁ°A-W6ò<ò”,Ìí 8ððâ‰|`ÀÞ‚äB7ˆ t0ƒ9Œ"@Á²ÀìæÑúáøl™®°ùZhÓ+€®ÐpéZíéºm ÷²/ïðên€œì›(Â!L2/33732?34Có#ÿA$ Á$Ó­%_r¸/˜@„BÜÂ6C9 *DÃ%hƒ/<Á9”ÄÀÐA€ÿ¯óa+Cä+›éÀÊ2ú,DD®‡F'°šîÄ4Bg«‰*0Êú@äÂ"D´DOô"0#0¬‚Fk´ t´G´œÀ‰ hÀ耧´ZäI&k² AP‚°T@#L‚PAä‡Uˆ€|À¸_îÝÞs¬–/qÚjÁ\‘tŠëE§3&‰r'VgµV['£š´CC4EOôEgtGB"œu"ØZ¯õZ‡ôŒtIŸ´J§4Kg²Þž€ôA!àp«†A°È%ПpÙõ jnÀÒ*S7õÈɵ\…™ÛÄ5 foöìéÿ'Î(4ó2#ó#T´Fk‚YB%¬v%˜‚k¿¶)Èlû»Ax€ˆö\×µ]ï­ð+$C£¨ì!´*XµÞµ±¬æ3çžïq6±°œA,IÔm¹–w7x‹ÕY%ÁˆÜÂÙ—|LÁ!,0B Øj¿ö Ô·}˶Ð6Ø6në¶Jóvo+€ ´A¸BÃÕ$xP$öZŠEWb?w G÷+O7?Wwëì@D4žp˜“´ˆ‰Ÿ8гÈÙŒŠÄ‚FžÀX0À,Â*hBZ·¶)Ø·}ÃËA$sk¦€Óµ6'ÿ@S:â ˜€ðAДÓAð A{ €Ø1²s³òb“oc/5ÓâjÏÁìÀŽ˜¤€šs›·¹›·¹šÇ¹œÏ9ǹ¨À´@€.°ÿ:Á üÀœ@0À!0‚ ä¸kóø ø8ù¹y3ïö‘'|èm„r€˜ëÁÀx{u–kù؉#RDZÀ>vÁJñ+Êb,b¬Çº¬÷­Óz”ß:ð®ç¯÷º¬ÿz¬Û:ÜA<íØó˜bAü€À`À z"}÷øùy6yKïK$„G¸rM8—©—W$ «º˜Gq«»º»Ó"¼¿ÿ¼Ï;½ëº½óA¯û:°ÿº°{(;²j$˜D»&È÷¢[û£cû¤k;_ºÂïrL#nyžº…ëóÒ¦i?³»+ºû»Ã; лɿÁ½ïz¾çÁ¾óû“{±»b*àð0Äwkó¸£Cº¤S:3[:·Oë»þÖþâÿ»ÌS8ÒF$àAίB"ô~å7üå?|æyÑ' Ý#ò3¾¿Š>º§z˜KñüýÔKÿàS¾Ã>DŸ>tèÜ!jˆ "pøð¡‰ âˆ@@‚Q C¦u„óQ· \DxH1eJ+Y²LðfL™ hÖÄpgΛxöìðó'C¡ !N4:ñDÒ¤˜6mj*T#S§±zõª­ZÛtõúsPذoÈ–5ËmÚvŠ·èQ£J—:uU*U#XIoåúµØ±fY§UËvm\ÙXæ<˜ðrÞÌO 0a‘¦À;TT_v224_html_docs/images/glass/grey/logo_orange.gif000700 000765 000765 00000032275 11222361073 022121 0ustar00abwabw000000 000000 GIF89aÜ‚÷äÕÅʳ›•••Œwcÿÿš$õõõVVU¨¨¨Ûd˜A¥¥¥ÿ½QssstcRʺªâââ×®¦ˆk¹¹¹rrrÿ“pppÄÄÄmmmyyy™™™kkk„q]ª—„¸¸¸âjŠ;›†r’|g²I½°¤GFEíqÿ¹Lθ£Ñ»¥¹«œuR"¦u/)éÇ¥ÂÂÂ877ÍÍÍvvv˜‚mÿ²CË«‹º¡‰¿¿¿ÑÑÑ0#¡¡¡•i*þ~²²²ÿeXK˶¡ÿ­=¶¶¶éÓ¼zzz»®¡Æ¡|ÇÇǼ¼¼¦D´´´ÛÛÛ¤ŒtÄ«“àààñu€€€ggg|||ðððŠŠŠz5Ò³”ÀÀÀʬ†††‚‚‚QF:&$"„„„ÞÞÞˆˆˆñâÓ±‰°°°Ð¬ˆ¶©œÜÜÜÒ¾©úúúÁœw¼œ}ª‘wŒŒŒ³£“ͱ•®®®ÁQÿ¶H’qݜՖ:ò­EÖÖÖóÕ·U(’’’H$ ö©Ê®’Ĥ„ê¦A÷÷÷iIÙÙÙüüüÿÿÿÿ¥2ÔÔÔÌZ´¦™óóó«««a`_Ê7èͲÈÈȶ‘kóÛü©–е›Å¨ŒÎ©ƒÿ…ÿˆ B=7À° [QFÔ¸œøz¹¥’¶WÓ°Žÿ ,Ó^ÿÀUc,Ê¥€m1¶3¶j¹•qõx}sið˦½™tƶ¦ˆ~sçœËËËG4PMIxl_Á¦‹Ù»œ62.Ÿ“†S:¿²¤ä >0,)—Œ‚Á³¦Þœ;…\$çmÙŠ)ؾ¤Ø¶”§›ÎeÌ8Ò™@ŽƒyßÑÄÿ¨7¬¢—¸™{¯kݹ•ἘÂ]\0]BÇVÈ´¡¥R€*Ë} ´•wIJ ëŽ!>,§ƒ`÷ЩȻ®Âx ; éééèèèîîîçççíííëëëìììåååêêêïïïäääæææú{ßv €d䀸±Exoߟ?à”0‘‡~ñ0Ÿeog^ö£5ö¥8ïªB¹K!ù,Ü‚ÿ7H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱcA CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê4¦…§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·p×R˜K·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±c» "KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËn=£¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹sã @ZxN½ºõëØ©?*áË šïß}Åÿ¨…!»ùóèÓ+ŸR+o+R%ëÕ_>bâôUkáëÀõ (à€hà&¨à‚ 6èàƒ Zp@ ^ìP öÔq œP‡ C43JT  5^Ô2„,¶èâ‹0Æ(#„3lçE »ô‡† ”Â@Í@b‰0Ê(2Ôô7ã“PF)å” NÁ´‰–R $fâ+Q˜`B¬ÀC€&@”˜ ¡ ±É“FÔiçxæ©çž|öé矀*è „±Á„ïÅ7H=–rÂHjâCBÇ?˜fºH&|²&šÀcÂ1¬˜A¡¨¦ªêª¬¶êª <ÿ²É*sB— ØH’°2Œ¥™f:ÂÁþ³È0žj¢É'&PS*€«R!í´ÔVkíµØf«í¶Üvëí·àn»/Xö >‚ D&Ì&`M±ÿ€`Ê-|×Â8}\A¬±&ø‰&¾:kªªálðÁ'¬ð´Ô’Ë{¤Âe£u ¦¨,¯¨üF.AÔóË1ÇèË>›´Ðǘ£f&&$@j¦²øÂÍ8ç¬óÎ<÷ìóÏ@-ôÐD3V¸ ½0êå 6D:é¯ð.q½¾ÔRÏ1Œtíu×o¼¡Kh ‚éjð+µP@³qFÇ-÷Üt×-·µÜXŽèæÿšH@ô:L—»}ŒãE ¶èòõã^‡6>]üq¶šð$ €Xàvhv‡.úè¤ÿ\+@‚î—A®+ª»ÅŽ €)ãÈù>çÎÈ»K>Æ]Œƒi¿˜` ©Hç•Ì7ïüóÐG/ýôÔWoýõØgý12H£JM©ÆÅ*põÇAÄâŒîƒò†û¾Ñ.Nl"ü"¬øàC# QB- HÀjï€L ˜@.Há¹`Á |d1IùŠU»BZ¢Và 4#DØ>P€(Dápð»c8(ˆ@$€ :|@& Ã (b†¢ÿ‡HDCpáˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅX)X,Á#fpD ä"B|³Â K^µcœãB8B¶Ñ  `„ Oˆ6<ãŽxü]:¡‘¸†F°ˆOøà‹X‚/`0 ÑMˆ¤$'9I*Zò’˜Ì¤&¡ø 8 KKc>„± 4Ä`1裳w‹cµÛÄíÞÂZ’pŽ(dƒW1‰I@£—«¸Ã6œð„"P‌ú°ˆ~eî-X@IÉjJò ØÌ¦6·ÉÍnzó›à §8ÇINoÎà³Ú¢4ô!N-؇A€dÊ|X;€úlÉÿO3TbŽtÜ¥/%ð yT߀4$pd"3‘p¬qC ã} #YÄŽq ©HGJÒ’šô¤(M©JWÊR‘RÁF;¨ ‚¡!/媉8’ à=”bš°ç?ð‡~°Ÿ*0CRý‰Ë:²á½„FAå1X•B_ ‡þ¢.p€Ã\¡JH‚éÑ!¶ô­p«\纅†‘+G畺$¥¿¡‰¢€)øbKµ¥ »ØJü“Žu|/jЬ^•¶p@rQ¯]à |ðj$\á‚müa @è _a£{`k[ A×ÚÿÚö¶*Eš{¼¡¥‰=ÍbÈÆHa :"QP“²$•€, õP¬RëXæòP„ *‚ª^ÖØÄZ Óð/V¼«˜À¹_ÿ:Ù P޲”§Lå*[ùÊXβ–·e.XÉäåÛ}¤+À ŽpÅ:\þ/L-"ÿ ú[-4uÁ؃â×…*e©Êb«j–\ðI…?ºä(HiBc-‡ÛëiÃÈÕ'.Õ70! =Ô"6ÍéNsšË µ¨Ge |RÆyõë'ܘ¹2Xh”Ó>êa‹´ÿ <Æt©ô2±ÿÌå$»P÷™à嬅"~‘ùîgÞ±x~ªÿ¨Mˆ‰ @EŒmU[„7ž2 Æ­lª+^]ÐŒ˜R3jÑŠe0ãöh' 7xàÂp$€Ag•ÃW|Ç—|18Xx˜¸h³Âz®Wo°7v÷4{¹pþæ}™Ç —§vP ·p O5 ß0~š\©å+ Ð]Ð ácxÕ7êâxØy±Vû  n¤ ·÷cÙ†x`^@ 7ö ˜b À€`ÀƇ|x†b8†d¨D RSd¶+sB·AYct$@*È‚G`*P Oƒ8€«@YÐ W0"b2_>ñ ÔP ½‚ÿc±÷Jc;¿0b·„QÑp `¶° Í`@pQЄ \HÇ·Š¬ÈŠrðа‹²8‹´X‹¶x‹¸‹%°`T}fÖ.ø'wGØ8G@‡Æˆy,˜Œ/¨‡1(kÐpÐpz–åâpcbâ/lòW¡ˆ+"xoAg8&¨OÎpyt¨y"Ä„?¦‰70mP ¾@ u> 1 ˜¦vת؊ü¨¹øYÕÐ%u€$­‰÷4‰²„Å8‡iŒÉÈ œð‚{x ‚€Ãö‡ÛµbVµ Þ`u0F¬À †” X8Åj¯Œ’—8F‘YŒGW ŒÐíÿ•m— ?NÐ +Pcw•Œ´€-×üèLÙ”Nù”P•R9•TÉ”_0P%p`MY…PŽRË‚aà˜O±ÀshŒk¹–I‘v`éŒ wБ–å]â5hôdÄE ?ÿ¢,bÍU,±¶ IØ–ŒÉ $ð–yxBN€mÒ· ?д` 0 Ð\Ï• M°í”JÉŠU¹š¬ÙšMéžfŒØ°Ô '3P ´À(¢ø ‡yF0ÉÇÀ ŒÙ–¼ð–o—{˜‘и]5°bU5šõ0… ¹wùw6†Äa¬ T˜Â1ôÂoøÿ`Ź–Ç™œ/ƒvô A—ÀB0°Ö9@ôS xåPû˜š«(Z z š  º únîjuð!6°’Ý 0æ×™C™r„‹Yž¼ð¡çù–x0¢ry · ‘w"à‘à~¹ sÒ#6P¬€)ý3 °>zðcwãÐêó¡Å ¢È©œÍ8l4È{ÈBò£ ši#Ið0 õx *—ú( ¬È `¦bú@1¾Uh8•SEÒ Êð%prÿ` -·£æIœ zœç‰œ0¢~…ry¢¯ !Y7q{Sq6•šÿ§ã0h𮣡ñB{¿ Dš©yJ‘$ú&ÊœzVYÀ¿#?à°!#yððÓ€ ÞP4p” ^*¦¸š«V€9·l<÷4Q“$o2_7XÏ6F3ãpΧÎj¤} ¨q9­q‰Oà©ÎxÒøg1¦%Ôç%êâÞÙ1`¹ A¢Z…c › šš§À ¢Êy ©‘H¨ÒhUA0ºÀySÊ £8¨?k’ ÿ2 Þ°è ¶šš ±;±[±{±û°~pN²Ù¶Òlç+ @ ‹˜& \ R<˜2A@¼ 0 ³/Ë ¼À Üÿ¨žz :{­O@­%ê‡ò z-ÀzNShâó›’Í0’ð@>}Ð j‰©˜:³5Û©Ÿª‘¯¢PÏ™UÞ´ÀY{c=Âow‹’ö‡ °µJ ËP·v{·x›·z«·/%}ÞúuÖ×j°“a¶£Ï¤1@µ1 ³6‹µ‚P¯H¹§°³ÓO‘Ѐ:i²#mnxOsZhpó{˜Ò@ŠË¸7k­Ø¹Äv—Ï ÒÙ€ÖˆgÛ öö e2 p&j¢$UzÐq;·¬¸·Ê»¼wVâæEûz÷F‚ß©A¦ /ÿ` ýrHÔ¶ÿ¢¬…×J¯ZLwp«ð H —vx`¹§€Ð –?ò7WF±EU‘Q  8’'w] º‹ÛºåËœÁ$»+ î—2ê” M>².ÌR)ðB 'k°†™QU`q›šÌ{Âw+±¹l4²lt‡` û`kW`,ùspÿ0Ë ¢®k¾özNàœ^+wÀ¾ïxv—à‡¹ nÇ+g½C… µ“"o“^  º’€rWv |³¯»Û@Y³ë‘§7,  }²¿â’  ™òžROÖ€0`Æ+·~üÇ„ 4 È„<Ȇ\Ȉ<Èÿ`@¶æ"„üK„wF´ã?´¸œð ]`6Ãpˆöô± œe¼µ åµ<"p¨ß!7@€N| k¨`o2)ßè\çã1À•µ‘3`°0£'×0ÆÖúÄ[Ûµ§œUÜ„€ËjíòjŠÅþ-` —Ó+‹pP||¼€L4pÎèœÎê¬Î[ +X‚»à \b3V ž²v©€ÀÏ0[‘m0H¤gt€ A ³l—!ƨ·Æä¥ó€ ¶ÐÊKp²,ã˜TzQúgJµ°·q*Tð\P …0 ÍTa¬ºú d\¿ÛàÌ+Ú¢ªÿ13_ÒXÏúVõ@ b¶°KPp‡Ø\h°âl¼äìÇëÕèìsðÁ‹‚ÁâÃÁo¸oA0žùÖb d| ãGVTúýö:ļbÑüÈâ ÐøÊ¯§ Ë-€ òÕª;ì Z c#-\°Vªð7 1WÐ û °p ÜPÑ~(+šuÚ쫌r¶"Ão¸¹„Z Ô¨Ú­0t@VâŠQrì0ÂO-·RÎÀ±15Sjè7fö¹™¢fŠ£5Î ÖÆMÙ°àÒà©ö;&`~¢W×òPÊ3í~»e¦Ó; °-àÊÿp ×@Ñžz§›ðË"ýˆ RPràó°+V¸Ã˰ÏÉÞz½N ÀÆŠº†¿¨qÿK;ý€À > ©-Ô”ðàA0Veupï°°$\Î4ÀÞá®Üc= :zÕ:ìR„°VÉŒ£Æ­b È]ÙLlÑ '-@–ƒVŠ]àà•NKÓ FA#².öÔmðÝB ymÑ` 7¤®›Ó0Ò‰­Ønß~@ nК0 ƒ…)-à 0žßq`ѯ ›:ߺj×7¸¯TÉ1PGð à  .ÎÏÐÃð&qW*G´]Î<ÿèŠÎp¨#hÓ+"ö6>ùF/²ô $à†éù\æÉ]Ùá-ËB°0 ’2_- ´à ‰úÆü{ËO§û äKg~ “ÐÃÀ ާÔ@‰mZ^ uK\0š@–q·^ ÀÜBp »¾] JÖ”.{áÙoŒp w>îx®à©Ýçàà —°>°.Ïî ¤yáNMÂô¾è‰¾¾ ÖiSÇjafÜC×þ¶éZPðOð° ÔÞ=êHÐ̳Û… "«þ)m2 CP´`—0 É5)t›€ëL.ê½Ó€Z¯ýµðaà[n·êÿLÐì03T¾ðé°PígŽ wÐ ’€3&qÜվРêÄyâ~{ÿ—çN |îÅà ðE’ í2`”é@ÛôNÂö~^  ýÛn„‰Ã6õà ÿöo ß¡^јP¿¯° wÐìhuPŽg’þ’’C"[m½¤g¬@ ýc×°äKnò˜Ð `Þ9t1°0/Èèlï/ð8~óõx Ÿžë ã`’ç’±&œÏÏtx vîqÌQÅ õà.€ –…¶P9õ™C§Hí0ïô¾<ÀüЭW Í8hÍß©â÷Úÿÿ °äu?Þf,Ä]›Æ±¾ A¢ˆ~¤`²†ÄêDŸËù§AKpC€=!ùB€%70 è3 V‹–  G€%.à±€Ëx@4Eù§À·k°P Nœ@hþ­d¹Rª?h6íÓHËMœ€ãÅé EŠDŠäBV4p®\ €§R%P¾ˆÙ(àÃÚ¿+`èSÎ\#aÅ. »M° ª»ÚRÁ•?-b<úEçÝ›´<àË—d€"yu§“5jˆX,ÂA_Þ ¥-ðiQËtH‘J°ˆæ Lµ@“+×R>|˜ø‡*È5’#-¡Ä„Íÿ‡(à%ø×‚‚4*’%NN V™2±²6Ø$KZ `i_‹%+—Àm‘ë¾#xqêÕ ';†5*-A¸¨Ûyú´Ó u€°þ÷G šx°Ä ‹¸ô©C-xHai úhÁ—b1C‹pÂÁ)à ûò…þŠc°mS¬1lé$4hJQËÿ§0s •qÐð¥„G¨ ¢–>8ˆ9r &…8I ZBù€†ù§ZàÐ@¸âŠ£a>Éd7uá&6’, …V|¹Ñ—ZbaD< ÇCX®Áã‰KÚp¡=c°¸áÚ°ƒ¾§t±ÿ%—Ò…Æœ#À3,ÐÀ²vhæ„Q\ „Khå 5ÄÃ;=ì D&e‹£ŒSÖhC‚ƒ 6AÛXdÁRJ¢H±Êå/Z0å &4¼Øä‘¨xáZ)(háVøÄA4*‰ÉÙràŠ| :@ÈÅà†ë’¬\B†JÖú°%éZeòÐ…Ô oB5Õ¾DL5¾‰Æ˜@ž tŒ1:p¢’êéÄ—VH&Æf4±òSQâÎ8‡@ÃB‡B“V2¥|N=˜ÃXóçVg‹YÀM¼Ø¡‚©ã„`°a” 2‰ÿ¢-¼˜Â*¦(!_¼ð%†,âÚ¤à‚‹-¶ËiL ²æ?bÂßÙD¹á›?>øÄÛEœÛ"^²^6@WÝ„’Œ05[ 8p(ßaŸG2iÄSXã 8¸(®¸ƒVV\š…<Ò’qMø[%’àÊ«KÅBn†¨l¥+j9âòW‚:¡-Q>rr_=e Cc—’y:Fêh¦ 2ùd˜Ë€Gãl¿ø‚‹/Ô–býµ¿pÛ 7àŽ˜r5¬:¹…dô4$@n>àM 0ðŠîpanæF‡ˆàqÊcR &G9Ë/#qÒˆ0Qÿ›5”HòpŒéÆ‹\MïEôp]öA¬š­¤S˜@$±(ã+àa°oT û‰t±³‘ä$(Ã1Q†2Ä Dò^…„ ¸(zp])N໪ù KLá‹ ©m ðsƒ¬†¶½~rðƒ¢ ô!]±Æ¼›þUñU˜Ø6îÇš›ùaK P á€Ψæ[ ØÄ !E*¦  \K½ð†q‚bD ‚£…`Ió†0R1ˆ.~‘jš€‡ Úb£a2ÈÑŽ*ôЇ¸F‘‰š ¨Z•«˜ˆ‰Î­ál`ž8EæÿYBe`æµ!¼PbFZ²TÈdi[#êhG?ÈAžò|§¶$L¹ùDÇPAþY Ût*öÈ :(À Z¢#‰8őª1Á"þ„”!¢ˆÃòJ®Ù<³sÏ(bÓ\Å c=žµ©@)§[Æ‘KäÀv`x‡:ªLa6Â*@€š• D<ÞIšX6”è0NpBžaMQ(Ï‚UÄBЉ¢6cYM>Ó’ÐH¨%0ÛÚÂ`àÜ“4°g]çŠOâ Îö¢’•úЊ nU›e˜Ä8†Ñ­oý _ŽCñXÈ"ÀÿhX)>¡ðµÀ„b8Š,Hq OEBTï@Õ“šò1¾˜^õ®'£:$‚{Þ2Y1³S DðÀÉdÐKþ4¨BÂ|°Æ5ÑÉ[OÁ†Q&Ó=®rщm`ÁüK'ºz üAn™ðÁ'b¸’(À=‚ÓØÇ6ø)’KÄ‘HDŠc¸Ç"à H—ép….¶&¼€ŒÖlSh, û`G  W ÃâƒL èÜ)<ìDhvº¤¤î‰TÄ"A‚…1òâöÂXÛ2²ä%1y„#xë[žÃ§@ ª#(@ VÌ4! Ø„IžYÚ’š´ºAÿP)¯Ä¡€ LÑ‚ÝÕfmЀ`|¹Z^Îg¾¶Íñ! }¨! Y)ôío qÎݦœåm³ ¸þPQ?ùÌ…ƒJè0Q|M£AxÅ3 ]CKÕ¤©Å+WŠ^Ë‹C˜¥?`ÎqÇ;_˜o'p²Y(â îîOMmê9øa‡í+9ðA$ZÒvPˆ–ÖaX‚¶„'Þ,PXò­‘µÌæ÷ůŽ[Jàž÷<hCÛü€ÜÈ4Ž, i rW@ƒZC¡ŠäƒmiGøãÈÌD3±®Pc˜*U}RÇtAiLËÃk¥öBä²¢œg}Pÿ„&T #,€¼õÀ§aìá (‡:€yêSCÛ ‹H€jvƒ\ÈãÒ=Ñ> Óêõ»…C`EoÆ`AnS™ UG@à µ±-Ùò[ö\›}nt]èèvD ÙW’íƒÛ¶ wE±†°šLhD<ô9D¸¨h·21Nx„¾ƒo[Ô‚µÔ³^µÇ=ïÕö–èMb€ ,Ü{ÿt> ì O‡9ÚqqŒW sˆè0Ôõ=l ¡¶À‰[´B·‹µ±»`¾mO8}†EìeÐ`„/¼U~v´§Ï ÷Øh“Aö³§}ígí)Ð!íÚÄÒ™ÿîô2øb÷‚ÝaõsÛ^Ú~ØÄºž  ª(Ä|ä‹°]~‹±ÔØ^y¥‰YÚ¼w£vӤ߭«3º9€ø³†*sƒ6Ûë@œ=8 =o!ç¸ä¶ÐQþ—ÿЍGøÀ9@€h¾•àЄ ¨£*€nÈ!L†_¡´ÍóÃ4íà8iˆˆð%PöKIP„=0„Ás‡r`t0<Äÿ="ù‡þóMÐÿch!8ü€aˆxPÂÀAØ6? ½®êûÉ2TØ7/ „½9¨½hDG|DHŒÄ3t„³6ºù…DAc(yУ#Q4h¬$ƒH”½»A®û‡E0ƒøÁQh8<À˜ÃÙ8ÛB+Ñ \ˆ7˜²Ð€ ÈBøëÂ&<x‡0T2,C3°†¿iÀMʢ쮾:ó«ãc$R”JÔlGˆºnñ”¨,†îÚ¦S‚+0ò²’+ˆ«{ÊwHŠxÿh+(H9Îíb£‚0hÎæl.‚Gøôó;¸Îp‡wLr(Ì“D”e8ôÛXŽíXõX"@0 a€  Mh5©MÐßñ˸‚Mh,mýؽó×REœo…§ùqQ¥§v¯—É/² àÂ=8Úz½×}]Z}íX"˜DÈYðª­'×c$`MÝpP4ÀR]Å…h…s٣̅l¥Nš][¶åX"¨—Ž+¯ $$Ys‚_ hM©€–óÊ<ëÓ¶í×3Ì:²øÖºj×{Ž b>TÐŒnÑ„wqÐP¬€O8+Ý"6b$ÆÝ®^I¤aÞeà4‚¶\òMÿ5^c6nc7~c5®B9–c/®Y½ã;ÜU‚ _Õz°Õ߇áÝC_Ø`ÎcE^dFnd:ž€ð%…&^ÈQì"æX‰>(wKêü4GndÝåXÝ]ä xá2>c˽W8~eX^ãQ~déUdξª’+i…@æa¨cµÄB8X€9€^QžedeØ4(È?û›dH ÐeàÙ¸âS2Ð¥dÞfn¦ã§ƒ0ã3NãX.g7îf=î`"(.³m—.ØáÖíáˆÔýƒ à"®á.&`Tö&x„ QU¬6¶d…ï#¸Bl€OÆçôCg‡vä øæpgÿr6g‹N‡m¾Ý¶%7€]ËpN d£A¶+(¦ÔV\¶½]:ö€˜³<Îsúƒ0:ÂÐl>æ‡îé9N囥V®è‹.ç8j¤ÎTNe;cID`¢Þ]ÀÏ¢ÔJ¨J†õ õÍÔ|Ä-SôKäO‹h2€ƒZhTÈ̈ña×leQNjº®k»¾k¼¦ë*„i2@¡_4– `Â.lÃ>lÄNlÂÎë—æÖþ@Ù›aË2Sp€ÏCÁBÊ|, *Ž …lО=°æK<.k"èë0(dùƒ>XÔ 9ù‰«~¤NõËkÛ¾mÜÖc2ökŠlÿÅþmà.l¼®ÂT®ÞÅ˺ü*3xšS„Šý¬m„½MÀ…‡Rní67Èâ@îe8ÏuÆSísu/Ze½Ùî-Ü^oö®k=>mÞl{ìà®oÄÎüÆo¤&î.\pƒ-@ðØ­ æÀ7Ò®U˜„.hAü¹/À€ÈkI›õÙpïpGŸ0p9K½$m¦&R©U\2{Jõ>êü~qqŸqÏo¥Žèp„èm%ÿq r!rr¸Îë´qâ~Z2Ð)à Ø“4_7f‡rð,ðþø JØò"àWpYhƒ‚ €u¡?RÿIP„b I‘ls7os(ˆs9ó&؃YÈ"à7ø9àרó¬AŠ8ÕÑuÊ"î;ü6rE_tFotGtEÏ¥†é9‚À£ÜÀîq"ßtN/òE—t=¦ôxÚžrrx„A´³}àƒ-§>ðrˆ†”0'fç`‚ˆ Éí<^ïõsx`öuöawc?vdW"ð+ ½\i%ÝîVõžQH¿vlÏv#¿ñÓÞ‚YìVÖôNw gô‡i2 t(u7&ÐjæX‚\èò.O Yð„8x/ˆ‡ÍãˆhGHó‰L_ïõ`vb_doxwhó Ѐÿf÷MhZG4ñ*\?mßxŽgtI7k8ðù¾\q'wr¿”ßö÷þ*ôT>ßtФôãÞ(†HðrWK°P4¨Øa çø”i‚‘,‡r8ø„‡…oz†Gö7¿€xZj'ëtNdWt”ßz®ïz¯ÿz°û®¿ÎIg‚¹yÁ6yµ'‡±ŸôhÊÌMßt ‡>ìƒørÀ…8€ P°…]H„f@¦ð£ (ú£Oz__ú¥oz‡‡zð€-Ѐ§4æŒGjk§Q±ß|Îïü°õÓæ‚o_’_{“ïzÐ'.€€¸Gß¹Ç0oL€ð$È÷@ð{]ð…ÿd˜«ÀŠ8üúCz¥gü`wüÇ7ö6WªWÛŒÏüëô|ë¿þ͇·ßL¿\ÁFzðñòÿ¶hŒO}U_vøoHÇ+¯P€.@ü_†.è§ &þýû“ÁÃM ¬+çðĈßQ¤¸î"ÆŒî6n„àÑ£’-Èü 2AIŽ,0.°léò%̘2gÒ„ #‡?üÙ³G‘2&8,jô(Ò¤E_ÂÈùCNsR¥¢«jÕªº¬Z³¦+—+”µ(>À3jǦ A6í`q‚Á(Öþ@3gÂM 4|(ñoE‹sìøÑ£¡pÿü`âád+kR®lY&Œ,J&qÄ" B‰*-mÚa’Ô,oNøÌTªWgÓF×uË:‹ÄfÊäC“*aÂRÕ)Å ûøW/„wJ®N¸ðáÃJÂŒt YòËÔâÇ“/oþõÁByÔó$“„Y”i!ë;Ò÷»™Í*ozËÙ›ú†«ì$pÐÀ£ÀÇô¨ŠV¼"³¨Å-fÑDPÜ’æ;Š=,Uñ ÂCœ°)\a _ø´–+é;‡; pCE~ô£ö°;¾¤)ˆB”Xÿ¦cD½ñ­oÖ‚À,ȇÀi`˜IC»Mr²“žü$(C¹ÉÁ €Ö¬µ‘wÃŒUœÕÀÆ6–ðÿე a8º­MdåxÇ´ÀÐCÓM¢sŽrD¬Œü³ÛÝŠB¢áéÌo„€”@hV°Â†q’³œæ<ç8éÎu²³ëä Œ0 ”À’‹BÀ” ƒw°UHci‰[J—rtyi®°£çXG®ôÄf:sˆÐ¬™4ÛÀïšÔ‚HAÚ„‘’´¤&-&Jw0œ¡¥.5)LIJLŸ´O v³YꔀœCÿTã,ÛHPƒêÒ| ½”é”´&‰Òe¬("/ŠQ¿üooøê¨G³Ò­r5¤+ý*XúR—¾4¦0éOd`ÓD¥ ?ÿ€;ÒñSYÒr¨MÉåwyÔÙ(é©OÕŠ_1©NÕ¡µ*ñ˜Utµ± +d¿JÖ–šõ¬† ©Zoª”uT r5@@OhW%à¡zUh’¶¢Z®øõ™ ž}¨ÙHk.Ö#Žmld#;Ù3Tö¤—MëZ‰¨ÈÕªPýxË»´i åejW»•Àºš°­l“È‘Úæ¶]Í-dwÛÛ’¢µ¦šMJD6DŽn/¹2X.i›Ë´çn-ºÒeíS«{^ªÆv£WUlV½ËUðŠU¼ãiy3ËÖàî0.rM8ÚÒ:÷´Ðåë}ÛZ‹Z×ýEl5¹ûo•Àa5ðšÜh"E"9Ágé*a唹EÍÚQ‘z• k8¿Þ¯a«z¯ÄnWÄŒ%ñcM,ÙÉÁ¿5ï‚=œÍr´´A(‰šW£¢Ã<¦îC))‚‚VVÅÅ‘’OMR–œCDŸLŸwxe\n›ŒªÑËØ¬¦±âmâËËËhhš• bUoˆ˜ÌÄÔxj†œ–¡œ’¥“‡žÆ¿Ë­ ¹š¤Ž‡”¢™«‘–<9>çWç­¨³…Œ”‰Ÿ¤›¬XVZ²²®¥·ys€.,0e`jWP^££”ŽšupzÂ'ˆƒ··ÈÈÞtÞ°@°««ëx뺴¿“‹šibpçpçÕÏÚ¬£´..`0`«¢³F?MÈ4Èrnvnirn^}gXw^_éééèèèîîîçççíííëëëìììåååêêêïïïäääæææïvïwh†vf†oa~~>~}y‚Á]Áyj‰ÉÅÏ —¨ã`ãlhoÝjÝ—‡§ ‘¯‹‡¢¢!ù,Ü‚ÿ)H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠé‚É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´éMP£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pã²m@·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇwHžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžíúƒíÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçǘt½ºõëØ³WŸ£€˜±àgÿS¡ íèÓ«_¿ü¨ÆUïG¾|»@«RÉ 1`ØI à€hà&¨à‚ 6èàƒFÈ ÀèbL6ÚŒÉ;w Æï\À~L4¡È¢¨Ê¶èâ‹0Æ(ãŒ-.¢€ 3Tr@=àãZ$Q¢"M4ÁDI˜˜A0‰³PF)å”T>8(ÄÌ0È&»¿o±œtr‹Ð¹ä’S>6Ù—ßÂ̺lòÏÎ8,Ð|£UÃõØg¯ýöÜwïý÷à‡/þøä‹ƒ.ÚìóôA61éÆ[2# (“ +ø?yå–Ss¹+¼Eze0¢ÆZ>'¤áŒ %X¾ Zð‚Ì`ç@ŒQ¤K ‚£š¥Šuµ¬©@]Ã_þ~÷µÊùO€=ˆázÃã¿ÀF!@!Ž#|Á NpÆÿ‘DŒÀjȃ—ÈÄ&æ!PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.ràJºˆ@ð$(6 —†x 'Èìv‡KœœŠÑ VÄ"*dáþ,犬a1, ‹Ä`ÃØ€0P0€B*Ø ¸Ø€ðÀ’˜xò“ eGIÊRšò”Z„Ä2€ŒâUÈÄ tqMÌã „œGLqâc3ˆ0|wÇ<毅¡(žc )"áhE+Âay8"Xh$#Y $‚ÍûÜ?ÌPDx€“¡Lç'‡ÀÎvºóðŒ§<çIÏzÚóžø”çaÿ!ù\bï(!$ETÁ Ùð!Âð…LÙÀ ¢(¼‘Œ;ÇÛ!.çÇ ÈÀà€¦41@Riš” …h¤J Q c ?t‚'þ‘ˆt@›t¢N•„žúô§@ ªP‡JÔ¢õ¨HMêOq0®YÕªGÈ•vAÕ$1!Ï0€D0ÓØ 'ÔÇ-è`Q‹ª°…ÅÜ™)‘Ž”¤$=Æ1â*…Z¤t¥…Ѐ0A *ÿ0‚\Ð q§NTªbËØÆ:ËR%ÌU\`]c¢ó2 &"HÌ”TP :˜¶¬…œ$BqÌõ@t¦[ኹÿʺÀÑ Ì aÜ•‘…†úáˆFxÂy+8‚ TP›n’“ˆåéc§KÝê5‰š+• G…) cÊØÆ–°|0Ë™'Ä´dM­$‘ÖŽÊ !æ[ãZÛcpÃ;fÐÀ‰ôB¥Àm©)ø0ƒ l qD̉D5XøÂ¾p6Ìá{øÃ ±ˆGLâ›Ä'€Õ…æói< QsÕ8&/LQA@\A¼Î ²Æ«m-Ö y@S¿´å/&ñr)]hxGV@ n Xæf?ø cP!`:ç*ðœV8ÃhÖš×Ìæ6»ùÿÍp޳œçLç:¯97èN€Ÿš®\íBpî¡°v€8}YS“Ìñ¥6QG;Îw£\ClŸ9Û$c·8ò'@×)pÌ “À2p5`ŠHAÁXV˜7q…øÀœGôƒ¬gMkYÛùָε®çì€4dÉÉèò‘f^ÛÉë— ÓÅ"¾Q M˜ÁÿhÆÊ¯Ü"‡hí-Ö †à—Òû¥í14‘% ¢i/ŽñÔp»M¸Yn$"±Tó*¹ÿØD €øà¸À¾ë‚üàm–?ã€K¤Âi>bŸ¤Ü¿b=´þIÃ0ì`ZÈ¢Ä0Âþµ‚fücÿˆôìÑV·ZÀÒþõNŽvTÙ˲Ë]T0'tA x3²ýˆÖ`Œe$!´ã„ŽGDaPºÔ£Žðª[}Î5˜C¬Ìn\©[„VÚÖ0á\ÐAð¥+$A[``0] 3þÑ ùm…ZaiLDGN¦˜Åh'Þ^ŠvÌè9–óÊ>`fP!2Ø8¹`4@‡Ó§Îy¨_áó ½èGOúÒ›þô¨OýŠÙ=ó(]–]×àŒ=hÄÝ‹qþ‚îÑŽöÓÒwÛ1`)¾†2Q*BH¥ùrÚ‚"·ZbÄ¡&©)¬ âÂzh"ÞŠžÃ{ÂèÿÈ ‹a ³"hè%0"ŒãQxz祮úúÛÿþø¿Â€írIðÃBá%34&,ÈL‹Ð »·€iGVôÕ+ÜpÐ+Æ× Œ€ûsÆàTMÓgêæ+ÀR,„fB P ôà}>Wp r²@»&'X-Ð~ïó'u[ðƒ@„B8„DX„Fx„HH„  ÷OÓ)w}èP•qÃÀ °€º—vq°v¬…•_Ü cî² 3Àš  L–#”{6×.„/òb{³4½@VvxŠ÷s¦@ ’ ÀL°˜r ƒD°ðÿ'=¸I8‰”X‰–¸™pèuR#B†ƒ)Ÿ`&ø ®…Z¸…¦Õ…ôE dÀm°_{§ «ðgdÂ& ´ P å21Ó÷]ˆ}™r€¼³g×{Ó }~AÇ1  „ÀFs7NÀ~4àˆuÜØÝÈàŽâ8ŽäXŽæxŽè˜Žâ¨Ùp pˆY8gx%·W Ìø˜ ¸Šôå }$b`ò`–p` Ð`ˆÅ·YŠ@$„lPó‰”br‡5þQ?v¨¨‡¡Ð X6 Át~4 É ð»àà ðj~y°ÞX“Q Ž8ÿ™“:©“ P _¢’Á8…˜â1»3L©»·Škw³àGb ÊgÏT ùr0<ðm´\ 0µ Z0U„W8$h{au )¨ˆvx”LôàHÂÅe5  •€ES'pSj°çàt6Y“l0˜„Y˜†y˜ˆ™˜Š¹˜ƒ97 à@ „©Úð’S5$„‘Ä ‘”p”ø¸{YÀ­õZ1€wà@á@•ùšÀf > ÍÀÇ¢@£^a`}Tplºs‡Ì𢙔j÷{k-Åed0@½°š0€5ø›qà0 ì)˜Œžâÿ9žƒyªÔ7óPó²¤ ™0 +𛵗8a• @ Ä™–Ʋ@_XÐ)«i ¥ w¯yÇ}Úð ¹By¢¨6ÓDÖ×P%%Lô ÄÙŸ¨XštôÕ”°%ÇÀeꜽ  Ù 0*&×7à9øä4ù܈>ú£@¤B:¤DZ¤A*üççr"$ìRÙ` ês”§sÁ© s0œü¹¥G©{"`Ú¯%i¥àš¯s3Àu3ŸˆøqÒF γ@Г)ò£"Ê [Ê¥H9¢‚x [ñðL­€ ͹3Ô ôÿ  ™£Ð½é 6 Lx€K‡3É£Ýh¤žú© šuLèOÝÅiZ@e$ZPÃFŸ™rfÀ¡BЧ~¢# ¦*ˆb*dj¦hziðázPEUŠ)4 ÆÐ í’1Áb› A@ e@«ü9š¦Ù”Ü•:RÜ ¨½ð­Ç` óÐ!RF& ôÈÀ ¢  à—°£œªò:¯ôZ¯öz¯øj¯:@7ÂuŽcR+œåYÕF4¶   eаÓJ«Yˆ€J_Ùv^p`m¾€Îh gjÏxÿç] *úÎâÄPëò<Árº  ±øXš]ÿÔ0d¼*•ŠþŨÀ„Ú ÃFæºY#oÐp3 ¯ß™¯T[µøÊàkÂúŽ€6‡¸Ù çµ&ËÒ+ÕØ à°[­`³²pCC×Xðxë¶d Y ±}ÿäb)2¦1Ââ,Z©S@c‰ v ­i[³a*¨¨ òг–𳰉ܠİgFë#»Ð.šåBéUVpgphÿ°À[r4U ¡Y­Y@¢LùZ ¿ñ[¹òb°X0½v+ñ` 3¸{77‡†Gh¢` ðï™ Z eyiÜà¸$L¢³p·Þ¿Š ók¥ ¦‹rn~U‘²¬sÁÍÐ#^¬¡f  @ ÷p §0 Å`;0r@dr3 /Ì1­Ì8ýÙ5}üªWÜbœ–$Só+\BGt€ÔIÔeø ³°˜p~Õ›_'–`Õà°Ñ¥²JPZ0FÀdà’ ¶@Èx+3 ÎÀÛtG 0 ÝÐ' ×5ÿ@ ðÅ’ÿ`˜0­Óš²0 ­ÑjÏKƒÅ 8Çœ),%¾‹à“p þ} ý ´P ›°~%Sÿ l°ëPÆ=Ó ]ÓzµoL+qìg]ë »¼ÖøÉ5ÉÛ NÎ{]Û”,­° X|õI ܲ,Ø|[Ø—½=³ƒ` KÃŒÀ ÄD(;'¥âÝàÞ:°l` Ý ÉoÚà ­ü‰`@1 ` âz©Ã³7Ò‡£;*50 Þ7 ÿ à¯ð ŒÄW>wV OàP $`çx~ç°Óí]!M{œš0üâ ®ÊøÿðÜk•òP 3fø+¤†˜À\7}k" •oÃ` ²PðÜw+˜Ð ?ä+Êe ,"×E®W°\Àx W`ºyiɰ¥¿¾À,gÄð:Òð‹Ô^>ŒDí B@ ÷ ‚(`æþà?¢à "ð<^199@ç2]$0îäNxÆÐp¥q‡-Ô§¡Á 5P“0 n`ï‡Þ°c°¶¬¼±Ñ-W~ÖM ™¤›‹¤ ƒ #¯'lq˜íš5w]m Pø :þʆ€ÖÉ2˜ 8ÞGë³®¯ AÐ" ™€õ ÆÐ§¸ ¿~_Œÿ0˜I}îs¡\…¾s Ï®‚Š7 } îHÃÅ›àí²ò* rÎÙtõå>î@ óÐ]žÈ+`×™‰‘Ã@õöøŽÔpPûž?Ö£ð{å–P èCƒæê)™•²sìâõžðÁG`` ¡ÞÄOi ÈPÝžiEpl@ò%oÓ8 "À»äU*šgóoLÀBtLBl­"Þ äL Bp @ïs"™æ£Öý` ÐFÂUvÜô}‰ßõR_î‹`õð4ˆsuLhr„BÉ0 ¨€ bŸïcð øÐïdðÊö‡ ðoÿö˜ÿ0ùðLЛ]Ù&L–<Ð>\,~Ü qr_ñ^p·b |1G`ŽßÌ5 $ YIôé‹“)_þ5R¾,PÀ`á#C¢/S¬`ñÉØÿ-z& Hµ@FS%ÚdN¢‰,’TP`p%‘fd[a NT€\pÑ"9ÄPaO&óäŸDÒ¸B+³Ì„&»ŒòŸM60í´6 ðŠ,ŠQ¡‘MTÀÄ;"|•-YËø…O_zHÁ<~%ƒŒ5ÖQõ6°€˜<6Ù0M ô‰K3ÝTSÿ²!䎑?2‚$¾É…œ]Õn%–.Äð\²ÀÇV>ìGŠ]³€bŒÉ&€QöÐxhÿ‰Qÿ±"‚4TØä +ŒàÄÎfPA“E>à`mjp`“/V€rÔ¨A-\ÕX“›U>ój #ˆy7^y±Œ`g& ò l‘Š6†nÃÈ1àp£—[t^˜g8Æ×/°èP "iŽŒ2îeƒaa¦nR  ­´aÝ:YÄ…úž0Ó•5%€ªÐ‚Dûç MèÉ9g:ïl"qñi#ò뇶ŗÖàIaÄR@‰À3´9’wî  vi" Âê–ZnP T †ëØ®¡† @(‚1¢‘8'ˆFÐÚ¤»´¢ž˜fPx]ix$@Ñÿ·Ѧ[‡ƒãüÕ\TÎ Øh•Âf! ©ÆÊ•< ԭ¡;ì=J¡ b”ï|ï(Ö.D$ÍÌ@.XÊ}ò¼GtpMàA‹>bLPây:{a e/øÂ^(áãþU9í(šA%æQ ¨jÐ1g$Kf3HÃÚj0@!€Aø_‡@@\a \`ƒ&Hñ…É(Ä h Ð&":Ì€ Or‚”(€‡Ý€ƒB#£®#l¢³ £ãPX¹m¤„‹xò’B×-D°D+0Ñ öâ `Ä 21,kLÍ DW”‡¯90 ˆPCSòólÿf“@E´$΀[|¡çÆÅšr‰A| ƒ/Àð¸~­F öà†°.‘ "RíZHÂp¦ð=‚ä ÄX„D^A:(™HFâA7 @"<¡­ÚcrÔË[kTð‰tiy˜àÂ@ ÊQ¯3ˆQ›Á‹a•¶€.~K7ÄŠVãºU‡ŒæG¤à{–¨F),€ GCÆD.±|`ŸI@Èœq Fà  Tà”d3›‚ À*‘„äýÚ`‹Jrê0娥\ö€<ì {È@Xðã «¥ ŒÑhÈÝîwguñ%ÜÖÛ_H1ŽÑk”/·'"ŸùÐ'Gë»x¼Ì‚q”* Ë¨@Ï;Шá G:ØQtÜ×Ý,ˆ h¾ÿð `àCJN>Ö¬J@YÊ°î ø…NãB·Cjý¦À’ín¨Iã¥øÅ‡_ü‹„.@ª¸åa c¨Ü/: (}Å3ÂnR=þ.°‼ä—=…Èà ð5¡ª†cøc‚²8:6:²2«Â2±àC‹˜X½Ösx=U5 ÚC‡r`‡ÛýòB‚.ø è8Ðð  °`ˆcB&eJ6ªÊ…H ð:öû…6X 9@1s‘8!h»E’( #ðë$˜B*¬B+¤Âº»Õ‚Œ8Nˆ€‚ƒÎi890d@ [û)´Âÿ»ãM°‚s†) È/yƒUp0cÈ'³'|:¶©ò'€Š˜ŽÁ àÖÛÀðhUð„Pr ADA¢›Â `©Èƒ (ñR3hªKx¹ÂÚAÉøÈ4]Â1L’ÖØ½QFXF«°“êቱº»BaF*ÜSÒº‰öëœ#™!9 °ˆ{E+ÐxI5bìà€8üˆ¸ ƒ P„&Ç$@h¸h¨¨½ëÊ.ÅÊŒ6)˜4H€Ý`pHlDðð5ÈlrX‡s(ÁäÄ()…3è?'E`¯$Ђ8*,ÑËÿ<ò'™Ê`0Á‡ÊaF(¨9ˆˆ‹¤#M¸‚FëÅ_dÃ6¤Â˜Iš¬I›¼I…ìc 7(ÁÅaXÆÎQH 88Œ²S+A˜Â›œBVÃMà¿hAÙÈ]Њ4=&ÀÈ ‚ s°Ù‚Âé x€}¤Ä„\wÈt0ȃDÈ™DÐ#˜Ã:T&ØÌ*»£<©€)¸—| É1ƒBÁ€ÁÓ–%° ³¸˜ÄIÌÌ̦TN)5 d8Çì8%Å”€“ZÊÌDV»è˜J zÈol&¸MìZ6Àg# DÃXÿ_?$ ðÇ;1ˆÀŒÀÈ a=H¼3}Õ%˜ Є+X“èK†X(k½EÚ‚-ÀV¸èµTDPqe€BM‡CMTF]×uÍ@GUH¼£€ø#°O°#˜bH°Ö…º[ìÉÑøI8؆mðZl£œ 4†a%€=Ñ œXŠ­Xÿ‹½ØŠuÔ4x$”´n…3ñ\’G°€F÷Y—n95¨O‰µØwUÁ Ð9XªØ„FhQ ˜Ch»kÕÖÍÊ0=À6€€qåGJdZ@×tET©Zª­Ú©­ØÈ?èCbàÐ!¸VEŠ(M8I IIÐ,Xl€ É»(Í'QÌÔƒØÀX¼Í[¼åØ)È(_0®09o8Q`‚$Ñœ¤¬O½5GMÓ­=Z6p›˜ƒ9¸²]¤¢u4Þ ÙãôÓ%]p«]]Ö­ÚFœX…œÙ À.ØVlÍVÏuÂκNØOãCÿlÀ†ƒÂB9Ï\ž4–½ÛFl^ç}^èÞ 00Ól:UÂ¥ÁUep„¨ˆ+ЄÆe^é…Ý¬í ­Ê­]mÕVÍrBGNJëøTý=ÝÔm]ÿeÝç5xEVš¥\68`Ý…B=ÈÒ¥38Þ%Å[à>À„K;Ò8©ú”^þ`çÍÀá‚¢†¸µîí^0-x‡&p¾(­¸åá×ÍI¼£ šÅ0=Øá ë, F*`ýÍýU?þý_&žZxâ'®áü›Y óá&Q$˜U(M„oˆààeR¸•Sª f=PJ>m=ÿ(^c6nc7vcÖÓBï ¡/‡hGè^oà†¨‡;@¤`± `Y$x5~ã(~ÝÈ­_Hë _â™|YÆÆ â#Þ_%~Z¨ÝdNîdOÞä6®á¬eµ¢_ä ÜØhi”Ni•.é{lé–fã×ÍÀFlc`$h’¹•’[Ølap[¸=†ÞåÂÖR^$°h—Nj¥^j¦~i X“s‚oüKPa>®Ø–`žÉBP>í¹¦fj8n^7Vj˜Þiþ%é•nk·fé°¾Ç^Nê'Ždˆ¸u9ƒbˆ`Ÿ>X¡„‡k`ã‚èCë¸Nì°®xÈ£Co´Í$èʉñÕʄحRlÎîì—žäiµÎä·.m•öìšè P/SÕ4W>Ø~pL>0 ÂÅÈå]¾h_6ëé]ÿ3€VޛР PÉèjÜÞ@Ô^î¦fÐí#NbÒ6mê†ëÄþå6+˜  òÈø/ÞAá]@[iT€ X^™¦a^ã—®€¸ØQ8ý„FP X¤jkoÎhÌìMâ$¤h„ `ÌQ} „›L‡%V+½IV¥Ø™î97$ØPØqø„èà„Dà#Ï}1Ãë¯q¿qÏñ¿GøÆËgÔe€ur"/r#?r$roÈ}Tv¾FM ;ôë„cðÏÆ,øÓR)á€ùlYbür+¬IG]=(®iß&ÿ0M„DðÍEX¤ƒ-]ö2¯s;¿sg&€î Or@t"Ïq¹žÞÈeÑÖc=xÅaöÝa†­æÀßuyŸwz¯w{¿÷]Ïs u0×qxx‚/xƒ‡?í€|—ë_Ÿ€ PÿèÜä”^r QXQ`†š  œ G…ÄŸ#>@?pËådN–oy–§˜y˜‡5P0¸‚!à(w |TJ¦G+¦Oæ@]Ox¤Oz¥_z¦Wz`pøî‚A?¯õƒ¿z¬ø¤úšŽúËRƒr®øq˜ó`€š¸ ž0…YŽ?/éÂ’‰½åTs¨{»7wÈû¼W¾çûvø{À|?06ÐØænþõ)Þô¶GlzÈ|ÉOx}G Pqg€ÏzÎ'ø¤Ïsø&.@‚q8‡°¯ø j†µbÀ‰ð‰0šcX„€3”Ÿ½½{ÿ»×û½ï{u|áo–€š=ü™LüuîtÿÖÉ~èGú§wî¯ ·úÎÏþ€îÿS}/{”Úsædt3?ø„@1S#WèP„]§“¨hNr Þwª+hð`»„ 0dø€ —HJ˜¨À€ Œ/ºÂG‡,iò$Ê”*Wš ÂE… @¨©©ÆÏˆŒëéó'РB{žìð²B‰ Î1mê´iº¨RÓ¡3§ ™§0N,ITJC?S¦|¹ruËB&B„D|ù÷Iƒ#`,pG¼yòxPÂÀ V2¡K‰]ÿtôøQ$ËÈ’'³ôñÒ’ ªlâÔÉs(èÐDMZv9È‚§ª™N•ŠnRT¦8™òe‡ ¦¼-»A…’ Iœ,ùgDA…誻KNïÞ¾|ÿ ÜЈˆ+T`üXäHÊâdz4 3)Íš8=ìtîþ=üøï‹†``rúõ¯fÝ:ê:/4B…'N8±Â¤DÂ,f¹â&ó\ðŽ"üó($· Íáˆ}ýE]` 1äzLdF‘÷"Œ)™‡H¨—S{òé¸ã]EÇE ûñ×ßQ¡CN;°€aLÀÙ0‚ &d3Ê WÜ3t×\ xøÿˆÐ‰8¢AÖ™¸@lQ@b‹…RŒu¾Ø™ HøÑYŽ< ú^ …’d%A„åô÷èk@ˆr +8!‚NdðFó\"ì&²H `ÒeW|!JçB%®ybŠH(Ö"&º+¯½úú+°ÁþZž—!Çè´S™Í:û,¯…Ôä4zí~ý¡³Ž;ÀXñÏ’—*ÒDZ€jÀL8ÑÖ?œD`« ˆøñD;æøô޳朙fu ™Ø&p²ØQx{0 {èQIq€å;1´»J{^ØjLdU‚èbÃ?Gx2E›DMˆ° ~2ÿÃ%TàƒjÐÐ9÷º—ï¾õëïš(N`kw.¬0ÒI/,mÂàDš05ÕU[}5ÖS#²u #;a‹­±£Dr{Å œ\Ȭ0Å+8ÓÌ…ÿØ`Æð¶¦]:Ëç*¬h6جl°ÌD’¯[;þ8ä‘K>9åŽ[,mç@‚À¨S8衯i¹×%€-vØd?J•9 衉8u_x„ìŠ31ÐAÍDÔ›sO;Nàƒ]¸ EL@QÑ‹3ÞxåÑKOy¯$åiB€°:ݯó=øá‹?þø“µ¨§N6¶¬qKƒs˜!Î'µÿ³ƒ›ÿ±b! Â÷]†‚/3½Šxüê׬'9ìh-˜#ø¸ê!ªÁr Á r°ƒü Í÷ô•`êcûÚwª£OðC1ƒF$â HD#f .¬hf{ËÃÍ(À°€$B`á:pݪ#γW’¹D ‚sø³¨Å?<â€ø"Q‡1’±Œª8#"ºVŸá„n\ßµü³ŽÖÁ`ª>pƒ94@]xAbLà‚ Âyð½Æ>  ÐY=;âñÖDAlÌóÎwE(V°ŠWÜ¢½øÅ1F¡”¦<å)ϨŠ4Ž0Qm|ã 7Æšm¹cÿ0ðƒZ0Eîð²#PÅÙŽ¾‰‘Dtät§¦Ð©";–|AE0˜Æ8¦šÖ¼&6³©Mlfä]ØÜ"@¨A,в¥Ü:ÑÙ‡u²³ªTE×|À€Áƒ°”å,¹µ"äA']OZ ŠšÁ CöZǶùáñU±úèZ‚-&ÜÙF3ªÑr´£­€ J íqo|ÝCSÆ)Æsî¡.}g<çYÏÞS…PÙ–9ÚAƒ'äa=ìaÏÔpH1å ¡ Ÿ1ÿÖPé<‰ S¶p<(…]˜Hb^ Õ­rµ«^ý*XêÕ a¤ è\èâŽq 4ÿXiZêÒuþt•£§=ߘÂl¥cäpG;ö ƒ<60  êbr|ï¤ÅM#›õȦVt  @‚ lA:h‹ ÚÑ’¶´¦-hS«ÚÕ²VµAàÀ >à kS+ FàŽuœ#0g\çÚ‡º"â®3å`M÷Z#ùÕŸ[Ó0ÚXÇ*tˆÎáY2Ñ´LË®‰Þõ. Â+Þñ’·°æ=$ˆð„õ²—¼î/aÕãegut<`ŽtøÖœru)q›W7*wH®™òRT£ž”ºH…ì1%›Ým—» ù.†3üÝôr¸ÃN/{Ûû^÷Æ÷&ó­oÿ|`P‚´ý .€Ùc×Ìᕦz-ðS¨Òà»fǵî‡8 ËÊÂ&Ò0’½ûá%s8Äë1‰ó _ú&>ê!\ ˆsÆØ3vA‘{c媦H­ÙñQ¿šÈ–i²Œ¤‘“Œd&3ÙÉO€ry¥lb*/T©w4Ç9þàß.9ÌLî^Ëlæ7øÇBaóðÜQ¼ ÇYΦó’íŒçñ–—|ö|ô¯qä`ËQ tqi|ÜC9Ñ9^´‘|\ÝGG¸Í†de|aKcÓÖô¦ÃÛéW¹‘D @;=hvXÕŽ%Ž_ k4;Å×}–›}Vd]/€×½öu‡œìa:xJÍK< eÓUÆ©óª5ˆè*zÚ²~0,á!ãšÛ»ö6 Àn'[Øzö´µC­Ì’ƒ`÷pÝ-`8ÚNu¬=ë„ëÛÖü¦¬¿p% Ä/8¹9atÁçxø©™-qgSÚd–ö¢©½ñbc÷ãoÎ5·Gð’«÷äã>8±ûÜ*½¸ÙétÌ×;TT_v224_html_docs/images/glass/grey/logo_purple.gif000700 000765 000765 00000032653 11222361073 022155 0ustar00abwabw000000 000000 GIF89aÜ‚÷¨¨¨l5²¥¥¥sss9lDBEâââ¹¹¹rrrppp‰TÇÄÄÄmmm86:yyy™™™kkkM7cg2­¸¸¸aYi›gÒ¦˜´‚y‹B9K\SfÂÂÂÍÍÍvvvD„¿¿¿ÑÑÑ¡¡¡²²²¶¶¶zzzºÉpfy$"&!5¬zÜÇÇǼ¼¼´´´ÛÛÛ~r‰|m‹ààà€€;+Jhhhlct|||ðððŠŠŠ‹•½´ÆÀÀÀ†††‚‚‚$ƒLÃyA½ ›¦„„„ÞÞÞˆˆˆ–aϰ°°r9¹a.§ÜÜܹ‰åž”¨úúúsc‚ŒŒŒ„œ¡™©®®®–‹¡¶…â'D˜£‚s¦®Žš¦ ¬SSSÖÖÖˆ}“’’’]+¢ ”¬©£®†Y¶¨ ±•¥wW–†x”bbcž˜¤÷÷÷˜“ž”””ÙÙÙ[Ì–––üüüŠ|˜ÿÿÿÔÔÔóóóööö¢œ¨«««3^²§½l]z•žÈÈÈ·¬Á\[\u<»ti€ôôô…a¨n`|S?gÀ’é’ƒ¢™‘¡ª¥°¤ž©½ç’j¸h^sKGOhK„,$3Q#•®‚Õ¥sØU&™OMR¢pÖ–œ}FÀe\n¬0-3±àÑËØ¬¦±ËËËš• ¾èY(œrÅbUpˆ˜H$zÌÄÔxj†Œe²ZBq-Rœ–¡¢vÌœ’¥qRŽL P'…“‡žÆÀË­ ¹š¤ŸlÕŽ‡”¢™«ª|Öf8ž‘–bG{mO‰­¨³…Œ”‰Ÿ?y¤›¬XVZ­¤¶_;‡ys€d`iv>»}[ŸXP_”ŽšupzˆƒnjrxG°¨wÚiC“˜oÀsLŸZ+˜>!gº±ÂU(‘“‹šhbo¥xÐÕÏÚ¬£´«¢³sovmgtgXwéééèèèîîîçççíííëëëìììåååêêêïïïäääæææq8¸»Œæ´ƒás;ºo7µ¾è¯~Þ·‡ãvf†wh†}y‚yj‰‹‡1NŸ—¨—‡§lhoÉÅÏGŠ!ù,Ü‚ÿ!H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱcA CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê4f‚§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·p×"˜K·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±c»"KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËnÝ¡¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹sã@&xN½ºõëØ©§)° Œï0~ ÿhÐBöóèÓ«W^£Ë¦ I%Í’-id¦£cÓ°ë(à€hà&¨à‚ 6èàƒ.˜À0  ðC¯Œb=î,²„œ¨0IF¼¡@1ú PI¶èâ‹0Æ(ãŒ-þQ€…4<ÂÈ;ô,bÈ"œLR¢D¾ñ†%‰.WlòPF)å”T:˜†#›À‰*ƒHÒ£!¡X!¤A´€h@<€`‘AÀ °8c xæ©çž|öé矀*è „jè¡%0ÐEðÉ׊îbÈÐT &f&A ,ÿtêi$aH2nb)4`'¢¬¶êê«°Æÿ*k Øh!¯HcÅòâÎ<¶¼ $! §žvêÉþIlb‚É™W¨à«7d«í¶Üvëí·à†+î¸ä–kî¹ân—% ¼¤òÎ>ÊÉ%FÌ©a ›,W¤ðÃw?üpEÌþC‰í1mÕ®Ú*ºG,ñÄW¬-•d¹å ¹p¦ÐAf;„I³ÿ³J ýuáÌùäó‹74ÃC‹L%§:€-j ôÐDmôÑH'­ôÒL7íôÓP…( Á.ʤ*XŠ ÅR‚r0yø‹‚#ÎÜÂÆÚl_rÉ2ËüR «t - Èh ƒ#üÿl\Ô€.øà„^B%·ö²#¯?ûÄJpl³äq…xÓ  °Ý¶ÛocSÊ-Ì‚ÝlÆF0(@@ß¡.ûì´×®t0’ '_†òŽ@ïÉÍòËrÜãùòl€þ6ܢߢÃ/üÐ)ÂðHIª5HçÕ à‡/þøä—oþù觯þúì·¿~ D Í’R*2¦h:öÊýUÂÌ%  ó@=lˆ®”Þ/ŒÁŒMœ.@B;Âà½U¢ Ì 7¨A÷yðƒ ¡E˜†M¼‚¡4„6cÍrâqD?nÁŠv®sŸ[†¥§ƒ~á=œž1ÿJ!Œnø¡«€EÚ À"èCèà7XñŠXÌ¢|ÀÅ.zñ‹` £ÇHÆ2šñŒhL£®Ô€6à%à"6‘ ú©@MÌåøõ¯¤á6 ¤çܦÃRèà xA PÁHT¼à0Æô°ƒXõ@(ÁD"›ØÀ'BPE7¸à”¨Le*ÓÈÊVºò•°4£¢²´ U<âш<â‹°ψç)ð¯ø(XÁÌ@â°y—ˆÞ!_€ 'ìà E6÷@ˆ@œ Ö¨¤5¬¡bPà ‘â!ŠÀ@}à@)UIOTážøÌ§>÷ÉÿÏ~úóŸ ¨@ÚÏü¡Bˆ@2´ñ+Xa#2Q1Ä/K # žRË6Q o,ƒ™Í¬¡¡ÉÑò1Ä5³IŠ ¸4¤ˆ))¶à‡pZÒz …~p0H0 ÿ¸DIJ-ÕŠ=HªR—ÊÔ¦:õ©PªT§JÕª.õÛ¹U®Þµµ_M ‘‘´! C@@ýR€‚¤M © ×v‰’Ž‘Ôt6eêRed@€õ«*œ@ =Øô’z°€Q Ÿ6ñyp VÀ*U‹Vͬf7ËÙÎöcëÒÑ»â5¯Çʼn‰¤RÀl1"  S@Á1Ô@Û¸ÿŠ´sˆ¨ëèt€EZs¯-íë_ë x(È-j*N?ÃbD ’€d¼–u ªJyY¤zö»à ¯T°(-q)úXÈFV2JD”Õ¨¤…)ŒVд­ímÙ€»ž4õ pƒ+\Àbà=? A/RASÀà6½)-Ä  9À@ðB`QA<€ žTÜ®ˆG<â"˜øÄ(N±ŠWÌâ»øÅ0ŽñŠK`+«aZãš×Z(6”u* kBØNv…JÀ®"Í-J¼V›,}é_§Œ%ï°kwKpÇ;Þ `&0A%s*~âIP؆Ýù€,`ÿ”!&±œs@ç:ÛùÎxγž÷Ìç>ûùÏuöA ¸ó ôBïêÕ"¹3M.Y•ë×À:A&®ù€\&K*½/øv¥|•²_Q!-b¡é =*…‰“ý a69- ‰C@ÔPÒ¥ŸÐÄsŠt¶°‡l@ûØÈNvŸà\™w‘ò½‚7<”óxpÆ1pG€ˆ"`ã tð¶%79 /0”c*å—*ÏÕFÁU_u…ÚëÔ¸0‹0“³Ì[ t¡×rê>ÀÀƒ8üᇸ²'NñŠßÙ…*’^w„BÕëÅ_ˆ™Qþm¢ ÿ`mAÑßll‚°P';ÝyN_àÉÀ¥@»ÿJhg‹öK@²Äã¬+9} ³è·¬iQk9|ñ¨×kÿñ<ÐÁçDâÀõ®{½ë»Øû<ƒ¬Úx8ÞÚîýµbµ³Yd»ÜÙ¼± !Ø=¿,ÇÆ-2Xø”dÿH2iPë|ç¤ö$x1Þù(Lc^ÉHÞ©<`:éböƒø!(`@°$ð ² 20‡Ö¿Îz®?áõ°½ìgOûÚÛþö¸ÏýŠÚBÿ\Ñœ–½­/eñ‘NÇȇÝï.„ü²¢¿ÓÜD5’ˆuŠ‚u¿ÍæÎ+a\S/”Cj¯Ôÿ¥H¦?¸—mo`À¼¬õ ‰-lÁÆ€Ä, ‚r! B8êЄ­·Þ뺀8€ø@!ÎÆ%óÐ;b"2’g2ÖvLpËWùU[Ðwø° € È6a S‡Çs†+ˆF½ò+¶Ppðàv(i˜SÆtJ·šwh€®Ð` bYø§üçÿÇuRЄNø„P…R8…TX…V(… p#ñ‘ âq“"~"×cÉB6ÕÆ ¸|h,WW·€1°RŽpo'Ä’ÕÐp`VÆ ‹CZBg/øR|¥gLÿÒWlÐ 8(fÖÿ@ íwˆId0o0uBµù—I¸„]w… Š¢8ŠRÐK&„h9æ‚×Bo7†0t6ΰ w†jH[lØ_ذ_¨°R@ P $Hĺ K4p^©Ö€dRmÅsLɤŠÐ|jÐ9¿ t²F bprðˆ@4` ó0zúš(œ¸ý׎îèŽSò8ôXöxø˜ú872½SZ‚X2„èƃ|Íp™h‹ý †„Y€„pM™ð‹.…Ó`‰ÄX]n¢Zä˜ckç5™"†e9ýó? 9‹ÍÇ Íó a¦ƒìw‡d Ë€d|Hÿp2GçktzuÀŽï”M°DY”Fi”€éõ–ò€”§VÒxB’¹·È²pHYÖtM@ ©s› Ðð `&j’0@`¬QÔVt”óŠ0CŠ *¹’ M÷“›'“ˆd ŽP ¨¤TÀŸàPZ'”A ™’9™”Y™–y™˜ ™CÐà]À9™À´F°0$Ù)qw’lP—Ty—QÀKÆ[/`¹ù‹aùócQ’ ”D*ÒR&€QÑx²“p)ët&I°&Èÿ)¾[ü:¼ë¹¼*¼ÂÇ[ƒ†[¨ éõ…"™?©™2«pÃ,éÄDñ 6Wp Z—¦Û¢¼‘NÀºJNPYðPоŠ¿ókó`òˆ&{ÄV|3•@“`–S—p|E, ‹›n¬‹›|¬™à¦£P û…"s/6Œ23_%#T8 Ák¶îȆ|¼S0Ÿÿ`5¹Ò¬¾,0(ƒ*•€;yà,0¯;Ê ¶È¢À ‹[ù´ Ç0ûÀLlh°²²Uhð´( @€±ÃW~ûÂ?*Ò?ã©–ž¥÷0ºw`µ€ r« ¡Áœ¬ŒRh‡–h#|wøhžBÁà)aÀ&ð0r?°ãPƒ,¼èŒÎðëÜÎìüÎîÏìü%0 ï~èxX [¬GV OPºzj` P7KD¯÷ +«‹nìÀqÍÜñ1ÀÊ| ®M†NЀ È`&$I†ÈE `(?`Åuz¹]0º¦‹º± µÏÿ Í™ ³}è.©öB§z ËÉ¿Œr?ÖÄ «âPÎçœÎÂûPÕR=ÕSÝi`3µÄ1yÔ;yˆm>Àc0ÖF+,j š$ í@2°° Ž@®Iܺ6MU–`ð W  : XP X ßX€f:›20Ä¿•P·‘Ò7 3ÐÂ8 h5Ìì±ÇŒP¿„PÓ™p ï¦x̨ª!W¹OIÒà "àÛÐ Öp ?à1'Aí^°ÔæÜÔèLÕ¼ÕO¹0|5]¨v]£ÁaóBþrr¸:ÖdMÖ\pû€²ðsèS€ 0ÐíÌ}Ó3ÿÛ.< íÀ½Q\ ®P ¡Ì¸N×{©· ~„Ò)]=>Ð9ÐÅ@/HP„Ž «º® ±L6³°ûgÇ Yܘ¿7w?à$ùà Ûpá­Ý §0 Ùð~·Ö@u``éȺýÔ½ÕpЃ*hÍ‹†ÍÄ7ɰ¸ Ì}ãcà·Ð­ÙpH ?ðĘœÕ° ÐÙ5í¦`^ÓŒ€©? >X¦Xвñ+}ÔxWP'«Rß÷ß9Є(ð /8u)` ¼X°/@Ó’`ŠÃ#,·Ã—ÿÜ/(Ð÷8h ÞÚ§p ²ÆX¢ d¤—àìÿ@¶vpâ þèŽþW`àý%òÀÓõò€„•,“9ù8~ãÆ¼èý œ 0€ |‡yØŽ@Çò†5Ž’¦…Q?` >ÈL€Þ‹…pKƒ° ?À"Ýå9ðR0`Ðpð0€ ¢W˜0p `* f rÀѰ ºã½ÂÕÏèÕËÙ ³à8Øo€á á&€S1ìA ·)³ ^ ဋîÔk ð"Ð]ð§Öq’2÷C~§-3 Ì ê¢î±Z ÆÈ̲Œ`® ?ðð5ƨ½p Z6 $ÂWïBv*A¥ µ`ûÿ°®0åËL0@œ÷RÛ p÷ýåÌîìpP¼à)€ §Iz¬¦¸à Ú`›À VÐ+”Rø\rWÐÃà p ëÞˆ²öî> ;Xbð?>­ô›`ž‰žÛ‹÷ðõ¹@?öæ5þB—¨Æ ‰ø .ñcMÐ4ÿ×½¾º'ÐÙÙÐñ#„˜xû& ;y§’a@œñ`&°À½® óû°ël¼•<%† T)Ð>POCOôR}Gÿ<“20•‡ïô˼¯œÀ»’ìŠrç?lãÕèõëk:¸ábföš  / ´ö‡òdæÿÀïq/÷ÿ?Àô³+4çÚl|—C'ÎОðþ‚Oø9ÎZ ûpñ‘õ@Ê6Ù ¬Cš•7€âˆ‡$7¶ ©˜dD¦v’Pú×±#¥íPòƒ™}Qö¹ª²MŒÕ’Àƒ'á_ž=ž€yðÁçAƒjHOA›6E¹#LX–[äØH€a’0°°A NŒˆ§³<ºX %ħ±ÇàÆ ¢Ç#àIB«­ªKá‡M†™ _N+KµÕÊàB aVjé¥zÁM7±Á·F*iHYÂ7Vô JD… =êêŠ`Ød“<(i ›V©ä;\˜¨9Ш†$$@f»`@ÿ > ntÔQ)~ þ") ‘”Àc¾øPæ‡`:’È.î"ÂD–<« Eî0‘ üðƒZô:äÙD$‘Dl („“w€°éŸfØ€Ø)§AšuÖQG™g‰29Õº ©¤V|ñ6B Ïêf 'Ÿ|Ja `hƒ|ô´c=íAËhºò@ÂIÐ¥M®àˆ)ôD™ËÌ#5²ƒ„xˆB)FƒB5kÁo\ã2—”Òõ»" H&öˆa4 […H†6GÁ%@ƒ'•@›RÐ… àXn0Àbp Ð&@ 0B4–‡ Æÿ,cèÏ$›ˆâöà,*ð4@¡ ÏlPñ2¨€‚îP1„ld:ÁXEX07ƒ˜J§mhlù[žúÔ'Aƒç%4‡NÑál¡Äv01@¤JU#v¡N@ž(‘   …ÂE3±¹¹"6.á(*ª´Vw½+{ë þ6 ®ö‚oÀ£¤ ƒÙq±uÀCª‰„hlÃМ$ ?C*Õ¬•ÚÕ.µ~VÀøjŸjŽbàÁ9 ž²â™7ù« ØÜ s0ùüäà1GÙw›áÆ(°Ü¸s?ÿHBÅô@vÊÄC•­ 0À9 ±'%`àˆLt¼[€BW (Ú¤¾îr×7l Œ/]òŒØä"*È K¼A”xñVA¦ÍˆFHD`ÕÀÀ§oØ'@‰ÙºK(mÁR9ƒ©p«œõù©bw~Ѷò |È0KÁ@  ¶tXž˜0u—«(€³Àr+KA°@;§kÀõ@EÓ®ð…·+Óß ïÆ—ŒÀ ÎKhíE SJŒª¥= Â€À¾OÐA ë8t‚Ýþv*€á$ËØ¶3€Vr›»á ”«}_ßy( ?†+–[Ú—(•©»[ ðŒ|ä,”%-yZëgåTà|ç Leó4'6Ɔó$A¨ì  x"‚Ÿã¡óœßuRð¢·#ëIK•ÿ±ðK£á]úR{q%È£‚ó°…žy/Š6q[®.&pýÀ²`+à· Žs¨ãíãçü ¯ºS  U’º»àì8̹΄F`p&®HWž«úš(ŒM9Ê›¥Zº¼áʼÙ[@\@su¿ñK0ÎûƒíŠ®2¥S Èu£šw +`172²} =a,8=B`²Ï‰’(ÿ!¥Zê)+¢*ë¼#¸C<ÌC=ÄC*8‚4P"Ö XP \ž2`Q+Òú”½=¤=)(€<(AÝL8A] 8ñY7)C ‡’:ŠŒàŒÙb†x€)À¾ äXOà€"t@qHÂ%lB·»Ã€Hˆî &’€H +m Cغ®ËD@È6`k€°:D\HÄ,øÊbùƒYƒC¹Y9ÙëÃ=LGu¼C)ð!'‹(3 ô& C jtŸ[G* h€Jü‡kLP„d,2H†L…VÈ/ht-ÿ»k‘™.ÿ8Š`Y\>à /pƒ#\qH‡rPB&ôE;¬„+øblLÀD¨€I€'åsæs¾QJ‚B‰‘¢}0Doª‚Ó˹¦Rœ 5r4GÎÓèJ«¼J¬ÌJ˜ÄH¶çàc°ÀC4ÃÓ+µb½p6<¸Ã¬¼Ci» Aš\d8H#°K€†y EX‚Ÿ‚õèƒ1l!’Ú¹‘X€´Å’t#4vHÉs`É–tɪ<h€!ºxxˆˆÐKh>ä³è«I“¹CË3”ƒÔ[=¢b”gCÇ#ÐJۼͶÄ%ƒ4±Ô² ¦BÙÀÿp”[ËÛ<iËGHùJh²KDÈ70‚7P€ÒDÅUcW«(?(ÇØ›J’t%Lq‡t8‡•Ë\BùœOu°Ê#¸ÎìQXTÃLxŽy›Ð J Ê<¡°2È&Däu1®¬âÀ¨*ÀM ­P«8Õ*‡¡¹-ƒß¬˜‹ñÆ+è‚5ÎãăÈ(¹üˆB!«%ì Êq„4À­!˜ ðNH0»À%ˆLt ‡õ4÷„Oø¤O%Oûăh€…Qƒ0z«H«+€+ˆ„`¢AÜ ì† œ‹!2¹G¬Ú´Pÿ6µÍPà 4 2d‚*'K‚ Ø%œðÀ ÅMäŒ (€X…æ ˜ ±¨—*FeTVš4ì ¨ÔXv Òp0R÷,‡÷DRP ÕPm¨Ê|GøCõlq¼aè€@€…wŒÇSßlÍ;ÍÇ=%U` VaVbV]Do¬¡ˆÁ3œxR ÀLŠMÈHèSbmRp€€ȃP™ŽkaF¥)™’v}‚™ªØÆü„>øz=€M=‡NýTQí×~õARÝJ€4º„õ °Ø„.HYR×'àFÝK±êÿDL—:˘óÀÚìQüX Y‘Ù%Õ^› Ý [ÛÙÜ€ZßbWüµ%§Å<*“¶ù€ I/àØÝÛ=`ÛÍ^ØÊmíÝޖì8€Ó…K(n 1ÍÆCƒÿ Ä/E¹ }_>aì0Ü9?­Úos\ÇTh°èoƒé-a†_˜ Á[Û1ƒ!î± Ï5e`p€vƒö:F`)ÞÚ¨â*Îݰõ_®1â#XDðÝgÐ`b †Bƒ»%„ÿ—¢’€_•ÔÀ²b9žc:®ã:¾>FÛÏî2}hR€á@øVF Å ŒDñ"€#h8¶ã+ÎÝÌÝ5G¡ «Ã5ÕÙöY%nb†â«ÅZPeQeP¦c,Îâù 2#®J=Y^-€l*cnÈÕÓ=b"–<¨ÞFvd_þå˜<Ð2@‚C‘S°º0[w ‡ö£ÃLä#ðQ`¾^ÌÍÌܼ>deLá,€Mæä'ž]R>gtÆZ_žÌÌ<´Êmd(Ü¡j=-èYöPWøàMˆÀ«Ø«^`è_ž€.X4éRi‚iàzxAìÿ` h è;XÛŒg;ž€øÓàd'–]0”Ni•^i–ni”îH˜†é9ÎÝoÂ9f8‚¼Î[Àç2¾@UèÒP˜Þj®â˜Nj¥^j¦–逇ƒ|ƒ P%0wÈ öÈŸЭ•Ô³kj¦¾ãë­c¥fi’.à“vi¸Žë—&ëŽü央âÑ"»‚cè† æ`Z¶ )*`䱦kÅ&ë `)A'˜N=³'€¬"À1£ÎèÅîlÏ–éL€‘nkO–kÓnéÏÆé‚ž€4P_Ĉeb˜åæ•Ød­]æeè´fçÿ?€q„ByQhž°ÎíìKmænêíÑnâ'.íÓ®î¹Vl9Fax‚5fC ^^߬…Î9jä%®^ëÝá–c™ž€€XÑ€ †(€¨%~<êæîï¥fù½¶.ç·¶îÓOpHë`†_޶M*°åÔ\MZ–ƒ ªzFkíÓ6½Ê`YX<;_k)HÕU×´.8Àöm±VpqŸq‡ñŽ„oÍpr–ÝHÿq r!r¯ñ÷ÆÜR…ÉuìÙðçåPÖü`{ðÐI ˆÐk]r-ÇCïQ›qÍìà Ú¯XØa¨%ÿ““ª]ž¨q7s8_ðiÐqéæq"Ïs=ÿq¯kvÎ\ÚÛ5•€?@AT _JJ—À‡2Ñax½”ôA¶©ôf›Æñm}úƒ?€Ð_qTsImó8/uSGpœ^ë:'m(îñ=u!çY—õ÷óîÙx‚Ð^ïu € †² и…ìaÜ= :ÙÍ›@¸Tr%j¯vkG!X**ÑnöòXúbq÷1 õŸutOwu_wvo÷Y—óÆ `uÀ×p¸w|Ïw}ßw~‡J­Ôw¯ë[€ð‚öe–Nrد\6b¹ÿ¸0 ‹ SCdÄÖc> ÈDÏôy’y8y”?yð‚Oà'‚)n·ÞRõÙ ø1É ^ÎYÿw z¡z¢/z ç‡o*˜"¼óVïw¨z|z¤Çi¥÷-/8ç…cö ËŠ¿ ¡‘ÉÄþ°~CÏL%¶o{r`¸‡{t˜û¹_»¿{¼§ƒø€n^ï[ÁØÛÑAóy£?|ÄO| ‡÷#èO çr¶w©Ÿ|}z9‡o˜‚#‡rÐz–‡jÖƒY‘Z‘DÂI¹ˆa‰£÷¾!uû¶{¹§{tÀ{Ü_‡‘_€ÿèû>ü¶JoïHÃW|ã?þ Gúç>)˜€zÊþ{_êÿwxŽÔÚtes .¦}à¡Ñ„D*У Ã’hqõq}ÚgÛ¯ÿÛÇû’_ß¿ˆ ° 8p  xlh¸aĈ'R¬hñ¢Ä† XLhñთ^è„Áá@¸”*W²lé2åÄ 'Œx  Μ:sžëéóœ9q ®%ÔN¬+™,ˆÑ„X©¨ÃhX²$Ì¿`(,áÂ;qbÉ‘%Ëî,Ú´èÖ®]çö-\&ôx@eD ,*\è#àÀ‚1òØHâˆO"IÿšDùò1d˜ ³8ìÃÀÎÌ8ú4ŽAµ0ñÄ ãÅ Mü F½€b§ í"ýËS€+‡¯èÄŠ+k6-p¶má—k€Î‡)ŽŒ˜0a¯_‡S¯ŽQ&Çš C’äp’7øðâLJ â‰Ʊg¯y3çžéZ¤•¤é0Õœõ–7<ò=@HðÏ?)”0Á¹É°ÛX¾Iœpgœ,ôs$ä—u!ŠXv4qw%}G‹-ŠSvS¬Ðž{ïÅ×SP›Ä‰H ±üЀ#Ž4ðÃôÈc´yÃ\ye„½Iè…²u!†n …xéÿBC#šâ<D>@c+º8gx+Ø ‘LŒP4Žó æ¤SD °DAÑ&ѨÂK2J†R2XýsÅ#HùUXãMœZÂq‰a†‘ׇeJd'«­ºú*¬±Ê kDivDOl`ÒIWúú+°­. MCˆã'²í½'(;ÃäñH`ÄFLbE(†Ìó<–Ð-°ÐJ¬CŽJáKN–Ãç©^‚¦‡ M·À¬ùê»ï¬xÎT“mDyÀºËê°Ùù,Ã6…GÁüKñ„FTPA@ ‚ÁÀÐAs8á…~xà»AvˆÇ0ëä=9å¤&õSWMõÕ€EÎ:m°JÚÂR:‚«ÀÀslp2箜R‹tŸe÷–xOÎBŒ@Î~ÿ 8⟫©I|ð‡9ѧ3=õÕ[ýõ‚CB±›s~u²›i-iü°ŠÄ¨{Ç]œ}À-ÖKêb jÝwÇ<ÿóÞÍ¥ºªŽ'À .yy>0°| #È@í-€{#‚÷Ô¾ð•(âX‡è@…?ÀàWXÅ®Tb #øÝxð67¤Œ~õkÙýðÇ ÅLryÛÀ8„ª„ïLF¼ãô„¤¡N|"ë AØ¡ŠV´Ã²¨Å-~¢‹}€ÚyFЃ ’ñ{È‚O:Èa„à hCjä \x! 6и!vè GõXb¿_½Lðšð À:ѹ×xÀ%61ŠP¤b³Ø„Mr²“ìâ'¾XA=±ŒlØf˜µF:p`j:€sb™|"ÿ}\Gܬ'H2TvUÞ>‘F¶xÙ _ú¢Ìe2³™Î|f3 Ò*8îd 1¹†MÆ¡›Ýœ8Ã9P~j<8@ zAS¢2•Z3Ü`¨Ig+øÄÉ\ð t¥CP\Iírˆ?C¾kr+ø€ìrG礡}(D#*щN€#Àƒó w½è™'ØÄ"7ã Α’ÓœèTçÙÉAž t2P‚ºãï„À }¤ÒÊúéOêírnAIªOA OhƒM@æà¥N}*T£*Õ©RµªNÁ0úÈQÎ-ìGGqP6A¤#çLC™°t®³ŒÿTÖ9Ò!vHŽ.p^Ýà"È,äÇô8ªËÇ ÒW…Ìî*ABrЃÉ¡²–½,f3[ÙÉr¶³žýlg} t EcšÑFÀ‚°#åÀ ¶YÖ³Î!­}X+J¨Ò·ŽGr%:f†K~V°ÿ¼!o\æK- µrÆ‘t¡ë‚éR·ºÖÍ+vûH"(¡»Þµ.x©‹Wîp€-iYã°Ý¦YGj[ܶ•Œ¼­QgÂa%²äT§5.O ËKÃ.—‡‰u.†¢«àGw»~0„·ëÝãIyÏ;Œ`ë0Ç{g+_凞qlM©ÿ[ï» ü÷¿iñ`‘¡^æï—qAð̬cèF¸Çžpw+la7×¼=:*HÛ›#æ@‰Ypbݦ˜·™¹gZ¼ÓéA¦°W:¬»‰ãï˜Á>ö1• äëÃF¨OÝHŽrÔ¾OŽò”¸Û·^Ë/þoŒ]âeÛíwÍEp™Í|æ§yÍÕ½0+ß,7ñ”e\áÀA“›pçÛš8·z®2ŸWìgÁø¸‚ð— LÐ1“*Ñ ^4£ìhñ¶9ÒöYˆ€uÐÙÎáœo§ë{J‹zÔZô­gLà3÷Ƭ–‹« k7zÖw­u†\Xp€É"F+‰9ˆ-eO3pÏì³±K`ïwÙ·3´³ŸíOûDz¶6¤³ g\“e±âP‡ ¾]ÛpÓÅö%¶NFMj@›:ÙíN5³ ,fyÏ[õ¶÷„­}í";|À2 ;ÊpMÿšàÁ6ø°­\l?»áÚVnÄWýlhWüâ¾÷¬ó-iÚùÔ,»>GI΀;TT_v224_html_docs/images/glass/grey/menu_body.gif000700 000765 000765 00000001425 11222361073 021600 0ustar00abwabw000000 000000 GIF89aÜ ÕêêêãããßßßæææäääáááÌÌÌÿÿÿÙÙÙÚÚÚ»»»ÅÅÅ÷÷÷ÁÁÁÈÈÈËËËÕÕÕ§§§†††ÓÓÓÏÏÏûûû×××þþþ´´´ñññòòòÜÜÜðððíííÝÝÝëëëåååïïïâââàààÞÞÞìììÛÛÛèèèîîîçççééé!ù,Ü ÿ@ƒðáX4 gÉ 9ŸO”tJ­v®Ø’vËÕ~¾`€X¬*›Ï§t:Ån»p8hN§î÷€^/êûý#„…†ˆˆ$‹Œ’“&•–—•  gej¥kn °BDFHJLKPºU¼TXY]Á`ac££¦nÊ)qruuxy{Õ‚ƒ†Ù‰ŠÝ‘“’˜ã&šœž ¢È¦jÊ"«­¯±CEGI¸¹ºQ½½¿WÁ„ ûPÌØ13É–µi6à´hÓ¨Ut-›¶mݼ}óN¹Kæ:} uŒ];Tð2ȃu@­{·píã×ÏÊ¿€],va)ÿ… ›9´qÚDŠ‚,˜‘ÑFŽ?‚Ü$2]I“'܉ ÒK—ölåã0ÓIM^ÿ:à䢳`OR?2:D4ö¹V@i¡mš:ÝØqƒTK!Ñ‘\gR+וôf…Å—¯lˆ³6­ÝÒ–çÛ„@Öµ[t^|ý,xÑÓ‡3QU¬ VÇ]絬W‹²Ì²˜}ÝÜ\¢ó˜·*@+]÷n^½©U³ný:jìÄ#kûlŒò±×È/ÅV\JZâźý74Ý¡ÎB¯(©àêáb—›ý*÷6ïx§X½ÅÔyåGœqd°w’{qŒŸió%U_"­‘€%×ñg2cìàÙn’8–eå™7Üf Ô“rË0_i|Tˆ_ÓÝG˜u‡a÷¡mÿ±`n,;TT_v224_html_docs/images/glass/grey/menu_foot.gif000700 000765 000765 00000003076 11222361073 021616 0ustar00abwabw000000 000000 GIF89aÜæâââÞÞÞåååïïïëëëíííÝÝÝÜÜÜêêêäääæææþþþáááßßßãããðððûûûÚÚÚÙÙÙ÷÷÷ÆÆÆ§§§ñññÏÏÏÊÊÊÓÓÓÉÉɼ¼¼ÂÂÂÇÇÇýýý×××ÕÕÕ¾¾¾ÄÄÄùùù½½½úúúüüüôôôªªªÀÀÀóóóøøøÃÃø¸¸¹¹¹ººº¿¿¿õõõ···°°°òòò¨¨¨¶¶¶²²²©©©fff–––ööö¦¦¦³³³eeeµµµ‡‡‡¤¤¤±±±¥¥¥ZZZbbbŽŽŽÍÍÍvvv```ŸŸŸ¡¡¡………ÑÑшˆˆ•••˜˜˜œœœ™™™‚‚‚^^^CCC«««{{{ŒŒŒ£££‰‰‰­­­ppp¬¬¬®®®   àààÛÛÛìììçççèèèîîîéééÅÅņ††´´´ÁÁÁ»»»ÈÈÈËËËÿÿÿÌÌÌ!ù,Üÿ€p‚n$2NgŒŒf“”•–˜™c›œ› ¡££g¦§¨eªªd­®¯ ±±´µµ ¸¸»»¾¿¿ ÂÂaÅÆÇ ÉÉÌÍÎÐÑÓÔbÖרÖ l¨¦«æ¬® 8 c*+ oò‚p„,!-YaŽ‘‘–VʤɓÁP¢H! GîÜ«‡ddͲe+—.^€iFì˜GeËœ‰Œ&Ú´l(Ålëö-ܸ†çV½20CA#àÉ{CÏ †6"`¼Ðá¦ßƒ $ˆÉàA„.dxÊ!DWP¬hcFÁ8züRäH’LžL‰m¥7pâÿÆ”éª ›2pšˆ7o›6hÖlrÅ(RIJ2-àÔÔ¨ ©V5w«Ä­·ºbvØXdeÍ6C›V-Û¶ÜÞº”;·Ì«GXØQÂ_ž~Û"ac ƒ~‡%VÌ´q§ÇR%—£\9âeÌ,&ðÊÙGŸl z4ZµN_sÛ2.̹®¬+ bÛ;{Ú ú àÁ‡_*nüÔäÊYUYVÐE§/Õp]vÅl×3¤'ž6©•÷R*­¹BB‹ÄÓ·É÷“!ù@‘B#Á  ß@üõ‡\d27às˜IG]u 2èàƒš6!yp]8zd`‚M4LPÂÿ^!ʧA"¬A @¸PÀQù­8Ébýù‡€’ xÐÙ¸ŽbéZw=š4¡JÉÚ\ PPƒ²yøÞm¸ù5¢)l Æ:H¢–[¶hÜ‹¤(w†˜‘Y㽠陚Ê<@›ÕüçjçÁ )@À'¼ÃäN}Öã†OºJ‚ ZQƒ …¨\vÉh)1Ò5£,š‰ ¥e·#›ßù( b¸ŠlPdœz‚’LòI_„ĺFl´ÀÃF¤¡îºì¶ëî»ðÆ+ï¼ôÖkï½øæ;/TH]XQÁÀ\Á /\ X°m {òÙ*¸è†ÿ)„°Á -È`Ã?¨!òÈ$—lòÉ(§¬òÊ,·ìòË0Ç|r3xÁƒ:‘ . ”AÀ•*ì°ĶI<±«¯þÔ"p° !@°aõÕXg­õÖ\wíõ×`‡-öØd—½µ 2ÜÀÅQT!Õ(¡Œq¥*Ä0AN&mô·ò½îÒhˆÀN¯aøáˆ'®øâŒ7îøãG.ùä”WÎ8 È  K$aÁç N *œÃw "ˆ¬ÆÇw߯VÜFKS@¸ç®ûî¼÷îûïÀ/üðÄoüñ¾³ ˜ _QÄÐG/ý #ŒqĬ·îúëàúíÈ>û›øä—oþù觯þúì·ïþûðÇ>ø¸ D>@ ÿþüC`BÞzËžöú½oyï€L ÈÀ:ðŒ 'HÁb lè|°ºzЃÔ^GHšð„(L¡ WȺ腂„ð†8ÜÞ wÈÃúð‡@4a g¨†æðˆ ¢—ÈÄ&:qˆ4´!§(@;TT_v224_html_docs/images/glass/grey/menu_head.gif000700 000765 000765 00000016002 11222361073 021541 0ustar00abwabw000000 000000 GIF89aÜ‚÷éééyyyppp¹¹¹uuussskkknnnmmm³³³ëëëìììííí¨¨¨èèèîîŠêêê»»»çççzzz°°°ººº···www´´´©©©tttÚÚÚïïï~~~xxx†††§§§ðððåååqqqrrrÅÅÅlllvvvooo€€€¿¿¿¸¸¸{{{²²²äää¶¶¶¼¼¼|||ˆˆˆ}}}ƒƒƒµµµÙÙÙ±±±­­­®®®æææ¯¯¯„„„ªªªŸŸŸ˜˜˜‚‚‚¤¤¤………‘‘‘«««¥¥¥‹‹‹“““¦¦¦ššš•••‰‰‰   ”””ŒŒŒ¡¡¡¬¬¬žžž———’’’›››£££œœœ‡‡‡ŽŽŽ™™™–––¢¢¢ãããÈÈÈûûûâââÄÄÄÃÃÃÂÂÂÇÇÇ÷÷÷×××ôôôÛÛÛùùù¾¾¾òòòÁÁÁØØØ½½½àààÞÞÞüüüÀÀÀñññÆÆÆÕÕÕúúúöööÖÖÖõõõÔÔÔøøøýýýáááÜÜÜÝÝÝóóóÿÿÿßßßÌÌÌÓÓÓÒÒÒTTTþþþÐÐÐÏÏÏËËËÑÑÑÎÎÎÊÊÊÍÍÍÉÉÉ^^^bbbhhh\\\YYYgggccc]]]```___aaaZZZiiiAAAeeefffjjjVVVddd[[[CCC!ù,Ü‚ÿ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱcA CŠI²¤É“(Sª\ɲ¥Ë—0cÊD‰ ¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§Pq˜JµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­[«*âÊK·®Ý»xóêÝË·¯ß¿€ œW€áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C'.Aº´éÓ¨S«^ͺµë×°cËžM»¶mÖ&rëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_¼€óçУKŸN½ºõëØ³kßν»÷ïàËÿO¾¼ùóèÓGçÀ¾½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ú(à€hà&¨à‚ 6èàƒF(á„Vhá…f¨á†˜Â‡ †(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æxb4Öhã8æ¨ãŽ<öèã@)äDi$ $©ä’L6éä“PF)å”TViå•Xf©å–Qàå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæf|öé矀*è „j衈&ªè¢Œ6ê(¡.D*餔Vj饘fªé¦œvêé§ † ꣅÎ`ꩨ¦ªêª¬¶êê«°Æÿ*무Öjk¬–’h ¼öêë¯À+ì°Äkì±È&«ì²Ì‹j¤|êÀÔVkíµØf«í¶Üvëí·à†+î¸änÛë .D»ä‘92àî»ðÆ+ï¼ôÖkï½øæ«ï¾üöëï¼ÕÖ€n€@c þß¿ 7ìðÃGüpÀ‘œiŸ­àñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ì2Èï~ 0Á€‰%š0¢óÎ<÷ìóÏ;3!ôÐDmôÑH'­ôÒL7íôÓPG-õÐ ËìBor ?°0`‡-öØd— ¶h§­öÚl·íöÛpÇ-÷Üt×m÷Ýx§Mõ3Tÿ—ˆG„nøáˆ'ޏ Œ7îøãG.ùä”Wnùå˜g®ùæœ7Ž6 ð€  ±‡â¨§®¸¬·îúë°Ç.ûì´×nûí¸ç®ûî¼³Þ8+|àB—¸ÙÈ'/vÌ7ïüóÐG/ýôÔWoýõØg¯ýöÜ3ï;ð5T€‰¨+o>Ù!¤¯þúì·ïþûðÇ/ÿüô×oÿýøçŸ¾÷B¬0¡HDùÄ6‡ð€L ½ÀÀ:ðŒ 'HÁ Zð‚Ì 7ÈA¦ÏB`À P‚Ä…Í€lH¡ WȲ0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡@„!ÿ‹Ð?pB&ÄASè‡&6qPŒ¢§HÅ'XñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šÑŠ4ðBlà?K¨Á„K|âAÇ:ÚñŽx¬cöÈÇ>úñ€ ¤ IÈBòˆL¤"¹Ç'Ð >`€ 2±à ~؃#&¡†xò“  ¥(AÉÈRšò”¨L¥*éÈØ@’¡8Øæ€I@@B Xƒ vÉË^úò—½L‚0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4…'xÁþK…,•ˆÉDÔ˜à g/§@ÎršóœèL§:×ÉÎvºóðŒ§<çIOr&!×d 2aÿInúáЏƒ@JЂô wà‚BÊІ:ô¡¨D'JÑŠZô¢ͨF:…$РL¨A'dIË=ÁM©Jú…–ºô¥0©LgJÓšÚô¦8Í©NwÊÓž¶” SxB„ðN¸á¨„ãæôð†•:Õ UˆªT§JÕªZõªXͪV·ÊÕ®zõ«` kT¿À|Úà–°$-ýˆ”á­p«\çJ×·Já®xÍ«^÷Ê×¾úõ¯€ ¬`KØÂö°w­Â<É´Z²–n­«d'ûV#Xö²˜Í¬f7ËÙÎzö³  ­hGKÚÒšÖ²R¨BP‹°‚O¨• {PÄ(K[ºÿfᶸͭnwËÛÞúö·À ®p‡KÜâ÷¸·5‚Ê&¸¶pJUDdkKÝ2(áºØÍ®v·ËÝîz÷»à ¯xÇKÞòš÷¼×Í‚ë!xâ¨nH*&¥[ÝêFá¾øÍ¯~÷Ëßþú÷¿°€LàøÀ÷UBTK€âµ±=&Lá [øÂž°6Ìá{øÃ ±ˆGLâ›øÄ(N±ŠW¼á(da¹ ¾„e›áÛ˜ÂaȱŽwÌãûøÇ@²‡Lä"ùÈHNrŽ „õ>Á2†nIeû†*[ùÊXβ–«Œ….{ùË`³˜ÇLæ2›ùÌhN³š×Ìæ6w9ÿ .®BŠÀ‰ŸaËx㕃Àç>ûùÏ€´ MèBúЈN´¢Íh>cÉRHBê,åL* zδ–ÁÀéN{úÓ µ¨GMêR›úÔ¨NµªWÍjNÎF˜‚P1cLkúÖUn‚®wÍë^ûú×À¶°‡MìbûØÈN¶²u †Gg 4 …Z3¹4âÚØÎ¶¶·ÍíkkáÛà·¸ÇMîr›ûÜèN·º×Íîv»ûÝßn«•ð…'”ÂÕî¶¾÷í.øû߸ÀNð‚üàO¸ÂÎð†;ÜßZhvä¼ è*‘­Õ^ƒÆ7ÎñŽ{üã'‚ÈGNò’›üä(ÿO¹ÊWÎò–»üå0¹ÌEÞy;!Ò¯ô2òžû\ãWºÐ‡Nô¢ýèHOºÒ—Îô¦;ýéPzЉñ0ÄRžÆÓðó®`»ØÇNö²›ýìhO»Ú×Îö¶»ýípûjŽ…gc½Ò€X×½ÎwCáàOøÂþðˆO¼âÏøÆ;þñš€z‹BʵÔ{6ÏùÎ{þó ß<FOúÒ›þô¨O½êWÏúÖ»þõ°½ìg?z(\A AˆÂLñØ­‡þ÷À缆OüâÿøÈO¾ò—Ïüæ;ÿùоô§?|*¡ `pB @ÀZFB¿ÿøÇOþò›?ü[H¿ú×Ïþö»ÿýð¿üçOÿúÛÿþøÏúŅɇA `q™~çW€~C€ ¸€ Ø€ø€8Xx˜ ¸Tp{X`(Ð}sô}mP‚&x‚(˜‚*X‚HЂ.ø‚0ƒ28ƒ4Xƒ6xƒ8˜ƒ:¸ƒ<؃-8bp}A(€y'+˜„Jh‚KЄNø„P…R8…TX…Vx…X˜…Z¸…\Ø…Mˆ[ÐA  ‚Š@‚K˜†)(l؆nø†p‡r8‡tX‡vx‡x˜‡z¸‡|ȆK0dh„€€†jxˆmàŠ¸ˆŒØˆŽÿøˆ‰’8‰”X‰–x‰˜˜‰š¨ˆ"€AØQpf x`¦xЍ˜Šª¸Š¦¸‰®øŠ°‹²8‹›Ø‰ŸŠ„I;ç,¾ø‹ÀŒÂ8Œ¾¸ÆxŒÈ˜ŒÊ¸ŒÌØŒÎøŒÐÒ8ÔXÖhŒ°a¨N '¤u±Å‹Ä8Žäø‹?pŽè˜Žê¸ŽìØŽîøŽðò8ôXöxç¸"ˆ]‹'Žå8Âxy™ ¹ Ùù‘9‘Y‘i?àžHX —diI"VP’&y’(™’*¹’,Ù’.ù’0“29“4Y“%yÿ W%yÇ‹y”B9”DY”F”:”J¹”LÙ”Nù”P•R9•TY•Vy•X™•Ii? [`P Š”Gy–h”;°–lÙ–nù–p—r9—tY—vy—x™—z¹—k©GàCM`>¹#˜Š¹˜ŒÙ˜Ž™˜=™’9™”Y™–y™˜™™š¹™œÙ™žù™ š‘¹V°HZP…éˆù˜®ùš‰i²9›´Y›¶y›¸™›º¹›¼Ù›¾ù›ÀœÂ)›= ?°TÐP˜‡ ›Îé˜9Ò9ÔYÖyؙڹÜÙÞùàžÑÿi;p" D°œ(­ùœî9/Ÿò9ŸôYŸöyŸø™Ÿú¹ŸüÙŸþùŸ ñ™=`°W@ÌIРú ¡Ú  P¡z¡š¡º¡Ú¡ú¡ ¢":¢$Z¢ú 0@  ëù“ :¡2:£j¢6z£8š£:º£%Š¢*Ê¢.ºV± @p¤Hš¤Jº¤Lz¤ð¤P¥R:¥TZ¥Vz¥Xš¥Zº¥\Ú¥^ú¥Oš9°?€@¹8G†i¤MÚ¦nz¤7§r:§tZ§vz§xš§zº§|Ú§~ú§€¨qª/ÐG°P+di‘ÿ 2Щ’:©”Z©˜š©šº©œÚ©žú© ª¢:ª¤Zª¦zª¨Š©7`"@ €B°UˆEj©¶z«‘Šºº«¼Ú«¾ú«À¬Â:¬ÄZ¬Æz¬Èš¬Êª«1 9   °¨C꨸z­•ÚÚº­ÜÚ­Þú­à®â:®äZ®æz®èš®êª­p/°°°žCúŠ­ø ©°¯üÚ¯þú¯°;°[°{°›° »°ûÚ1d:@­g( °›±»±Û±˰ ²";²$[² ë°ûK±z±û²0‹±0³4[³6ÿ{³8›³:»³<Û³>û³@´B;´3; †: BMô“«PµR;µT[µP;X›µZ»µ\Ûµ^ûµ`¶b;¶d[¶f{¶h‹µÐ7ЪH°´LK–-kµt[·Q+x›·z›·iÛ·~û·^»·‚;¸„[¸†{¸ˆ‹·01ð¬Kà,û´v;¹Tk¸][´&›¹%{›¸žû¹ ;¸‹Û¸:ð¸L«¦Ž@ @¹¬µt𺰠»{‹¹ìº¬¶{»Çº­ûʹ‚»¾û»À¼Â;¼Ä»2pð®"0‹J–Ž ¹­K¹p0½Ô ¾;3Ë®10¨<Ú½&ªrÿл;2»Õ›¾ê»¾ìÛ¾îû¾ÔKÐ ÐP§û“”pпþû¿ÀÜ¿,PÀ\½t ‹ë°OŸÃùÀ œ9ŸàäË»tP½¼ÁÜÁüÁ  20`€¿q»ÏË¿üÂ0LÀL½ ¼¶ÍŠ¢;à—GðרÃ>|Œ~Ø†Çøi:°ðà‹pç«Á"ÅR<Å#\Âm›ÂÍËÂ’àÂ1ÜÅŒ` ÆœÀk»ª)J\¡S.×ò2'Ã-S-+ >@UC = ÄìÄt°ÁaÈ‚<È„\Ȇ|È„ÌtÿpkàD™¤¿”\É–|ɘœÉ”,œ,a¬È£[¿M°Tp~ kµ] cÐÊ®üÊ­l²<˃P˶|˃ÀºÌ$Ð˽ À ̰l8•0KÀO:` 0Æ\ÍÖ|ÍØœÍÚ¼ÍØŒp0¿  +°L„ºû«ÉèœÎ•œìœœìÍÇ‹«Rà/Ûº¬ÎðüÜÏðÏл¬Ë¾üËÁ|ÐÂüʲ< "ðDÐÏìÄpÀÜÎ}ÑѽÑÑr Èp=“ÀDlU–[¬Ï*}ÉÍÉ -Ï` ÿpϬ›ÏêÜÏþÐ<=м\Ðа<ËfP A`;ð1 ÑxPÑýÔPÕíÍŒlU€NdΰÒ\ hðÕìüÑtÀ¸9©1˱UÛجÓnÍÏ==Ð=×$ Ô°ìʲ,R` €ÒLÑíüÕ‚=Ø„]؆}؈Ø`, - Dp嬿[ÝÕ*}˜ýÕíØ K€­K¹8În×>½Ësԭв¬FÐÐ2x ؘ}Û¸Ûº½Û¼ÝÛ¾ÙhàÍ=` ‹’lÙ— ÜÂMÜ6` Ý±¢ Àú\Ú}Ú¨ Ԫб<Ë[ÿ Ó702@ѶýÛæ}ÞèÛšÝØô WðDy÷”0o]ßö}ߟ„ÙrŒ| ¤¶šÖKµl}ÉÖÍÓíÓt­ÝÁÌÚ³ìZpä}Û£tážáŽá™ýÑóûJ`‘ÌÂó}ß&~âùr@ô+jà–*àKà1ÜÖ:à×Ý ^׫×D- O€ Û~~äHžä'€Ùi€‹?  ”}âV^ßzå' âp0/@…ãù*Ýv;Ú•lâ¦Ý©Ýãw=f0à}´Ÿ”åv~çxžçz¾ç|ÞçžtMþÍÄS Dšÿ€ãо讎®g°ß-ð>ðoФ1žÖ4þ¿9}ã‹®à ÔCmCà/€ãg`çŽÞê®þê°ë²>ë³nç[¾Ùô«5àp‰ÎèÀ®è­é+>éBpé˜^©¾éþÛé;­è îËÛÍʬ]SC.µ½êYNëÞþíàëv~*ÎÞ/pNÀ0 }X‡dðîjè,þ6¡m:æ©<µ~æ÷æ?½ãlËzð;pr®ê'àêï¾ð ßðÿðñßêKîÎó¾P€šDÝñÿñ¿ðñžó^ïzïøªÖú^ã–Œæ9NÐ;ÎãÜÿ}×;âr€«ëßó>ÿóð>ìäŽýHЙµ^¼ô•Ðôd°åp0é>`ïȞ쓪òukæ6þìÿŒÝ:nЪ ËP9€óhàIzàè@ßönïð¯~iÐå/°@` Aùži”M_ OQOéT_õ ìùžõÔÎÞõ^ÿï`/ꯌYÐ9`ðœó:¯äš¿ùù}Û$ïå?@žÀЧX‚áçy>7 ª_ z€,0 P4ú Mjø0Ëìlàžír ðßÊ{ ”-pö-ì¬ØÊ¿üÌ_Øû û¡?ú¤ß§¯qoPa’¥ú“Àú®ÿû²?û Zû”ªé+ÿºÏõítm×°¼X: Ô-€ÁêKÅöÿ\°"@, X`žwMÔÈâÅF4NRsÏ E ôPÒ¤I)U¦lÐÒåK— dÎTPÓæÍštêгç A…R J”ÇQ¤II,%ÃéS¨c¤Žé1…ÈŽb`h1Àë× aÅŽ%[ÖìY´e[ÄÈaeH—N;åÚl9"¡?kÞ”‘xñÐ_À!qôRäÈ“‰W®„Ù¸åLš8%Ë•àó§PÌE&åÌ´)TÐS¥>úAJ HŽè°`!Çk ±eϦ]Ûöÿmܵ_ô8‚HMf„>Æ) Œ0äO™ŠNT™r&h1rDâ“‹Å3† Ù|ä›”-¯YóûΞ=‡-ÜŽ KˆD©’Ä¿ÿp@i0ð@$pA ,B\HAUD°ðB xAGx <ÚXã¹è¦;¤ºD®Ën»î¯¤ñblì¼ó&“‹=ËÜ{¯¨øä[о©ˆr"‰¬ãH$“DdI7ÜèàÉ'qrJ) ±’,³lrK.·Œ6öPä‘ ØÊHdp  AĈü¢Î:ì´ãλaŒQ¼i„ÌÆpôIÇ)èÑG ¥ÿ’¸"LòÑ%#µcRJ+µòÒB²Ô²KN¿ sÌ2×Ã,¨rÞ „/‹¦CQE;[4(Oöä³[05G†‹¢ƒ F(· ‹OL7ÖÛí˜%\ã¹W_ƒ6Ø£†ýß1å Wn´e—Ž9Úk¶¹I„Aå¶Û¢ì؆ Y:é.>ZcvÁ[šéA~šd©§>™X¬ÕºH®ëxùk°1%xl²qÖvçA{. JÆíƒsåN1ãugåønxsÝ[P{áSÊj}w´åÿžyqÆËV˜g´‹Šd‚\61ŠÅ¦;V ¹©d¨”}Ùˆ7ï^­œ;?ŒÈ3táшM£>¥šíRYoI¼æ[¶åÚWooÎ ˜÷`ߣIŸ3}ºcÚâ™F~ʼùì˘¥'ÌM­ºào„³W žx8ÈÆÆ[Ÿ\ÞËüsd˜• Þ4ì¹ZEò­@ŸYö©ÆB~â¹F^±]LÚDgÖÁ‡ÿ| Õ x¬E¸ß„+UøA¶i¶^¾·J| –VŸwŒárãå2™ŠS¡×âA¸Á¸›Œà|˜]ˆ¨c‰§¦Mfq©{\‡~ô™pÿåPjÕ‚’ºÂ®:ÉÛó^½æPoh›;ZÚ7¯l5¤KßJÅÞµ¦äeV3*^Ô®®º~ +'!+Ñv·¢ß]pbO»Súþ¹ç…©ÙûŽ«¾¼Ñåðb[_Ÿþ¨é èz™{aÙfØt F§>9;`Ïx¹ÜEðYŒã 7¸Ã.¯‹% M Ou¢5v.‘•gd7É-¶î‹±c¡î7ÊýnŽ·ºcؾ[Ưv¼ì[!÷ÆT¯•ÌC%k™É­uò`¡ìfïNùsFr³aÖVϯås{mzb Ë™ÌWô™—lèì"z»Š.±{i ßʨxºXžôÿ+ÝeíÎ8È‹N0V‹ühâÒù‰„^-`-=b÷ö%€oÛVÝþP¹2Íô7LÌiÇ÷Óó 56@|_YØIQu£Yâ#¯ØÃËF3ž]kTkšÑÅvtµ}meë†Ò³.õ¥O íµlÚ˜â>¶µA-él£Æù•ñ—omã\+U€]ÍmwûÙg[˜ßR^uœÇ éW3ÔÎ…Nw¾Ù|àTYá€n¸ a-êˆã{ͦ޷Åßìoµ|³f¶÷¨%òu‹üÛÒ7µåMnzs\åçòÄCÞæ‘ûãºÎl™±}î•|>úí9Ì/>í…Ó\ãå®wÑs®f¤ë[éÃ~÷Eãíƒéy'[êíavšìƒû×@ÿ÷{=ð_¼ìjDx˜ïú_¡GúæS—õÑ”ôŠ/äi7ùÚüU¨¾¬íN±á=ó®×üëx»¶I½s—c=ÚL—¹Óu›?<Ö†ÿ1Üizö~¾¶'Ç- O`±v;ñ«‰9ã7ïd|õªK;TT_v224_html_docs/images/glass/grey/menu_item_foot.gif000700 000765 000765 00000005303 11222361073 022627 0ustar00abwabw000000 000000 GIF89a´dÕÝÝÝ×××âââÏÏÏÍÍÍÆÆÆÊÊÊËËËÇÇǵµµÀÀÀÈÈÈÌÌ̽½½¿¿¿ÅÅż¼¼»»»ÃÃÃÂÂÂÉÉɾ¾¾ÄÄÄÁÁÁºººïïïèèè²²²çç縸¸¹¹¹···¶¶¶ÎÎγ³³¡¡¡£££ÔÔÔØØØÚÚÚÞÞÞÑÑÑÒÒÒàààÙÙÙÓÓÓÕÕÕÛÛÛßßßÖÖÖÐÐÐáááÜÜÜ!ù,´dÿÀÎax0È$eÉ\8ŸP'bJ-X¯ØlöÁíz-`°dL&OÎç‹Z­h»ßo‡|N¯Øí¼~Ïo@þ€‚ƒ„„ $ZW"’3•–—˜+š›0žŸ(¢£¥¥4¨©ª«/­®¯'±±,´µµ&¸¸»»1¾¿ÀÀ.ÃÄÅ%ÇÇ-ÊËÌ*ÎÏ)ÑÒ2ÔÕÖÖE «ª‘“˜ä—›œ é£¤¦ß隷ò/²³¶¶¹º¼Áý¿Å] KƬà3hÒ¢][X-Û6ÝàÑ7‰R¹rç4¥S·E;wYÍsUïÄ=|ùöñó×/ ± T‘P!Ã…¹yƒGqÜEÿrWlÕÑc»"GÒ«wòVÊ},[º6°DÌf3k¦¸‰S›N‰=%ýšqè§¢‘ªRÚªdSZùL¨Œl*U˜W•ͤY“뵜w¾ kq¬¥ f=¡=ª6[·oãÎ¥ûÏnÕ¼z³öõÛÐk`°âÄ>\61ŒÅ¦;V ¹©d¨”}Ùˆ7ï^­œ;?ŒÈ3táшM£>¥šíRYoY¼æ[¶åÚWooÎ ˜÷`ߣIŸ3}ºcÚâ™F~ʼùì˘¥'ÌM­ºào„³W žx8ÈÆÆ[Ÿ\ÞËüsd˜µ Þ4ì¹ZEòÍ@ŸYö©FC~â¹F^±]LÚDgÖÁ‡ÿ| Õ x¬E¸ß„+UøA¶i¶^¾·J| –VŸwŒárãå2™ŠS¡×âA¸Á¸›Œà|˜]ˆ¨c‰§¦Mfq©{\‡~ô™pÿåPjÕ‚’ºÂ®:ÉÛó^½æPoh›;ZÚ7¯l5¤KßJÅÞµ¦äeV3*^Ô®®º~ +'!+Ñv·¢ß]pbO»Súþ¹ç…©ÙûŽ«¾¼Ñåðb[_Ÿþ¨é èz™{aÙfØt F§>9;`Ïx¹ÜEðYŒã 7¸Ã.¯‹% M Ou¢5v.‘•gd7É-¶î‹±c¡î7ÊýnŽ·ºcؾ[Ưv¼ì[!÷ÆT¯•ÌC%k™É­uò`¡ìfïNùsFr³aÖVϯås{mzb Ë™ÌWô™—lèì"z»Š.±{i ßʨxºXžôÿ+ÝeíÎ8È‹N0V‹ühâÒù‰„^-`-=b÷ö%€oÛVÝþP¹2Íô7LÌiÇ÷Óó 56@|_YØIQu£Yâ#¯ØÃËF3ž]kTkšÑÅvtµ}meë†Ò³.õ¥O íµlÚ˜â>¶µA-él£Æù•ñ—omã\+U€]ÍmwûÙg[˜ßR^uœÇ éW3ÔÎ…Nw¾Ù|àTYá€n¸ a-êˆã{ͦ޷Åßìoµ|³f¶÷¨%òu‹üÛÒ7µåMnzs\åçòÄCÞæ‘ûãºÎl™±}î•|>úí9Ì/>í…Ó\ãå®wÑs®f¤ë[éÃ~÷Eãíàéy'[êíavšìƒû×@ÿ÷{=ð_¼ìjDx˜ïú_¡GúæSëVpt%½âK'yÚM¾vÕªpÁ úN=v›=ð?ozÆ]½ñ‡Ç%B·¼ÛíN±á=ó®×üëx»yY°€d*xÁ ÈNÖЯ&æ¤wºé¡nsËw\F'pX  d€&–Ïüæ;ÿùDˆ¾ô“`&,! Q ÂÁ}/x? b(ÆŸ†5\èÖ‡;ôð¿ á,bQ8@ V  ;TT_v224_html_docs/images/glass/grey/menu_item_head.gif000700 000765 000765 00000005230 11222361073 022560 0ustar00abwabw000000 000000 GIF89a´dÕ×××ÝÝÝâââÏÏÏÍÍÍÆÆÆËËËÊÊÊÇÇǵµµÌÌÌÈÈÈÀÀÀ¼¼¼¿¿¿ÅÅž¾¾ÉÉɽ½½ÃÃÃÄÄÄÁÁÁïïïèèè»»»çç纺º¡¡¡¹¹¹ÎÎη··²²²ÔÔÔØØØÚÚÚÞÞÞÒÒÒÑÑÑàààÙÙÙÓÓÓÕÕÕÛÛÛßßßÐÐÐÖÖÖáááÜÜÜ!ù,´dÿÀËE#2)ŽÈ¤rih:ŸÍƒt*©VجÁå¾à°øA.—+h4e½†¸ßo‹\ΨÛïx‡~Ïøÿ‚ „…†„ Z &',%+,/žŸ ¡'£¤,¦§¨¦$«¬®®0±²³´+¶·¸#ºº(½¾¾"ÁÁÄÄ.ÇÈÉÉ*ÌÍÎ!ÐÐ)ÓÔÕ%ר&ÚÛ-ÝÞßß ´#* (,¡ô ¤¥©ù¬­¯´ÿ³p \±‹×¯_† ¬!2gUD“V­"¶lÛ´ÛèM9sèþ¡XpBÅ yóêÕ»7*Ÿ¾}$úùp`®‚&\ÈÐaÃÿˆÏ&V´x±DF7z,wŽfq'Pª\ÉÒe*˜1ûѬiÓVÁ9í\èó'PfC µVô¨‰¤JÇ1 ùo„(SNµWÕê)¬2·þëêgX Eð,«ì,Z¡k§5z.¸¥ ·"À+u/ß{~ÿ ,8 ᯇ-Æx™ã´‘%·­l¹£ÜÌ47çõü_hÀZKË"LÐpØÄ‹[s,räÉnkÛþØ47gy¼?±<ZÕèàÂaG}9Yå.˜ÃŽ ¶tÌÕêîœ}{wÀ_…5ÞxN󬡧žskµ—‘tÝÀG×?óa—Ý öu—,ûõ·Kj#àkeÿ 7*¨ÙuzñáoßéWáiþ”aOÊ Ml)|ˆÔ{·ÅÇ ‰BØŠûž…·š†1r8#{³bŽ ÒÒ`‰žèׄ3 Éâ…å ck2Rô\“ âH]”³LÙ£•Va¹Ÿx[ùŸ—襧¤˜’ycm"Z·ÛƒlºäæŠ]‘g¤0É%yÖzc^Ý“gŽøg}?^™"…ZÚ¢Nˆž§(PŒæé¨{|B))}&VÚæ¥Y G$X]và§…ꡞoA:שR š„¬¾ù*†tn¸h‡Dꤙ»ú‰j•ª ,¡6:§¬H‚y§ZL*[f©‘:Ûkª¿ÉŠ™V»ÿ©XØ~ÉX˜Ü6ŠÑ²à6+€FûRà¹'¬‡*4«¶Ç.)ï52‹Û½“’뛥ü¢ë¯¦\¬˜§ƒŠ,[ÞîiYŸ ?»W ûž‹éÄêV|­ÀÙ¾»-6檰ŽRâëëëF|riÃÆÊ²»eÁ 3®¶òŽ C[.Ä&·Êó¿Ä¶[§ÐÝÎûíǦŠKåÈú^5mºYëb±´Bdk²V{ ×Ñ5'ÍõÒ97-,Ô>_<°ËãykÇ2×»0Ò"OE²×:;-XÏ'šq­SsÑl§i³Ã-[øÜË9¶ÔÆjl°¨i÷u¸!«4ÎÒ^NmØëöòâÔ/W0©£Û ÿ¸éo£^ò*B¢ÌºÊ›ÿ {Þñ‚>;½µÿÝvà* ŽÊ ` $6§ÂwÎøç{‡yÖ¥o-x×Ïí»ô­«ÆyÙAaöñW¯ÍýíÞ7¾hªGðÔÛÝrбLòî#üÖ4?ïÔo|÷Ó\þ‡7Ïém}ÿk_R"' 5å n©“Ûêȇ?vU}Í8Ç´§+åIÎmßÃàî²"±§e`+ÓÐ|B5ÿ%Ìo4;!ó¨¢BÂiÐ~·˜že8</{ìSÛß·<Ü¥Pw>ä]¿\˜2‘ü#ÞÐø¶=61~<„bøHÅßYÑud[œÙ'.–0‡œÜé*g.)¶ÿðptKÆx½Ž0‰¢  í¾HÀŽñ‡ bù^g½5ªïT"G( ÞŒŽL³ãÎðøÂ¨}Péó£ãˆöF4Å…ò3$ýYFžÑ|Ÿä£#EÙFÎÌ”•”cî07Mn+ˆ‹!iØ?ãE2Kô¢˜J1®Ò—˜«" ƒGÄF†òˆ¼aòà˜KT†‘—„æ8Íî1‹FÜ¢-qˆKX’rܱ+9)MOV„yä(ÝxK^‘Î{& 7 Ì< óœÄÔ¢ìŽÙÅA.óŸ¢( ~Ä×JrÚs˜©¡1µ)Hžr‡•(ôY˜¢ñ|  !kDÊ~j­ÿÎ4à< ÚɺaÔ, µ!í:ÊMwêò‰à\aï*ªH“Âòž)Í'-YÊOvú¦Aâ@I“`Ró¦)&Zʧ^0¦%#=ÍXÎ+"4£ZÍæN“éÐ2ó›ñ¬ãT£IÖ‹ž§é\(GÙêÑn‚4¢ª”©8XÒW2ŸÍÑg-ÙоúÔ›! lXgZUƒ^õ®YÍéF×:I&>ªqÍä\ÇYTæQ–×T'c»úÒ¯Fõƒ%iqŒzؤ&v©cm÷@{Ÿ‘µ°e=i,ÑÙGlBr¯U¦[!Ú›× t¨cuepŠU×hv«È‹rýúÖȂշѵ¨M1kݼê€|íÿé;çÚ^Ž–°³5-JQ«RÅ2uÛlçzwÙÞp¾W¶B.Ré«Tãî¿<ÕïO›é\Áþ÷·ñnm |[/–«.Ý­kû+Ô)†·´>-qgiáû®6ÃÜpo)úaàÚõn#N­^9«Ý¶r—¹Ú)‹iZÏñÂ8¡æÝ,z“kãÇþµ¹–*ty\WïÈÅU-†ÚÚK&¶nq„_üd´^W­C®±c÷ Ô+?×ÃL–.—gèå c—Æ—ñìry+ÏØB8ÀÔ%ïCÒz\8‡CÎ7¦³\—\ÙšêñÇmŽòŒÃçí¹»€ýîŽ ÝãCw¯Š>¯‰<æÃuÅbM³xÿ-ÍfL“XÊÙmt‘ÉÌ`3;˜Ð\1ôAmjkZ’bV¯§½ÛàÉÚYËxžpŒë‹Û–RYÃV5ec]éY_:³nó¦s­`ÈFº×à5ˆ×\ÄL yڪ‘¬ì_kÛÅN.5´½ýfFÿÙѬþt³|î-§»Û§^4¸ß½ê]_ÛÕ¾¦7¥›Lj|ÛúÛ¸·®ÇcÉf{àj¾·5‰]âÜ¢˜*ž7¬cYsÒzÝù¾529½ð#7\Ò¡†ø¨­îò²[Ú ç·¸M¾Í*ß¶Ä+ŸøØ)N¶ÆqÎl‚³ÜàGµŸ§Óo†×\Ç)/zÄ >ñ+ÝÝLŸ9¤É=µô;Ö;Ø"†rÈ>rj{Uèƒ&:Çe}Ù»|ìíÞwÖK¾õ“c{ÒR_yÛŸýöƒÇ=æs¯6Í}äp¼¯½Ù{oùž¿Üg¬'ÐÆñÓ õÃ=ñH·º¾ÿxxû›ëi÷zÎÑMuž¯Ôâ@Ç8ÚE»ñZtܬn_|´/÷Î7}ð6xëMÃvó]ö/§=çùxóàÏ»ÎKoÛž_8Õ2§»ä òe[~êG¯z…¯^{âÃ;;TT_v224_html_docs/images/glass/grey/menu_warm_body.gif000700 000765 000765 00000004357 11222361073 022635 0ustar00abwabw000000 000000 GIF89a´dÕßßßÍÍÍÎÎÎÇÇÇÝÝÝÞÞÞÜÜÜÙÙÙÐÐÐÏÏÏÓÓÓÌÌÌÉÉÉÒÒÒÊÊÊÑÑÑËËËÔÔÔÆÆÆÈÈÈÃÃø¸¸¹¹¹³³³ìììæææåååâââéééêêêáááàààäääçççãããëëëèèè!ù,´dÿÀJdQȤ²Ál:™¨tú@X¯ØlbËíz¿\xL˜ÏhôbÍn»!ð¸ÜA¯Û錼~¿ŸLYX‰#ŒŽ’“”’—˜™$œžŸ!¡¢£¤¦§§ª«¬ ®¯°°"³´µ¶¸¹º¼½¾¼ÁÂÃßžˆŠÒÓ•ÕšØÍÚœ¤Ý£¨à¬â±å¯¶èµºë¿îÄñÂÆÈÊÌÛÏŠ‹ÓüÖ•Ø4mÓæ­ 8TãZ™+—®!»]ï|É“G/Ù²ù¢õë÷RÀL›ôv0UBU 6D÷0WD‰‰U´‡Z¢;Zúx)$¨ÿ‘¥Jf8‰2¥¬•·Z¶{ ,f±cïiËx'5×xnòÙ hÐ’DÉ=‡TR¦M›yŸÍ}V#aÕº•+ ¯ß„†K¶ì,¥K™ª•¦[}q¥aÍÊÓ.7¼¡„%Êו_Z€ÑÂü­ÔfTá&ö7W«ã»CHÞ[ùòß³h9w.ÜvêÛÑÓ=Zµ^Ê­]gŽÍÙsMĸIëÜí¸÷jà|]‹.¸8íÏŸB'WÞ‘¹]ç¿OV!úKÙÆkÜ®ÛtóÔÏÅ¿l>"úëÇ×'oßø=äø WlÕ –žmȱWZßÁ^€óùUß;÷ÕSh·m7ñæÿ XÐ5`KšUU~U)¸œ{ þ÷à8 GàyÖYˆ3ªØ‹\¢|ÑÉH"qâ§^Šû-Ø¡xc„eM莉†!¨nä¡‹?B$}3ÚWã‰GІ¥’Z2é•“âÄæªu † &¹"ƒ=~xk_J&…cVIç•£e™š@±©PŸQþ9e f—£;âé“{†hÔˆ•éh§¡¡!:’¢«¸é'œ4i#ŠfŠæ¡-6ùb›P"%å/TFŠcgÞ¹d­kÞº¨ˆBvJ¤œFZ‰d°•›'—™‰ì›ÊÆéÔœ’+«°i›¨±©æºÒ®0¹Jÿ¦³±&F*H¦DnQŒêê(¯ŸÂªá†³–*î©óŠUï¹÷¦Ëì«eîû.&[ÚÚå“;Tp/½‚ʉ¨:þãÝ´Wë嵫fÛêÁëúì·Ñ†Ëq±ãq:èRœo£ö ï¿ò¶|ì¦É²ã©º‚vK¨»63/I«Ú(«bík¨“B«1—êަ)qêó²Û6kr»q-ÜÓÑÝ J/ÈK‹Ü4ÉAÿ:tØE3Ò:—û2K§ÅöÓGòÔ–†„éÕÖòŒíÖÚÆÄ­Û' .­+[÷Ù†‡ŒøÈ]#Ì®Âq×9À“ Œ¶½Lê´Å$`L)àÒVM-áWžöåkg^ÿ²ÐÃý¸¿Ÿçì1Ä£\ú£§ë[óî7÷N÷ï./ñðøOsÆÖlìzǰ/;éj›¾7êªK]=Õ‚[Ö i½ÎÏßO}5Ö—ÿúù…gÝóú\+î5î`[%¶ç×cóvf¿Ãá/qYԼ帔A.€’ Ýœ³¼mFz›;žyAÐIr´Ü1§?Í}sÈ3ÚÜÊ–4s=¯{ÄkßôV7¾À dpô‹]g7ÂÚ•ðvŒëNþ×0f¯yÛ £'à ¾ 仡ùLR¿ôÝ"¤Èþ‚ˆÂ &¯ƒ¾;"­h@,’0[\àÛü×¹"FPŒLâ iç=ÛµÿM¹cc å¦<†NiÜ£c íÈ·Ôù­¬S—G’Q„fô!MÈ¿.&òòÃ^µ·Ã@ö°Ž?¼cߨ;/ª°_ù èäXAèŒà;d)/ÉÁLq“Hì¤ÉDXº†ð‹â6pHE>’‡‘å$ˆG!n„ˆdKe#W©Ë9~r¡,døþVÃÖÙò¸£9Ô—Ll.S”†$¥MÉÇEúQ•€Üå5{™ÍXªsˆmŒf^þèÂV.ñ•õü¥ø‚iÃaNÑ|¢ Þ\)3 žPƒ´üâ7=8ÍxZ³œô<§6e¹ÎˆžÒÒ g«éO^T£ö\#>÷À‰†Q¤ÿŽç]’?” ”›õ¦çWLNÓ“=©)ÉEˆvS‘.e$L©ùSyµ¡M|è="L‚t2U”iišÅx(p”*}f>WҞ沩åê‡ÊL°æq¥ìléN5iVqªd«¸`Ÿ/g8P(Ôª·³ÑýìBÿ ÕÑJµ´Tý«H®šPVîפý%/iûàÓV½ªõinºÛŒ*·¼Ì=ocÓûØõ®¶½~ïaãÛÖìþv»mgRßYÑ~˜² ¶)†gY_‰Þw¸–0ˆÓ*â×’8±…kŠåÊaèæø¬æq`à{]ùb–¾ÍÝðƒ;a$ï´®l“K¬XGÙ¾EÆï‘í rf9Æ^°yŒÞ)¹Êd> ^—<â-Y¶(®ñGW\Ö1G6ÉXî1o[íòšdÝ'<]^þŽWÆjÎ0›¥<àÔ˜¤/í£ZI£~ÙÆaÆ1œ ÿ|åLŸùÑiM;TT_v224_html_docs/images/glass/grey/menu_warm_foot.gif000700 000765 000765 00000004543 11222361073 022644 0ustar00abwabw000000 000000 GIF89a´dÕßßßÎÎÎÍÍÍÇÇÇÙÙÙÝÝÝÜÜÜÞÞÞÌÌÌÐÐÐÏÏÏËËËÓÓÓÉÉÉÊÊÊÆÆÆÈÈÈÀÀÀÒÒÒÑÑѼ¼¼¿¿¿ÂÂÂÅÅŽ½½ÃÃþ¾¾ÄÄÄÁÁÁÔÔÔïïﺺº¹¹¹»»»µµµ²²²¸¸¸ÕÕÕ³³³¡¡¡ØØØ···ÖÖÖìììæææâââåååéééáááêêêäääàààãããçççëëëèèè!ù,´dÿ@RgØaȤRÂl:™“¨t:IX¯Ø¬bËíz¿Ü€xL˜Ïh4bÍn»ð¸ÜA¯Ûé¼~¿‡@ YX&+‰+6ŒŽ1’“”’/—˜™/7œžŸ5¡¢£¤,¦§§.ª«¬2®¯°°4³´µ¶-¸¹º0¼½¾¼3ÁÂÃßžˆŠÒÓ•Õ1šØÍÚœ¤Ý£¨à¬â.±å¯¶èµºë-¿î0ÄñÂÆÈÊÌÛÏŠ‹ÓüÖ•Ø4mÓæ­ 8TãZ™+—®!»]ï|É“G/Ù²ù¢õë÷RÀL›ôv0UBU 6D÷0WD‰‰U´‡Z¢;Zúx)$¨ÿ‘¥J²8‰2¥¬•·Z¶{ ,f±cïiËx'5×xnòÙ hÐ’DÉ=‡TR¦M›yŸÍ}V#aÕº•ë ¯ß„†K¶ì,¥K™ª•¦[}q¥aÍÊÓ.7¼¡„%Êו_Z€ÑÂ<ƒ­ÔfTá&ö7W«ã»kHÞ[ùòß³h9w.ÜvêÛÑÓ=Zµ^Ê­]gŽÍÙsMĸIëÜí¸÷jà|]Ó.¸8íÏŸB'WÞ‘¹]ç¿OV–!úKÙÆkÜ®ÛtóÔÏÅ¿l>"úëÇ×'oßø=äø WlÕ –žmȱWZßÁ^€óùUß;÷ÕSh·mgñæÿ XÐ5`KšUU~U)¸œ{ þ÷à8 GàyÖYˆ3ªØ‹\¢|ÑÉH"qâ§^Šû-Ø¡xc„eM莉†!¨nä¡‹?B$}3ÚWã‰GІ¥’Z2é•“âÄæªu † &¹"ƒ=~xk_J&…cVIç•£e™š@±©PŸQþ9e f—£;âé“{†hÔˆ•éh§¡¡!:’¢«¸é'œ4i#ŠfŠæ¡-6ùb›P"%å/TFŠcgÞ¹d­kÞº¨ˆBvJ¤œFZ‰d°•›'—™‰ì›ÊÆéÔœ’+«°i›¨±©æºÒ®0¹Jÿ¦³±&F*H¦DnQŒêê(¯ŸÂªá†³–*î©óŠUï¹÷¦Ëì«eîû.&[ÚÚå“;Tp/½‚ʉ¨:þãÝ´Wë嵫fÛêÁëúì·Ñ†Ëq±ãq:èRœo£ö ï¿ò¶|ì¦É²ã©º‚vK¨»63/I«Ú(«bík¨“B«1—êަ)qêó²Û6kr»q-ÜÓÑÝ J/ÈK‹Ü4ÉAÿ:tØE3Ò:—û2K§ÅöÓGòÔ–†„éÕÖòŒíÖÚÆÄ­Û' .­+[÷Ù†‡ŒøÈ]#Ì®Âq×9À“ Œ¶½Lê´Å7`L)àÒVM-áWžöåkg^ÿ²ÐÃý¸¿Ÿçì1Ä£\ú£§ë[óî7÷N÷ï./ñðøOsÆÖlìzǰ/;éj›¾7êªK]=Õ‚[Ö i½ÎÏßO}5Ö—ÿúù…gÝóú\+î5î`[%¶ç×cóvf¿Ãá/qYԼ帔A.€’ Ýœ³¼mFz›;žyAÐIr´Ü1§?Í}sÈ3ÚÜÊ–4s=¯{ÄkßôV7¾À dpô‹]g7ÂÚ•ðvŒëNþ×0f¯yÛ £'à ¾ 仡ùLR¿ôÝ"¤Èþ‚ˆÂ &¯ƒ¾;"­h@,’0[\àÛü×¹"FPŒLâ iç=ÛµÿM¹cc å¦<†NiÜ£c íÈ·Ôù­¬S—G’Q„fô!MÈ¿.&òòÃ^µ·Ã@ö°Ž?¼cߨ;/ª°_ù èäXAèŒà;d)/ÉÁLq“Hì¤ÉDXº†ð‹â6pHE>’‡‘å$ˆG!n„ˆdKe#W©Ë9~r¡,døþVÃÖÙò¸£9Ô—Ll.S”†$¥MÉÇEúQ•€Üå5{™ÍXªsˆmŒf^þèÂV.ñ•õü¥ø‚iÃaNÑ|¢ Þ\)3 žPƒ´üâ7=8ÍxZ³œô<§6e¹ÎˆžÒÒ g«éO^T£ö\#>÷À‰†Q¤ÿŽç]’?” ”›õ¦çWLNÓ“=©)ÉEˆvS‘.e$L©ùSyµ¡M|è="L‚t2U”iišÅx(p”*}f>WҞ沩åê‡ÊL°æq¥ìléN5iVqªd«¸`Ÿ/g8P(Ôª·³ÑýìBÿ ÕÑJµ´Tý«H®šPVîפý%/iûàÓV½ªõinºÛŒ*·¼Ì=ocÓûØõ®¶½~ïaãÛÖìþv»mgRßYÑ~˜² ¶)†gY_‰Þw¸–0ˆÓ*â×’8±…kŠåÊaèæø¬æq`à{]ùb–¾ÍÝðƒ;a$ï´®l“K¬XGÙ¾EÆï‘í rf9ÆžŠb ]~@“¬û„§‹ÃËßñÊX$ ( Ú|ÚÂÙ¶ßU(lç4 ¨ØœY7•qn1xÍ"Þ Fµ,@À <Ð PÖ0˜€§lä*“ù(x]òˆ·4 ¸ð¤@#8±0p";TT_v224_html_docs/images/glass/grey/menu_warm_head.gif000700 000765 000765 00000004435 11222361073 022576 0ustar00abwabw000000 000000 GIF89a´dÕßßßÇÇÇÙÙÙÝÝÝÞÞÞÎÎÎÜÜÜÍÍÍÌÌÌÆÆÆÈÈÈÀÀÀËË˼¼¼¿¿¿ÂÂÂÅÅÅÉÉÉÊÊʽ½½¾¾¾ÃÃÃÁÁÁÄÄÄïïïÏÏÏ»»»ÑÑѺºº···µµµ²²²ÐÐÐÒÒÒØØØÕÕÕÖÖÖ¡¡¡¹¹¹ìììæææâââåååéééáááêêêäääàààãããçççëëëèèè!ù,´dÿ@ &&Ú ŽÈ¤rÉh:ŸM‰t©Vج6Àå&¾à°B.—/hte½~¸ßo‹\¾¨Ûïx‡~ϧøÿ‚ „…†„&%Z /33$0+2žŸ ¡¢-¤¥¦¤+©ª«+—®¯°31³´µ¶(¸¹¹*¼½¾.ÀÁÂÂ0ÅÆÇÈ)ÊËÌ,ÎÏÐÎ/ÓÔÕÕ°* ²!-''¢éê§ì-¬ï±ñ—¶ôµº÷¾ù*ÃüÁÈÿǘ L­ k©aÓÆÍ[,^Œpqº‹ŸÚzÇJ^¼z ïéÒ÷«?€(63-aÂ…ÛºÉ!ƒ¹ssj4Åq•ÇÿX ë‰ÜE’—É“(ÿ©\Ʋ¥Kk0ÊCá@E‹9×íDÕ3ÕOXAé ÅUÔèQbI“-%ØTÚÓkÙb:ŒÀjŬ·ríúõUØ[cËî;ë/mÀµmݾU¦¼ºWñjÝÚÕkßyiE!˜paÃÅÖ²m»Xa\©í┋eã–þùò*OÞqå#r½Ós^}ò»n5ìI?¯Øð?/Žõ°Y/èþ¦?z±¥·~ÔC“½ùeCÖî׳üIOYüëœüƒ½£ ðlêëÁ‡À·I-nÓØë´Ç2î¹Ì{0sÐ6—ÀñajÜï(¼Ã].q"t_Và÷8jð|ŒgB®íÍk$´`ÿN8¶2ïÎ# ÖzX»ÓÝîk¹«•gÄì­p{-´œK0÷CͽO|ñóßü:ûÉì; Û¢¶)–ï†Ì¡wˆF&ÿï‰Ad#Üv'7¢øÎ$vËb÷^ø=ÅíOˆ #«è@9ðŒL#×x¼Õy¤upT! ·-¾†™áKF7þ/“Gt$•½ ²‚z¼ 3Ø» ^±ƒ‚ü !CJêŒ5,"*­¸Ivr[eE9C`znŒŒ,ã#éI;ê–•ÔÝ%yçG[‹ÇÔe2 ÃCÆrˆ³´a-qxKæ’‡»ô¡í€8JDš0Â\gÛ9ÇwÖ1žM,î²)E|Rq˜äç4ýYM€Þ‘žÍ$e0ªOMö#á„ç8y¹L_b„†Ï\$B¥¹JH.ѡפ$;gJhŽ´~ÿ Íè?7*O'Bô— ©=è×<µ°r}ÖTcêÚFƒ¾±¢©ThI©yRšõ÷6¿E§¦Çºá²æºÕ’–2¥;TT_v224_html_docs/images/glass/grey/osi.gif000700 000765 000765 00000005033 11222361073 020410 0ustar00abwabw000000 000000 GIF89aF2÷ºººççç2…Aåéæììì‚‚‚ÞÞÞ‹¥ZZZMMMVVVB°V222(l5•­šIqQ³¡………©¼­CmKyyy­­­´´´)Y2@«T‰£Ž^dïðï5b>DDD555nnnÚÚÚÕÕÕ!Y,~~~¶Æ¹ÝâÞêìëfff"\-ÄÑÇààà8•IÂÂÂÏØÐHHH5Eçêè$$$ U*1?@«S²²²!!!»È½ŠŠŠ===§ºªQQQmr6‘GÜÜÜ^^^:fB)))ÎÎÎ%d1ÆÆÆ@@@:™Jb…i ?¨RV{]-x;€œ†:::|™‚,u:'h3RRR¢¶¥ccc3ˆB©©©èëé*p7@¨R;M™™™¯À²³Ã¶$a0S)ÑÑÑ,]5=¢O‘‘‘ÌÌÌÊÊÊÄÄÄqqqˆˆˆëïëqw¨•*r8ÙáÛGpO*^4ËÖÍÉÔ˽ÊÀ```¥¥¥sss:›L®¿±>kG!X+>¦Q>¥Qïñððòñ=£P<žM888ÔÝÖ+t9/}>NuVLtTw•}nŽt¥¸¨$a/SzZ3‰C1‚@j‹q-[6#V,.]8'X1&W/õõõïïïúúúóóóîîîB¯UA¬TB®UA­UB¯VA­TiiiA®UèèèëëëÖÖÖhhh?§R×××ÙÙÙ---åå寯¯žžžãããØØØÓÓÓ®®®B­Uêêêãçäääätttââ⪪ªÒÒÒóõóééé§§§íîí¦¹©ÒÜÔwwwÑÚÓéíê¾¾¾0>‘©–„Ÿ‰ãè䑪–3`;7“H%X/NwV.`7÷ø÷˜¯œgˆlûüû4ŠC´Ä·›„*[3x—~ÈÒÊõ÷õîïîh‰nâèã#_/¡¡¡“ª—[€bØßÙA®V¤¸§—¯œ¹Ç»áæâòóò@jIêëêz—€r’xt’yt”zkkk.{<°Â³ÇÒÉöööøøøíííýýýñññüüüùùùôôô÷÷÷òòòûûûððð@ªS!ù,F2ÿí H° AƒÐæ¸Y§2D-ŠgÚÁ‹3jÄ8@…G¦@¢–C[¼Mr4ׯ—ñÉœI³¦M™ÚÊUòvH Z :}úЧ>@ ñIWâ¦Ó§P£Î †h$?¡>ÙøÇµ+× ŸH z"¦ ©hÓÚŒ€á Nž¼Ê• j‹#DT¨uÚ¯¯ß¿€ ¨¹ˆåvJõÆR‰À#KžÜœ˜G¡2$ÞÜUT†)׿PMÚ/kBmåÌÚS†-Ø”žY …B¤V³nêÈÚÀÿJñHÔîãÿ:±&x?MУKŸ®)˜¥G vgØ®{3©BxQÿO¾¼t)GšhÞL«Ó¿T©lÀå *ÏŒxæÉçÛÏ¿¿ÿnË`Êf6€¢F*©¤çÈ‘¢ryR%L:)2VbùO($¢§¨¦ªj¥—"¦)§ªîÿꕈ‘jj¬¸ªÊ§ŸˆÚÈ1±nPÈŸs)êÈ<¹&;éež)pê0—Ä™Ò(é<Üvëí·K69—(‚ŒÎ·ÜbÂM¨þã€5èÆ+ï¼ÜÎXãµÔÌp :Þ& yéj‘ŒÐ/&'¬ðÂhÈá\b‘Bà ¬Ç3G° 'bÀp8 ‡,òÈ!'ÓAj2@Í%. ‚d·™([,A2Éúä¬óÎ<ë³Nzë!Êè|Î28K—}zôìôÓPïìY.9;·Á.ÄBÀAÔ`‡ópe`êU't`ËÎæÌ ±g3#Æb× õqlJÐYÚÿ@…è´zÍn»ßð¸|N¯Ûïø¼~χc" B ‰Š‹ŒŽ‘’“”•–—˜™š›œa! «¬­®¯°±²³´µ¶·¸¹º»¼½¾¿± !¤)¥! ÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãÏ Å)È  õö÷øùúûüýþÿ H° ÁƒÖcð‚‚uâ©S2ØÈ±£Ç CŠI²¤É“(Sª\ɲ¥Ë• ƒ˜b¢ÍŠ„ØÉ³§ÏÿŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§;q @ æDXE8¢+U`ÊK¶¬Ù³hÓª]˶­Û·pãÊ+—j×v²Š(QBïÄ\ï L¸°áÈ+^̸±ãÇ#KžL¹+à«YùØ€¯g¾zC‹Mº´éÓ¨S«^ͺµë×°cËÖûÙ3çÛ¸këÞÍ»·ïßÀƒ N¼¸ñãÈ“+Ž›3‰çУKŸN½ºõëØ³kßν»÷ïàËþ„ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€ÚgÂ&¨à‚ 6èàƒF(á„Vhá…f¨á†vèRᇠ†(âˆ$–xá(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<êˆÂ@)äDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\vùd;TT_v224_html_docs/images/glass/grey/right.gif000700 000765 000765 00000000136 11222361073 020732 0ustar00abwabw000000 000000 GIF89a ¢ÇÇǪªª´´´Â¼¼¼ÊÊÊfffÌÌÌ!ù, #h!4P'Ê)sêcÛÛZ‡”ø‘Õâe(§Ž­{­É¢v|$;TT_v224_html_docs/images/glass/grey/show_menu.gif000700 000765 000765 00000000714 11222361073 021623 0ustar00abwabw000000 000000 GIF89a(ÕÙÙÙåååÉÉÉÊÊÊËËËÚÚÚòòò×××ÔÔÔÞÞÞáááèèèÑÑÑÓÓÓØØØÛÛÛìììçççÏÏÏíííêêêÍÍÍÈÈÈøøøõõõúúúùùùÆÆÆöööÇÇÇ÷÷÷ÌÌÌûûû!ù,(é@pH,ȤrÉl:ŸÐ¨rP\’v+x$/ ÄB˜)W,I¤Ì.Ððx¡ÍŽHÐú'Ž˜Ðÿ€lq‰Œ‰”Œ‘•‘‹›‰“›–‰§Ÿ¡§Ÿ²Ÿ§Œ†®§£¥¶—ª¬žÄÇÈÄÈÏÇÌÐÌÏ Úàáá ÏÙéÆéïéÖÈðïÇð ìÁ“g­žÀt0pw°¡Ã‡#J„È¡¢Å‹3jÜȱ£Ç1ˆI²¤É“(I;TT_v224_html_docs/images/glass/grey/show_menu_roll.gif000700 000765 000765 00000000714 11222361073 022653 0ustar00abwabw000000 000000 GIF89a(ÕŸŸŸ¹¹¹———   ÒÒÒºººììì···®®®ÓÓÓ¸¸¸ÅÅÅ£££¢¢¢«««¡¡¡ÖÖÖááášššžžžÛÛÛóóóÇÇÇÕÕÕ­­­¯¯¯›››ààà”””–––øøøõõõùùùúúúööö•••÷÷÷ûûû!ù,(éÀ’pH,ȤrÉl:ŸÐ¨‚±ˆ’v+($E D*?:Æ¥Ì.Ððx Í¾0Ð: ž‰Ðÿ€lq! ‰#Œ‰ ”Œ‘•#$‘ ›#‰“¢#— ¢ž‘¡¨ŸµŸ¨#µ²• ¦¹ª ®žÈ‹•È ¹ Í™›"Í”×ÝÞÞ”Ö$æ æíæéñòîí éî õÜÁ“—Ž^@s8`w°¡Ã‡#J„(¢¢Å‹3jÜȱ£Ç?ˆI²¤É“(I;TT_v224_html_docs/images/glass/grey/tab_cold.gif000700 000765 000765 00000002525 11222361073 021370 0ustar00abwabw000000 000000 GIF89a (æÀÀÀ×××ŽŽŽhhhddd```ggg///XXXkkk@@@fffiiiTTTlllaaaeee^^^WWW[[[cccUUUYYY222GGGéééïïïZZZêêêyyy???111ðððmmmÐÐÐÒÒÒbbb444RRRÑÑÑKKK888¾¾¾œœœÓÓÓ___îîî666···¤¤¤JJJ777...ÅÅÅÂÂÂAAAÙÙÙ‡‡‡¯¯¯>>>›››»»»OOO¸¸¸999¼¼¼µµµSSS½½½”””\\\ËËËëëë333QQQ«««¥¥¥:::{{{æææ<<<000èèèBBBªªªÍÍͧ§§ÊÊÊNNN;;;MMMÇÇÇÔÔÔÎÎÎÛÛÛäääÜÜÜjjjàààÞÞÞÝÝÝâââáááßßßòòòóóóñññ!ù, (ÿ€ ‚ b…†‡ˆ‰Š‹ŒŽ‘’“†ƒ–——† › žŸ ¡¢£¤¥¦§¨©ª«ªœ ‡˜™b›ž¶·¸¹º»¼½¾¿º Âà ÀÆÇ¸Ä¼Ÿ›…ƒÑÒ‚³¶ ÛÜÝÞßàáâãäåæçèåÙÅ΂Ñ!!Ñ‚ÖÚ$ûýþÿ H° Áƒ*,¸o ع{¯Þ,D˜°Á‚ CŠI²¤É“(SJP¡Ë—/+¬LI“æÊ–0cÊéqÄ# P`÷NL‚ibPˆEK‰P£JJµªÕ«X³NUÀµ«WZÊýJ6ê‡ %RðÀ`bC„DÿR°`‚‚H˜ÙË·¯ß¿€ L¸°áÈ)“C„ŠR`Øà‚‚¢ P©’¸³çÏ C‹.,bE,¿ëDÀE‡3£cËžM[´ˆ' &`‡íŠg‚ N¼¸ñãÈ“+_μ¹óçÍ{x°ð`ÛR'd kßν»÷ïÊ›xнo‚ðèÓ«_ÿ½Eî|C¿¾ýûøóëßÏ¿¿ÿÿ(à€c„€T0 6èàƒFˆ 4l! ¡á†vèᇠ†(âˆ$–hâ‰(¦¨aQ,ñC†*Æ(ãŒ4Öh#ˆ-x0Œ7öèã@ÆX† 8\@Æ‘H&©äÿ’L6éä“PF)å”TVie’7À Å•\véå—`† ¥5”aæ™h¦©æšl¶éæ›pÆ)çœtÖ™æ Ø©çž|öéçŸo²pE„j衈&ªè¢Œ6êè£F*é¤‡Ž Ä˜fªé¦œvêé§ †*ꨤ–jê©›žàC¬¶êê«°Æ*무Öjë­¸æªë®¯ZDÀ+ì°Äkì±È&«ì²Ì6ëì³Ãb1„ÔVkíµØf«í¶Üvëí·à†+î¸×Ú°覫îºì¶ëî»ðÆ+ï¼ôÖkï½ëªÀüöëï¿,ðÀlðÁ'¬ðÂÿÆ ƒG,ñÄWlñ²Åg¬ñÆwìñÇëÐ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ'ƒÀÍ8ç¬óÎ<÷ܲÍ>-ôÐDólsH'­ôÒL7íôÓPG-õÔTWmõÕKkÖ\wíõ×`‡µÖb—möÙhƒ­õl·íöÛpÇ-÷Üt×m÷Ýxç­÷Þo¿0߀.øà„^÷ ®øâŒ7N¸I@Æä”Wnùå˜g®ùæœwîùç ‡.úå;TT_v224_html_docs/images/glass/grey/tab_pre.gif000700 000765 000765 00000000755 11222361073 021240 0ustar00abwabw000000 000000 GIF89a (ÕrrrÔÔÔuuuvvvÚÚÚ×××hhhxxxggg222ÖÖÖjjjÒÒÒÃÃÃ333]]]ÑÑÑ444iii```aaaTTTÓÓÓ___^^^ÄÄÄcccfff111RRRMMMPPPÏÏÏbbbLLLYYYeeeÐÐÐCCC:::JJJÎÎÎ000dddSSS$$$\\\zzzwwwqqqÕÕÕÅÅÅØØØyyyssstttoooÙÙÙpppmmmnnnlllkkk!ù, (ÿ@ŸpH,{È$R¸k:—>çÓ·ð®×]jÀf{ ÃGÆñ´á•n­3÷$¤ »½ó4¢˜>†«('‚1:<>6‹1†‹6†.7š6|‡ ¡78= ¢¤¦Ÿ­6:; 0¶7Ž´½0¤ ‰5İ>Ä5ÆÈÊ/Ñ507:=Ñ/ÓÕ×ÙÒÔ:>!ÌÎ8¶0¸<»š7œ8ž lfv#*þ,>x@a¢EŽƒi(Á ‡ 0Ìð" d@˜ƒ†B† 8^\¡Ç“”,ÀRÁÂJ4ASF˜ @4¸yÓ Rd˜A´¨Ñ ;TT_v224_html_docs/images/glass/grey/tab_roll.gif000700 000765 000765 00000002434 11222361073 021416 0ustar00abwabw000000 000000 GIF89a (æhhhddd```ggg///XXXkkkAAAfffiiiTTTlllaaaeee^^^WWW[[[cccUUUYYY222ïïïZZZGGGââ⣣£???ÝÝÝ111õõõöööôôô@@@bbbìììKKK~~~mmm888åååàààÈÈÈ___444ššš××׺ººQQQ………NNN777ãããÖÖÖSSSÜÜÜßßßIII­­­RRR;;;000999...OOO>>>²²²ÀÀÀ333:::ÉÉÉèèèÐÐб±±JJJppp–––”””<<<´´´ÇÇÇÏÏÏ\\\ËËË———MMMÍÍÍ666ÅÅÅäääáááëë뜜œÓÓÓÚÚÚçççjjjîîîúúúøøøóóóòòòñññùùùððð!ù, (ÿ€‚`…†‡ˆ‰Š‹ŒŽ‘’“†ƒ–——† › žŸ ¡¢£¤¥¦§¨©ª«ªœ ‡˜™`›ž¶·¸¹º»¼½¾¿ºÂÃÀÆÇ¸Ä¼Ÿ›…ƒ ÑÒ‚³¶ ÛÜÝÞßàáâãäåæçèåÙ Å΂Ñ%%Ñ‚ÖÚ! ûýþÿ H° Áƒ*,¸o_ˆع{¯Þ¬8€`a„ CŠI²¤É“(S>x AË—/%¬LI“æÊ–0cÊéÑ)D`÷Œi`DpƒÇ P£JJµªÕ«X³N=Àµ«×ZÊýJ6* +L¹°Ã‚DÿR€-DÙË·¯ß¿€ L¸°áÈ£qdCŠ L\° "‚¢’¸³çÏ C‹.¼!ƒ,¿ë@‰2£cËžM[ô `‡Áµƒ N<ƒ† ¶--¦ŒóçУKŸN½ºõëØ³kßÎ}» º÷A Ò½¼ùóèÓ«ÏÎ$·8¬ŸO¿¾ýõK.L€ Aþýÿ 2Tñ€ ˜¡à‚ 6èàƒF(á„Vhá…f¨ N¼D‚†(âˆ$–h"„Th ˆ'¶èâ‹0††°ã8æøbWô€Æ@)äDiä‘H&©äÿ’L6é¤,üðä”TViå•X"‰AYvéå—`^yBa–iæ™fž`El¶éæ›pÆ)çœtÖiçxæ©çžoÎ0Å€*è „j衈&ªè¢Œ6ê裃¢Â”Vj饘fªé¦œvêé§ †*ꨗހ…¨¦ªêª¬¶êê«°Æ*무Öjë­«Ö0„¼öêë¯À+ì°Äkì±È&«ì²¿"áBÐF+í´ÔVkíµØf«í¶Üvëí·Óñä–kî¹è¦«îºì¶ëî»ðÆ+ï¼ç6ƒøæ«ï¾üöëï¿,ðÀlðÁûz€ 7ìðÃG°ÂgTlñyÅg¬ñÆwìñÇ ‡,òÈ$cìA%§¬òÊ,·ì²Ç üòÌ4×l3Ë1߬óÎ<ïó@-ôÐDmôÑH'­ôÒL7íôÓCÔTWmõÕXg´ÔZwíõ×`c-ud—möÙh§­öÚl·íöÛpÇ-÷Ügc€C ;TT_v224_html_docs/images/glass/grey/tab_warm.gif000700 000765 000765 00000003065 11222361073 021415 0ustar00abwabw000000 000000 GIF89a¾(æhhhgggddd```///XXXkkkpppmmmnnnyyyssszzzuuutttÙÙÙlllwwwoooqqqrrrvvvxxxØØØÚÚÚiiiTTTÕÕÕ×××ÖÖÖeeeaaaAAAUUUfffÑÑÑÈÈÈccc^^^WWWÔÔÔZZZÓÓÓÐÐÐÒÒÒbbb[[[@@@YYYÇÇÇ111ÌÌÌGGGSSS]]]æææòòò222888???RRRÍÍÍQQQùùùVVVÆÆÆ¨¨¨ÊÊÊ___ÎÎÎ999NNNúúúFFF>>>›››öööBBBéééÏÏÏ444JJJLLL³³³óóó<<<øøø¥¥¥\\\ïïïKKK:::ÝÝÝPPP£££ððð•••ÄÄÄíííEEEßßßìì츸¸‚‚‚ËËË©©©DDD;;;çççjjjñññêêêâââ÷÷÷ûûû§§§ýýýþþþÿÿÿ!ù,¾(ÿ€‚n…†‡ˆ‰Š‹ŒŽ‘’“†ƒ–—˜™š›—†Ÿ¢£¤¥¦§¨©ª«¬­®¯® ‡œµ¶š…Ÿ¢¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊ£Ÿ…ƒÐÑÒÓÔÕÖÐn¡¼"ßàáâãäåæçèéêëìéÝ"¼Í‚Ð÷øùúûüýÞJ´ø@p€Áƒ*\Ȱ¡Ã‡#Jœè Á%À 0ÏM½~ Cö àƒ )`À(À²¥Ë—0cÊœI³¦M™'N„ØâfÍœ<{¶ÔâK•)\d11 ¼Ž ÜK@µªÕ«X³^-a ›(ŠK¶¬Ù³hÓª]Ë„['9ÿd°Uë\¹aÝŠ•‘#ŠŽ%4x¤0ñá©G©´*^|ÕÅ‹ešÜ™L¹²å˘3kÞ̹³çÊræ|þ:ó98n@¡ÓBEJˆàF*U ¸sëÞÍ»wngF N¼¸ñãÅo 9²Å„ì QH8@½ºõëØ³Wÿa¹÷ïà˿態" 'ž®½½{êOÄËŸO¿¾e:;R”P[ú (à€8Aö%¨à‚ÃQñ‚ `€tR`á…f¨á† vèᇔ1B¸€P°ÀŠ,¶èâ‹0‚(ãŒõ- ÅLˆ¢Š0öèãŠ4)$rfè A @°ãÿ4éä“PF åTVùÙ ;˜ „0ÙÀ—`†)æ˜bZiæ™—1±Æ(Ù¥dÆ)ghÖyæ!ð € ¼Ù@€*è „jç¡U^°„ pÀF 餔Vj餈f*äd”`€8PA”jꩨ¦Zª¦¬Ê8Gˆ€À¢’ªÀ­¸æªë® ´ê«‡ì0@ 6`+¯Èîúë² ª¡„ŽŠj TkíµØfkǶÜvëí·à†+î¸ä–kî¹è¦«.¸IÀ@;m¶ôÒ;ǽøæ«ï¾üöëï¿,ðÀlp¿(¼Ð± T0o½W+ÇÄWlñÿÅg¬ñÆwìñÇ ‡,²Æ_(á©›,²o´ìòË0Ç,óÌ4×lóÍ8ç¬óÎ<Ó<†>xÁ£pŽzéђ¡ôÒL7íôÓPG-õÔTWmõÕXg-µVØPbÿ­(åØMÆaöÙh§­öÚl·íöÛpÇ-÷Üt×ýv @HÛzïaGÇ߀.øà„nøáˆ'®øâŒ7î8âXpq S á…<Ô ¹œwî¹ç̆Î`BŒ€B\pÁ¬·îú묋.{‚OÀ¨¯þ:¼÷î;³O_i¨»îü®<ïë6ïüóÐG/½ó@Ѓ ¸§®:ìÜOïý÷à‡/>’·UÄ`öÇ«Ž|÷ã·ïþûðs F =ÜÞêÚ«¯¿úñ÷ïÿÿÎà ˆ0 `¸»ßý8ÀÀr€Œ ½u Ä`#`Qp@zЃ ¡ý‡ ˆa€30V0‚ºp+¨ƒ gHÃÚð†8Ì¡wÈÃúð‡@ ¢i-´¡ Á HÀÄ&Ö/;TT_v224_html_docs/images/glass/grey/top_grad.gif000700 000765 000765 00000001656 11222361073 021424 0ustar00abwabw000000 000000 GIF89a ‚把Šiiiggg¹¹¹ÉÉÉyyyfffËËËpppÅÅÅsssjjjnnnuuummmÊÊÊÈÈÈÄÄÄÂÂÂÇÇǼ¼¼¿¿¿¨¨¨³³³hhhkkk§§§«««ªªª­­­¬¬¬®®®°°°~~~···»»»ºººÀÀÀrrrxxx“““©©©ÁÁÁ²²²¸¸¸ššš¾¾¾qqqÆÆÆ‰‰‰¥¥¥{{{|||‚‚‚†††‘‘‘”””–––ŽŽŽ¡¡¡ÌÌ̽½½¦¦¦tttœœœ˜˜˜zzz´´´„„„¶¶¶   žžž¯¯¯€€€ÃÃÃvvvƒƒƒˆˆˆ’’’———›››………}}}‹‹‹£££ŸŸŸooowww•••™™™‡‡‡¢¢¢lll±±±µµµ¤¤¤ŒŒŒ!ù, ‚ÿ€‚ƒ„……ˆ‰Š‹‹Ž‘‘”•–—— š›œ ¡¢££b¦§¨ª«¬­­ °±²³³[¶·¸ º»¼½½0ÀÁÂ'ÄÅÆ ÈÉÊËËBÎÏÐÒÓÔÕÕOØÙÚ\ÜÝÞ(àáâäåæççEêëì5îïð6òóôWö÷ø"úûüþÿlB° A0*¼Á°¡C(#J h$0™5/˜46°<9V89¸?8¶>©Õ´¥Ñ¯%y)¦Ò°§Ô²3¤84ª:§Ó±7³=6®;$s'#q'9¹?#r'!ù,Ä@ÊÈE,ÇEp9ŸÐhô Djجv»<Œ˜xL.—žOèÅn»ßïЧ1Ùïø|~Òp€f€‚ƒƒ  4Š‹Œ %7”•–——%6žŸ ¡¡ )7-©ª«¬ª(+ &,µ¶·¸¶'$:ÂÃÄÅ:$*ÆÐÃËÑÂË9å"ëìí"åóôõö÷;ùúûüýþÿõáH° Áƒƒ;TT_v224_html_docs/images/glass/green/col_grey_in.gif000700 000765 000765 00000000622 11222361073 022240 0ustar00abwabw000000 000000 GIF89aÕ!m% ¼ª!j%Hš«£]mZ:e#d"›¬¥©¥ žº¨®¦¤Dœ®¦›¬¤ % `! g$¡¾¬[†‹9H h$Ÿ»¨:T9!l%™ª¢Qxtqƒ…}„‡~wsp7O5F5M3GP¹±¯6´­«°¨¦}xw©¢ ÑÔ×ÍÐÒÏÒÕÎÑÓÏÓÕ"n&$s'#r'#q'#p&!ù,¯À‰£E,GÇ$ˆ9ŸÐh4<^جv»}2˜xL.— ™ÇÅn»ßoÎb ­îø¼ï " ,ƒ„…†„&" *‘’“* $#)žŸ ¡)% '¯°± ¨¹ (¿ÀÁ ¹2ÉÊËÌÍÊ6ÐÑÒÓÔÕÖרÙÔ5ÜÝÞßàáâãÝ4æçèéêëìíç3ðñòóôñA;TT_v224_html_docs/images/glass/green/col_grey_out.gif000700 000765 000765 00000000647 11222361073 022450 0ustar00abwabw000000 000000 GIF89aÕ8#p& ¼ªGPQFŸŸ?*@ÝÝ6ØØÒÒÊÊ––Ü¥åÙ¡áÚ£ãØ¡áÚ£ä"n&$s'#r'#q'#p&!ù,¯@‡¤E,G‰#‰9ŸÐh4$^جv»M" —xL.—ÅÆn»ßï‡bP ±îø¼ÿ) 8%+ƒ„…†„!&*‘’“*" #)žŸ ¡)   '¯°± ¨¹(¿ÀÁ¹2ÉÊËÌÍÊ6ÐÑÒÓÔÕÖרÙÔ5ÜÝÞßàáâãÝ4æçèéêëìíç3ðñòóôñA;TT_v224_html_docs/images/glass/green/col_pink_out.gif000700 000765 000765 00000000647 11222361073 022443 0ustar00abwabw000000 000000 GIF89aÕ8#p& ¼ªE0G!j%#p'¤!¥›¬¥5ZKš«£0Ÿ»¨žº¨d"H™ª¢L#o&^ ÑÑ›¬¤G`!42œ®¦!k$"n&u(vãã h$ $ A¡¾¬<!m%8ÕÕ9°°C0D×ײ³ááääÚ£äÜ¥åØØÙ¡áÒÒÊÊڣ㖖ÝÝØ¡á$s'#q'åå#r'!ù,ÄÀÑF,ÇÍHpx9ŸÐhô Xjجv»µ ™xL.— GÇn»ßÙïø|>Á0h€‚ƒƒ 3Š‹Œ 1”•–—— 7žŸ ¡¡%('-©ª«¬ª+&%",.µ¶·¸¶)" ;ÂÃÄÅ;* ÆÐÃË Ñ Ë:å$ëìí$åóôõö÷<ùúûüýþÿõåH° Áƒƒ;TT_v224_html_docs/images/glass/green/col_purple_in.gif000700 000765 000765 00000000622 11222361073 022601 0ustar00abwabw000000 000000 GIF89aÕ!m% ¼ª!j%[e#;5[H9:Ÿ»¨Q6‚›¬¥Hš«£ h$žº¨ g$¡¾¬™ª¢Dh4¨e7£d"(5:`! % œ®¦!l%›¬¤F%36H%t$34GPP2QG%sO2n7³6i4ªl6®e3¤K%y·«Ô¸­Ö¸®Ö¶«Ôº¯Ø"n&$s'#r'#q'#p&!ù,¯Àˆ&F,GM$°x9ŸÐhtp\جv»å–xL.—‰‡Æn»ßoɃ‘)±îø¼ÿÉ00#+ƒ„…†„&")‘’“) $*žŸ ¡*! '¯°± ¨¹(¿ÀÁ¹2ÉÊËÌÍÊ6ÐÑÒÓÔÕÖרÙÔ5ÜÝÞßàáâãÝ4æçèéêëìíç3ðñòóôñA;TT_v224_html_docs/images/glass/green/col_purple_out.gif000700 000765 000765 00000000647 11222361073 023011 0ustar00abwabw000000 000000 GIF89aÕ8#p& ¼ª)86®;%y)7³=3¤84ª:éééóóó­Ò®>ˆA­Ñ®¦¹¦¬Ï®¬Ë­«Í­âââ§§§'€+8µ>5ª:6°<8´>ÞÞÞ8¸>®Ô°¯Õ±8·>­Ò¯°Ö²6±<®Ô¯´Ú¶²Ø´±×³5«:¶Ü¸³Ùµ7±<ÀæÂ7²=ÂèÄ3¥8µÛ·®Ó¯°Ö±²Ù´Áç÷ݸµÛ¶¨»©®Ò°¯Ô°½ã¿¬Ð®­Ñ¯èèè6¯;ÀçÂ3¥9¯Â°¯Ô±®Î¯¼â½·Þ¹»Î¼ÃéĬή­Ï¯ÃéŭЯ­Ï®*‡.ããã±Ò³²Õ³4ª99·?«¾¬ÃÃðӱµÚ¶¶Ú¸³Øµ±Ö³¬¿­³Ôµ­Ð®­Î¯ßßß²Ö³¶Û·¯Ñ±%z)ÀãÁ·Ê¸ÁæÃ¿àÁÃèÄÃèūҭ·Ü¹!l%¾á¿¬Î­2¤8:†><ºÙ»çèçmªq¿åÁÕÚÕ§º¨ÅÅŨϩ»á½3¨9·Ý¹ŽÀ‘°Ã±4©9³Æ´/—47±=ºÝ»4¦9¼ß½“À•¬Í­ãåã¸Ë¹ÆÐÆ5«;ýýýüüüñññùùùôôôêêêíííòòòððð÷÷÷ëëëûûûþþþ9¹?ÿÿÿ!ù,¼dÿý H° Áƒ*\Ȱ¡Ã‡#Jd¸Æ ?4nøÇ±£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµj4þò³f¢×¯`ÊKbÅ‹7V]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ó½šukײˆ+^ÌXâYŒKžL¹²å˘3kÞ̹³çÏ C‹ “°V®S«^Íú+®@¤È¥íG»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàËÿO¾¼ùóèÓ«WOZ¥iíãËŸ¯zý×±I¨)À¯¿ÿÿ(à€hà&¨à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ.Ê#O<ñÜÖ^Iï¡Fß@‘}ö2É é`Nú4éä“PF)å”TViå•Xf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæ©çž|öé矀*è |žq=ô”Ñß¶í(R‡ )餒¹Æ lrÎpà`Bøà3Ϩ¤–jꩨ¦ªêª¬¶êê«°Æÿ*무Öjë­¸æªë®¼öêë¯À+ì°Äkì±È&«ì²Ì6ëì³ÐF+í´ÔVkíµØfël¨øÌQdè“(?ŒÖæèGRªîºñ9ˆ!™ú€8ú9¡Å>øÚ£ï¾üöëï¿,ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñÅg¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Œï>bÜóàS‡’›#mçv”.»D˜}˜úÈ€ÄA§Xh±ÀTWmõÕXg­õÖ\wíõ×`‡-öØd—möÙh§­öÚl·íöÛpÇ-÷Üt×m÷Ýxç­÷Þ|÷ÿí÷߀.øà„nøáˆ'®xà´,°@ £Ø#Î;Ÿ¡èÏýýÏÐFwî¹c—²áÇ‘´O:8‘E4Öðáúë°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üòÌ7ïüóÐG/ýôÔWoýõØg¯ýöÜwïý÷à‡/þøäo_A\Ѐ.D,0Ê>aè,.?˜Íùçøç‘†Œ ŽH‡²…PšK ÈÀ:ðŒ 'HÁ ¥?ø¸Gˆ  èb£C>æ0¿ú9ê~úKaþŠ”©ÿaDuA°Zð†8Ì¡wÈÃúð‡@ âÿõA„ Ä`öˆèA? +§‰” §è¹Ðbmp ¬0I8c†5¢ÇHÆ2šñŒhL£×xC~@Ã=ð±Ä&fnG(¤¢ÕU¤ÑâGÂ`á M8À5\"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“ äÍ‚Q̱„N$M÷ÈÊ Ù'S“`Â-œÀXÒˆdE(wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—é 4 Ža aäa.UB>­Ì¦B÷†D¼ iˆB+nyÈD2óœèL§:×ÉÎvºóðŒ§<çIÏH>@;êqÿ;¶g•Ú èj.5º6üÁ hE+šA‰&X@Ìð@='JÑŠZô¢ͨF7ÊÑŽzT™\À>òa&þÌš…ñ‘@WÊš5ô//¸Â,Ä¡P†:¢ý¨NwÊÓžúô§@ ªP‡JÔIÆ@ éAÍT‚ ,jYÖ)o¡â\hCÑ¢zõ«` «XÇJÖ²šõ¬š4Cˆ€{H³©£ªTç ª"Ž0…tÐ JP—+ˆ(ŽKØÂö°ˆM¬bËØÆ:ö±¬d'KÙÊZö²˜Í¬f7ËÙÎzö³  ­hGKÚÒšö´¨M­jWËÚÖºöµ°­lgKÛÚÿÚö¶¸Íía‰Ñ€=È!õ0©S=#WºwHl`š#*á¿ú°‚Õ­t§KÝêZ÷ºØÍ®v·ËÝîz÷»à ¯xÇKÞòš÷¼ßíÆ÷1%6õŽŸ)îqçK‘ä’‚SÍu.t=€Þþú÷¿°€LàøÀN°‚ÌàÇ– B ܪi—3ò¥¯†÷—\ƒÂÁ š±&–¡dŒÀ°‘ŠWÌâ»øÅ0ޱŒgLãÛøÆ8αŽwÌãûøÇ@²‡Lä"ùÈHN²’—Ìä&;ùÉP޲”§Lå*[ùÊXβ–·Ìå.{ùË`†1o} \á·3Þ°šBÕ7´!ÿñˆK|â‡ùÎxγž÷Ìç>ûùÏ€´ MèBúЈN´¢ÍhC`½íej5Ñ|M•®ùÒió›ã,b›Åµ¨GMêR›úÔ¨NµªWÍêV»úհ޵–Ïá ¿õ™I3¦é«i8»¡À–„6,0TÁ4J¶²—Íìf;ûÙÐŽ¶´§Míj[ûÚØÎ¶¶·Íín{ûÛDo\R:¥RܵºýÑë»Â&¶±‘ îzÛûÞøÎ·¾÷Íï~ûû߸ÀNð‚¿èÑ"ô{ÏÅu;œÝöµ$&.ìdH£ UP†Á7ÎñŽ{üã ¹ÈGNò’›üä(ÿ϶>jMa Ÿ9וN÷Ã×Ün7P¼âÏxÊwÎóžûüç@ºÐ‡Nô¢ä;w™Í­]Ï<ª5¿y‰s®ñ£[ýêXϺַÎõ®{ýë`×6ÂÙëÞIcÆéO_i͵ÁvmÒ8”Q†ºÛýîxÏ»Þ÷Î÷¾ûýàOøÂþðˆO¼âÏøÆ;þñ¼ä'OùÊ[þò˜Ï¼æ7ÏùÎ{þó ½èGOúÒ›þô¨O½êWÏzÀ“å·~¹eОö€®½íoûÜ[ÏûÞûþ÷À¾ð‡OüâÿøÈO¾ò—Ïüæ;ÿùÐ~ô“NærŸæè®ý¥oïvPà90ÿ Eþò›ÿüèO¿ú×Ïþö»ÿýð¿üçOÿúÛÿþøÏ¿þ÷Ïÿþûÿÿ€8€X€x€˜€ ¸€ Ø€ø€8Xx˜c§pfW´§}­Ä}o÷}á7~˜‚*¸‚,Ø‚.ø‚0ƒ28ƒ4Xƒ6xƒ8˜ƒ:¸ƒ<؃>èƒf{Wgs"¨f5gJ˜{ê°R€‚?…R8…TX…Vx…X˜…Z¸…\Ø…^ø…`†H}äffE˜}G¨aI¸„pׄO(†p‡r8‡tX‡vx‡x˜‡z¸‡|؇>Øuô’‚iHE5 ˆè}'Є×†ÿòˆ‰’8‰”X‰–x‰˜˜‰š¸‰œØ‰žø‰ Š¢8ФXЦxЍ˜Šª¸Š¬ØŠ®øŠ°‹²8‹´X‹¶x‹¸˜‹º¸‹¼Ø‹¾ø‹ÀŒÂ8ŒÄXŒžXBèr—Aˆ…¨B‡˜ˆßLjŽhŒÔXÖxØ˜Ú¸ÜØÞøàŽâ8ŽäXŽæxŽè˜Žêh(IúÄOL7ÌØŒúSspð Ј„ò9Yy™ ¹ Ùù‘9‘Y‘gÒ%‚1ôˆ?öˆúÈþh‘$Y’&y’(™’*¹’,Ù’.ù’0“29“4sp"ÿ0aø0„‚øÙ‘Uq¦ Dù ß Ð×P5Ù”Nù”P•R9•TY•Vy•X™•ZY’İ‚0 ÑÄ“¸Ö? ”FSsD© F‰”JÉ”[ù–p—r9—tY—vy—x™—z©•oä[û$–c©ei–DSsFi”@è€S0d𘙒9™”Y™–y™˜™™š¹™œÙ™žù™ š¢9š¤Yš¦yš¨™šª¹š¬Ùš®ùš°›²9›´Y›¶y›¸™›º¹›¼Ù›¾ù›ÀœÂ9œÄYœÆ9šKp´`À…J:B–FH˜P'”np˜ú¨˜Œé˜Ç¹ÜÙÞùàžâÿ9žäYžæyžè™žê¹žìÙžîùžðŸ“™P  OsÀ3Šâ3…ÅI„A¤¸ Óéf¾Š  Ð(C`¡:¡Z¡z¡š¡º¡Ú¡ú¡ ¢":¢$Z¢&z¢(š¢*º¢,Ú¢.ú¢0£2:£4Z£6z£8š£:º£<Ú£>ú£@¤B:¤DZ¤Fz¤%úK@´ Gó°3úp(‰y-Rj@* DB ¶G ª  ê H:¦dZ¦fz¦hš¦jº¦lÚ¦nú¦p§r:§tZ§vz§xš§KPAûpùÐ-ß.¬¹'`$/ÿ0 †`)\šM5§”ª °˜à õ°©œÚ©žú© ª¢:ª¤Zª¦zª¨šªªºª¬Úª®úª°«²:«´Z«¶z«¸š«ºº«¼Ú«¾ú«À¬Â:¬ÄZ¬Æz¬Èš¬Êº¬ÌÚ¬Îú¬Ð­Ò*«PÝ ´r¨7“Þú­à®â:®âº-øP&€pðçl0©z4©•z©(©C0­úº¯üÚ¯þú¯°;°[°{°›° »° Û°û°Kª Ð ‚Ž9£ Û±û± ²K23£Np¥à€>ஆ¯ö!¯†H•j©a ãÿ±8›³:»³<Û³>û³@´B;´D[´F{´HÛ¬£Të#D°; T[µV{µX›µUK C Z€éJ qo~ð®/ ³Î(³õZ³7›´p·r;·t[·v{·x›·z»·|Û· +ðFK>çS¸†{¸ˆ›¸‰«=Ö Y 8ðБðgë²j›B5—œ›á ½ \p sPº¦{º¨›ºª»º¬Ûº®ûº°»²;»´[»¶{»¸›»º»»¼Û»¾û»À¼Â;¼Ä[¼Æ{¼È›¼Ê»¼ÌÛ¼Îû¼Ð½Ò;½Ô[½Ö{½Ø›½Ú»½ÜÛ½Þ{ ëÿ<NŽÀ•ëš¶™û95· ðû¹Æ ¢{ Ür¿ø›¿ú»¿üÛ¿þû¿À<À\À|ÀœÀ ¼À ÜÀüÀÁ<Á\Á|ÁœÁ¼ÁÜÁüÁ Â"<Â$\Â&|Â(œÂ*¼Â,ÜÂ.Ì-§À@ 3PBè˲ìÛ¾ó¾ñ ó[¿/<ÄD\ÄF|ÄHœÄJ¼ÄLÜÄNüÄPÅR<ÅT\ÅV|ÅXœÅ)à ưÙ`$àm0 î ¯<ì¾Ô¹ l¼ º  Åt\Çv|ÇxœÇz¼Ç|ÜÇ~üǀȂ<È„\ÈÜ‚Á0ÿÐ °  Gðd«¾;œÆìRsmìÆp,džÜÉžüɠʢ<ʤ\ʦ|ʨœÊª¼Ê¡‚ÈŠÌÈl Np L`ÆlPÉ–ÌGÔù¼üA<€Ú2ÌÄ\ÌÆ|ÌÈœÌʼÌÌÜÌÎüÌÐÍÒ<ÍÔ\ÍÖ|ÍØœÍÚì,°Šìż iP /o€¶¹\45×˾L¿À,ÌÛÏò<Ïô\Ïö|ÏøœÏú¼ÏüÜÏþüÏÐ,ÝüÍÆÀËá&ðm`¹hœÎ—L–0Ñ–À €ÌäºÑÝÑýÑ Ò"=Ò$]Ò&}Ò(Ò*½Ò,ÝÒ.ýÒ0Ó2=Ó4ÿ]Ó6}Ó8Ó:½Ó<ÝÓ>ýÓ@ÔB=ÔD]ÔF}ÔHÔJ½ÔLÝÔ.ÝÍ€À ³p/ ” Ñm FÑ}ÑN]Öf}ÖhÖj½ÖlÝÖnýÖp×r=×t]×v}×x×z½×H ÕRMÕ–À TБœî*s\íJÔÉ ŒÍ ‹€Ñ*P ÀÀ×”]Ù–}Ù˜Ùš½ÙœÝÙžýÙ Ú¢=Ú¤]Úß µ Q½¼ÀØ…`¦à†}ˉ­Ë^íŒÍ Ž Ù’mÚ¾ýÛÀÜÂ=ÜÄ]ÜÆ}ÜÈÜʽÜÌí­¨­ÚHÀÚ¹í•àdKÛµ=)5·ܽÿ€] ¹ä]Þæ}ÞèÞê½ÞìÝÞîýÞðßò=ßô]ßö}ßøßú½ßüÝßþýßà>à^à~àžà ¾à Þàþàá>á^á~ážá¾áÞá¹P ÞÐÝ‹àëJ çŒØÙ=ÛÝÝßÞãÝá2>ã4^ã6~ã8žã:¾ã<Þã>þã@äB>äD^äF~äH>äâ0âÝmâ â+^)Ô V ¾Ð¶, aðå`æb>æd^æf~æhžæj¾ælÞænþæpçr>çt^çv~çxžçz¾ç|Þç~þç€è‚>è„^è†~èˆÿžèоèŒÞèŽþèé’>é”^é–~阞 ,¶Ð¾på`âqÐÐØ=å@Rs žå[Þå˜Þê®þê°ë²>ë´^ë¶~븞뺾ë¼Þë¾þëÀìÂ>ì¿®éœîé .꤮â¦ÞRÔ™ ÐÎP ÀJ ÷íÚ¾íÜÞíÞþíàîâ>îä^îæ~îèžîê¾îìÞîîþîðïò>ïô^ïö~ïøžïú¾ïüÞïþþïð?ð_ððŸð ¿ð ßðÿðñ¯JÀP ÀО Ê.åÍþ#5·ñÒNíÖŽíò(Ÿò*¿ò,ßò.ÿò0ó2ÿ?ó4_ó6ó8Ÿó:¿ó<ßó8Oññí_ê/5ÇJ/í¶° Çpí>õR?õT_õVõXŸõZ¿õ\ßõ^ÿõ`öbßî »ÐéKÏEÏìGßI¿ôZîôP?öt_÷v÷xŸ÷z¿÷|ß÷~ÿ÷€ø‚îeö¿ôkßö,NÐøð …àô-Ð bPù–ù˜Ÿùš¿ùœßùžÿù ú¢?ú¤_ú¦ú¨Ÿúª¿ú¬ßú®ÿú°û²?û´_û¶û¸Ÿûº¿û¼ßû¾ÿûÀüÂ?üÄ_üÆüÈŸüÊ¿üÌßüÎß -`ö…ð Žß‰¯øíÂøŽù’ÿOùÎÿýàþâ?þä_þæþèŸþê¿þìßþîÿþðÿò?ÿô_ÿðýÒOýŽýØþ$XÐàA„þÖ°yÓ&7ˆ$"*„Š…TömäØÑãG!EŽ$YÒäI”)U®dÙÒåK˜1eΤYÓæMœ9uîäÙÓçO A…%ZÔèQ¤I•.eÚÔéS¨Q¥N¥Ú)¨ MDäNœ6oجIXÖìY´iÕ®eÛÖí[ >Œ8±P’‹©îåÛ×ï_À&\Øðaĉ/fÜØñcÈ‘[ÅšdëD¯`Å’…ÛÙógСE”ë"×»»Žé•ÜÚõkرeϦ]ÛöÿmܹuïæÝÛ·K«ÇvYæš9ìØÑÉ•/gº4]LÑ UôDa·ßÙµoçÞÝûwðáÅ'_Þüù•܆Qð¤µPtLÆ77§_ßþ}… M»?•'Q†éô 4ð@TpAtðA#” ›†å÷à“9ü:ôðC¶žƒhºé>¹ÀWÃ[tñEc”qFk´ñFsÔqG{ôñG ƒrH"‹4òH$“TrI&›tòI(£”rJ*«´òJ,³ÔrK.»ôòK0ÃsL2ÇCWDñä’OH,dCÎ@”sN:KûcD?!Å.2£L@tPB 5ôPDUÿtQFuôQH#•tRJ+µÔQ92è"MOi“D¯þ8.N:K5µ>¹H¹Ó 7?1Ñ“X^yâKkµõV\sÕuW^{õõW`ƒvXb‹5–Çwžx%–5]u3TRæ;uZjG“ G*qƒn¹½ä’CD‘…'2ئ9ÒUw]vÛu÷]xã•w^zëµ÷^|óÕw_~ûõ÷_€x`‚ 6ø`„Vxa†vøaˆ#–xbŠ+¶øbŒ3ÖxcŽ;öøcCƸm2x‚YD9äÛn¹u£G‘¶Zšknk¡@qÄ+¼i™K>WWºP€›;’Vzi¦›vúi¨£–zjª«¶ÿúj¬³Özk®»öúk°Ã{l²Ë6ûl´ÓV{m¶Ûvûm¸ã–{nºë¶ûn¼óÖ{o¾ûöûoÀÏ[.\Iù.ùùdLq$‘@8´yrÊÂ9‘Žèc†Ÿ¿Z”Xðp…vj¨!ÔSW}uÖ[wýuØc—}vÚk·ývÜs×}wÞ{÷ýwàƒ~xâ‹7þxä“W~yæ›wþy裗~zê«·þzì³×~{î»÷þ{ð£7tWðˆEåÄo™ +ÀyrÉ+—_þ5 ñ#’®˜åEúÿÖ /âvF(ð ºiN d`ø@FP‚¤`-xA fPƒä`=øÿA†P„#$a MxB¦P…+da ]øBÆP†3¤a mxCæP‡;äa}øC QˆC”!é¦Q><„Bv ¾u‰þ)⳸ "áCj~[¬ÙᇆüÁPˆ¢"ž@Ú€¡`ãÝøF8ÆQŽs¤cíxG<æQ{äcýøG@Rƒ$d! yHD&R‘‹dd#ùHHFR’“¤d%-yILfR“›äd'=ùIP†R”£$e)/ÉF%ªQ€‡pâ·Êˆê ~„¹xËSy‘!˜«D¨Å'^€«L£yLd&S™Ëdf3ùLhFSšÓ¤f5­yMlÿfS›Ûäf7½ùMp†Sœã$g9ÍyNt¦Sëdg;ÝùNxÆSžó¤g=íyO|æSŸûäg?åILV¶Ò•ŠøÄ ÒP‰÷‰¥–¸dè´Ö€³I0áN€ÂxÑ‹ÒA£åhG=úQ†T¤#%iIMzR”¦T¥+eiK]úR˜ÆT¦3¥iMmzSœæT§;åiO}úS U¨C%jQzT¤&U©KejSúT¨FUªQÅhU¡à„[0a‘{hC½Z§ú™B6ªzV´¦U­kek[ÝúV¸ÆU®s¥k]ízW¼æU¯{åk_ýúWÀV°ƒ%la {XÄ&V±‹elcûXÈFVÿ²“¥le-{YÌfV³›ål^³!„#¼@fXìêWMû!]bmp „ÀotV¶³¥mmm{[ÜæV·»åmo}û[àW¸Ã%nq{\äÖÖ  ц­²a¡§¥.~j6"LȪ!Ž/„W¼ã%oyÍ{^ô¦W½ëeo{Ýû^øÆW¾ó¥o}í{_üæW¿ûåoýû_XÀ&p |`'XÁ fpƒü`GX¦p…-|a gXÃçG5°3&D"rY´euMœœ‡†õ ÛuÄL`ü`ÏØpm|cçXÇ;æq}üc YÈC&r‘|d$'YÉKÿ®ð3Öñ ÃGpDˆgIâŸXË yè ØÆH´áq8‚9fÑd¸AÍkfs›Ýüf8ÇYÎs¦sí|g<çYÏ{æsŸýüg@ZЃ&t¡ }hD'ZÑ‹ft£ýhHGZÒ“¦t¥-}iLgZÓ›æt§=ýiP‡ZÔ£FFfaŽ#ÄámˆÄ,¥[Ú-ÇÚZºôC Þ&¼àä8‚)*Q 8[ØÃ&v±}ld'[ÙËfv³ýlhG[ÚÓ¦vµ­}mlg[ÛÛæv·½ýmp‡[Üã&w¹Í}nt§[Ýëfw»ÝýnxÇ[Þó¦w½í}o|çÛÞ¿6ÅÈñ‡0!o„ÿ^eY'Ü-)vÁ8‰D´!×/pÄþŒg\ãçxÇ=þq‡\ä#'yÉM~r”§\å+gyË]þr˜Ç\æ3§yÍm~sœç\ç;çyÏ}þs ]èC'zÑ~t¤']éKgzÓþt¨/ÝâŽxAÀÛˆI¸Úµ„µÂ½—ÓŒo€x"AŠ6¤]íkg{ÛÝþv¸Ç]îs§{Ýí~w¼ç]ï{ç{ßýþwÀ^ðƒ'|á xÄ'^ñ‹g|ãÿxÈG^ò“§|å-yÌg^ó›ç|ç=ÿyЇÞó¤D"°þ†Yœë]ÿzëÎp6|¹Ö¶F}ím{Üç^÷»ç}ï}ÿÿ{à_øÃ'~ñ|ä'_ùËg~óÿ|èG_úÓ§~õ­}ìg_ûÛç~÷½ÿ}ð‡_üã'ùÍ~ô§_ýëgûQpƒœõ®§ˆÂ>ˆ†c7öûçÿýÿ @@,@<@L@\@l@|@Œ@ œ@ ¬@ ¼@ Ì@ Ü@ì@ü@ AA,AìC?üC@ DADB,DC„„„)…-–––%z)‚‚‚žžž5¬;2¡7œœœ0š5’’’‡‡‡¼Ø¾(‚,¢¢¢´Ò¶*ˆ/   ŽŽŽ¥¥¥˜˜˜6¯<ŒŒŒ5ª:šššˆˆˆwww,0&|*”””»Ø¼¹ÒºZ.•38´>™»›m›oºÕ»¶Ô¸4¨:6®;7²=¹Öº$r'3¤8¥Ç§1ž6R†U2¢8±Á²/—4·Ñ¸S¹Ìº/–44§9¼Ù½ƒ¬…0œ6¹×ºa!µÄ¶,1&~+VF3¦9-’2\0›5¹ÔºµÏ¶¸Ö¹ g$4¨9+Š/-2.“3+Œ0»Ö½ºÔ¼ÈÓȺֻ'~+¼Ô½·Ô¹1Ÿ7µÃµ7³=',%w)#q'$u(#r'"o&&z*ýýý¾Ø¿'€,úúúöööøøøõõõçççìììîîîïïï!i%þþþ&{*¾Ù¿%y)&y*%v($v(%x)$t($s(&x*%v)½Ö¾#s'#o&¼Ó½¼Ô¾0ž5âââ§§§óóóQ&z)9¹?{{{ÞÞÞ~~~ÖÖÖäääxxxÁÁÁyyyÚÚÚzzz|||ÉÉÉÃÃÃÑÑÑÒÒÒªªª}}}ÓÓÓÈÈÈÂÂÂÏÏÏ×××9¸?ØØØÍÍÍÇÇÇæææÜÜÜÊÊÊÔÔÔ¿¿¿ÀÀÀ¸¸¸«««ÛÛÛÎÎÎÐÐÐÌÌ̯¯¯ËË˽½½ºººßßßÙÙÙ¼¼¼»»»¾¾¾µµµÝÝÝàààãããÄÄÄÆÆÆ®®®­­­©©©ááá²²²³³³åååÅÅŶ¶¶···´´´ÕÕÕ¨¨¨°°°¬¬¬¹¹¹¦¦¦±±±8´=½×¾¾ÙÀ$t'½Õ¾&x)°¿°+z/'z*¯¿°(€,¼Õ½%w(%x*³Â´-‘1$x)%z*$w)½×¿¾Ø¾¿Ù¿ûüû¸É¹¾×¾#r(øùøëîëºÓ»+‹0çìèñññèèèüüü¿ÙÀ#p&òòòðððíííôôôêêêùùùëëë÷÷÷éééûûûÿÿÿ!ù,à‚ÿÇH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£J*’žÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸së~ ¦·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàËÿO¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6è`wbD(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)fŒz”iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæ©çž|öé矀*è „j衈&ªè¢Œ6êè£F*餔Vj饘fªé¦œvêé§ †*ꨤ–jꩨ¦ªêª¬¶êê«°Æÿ*무Öjk¡yäªë®¼öêë¯À+ì°Äkì±È&«ì²Ì6ëì³ÐF+í´ÔVkíµØf«í¶Üvëí·à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ‹nôÖkï½øæ«ï¾üöëï¿,ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñÅg¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ4×lóÍ8ç¬óÎ<÷ìóÏ@-ôÐDMñH'­ôÒL7íôÓPG-õÔTWmõÕXg­õÖ\wíõ×`‡-öØd—möÙh§­öÚl·íöÛpÇ-÷Üt×m÷Ýxç­÷Þ|÷ÿí÷߀ßmÇà„nøáˆ'®øâŒ7îøãG.ùä”Wnùå˜g®ùæœwîùç ‡.ú褗nú騧®úꬷîúë°Ç.ûì´×nûí¸ç®ûî²áûïÀ/üðÄoüñÈ'¯üòÌ7ïüóÐG/ýôÔWoýõØg¯ýöÜwïý÷à‡/þøä—oþù觯þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ  HÀð€L ÈÀ:ðÞÃ'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ WȺð…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡@ ¢ÿ‡HÄ"ñˆHL¢ƒH‡&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBò±ˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À¼%†IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎvºóðŒ§<çIÏzÚóžøÌ§>÷)ÿO9øóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽzô£ ©HGJÒ’šô¤(M©JWÊÒ–ºô¥0©LgJÓšÚ´¥üÌ©NwÊÓžúô§@ ªP‡JÔ¢õ¨HMªR—ÊÔ¦:õ©ótè¦JÕªZõªXͪV·ÊÕ®zõ«` «XÇJÖ²šõ¬hM«Z×ÊÖ¶ºõ­p«\çJ׺Úõ®xÍ«^÷Ê×¾úõ¯€ ¬`KØÂö°ˆM¬bÛÖ†à±ld÷@ÙÊZö²˜Í¬f7ËÙÎzö³  ­hGKÚÒšö´¨M­jWËÚÖºöµ°­lgKÛÚÿÚö¶¸Í­nwËÛÞúö·À ®p‡KÜâ÷¸ÈM®r—Ë\Ø"r˜•¬tù@ÝêZ÷ºØÍ®v·ËÝîz÷»à ¯xÇKÞòš÷¼èM¯z×ËÞöº÷½ð¯|çKßúÚ÷¾øÍ¯~÷Ëßþú÷¿°€LàøÀN°‚ÌàöoÏ•d±@á [Øΰ†7Ìá{øÃ ±ˆGLâ›øÄ(N±ŠWÌâ»øÅ0ޱŒgLãÛøÆ8αŽwÌãûøÇ@²‡Lä"ùÈHN²’—Ìä&;ùÉP†15¦†;Øá x¨$ { ³˜ÇLæ2›ùÌhN³š×Ìæ6»ùÿÍp޳œçLç:ÛùÎxγž÷Ìç>ûùÏ€´ MèBúЈN´¢ÍèF;úÑŽ´¤'MéJ[úÒ˜Îtž­Ò1øwè†ùØ/W8¨NµªWÍêV»úհ޵¬gMëZÛúָε®wÍë^ûú×À¶°‡MìbûØÈN¶²—Íìf;ûÙÐŽ¶´§Míj[ûÚØÎ¶¶·Íín{ûÛà&v ’àuäaÞØ2ˆ@a/¸ûÝóˆ·¼çMïzÛûÞøÎ·¾÷Íï~ûû߸ÀNð‚üàO¸ÂÎð†;üá¸Ä'NñŠ[üâϸÆ7ÎñŽ{üã ¹ÈGNò’›üä(ÿO9ÃÍ€РNȃ¬‘.¿Û ÛÈù6TÎóžûüç@ºÐ‡Nô¢ýèHOºÒ—Îô¦;ýéPºÔGŽ8A| ¹ÍÝ­óOýë`»ØÇNö²›ýìhO»Ú×Îö¶»ýíl'A ‚@nÁæ9€Þ#0‡¾ûýàOøÂþðˆO¼âÏøÆ;þñ¼ä'OùÊ[þò˜Ï¼æ7ÏùÎ{þó ½èGOúÒ›þô¨O½êWÏúÖ»þõ°½ìgOûÚ{^s¿l~†½ëÝ À¾ð‡OüâÿøÈO¾ò—Ïüæ;ÿùоô§Oýê[ÿúØÏ¾ö·Ïýî{ÿûà¿ÿøÇOþò›ÿüèO¿ú×Ïþö»ÿýð¿üçOÿúÛÿþø·þß§ÁÿþO#Þ4àá Xà½ç{ù—€ ¸€ Ø€ø€8Xx˜¸Øøí7æ`o2P|pè{z×,Ø‚.ø‚0ƒ28ƒ4Xƒ6xƒ8˜ƒ:¸ƒ<؃>øƒ@„B8„DX„Fx„H˜„J¸„LØ„Nø„P…R8…TX…Vx…X˜…Z¸…\Ø…^ø…`†b8†d(„Òp†é|g4t‚zWrtX‡vx‡x˜‡z¸‡|؇~ø‡€ˆ‚8ˆ„Xˆ†xˆˆ˜ˆŠ¸ˆŒØˆŽÿøˆ‰’8‰”X‰–x‰˜˜‰š¸‰œØ‰žø‰ Š¢8ФXЦxЍ˜Šª¸Š¬hˆÜÀ Õ‹}p†ÒPf x>»ç ‡¾ÀŒÂ8ŒÄXŒÆxŒÈ˜ŒÊ¸ŒÌØŒÎøŒÐÒ8ÔXÖxØ˜Ú¸ÜØÞøàŽâ8ŽäXŽæxŽè˜Žê¸ŽìØŽîøŽðò8ôXöxøXuX ³HÀxóP‚޼؋¾™ ¹ Ùù‘9‘Y‘y‘™‘¹‘Ù‘ù‘ ’"9’$Y’&y’(™’*¹’,Ù’.ù’0“29“4Y“6y“8ÿ™“:¹“<Ù“>ù“@ù‘è@€À ³( w%ð!° é‹e0•TY•Vy•X™•Z¹•\Ù•^ù•`–b9–dY–fy–h™–j¹–lÙ–nù–p—r9—tY—vy—x™—z¹—|Ù—~ù—€˜‚9˜„Y˜†y˜ˆ™˜Š¹˜i™ï`:P”³=x%€Oi°™ŒÙ™žù™ š¢9š¤Yš¦yš¨™šª¹š¬Ùš®ùš°›²9›I :À T€”=P™~W»§™›Iò0œÄYœÆyœÈ™œÊ¹œÌÙœÎùœÐÒ9ÔYÖyؙڹÜÙÞùàžâÿ9žäYžæyžè™žê¹žìÙžîùžðŸò9ŸôYŸöyŸø™Ÿú¹ŸÜy‰›H™”»Ù¾IÛ ‡Á)œü¹  Ú ú ¡:¡Z¡z¡š¡º¡Ú¡ú¡ ¢ïÉèP¹) Z ½˜  *¢.ú¢0£2:£4Z£6z£8š£:º£<Ú£ö©Æùþà£Þ¹PÜ ›J ‡À‹@P¥PàTZ¥Vz¥Xš¥Zº¥\Ú¥^ú¥`¦b:¦dZ¦fz¦hš¦jº¦lÚ¦nú¦p§r:§tZ§vz§xš§zº§|Ú§~ú§€¨‚:¨„Z¨†z¨ˆš¨Šj¥ŠÿÀ  ƒ€ø ¤àõ°Tšo ŒÐ˜º¨ j¥BÐ*p¢KZrÐ{O îЪ¡úª°«²:«´Z«¶z«¸š«ºº«¼Ú«¾ú«À¬Â:¬¯ªTÊñ°ðàn  ¥p ¤À•0 žp ¨À ¤° —Ð š Ê ¢0 š þ€hêiPĺ¥£j¢Jº›¨ªªPÚªîЮøš¯úº¯üÚ¯þú¯°;°[°{°†ª©0 ¹à ÊÀ‘ – ±½` µ ßú È ¯€ ²P ¬ ‘p ¥ ³ Ãp «ÐÆ*¦i ºÿÐ –` Œ` — ƒÀù*$`¢#0”¹›Ig°ªî0N‹°PµR;µT[µV{µX›µZ»µ\KµýÀ£  @  à —° ƒ° Ð=» ½ ¬ðš š0 ¾p ¼ð ¢Ð ƒÀ¦P ‘ ·`²p ª€Öz µ Zʸõ ù ° ¬Ð ‘` ¬à ý  ƒP Œ0 ý° Ã*´D{´H‹+Ú´ °º]Ûº®ûº°»²;»´[»¶{»¸+§o³À³àš@ ³ ùà  ¥@ Â` ¢0 š  ½ ¥« «Àœ° ¤°    ÿ °€ ¤p Àp›€  ¤à ùPú¡° ‘P p« É ¥ ·° *먥୰ ¦@ Æ0 Êà öЫ¤KF»¤I€ºS°º«‹¼ÁÜÁüÁ Â"<Â$\Â&|Â(œÂ*¼Â,ÜÂ.üÂ0Ã2<Ã4\Ã6|Ã8œÃ:¼Ã<ÜÃ>üÃ@ÄB<ÄD\ÄF|ÄHœÄJ¼ÄLÜÄNüÄ7œ ©P| ¤ +k ¦à §Ð ³Ð «° µ@ ¥p ñÐ «° ÈÀ°¢@ ”p  P ¦` ¬° h8{ —ÀË0 ´À `À  ½` – œÿð ” µðñ ÆÉÐ ¶P ÆÀ ™ë ¼À Ì „À ¨ ɰ;{­¡ ø ÁüPõÅ"Ì$@ª\´E;Á½hÁ ®¼Ë¼Ü˾üËÀÌÂ<ÌÄ\ÌÆ|ÌÈœÌʼÌÌÜÌÎüÌÐüÁ´Ð 0 l ­à ¬0  º Œ ­­– ”ÐÊ ÂÐ Åà ½à°«Ð Ì Å` ›Ð –Ðñ0 ³Ð ¢ð À ©€   €  ¼ ®Ð ”À²@ Í Ìð  ¿À ¶Ð”@²° ¬@ ¯Ð •ð À ¸P –` › Â` Î “› ¹ÿh@Å¿ ËU ´< IÀ‹PººC0ÔúPÔF}ÔHÔJ½ÔLÝÔNýÔPÕR=ÕT]ÕV}ÕXÕZ½Õ\ÝÕ^ýÕ`Öb=Öd]Öf}ÖhÖj½ÖlÝÖnýÖp×r=×t]×v}×x×z-ÖP m` Žœ¿@ úpùÐü𽦠›Æ–0”p¤P ´à º Œà °Ê` ðøÀ Å Ù÷  ®À ¦  Æ` !K §€Á`¶€ ¨` ŠP ±À¦° ¬P À ®p ²` 0¸·°ÇÇ ¶p„à È`©ÈÈ ·  ` & ¤°ñÿ {}Ô°LªWp=ýÓOê ìáýÞðßò=ßô]ßö}ßøßú½ßüÝßþýßà>àžÔi0 —°ÁÀ ÷ ° ú ûÀð@ » Ï¤Ð — Œð¸@ öÛº@ ¦  «@ ‘Ðù° ½P §  Å Š ¥€ È€Ðà@ >Àp Œà ¾m ¿p  rë °PÜ¡À ЀȢð ¸0 ¨€ Ð ¯p ð ¼p Ç  À÷ ã ß°¼*E; AàO:Càç¾ç|Þç~þç€è‚>è„^è†~èˆÿžèŠþß…Àl ààúP»PÔüP õÀƒÐ { ‚}¿½ ³P Ä0 ¤ðl — ®0 û    £0 ¾« ¡À ` „àëÐ@  À›p¡° ¶`­°Ð ~ ˜Ë ÄPÉ·p Ã0ܶ``ÎÐ Í` §p¶p ›­Š ¡P ûÞ߀¤úp^´WJvŽçz¾èð?ð_ððŸð ¿ð ßðL­´À  ª°>úïoð kÀ¹ð ¾þ ©`Ä ªP ¥À ùP  P m oÿÐ `¶Âà Œ`ñÐÙ @ ·àÄÀ  ÐÍ  ¡@ ¯À µ ¸ð ª€á°P ¢p ÐÐ` —° ƒ[ –€ ‚í ¡ð Ëp Ãp½ •Ð ¬p ‘` ³P § {=ïõ~ïE«ï CH0øjPø†øˆŸøŠ¿øŒßøŽÿøù’?ù”_ù–ù˜Ÿùš¿ùœßùžÿù ú¢?ú¤_ú¦ú¨Ÿúª¿ú¬ßú®ÿú°û²?û´_û¶û¸Ÿûº/ú¯0pÉjЖü…ïÂÀ©—€ P˰¹ð ² Çp – ÉÏ« žÀùÿ0 É áÊ ³ Š` ± ÏÐ PÐ ±€ ¦.¦ À² À ©Í6Ý¢ôª•, –*¡†+! Æx Ãj.X¢`Á²åà,MÇm²$Š–¢7jT®dÙÒåK˜1c~áeÉ 9s‰@ÁpH¤ •YÔèQ¤I•.eÚÔéS¨Q¥N¥ZÕêU¬YµnåÚÕëW°aÅŽ%[ÖìY´iÕ®eÛÖí[¸qå6¥• ƒ\ Ô0ÊgO%>Z³h¹‚&Â@(ñŒ-bà€ƒ_ÜêÅ‹Q.ZœHyêÛfW$FõVqLåKB,hÎ|=3°ÈÂ+Q–X)ìÄÈ–ÿ&YÉ’ÕÊI%J˜x¹’€Œ«Sžbq¨ ¡§dÄŽýºð‹ÁgÌàZFHV_¤NÅRªP[šZšàÑ~O S¢5QŸß}üùõïçßßÿp@ 4ð@TpAtðA#”pB +´ðB 3ÔpC;ôðCCqDK4ñDSTqE'ìÀ‚E"a€Ÿbò¹¯R"iå’J`lÅBÆE4°`00€:±™U •{,aã WJyãYDY¦`n©…–WRq¦"8À˜H’™%Tâù“eåQ`kÅb^a¥B˜ %N޹À€ Taÿ gT!F ZiÆL ` *1Àƒd`aÅJÞ8ÑjZO' à“>ûZtõUXc•uVZkµõV\sÕuW^{õõW`ƒvXKÑàdi„ŸMîƒgN\!0°@NY$`XÄ[Xfx1¥•a6Ñ…ŸNÉE|"‰d”b:¸[JI%–N~±E_ á„Q(qs[fñ…Y\qF”AxîKx„’R…h–Áfn¹ä ®¥\~‘EId:øÅ (yÄ•xöédI5'‚(  ¤¨¯Ub‹6úh¤“Vzi¦›vúi¨£–zjª›þÿÖjá'—5øÁÇždB1ÔoE`@ׂ &˜Xä .@å‚Nfé§JBYãV”ÆNx!•d(!åbl‰äg†A†•xdñ•Rzacd†q¦J6‘XoMj)…JŒA†˜ 0yOd(±¥—H.9E[LsÀZ%¦‚½å‘J:ÉÅ“{JÔY½&rjb‚ |‰úv¾jê«·þzì³×~{î»÷þ{ðÃg0ŸE xÀ€Aø…Ÿ}h¡…` [$˜E˜{‘JÜÖÖ€êd¤”\„‚ 0ÅF ch¢'é#x!YTb¹¸Å0*ÑRؘØÄ+Pñÿ X0"œX…&ÜÀ fÀž81´Æ P8#ÃÆ1˜! `¢¢@ER‘^t¢Rθ…%Ra 8€«™Û*€‰Ý\‚]Ññš¼œÈÀ >™Oô¤—0†QŒc$cÍxF4¦QkdcÝøF8ÆQŽs¤cíxG<æQ{äcýøG@Rƒ$d! yHD&R‘‹dd#ùHHFR’“¤d%õXŒLdÃHCÒÃaàåÃ@&@€LD"™2L‰€¨Bˆ…*za‘AÐbi ¨ÑSøf­02^± Q(â¿°G(~ +@^h@ùm´]n>ì}o|ç[ßûæw¿ýýo€\à'xÿÁ ~p„'\á gxÃþpˆG\â§xÅ-~qŒg\ãçxÇ=þq‡\ä#'yÉM~r”§\å+x$0 àcÂÀ‡2bÁ `õ#ô$|nJXÀ•j†&aŠU´"mð[?QŠx\‚÷X*(\± OØCf§0†2âŒZÄcÐ1,4eÌ¢€…2fáŠ]¼‘hF+baŠúòâ¡èÅ#x<Š^ü‚Œø…(’¡‰Á˾p¬zOðU¿ìc< f࢜ØÅÇŸe) ypGho@oz³\õ«g}ë]ÿzØÇ^ö³§}ím{Üç^÷»ç}ï}ÿÿ{‡3Âç"ÀGh~MøÝèGŸ£HÆ)Šq VÐbÕŽÇ(â N乃 E1Ú`Ux‚ÂÐÄ ð¡‰ÙÆHÆ 8ŒÛ”¦¸D-V‘S„~€W€WˆRØ`˜…Kˆ‡Uˆ…AP^èUàO@…P†P€…G€f€³Ã…g`†}ÑXÐWÀ…øy€íH…Vè…6ð¸Ï“² H+y£7%øA%>!B",B#`N`^`n`~`Ž` ž` ®` ¾` Î` Þ`î`þ`aa.a>aNa^anaĵ]hŸ~X…FØx(†x€Úí–8Zx1 „DºH„`˜!}€(bÐEp _L¨¾fZ…cPÈbP6 „Vxèp€|¬FÀݪš…ÿ„6 …^`4dЄ]P]xÀ‡4à5Ð}@>îc?þc@ä>öB.dC>dDNdE^äC6ɥܨ‚þäþuaK¾dLÎdMÞdNîdOþdPeQeR.eS>eTNeU^exˆ‡%5Üxȇ é­ÒDE…Z 7¨e©í€]R"I/ðǰø…_è”ax_à…Yˆ‡ZÈ]Ò ¸ƒ(…b!Sx+q…\ÂGì‡7(„4P4 dy(w~ç8ˆgyžgz®g{¾g|Îg}Æç2päɽH¦d&\‚.hƒ>h„Nh…^h†nh‡~hˆŽh‰žhÿŠ®h‹¾hŒÎhÞhŽîhþhi‘i’.i“>i”Ni•^i–ni—~i˜Ži™†i7ð„´º„]°Rh…¨€X°IØ‹ †ÙÕ®›…G@H¬‘„æ+b„L  „W0¥5Á…$!„D„ ¢fX˜{I`€4!?)JhNÐéT˜bØ„]è |à}ð‡2¨çèk¿þkÀlÁlÂ.lÃ>ì0 ü]€xlÈŽlÈžiÊ®l˾lÌÎlÍÞlÎîlÏþlÐmÑmÒ.mÓ>mÔNmŠ6…R…M@{à`H†Gˆ…gè€V? €x Üÿx0k2þ© €î€à§Eà Ø6 `@Ý„Z¨…J¨EàÀF„œ3J€…Tè%P˜…2…Sà…ZÀ7¸k4‡yFl÷~oøŽïÁVì!Ø%ØÉÎïÉVmþîoÿþopp/p?pOp_ð׬†…H(…ˆº]hÉ©`èÛ‚îIH„e˜@/I ÐnÊ€W°–À… …½ÓMHVØ_ „T¨…žY`…Z0K¨DcØ„}¿cPK+~Xoy–o'r(lC€pèˆ,Ïr-×rïr/ÿr0s1s2/s3?sÿ4Os5‡h 0k¨–cYð 0Px „ö³À)„IÀ€fxsÔì^ðWxN Yd?@'TðSp]Ø„Pð…{p&V…Õ]röŽç(?uTï)¯ò¸ò-u,ßYŸuZ¯u[¿u\Ïu]ßu^ïu_ÿu`vavb/vc?vdOve_vfovgvhviŸvj¯vk¿vlÏvmßvnïvoÿvpwqwr/ws_v7‡ê{ð"•_H†{èõ¨IPâfà RA¿ I€™$I€KðKè…¾k†T-têê°g°ÿ^h†R†U°N³á5È뽎ƒTÿx'ì)G‚˜W‡õ-?w•_y–oy—y˜y™Ÿyš¯y›¿yœÏyßyžïyŸÿùdw§ö…ª]I8³_O€?Ÿj(Ò³qA³~™å~€Ec €ˆ…Tx …|(Fðº[„`(RQÀL82 ¨…Ppa0g|P½6õ¿{¼Ïw@‚˜8À|Á|7(|Ã?|ÄO|Å_|Æo|Ç|È|ÉŸ|ʯ|Ë¿|ÌÏ|Íß|Îï|Ïÿ|Ð}Ñ}Ò/}Ó?}ÔO}Õ_}Öo}×}Ø}ÙŸ}Ú¯}Û¿}ÜÏ}Ý}ÿ]O¨6ÃgT| ãªá0 €ehŒ1&HxàdH†${b 5H€„%Ik‘ €L°QWr&÷x¼o×{¾÷ûÁŸÿÀß}û¿üÏýßþ7,hð „ 2lèð!Ĉ'R¬hñ"ÆŒ7rìèñ#È"G’,iò$Ê”*W²lé²"F Û°0@Ò¤“ íL,80°lèP:,«dà1g¸~‘)‰ à°ÌªFûà¥Ñç/Újײmëö-ܸrçқÔ[báá÷/à¿÷.lø0âÄŠÿ3nìø1äÈ’'S®lù2æÌš7sîìù3èТG“.mú4êÔªW³níú5ìØ²gÓ®mû6nÛý é$?ƒA’éx¢ãØ´ é7€ "0`ÂŒ“® ,@â ¸œ êgŸÙ2ië²oïþ=ûSL(YƒÇ“üú÷ëÏíÿ?€ 8 x ‚ *¸ ƒ :ø „J8am§0³Ì"™€·Ès™ ¹(£?æ‚ ?,p„’•.Ù%¦™jº)§zú)¨¡Š:*©¥‚vŠÁ=€cÕ"@‚Áa£$Õ‡™$2@"™ ꀘèâg«#r@žyèù£^:ûl|JJéÕZ{­µmh»-·Ýzû-¸áŠ;.¹åš{.ºéª».»íºû.¼ñÊ;/½õÚ{/¾ùê»/¿ýúû/À <0Á|0 +¼0à ;üð£0pA&ŽxàÈ8I"Ž8K¸ 8b‰ô:À"“82#Àÿ\&Á`üÌ9î˜(´9ëìV ì0C G`;t¶}4ÒI+½4ÓM;ý4ÔQK=5ÕU[}5ÖYk½õ¿£X² •X²í) übÆX€Àލœ-ã"0Êe"Àa¬ÀÌ#nsèH†’¥O¢Íî|xÎE qà ÷Mô>‘K>9å•[~9æ™k¾9ç{þ9è¡‹>:饛~:ê©«¾:ë­»þ:ì±Ë>;íµÛ~;î¹ë¾;ï½ûþ;ðÁ ?<ñÅo{>Ï<óеhŒ(Ó% ò*f"IÛŽ ù.8RgÇ“àˆ8‰%'²ˆÈž—ž¢ˆË¿¨âŒ;®þùëŸÿÿñýûÿ?(À°€< ¨À2°| #(ÁÚ¨à€Áªß$JqDÞ& n#À®ñ€<€ <€2šáHG<Šßürø£úí…ûû!ÿ&(Ä!±ˆF<"“¨Ä%2±‰N|"£(ÅÈ™Ž€%lb $À|Û˜R:æˆÎ„ †$`¾Dt@À€'–ÁN‡vRÀ¡—øˆ?œ" )ÈA²†<$"©ÈE2²‘ 3†#L˜G4c˜p„$0‰U¡'ìÅè\ሎAb£$ð`àîS³î(Ë÷äqÿP@ r©Ë]êÒ‘¾ü%0ƒ)Ìa³˜Æ<&2“©»$£oް@Q&ùÅX`#”4Lg>â$b|x!$°ZÐÐf74Ü,ÓI—ZNj¼|§.ó!ÏyÒ³žö¼'>ó©Ï}ò³Ÿþü'@*д =(BªÐ…2´¡}(D#*щR´¢½(F3ªÑr´£ý(HC*Ò‘’´¤&=éEQ EøÄÀ@à$B—Hh?>ITìx*NQhA§:“úv žðD)T£*Õ©RµªV½*V³ªÕ­rµ«^ý*XÃ*Ö±’µ¬ÝDp! Êÿ@EC ð e®hF*4ñJø!U©~]KЀð—8,b‹X³2¶±Ž},d#+ÙÉR¶²–½,f3«ÙÍr6Ÿ‘ØE1$ê ºJÂ':14|Q3â쯮¬` kXÅÒ6ý¸-ns«ÛÝò¶·¾ý-pƒ+Üá·¸Æ=.r“«Üå2·¹Î}.t£+ÝéR·ºÖ½.v³«Ýír·»Þý.xÃ+Þñ’·¼æ=/zÓ«Þõ²·½Ê-Fné*¾Ièô©(*áŽúÚý>5x‚j[[÷¸À>0‚¬à3¸Á~0„#,á S¸Â¾0†3œ^ øÔÊHÅ\±÷G|@{]ÿ÷›Ôþþ OhA\ ãÓxƾ1Žs¬ãó¸Ç>þ1ƒ,ä!¹ÈF>òrcaWúvS§øÀ$±ŒK°Áœ­U±kYÌG׸Ë2F2˜Ã,æ1“¹Ìf>3šÓ¬æ5³¹ÍÜíĞь Œ9vk*QŒ6Ôè)Ær:K`‚ƹÓË^v3¢­èE3ºÑŽ~4¤#-éI3Øh•4ñ€{Òd[‰…Xì±¾úµ‚&t ÝeJ³ºÕ®~5¬c-ëYÓºÖ¶Æî‘€$X…>‰¹6/ýx>Ԁ⾖:©%øY 6ã.P»ÚÖ®v<²­íms»ÛÞþ6¸Ãÿ-îq“»Üæ>7ºÓ­îu³»Ýî~7¼ã-ïyÓ»Þö¾7¾ó­ï}ó»ßþþ7À.ð¼à?8®ð…3¼áø¹¡!xÌõ™ Ä- Oôà ¬Õo³ÿúlBOûÚ&ïÄS®ò•³¼å.9Ìc.ó™Ó¼æ6¿9Îs®óó¼ç>?x#(¾Ì{êU?à/øÀ³¡ð†?<â¯øÅ3¾ñŽ<ä#/ùÉS¾ò–¿<æ3¯ùÿÍs¾óžÿ<èC/úÑ“¾ô¦?=êS¯úÕ³¾õ®=ìc/ûÙÓ¾ö¶¿=îs¯ûÝ[~ºXÅq‰Møâ¡uCŸŸ¾w¿öêèÂà£xÞS¿úÖ¿>ö³¯ýís¿ûÞÿ>øÃ/þñ“¿üæ??úÓŸùF°¿ýîw?äÙŸ‹HXbÈhF%r6ØCG|eöòÍR ÜÀ– œ€$ . ‚> F N V ^ f n v ~ † Ž –  ž ¦  ® ¶  ¾ Æ  Î Ö  Þ æ î ö þ ¡¡b‚!"aá+ ÿƒ,T‚&Ý> >8ݲ`ÊÒ  ~a‚Ž!–¡ž!¦¡®!¶¡¾!Æ¡Î!Ö¡Þ!æ¡î!ö¡þ! ¢ "!¢!""&¢"."#6¢#>"$F¢$N"%V¢%^"&Êá.4B1ŒB<äC¼<àC¨\aŠÜ ,€¹‚agÅ¢,Î"-Ö¢-Þ".æ¢.î"/ö¢/’”ä´Á=¸(Ö)ªYȳ`a*ÞѲb¾âÂ5V£5^#6f£6n#7v£7~#8†£8Ž#9–£9ž#:¦£:®#;¶£;¾#<Æ£<Î#=Ö£=Þÿ#>æ£>î#?ö£?þ#@¤@$A¤A$B&¤BŽc=4d!àäӢ236£•À`¹SÀ'|$H†$HòI–¤Iž$J¦¤J®$K¶¤K¾$LƤLÎ$MÖ¤MÞ$Næ¤Nî$Oö¤Oþ$P¥P%Q¥Q%R&¥R.%S6¥S>%TF¥TN%UV¥U^%Vf¥VÖ¤ £>œ¢?T$Èa$ómd t¤H¦åGú[¶¥[¾%\Æ¥\Î%]Ö¥]Þ%^æ¥^î%_ö¥_þ%`¦`&a¦a&b&¦b.&c6¦c>&dF¦dN&eV¦e^&ff¦fn&gv¦g~&h†ÿ¦hþ¥<(ã2þY  Y¢¥ZФE¾&lƦlÎ&mÖ¦mÞ&næ¦nî&oö¦oþ&p§p'q§q'r&§r.'s6§s>'tF§tN'uV§u^'vf§vn'wv§w~'x†§x*gjbY4@ HÛ ´fZ–§{¾'|Ƨ|Î'}Ö§}Þ'~æ§~î'ö§þ'€¨€ÎÏy¦g¬'{†ä€.(ƒ6¨ƒ>(„F¨„N(…V¨…^(†f¨†2hªg‚*膆¨ˆŽ(‰–¨‰ž(Ц¨Š®(‹¶¨‹&U(z$"Ô¨Þ¨¾¨Žî(ö¨þ(©)‘逯èŒ~Ž.½i©“>)”F©”N)•V©•^)–¦&’J2)Žf)˜†©˜Ž)™–©™ž)š¦i~nit©—樚ƩœÎ)Ö©Þ)žæ)²©›¾)"è) ª *¡ª¡*¢6 Ÿ*©Ÿ6i¢>*¤Fª¤N*¥Vª¥’è¢6ª£^*§vª§~*¨†ª¨Ž*´dª¦’*ª¦ªª®*«¶ª«–©©6ê«Î*­Öª­Þ*®æª€ÆªŸêª¯þ*°«°+±2 ¯¾i@;TT_v224_html_docs/images/glass/green/hide_menu.gif000700 000765 000765 00000000714 11222361073 021706 0ustar00abwabw000000 000000 GIF89a(ÕÙÙÙåååÉÉÉÊÊÊËËËÚÚÚòòò×××ÔÔÔÞÞÞáááèèèÑÑÑÓÓÓØØØÛÛÛìììçççÏÏÏíííêêêÍÍÍÈÈÈøøøõõõúúúùùùÆÆÆöööÇÇÇ÷÷÷ÌÌÌûûû!ù,(é@pH,ȤrÉl:ŸÐ(ô¢@,†v+x Å™)›Ë‰ÅR)Öðx¡\YK"çüy‚ˆ4zqy‰Ž•މ–ŠŠ›‘“£—™£Ÿ§¤Ÿ±²š§Ÿ¡£¥”§˜´–«‰ÃÈÉÉÏÈÃÐÄÙà ÏÌÚáÃÏ ÚéêéÈÕÉéÔëüý ìK7¯š=v `ðǰ¡Ã‡#J\Ç¡¢Å‹3jÜȱ£Ç1ˆI²¤É“(I;TT_v224_html_docs/images/glass/green/hide_menu_roll.gif000700 000765 000765 00000000714 11222361073 022736 0ustar00abwabw000000 000000 GIF89a(ÕŸŸŸ¹¹¹———   ÒÒÒºººììì···®®®ÓÓÓ¸¸¸ÅÅÅ£££¢¢¢«««¡¡¡ÖÖÖááášššžžžÛÛÛóóóÇÇÇÕÕÕ­­­¯¯¯›››ààà”””–––øøøõõõùùùúúúööö•••÷÷÷ûûû!ù,(éÀ’pH,ȤrÉl:ŸÐ(TdÁ@†v+( !‹*›ËF§ó(Öðx üX3.çü9’‰6°<9¸?\ÿÿÿ9¹?!ù,Ü eÉI«½8ëÍ»ÿ`(rÅ@`lë¾pÌŽtmßx®Oå™®² p¶+Èd¥‡R Ÿ1¥tJ­b˜?¨¶eíz¿9¬s«›ÏèŒH~¦ßpðº ÛïÊ9}ˆïûqz{A„…‚1;TT_v224_html_docs/images/glass/green/logo_green.gif000700 000765 000765 00000033033 11222361073 022071 0ustar00abwabw000000 000000 GIF89aÜ‚÷#q'EÃLñññ8†<ÆÆÆÀæÂÂèÄ7±<8¶>*ˆ/èèè0œ5QÌW«Ë­°Ö±þþþ5­;+Œ0õõõG'|+)….i¥l]§`¸ÞºR;$u(=ŽB-›2[Ôaëëëj©mjáqººº´Æµ¦¸¦‹š‹¿åÁ®Ó°¼â¾KÈR2 7` ºà¼·Ý¸­Ð®Z¤]3¤8íííåå剢ŠM›Q’«“s™v"o&a¢d*4+  -‘1eÝl¢Â¤f£ihpiu¤wKSK$s(AˆEXˆZÒÒÒ´Ù¶4©:ÆÕÇL¥PÜÜÜAÀG¼Ó¾ZfU¢Y(‚,ˆ³Šk†l&{*§¨§úúúaœd^˜a²Ø´4¨: " VÑ\6{:–Ø%GtIs!îîîZ]Q›U#w'ÃéÅ9¸?(-:º@(€,T½Z.”35T7E›I÷÷÷œ¾6®<%T($C%[«_P¡Tâââ&‹*1¤64¦9@“D5g7¯Ê±2¢73ª8z†z“°•fªiH™M¾Ù¿aÚiBhDWdW k#ežh$…(b¨e;F»á½45°;$r(1…54¨9Z‘]p•rf#8´=A™E½Ö¾k¬o£Î¦6;+/ 4O³T/—4'~+`b¦Æ§dÜk›¶œ/l3£+b/7²=@®FM‰PV–Ym‘o–´˜V§ZcÜj»N{Pz±}_Óf/M¬SŸÅ¡¨Èª=\?1q40½ã¿%{)—»˜0J1moÐÚÐ27%w)*l-)ƒ-5«;'u+ i$ÍÙ͸Ϲ,ƒ0+/&g)0\2¾ä¿lãs¼â½¹ß»hào;»A^Øe+—02§7(+µÛ·mäta×h%y)5ª:%z)lãt#r'3›8&o)]Îd)w,3£86£<*“.dÙk«×®³Ü´#p&z#!ù,Ü‚ÿoH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱcA CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒò@´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯Gç‰K¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·oY!€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ³#ô Dtzwø‡3ÂñÏRX‚ ø~ú ²Ûfv&Áè p$Tñ4›#« ZðØ—ñ†Û %ÐA¶°SK"(‚> ¸Óýøлò—ÏüT ·(‹Cկα¬`ëê8e¼ÀP¥øüŽ·Àÿ„}@~ì”ÕXA,Ð`Ìt6 5„è)›ÝB褻‚2°Ð7©5HŠP­¥p= “`6  ~ w W• 9@§oWpw€p×|Ø#7ÿG(§·+! z¬5R£[ó<Žçx> ~äyæÇŽ`N–P°çðEéÐ/Õ£oî14°CP.§iëÒ.bDFtsF„ Ý0€½T{@€ 3  A [°hà7M ¨hX†˜ i¸†j؆lø†n‡p8‡rX‡tx‡7P#÷÷rt¥We(8:w.Ø‚1X~8€b@ƒ•0ÿðXµ²)Ð hp£ Mð Ð/Þ§%Ô÷[ #2ót,`Ðwª<ÂS ؾ4v60 º  ^ ƒ¼p,rðaøx†gÀŒÂ8ŒÄXŒÆxŒÈ˜ŒÃØAP„:r„{Ã.îrxòÒ„hÔ‚âWˆˆ¨ˆb0þÄ¥ ä!+c!›B6=”×0rÐ F“¶Nƒ‚($(÷4a&<Žv­HvR  … 0yj·‹à¸ ÉÊø‘™VÒ¾5 ]ŠÙ7ŠÿÀ}ºõ}؈‡˜ˆcƈŽßàXEõtZ° µ¸)ê…)Å5yó+è7ÿ( 5U W’ä·8D p¶@^d7 RPÈ`u[`Qã(uÀ‹ ÙTYy•X‰•NÖ3sôxsöH?—’.ƒ‰¨ˆŒð •P æä ° Bz”ÕA¢€·2 ¼€‘)[`\é2ì£;Ÿ¦NØx> ƒŠÃ?0”ÅÖg¨0 F©z€z Ç¢~  mW|UI•YYšX™Ûµ‰° Œ[éNæÀ‚Æ8ys‚ØBV`–Ùˆ–$ÉcP y0¥@ñ TàtOk: B0¥ú`g £0\‘À`À@ÇRn9<º ƒˆ8fpÿÄQÕg6 ÀP™9@“\XQþ|ð™2¢9š¹ÀˆŸ Ÿü™Ÿþ¹ŸÿÙŸ: Z `V2.¹Àžé îD¼PQÛ×;ר›/È›8ð‹è’Ž´€f…œO—JXr _¨õ†p,  ÂÕC3#–9Ç Åp  ¡Û8f¿IK\æ‰ éI™Š GCJªPtƒä™˜öÙ TJ U:¥V  BðÃmÃ0 ƒp ²¥p% 4KÐÔÈÀ³£f¹¡ÛH’‹ø›æ—ó fÉ„: »ðoIC£@ŠÞÕvP@f  `s X-ÿtn*’à)§¿@n)œßrM€ DZ¤R rp48òŒµ³iJ¨N ¢°@:@‹è 2…UÒ€»¹Û›t Ži@ ñ°ó°µFu¢5Â_†Ò%\DBÆêp| YF\¼€qðp½Ù+¥Ü{Ã;}§À£Ë‡òà‡%ˆ¶9-¢öˆð2Æä7@R›ˆÚ¿!ú ÀKïï@ØP y€¹œ¢¬ 0í`¬2‰Jð1±‰°›i—r€»r ¹/à›Vë ´° U¢LY‚²d’p}ˆº¡Hsµ‰,g  ÿ Y5Ã×kŸk0É”\É–|É—œÐ7„œ7H(K¸}ÖHÌn¢fÓÉ Eç _¹¿™àT¼sY1Ö@ÞÀ’ ¹½ë¹Þ°K`;\çzÇ25W j|þ0ZÐQvEDঀˆ½+ ¯€Çhv§jfTÛõ­Òwi¾õÉJ¸;¤¸N€,Ð,h Øà·4Œ½øŒ½˜¼Ïû¼@ST— )…ue,ŠdW»E§°²Ù¼<@ ~¤ WÅÊØúÊPÁ;PMgT 䢥ÐË2[³à¸wÐ çÀE‡,á´§¡¶ Ï<¤ÿ°Û  €n¼™‹»£Ù\ÇÀl¯¯&YͳsuÌ‹‘LcÆã?€ ˜^0dð”Ã.v0Õ ·ùÜÕnÀÏ`½|g+ãä_»f‚è[+Ä à§²+«ÍÅ ` ´´ ”[ÒB-DÝѳ·½°•"í›4Õ© ±pç0ª.š˜ F=° S0+˜Ø‘:Ђ-[Ç•ð ið|¬@ü6N.§kJ#sÐBsÈ Xp¼ŠðT€ÜÀ "P^B×CåE ö|ÏøÖ–\ ÈxÃ+z3eýG/€£“:笭àÖÏúÙbPØq0éP@íÿ oÍP S€fþ`}Í !Ü¥ƒf@#˜Ë×ê»Ýœ: êÐØW ÌÜóp=€‘6ÕBëÎP ”©5Á€`»ûž‹ ¤-Yz:„y ;O6pÁRxS+^`ªÎF ~ÛH€Lð^€ U…W% %•ôIÜØ; 2>ã4> k°ú}Eˆi_é|˜ƒå¨ÕmÝ F®Íž[ 7 }°›Â @#Û°DeTüÆ«ùw [ @tßOP³† E»~fyj=”MN i؆:Ð ér‹ÿ Űà‰/0’P ´°†P#–FÀ=®u¸ÿc˜:^€°~P­5âÔ âHÐ © Â¥™qJ°°ìÕ5Nã°¢Þè£ÔÙÔñRnß× C>ä*kä{Þ¡½‹Áïp:Ð $„œv©0(BÔ/ÞÅd‹€i22¥C0Oðñ¢¥P%~„ìå:5mÙðæ;–†ÀXZPÌÈú{=yëOPØpÙA¹ ¾$ˆÖ®Ž,Üù5€‘>é•Î #Žéœ À”ˆZN š(0^ê³@>.·+"Ä(­]sþUÓÖÕMë×mëZÇþ[ yL+ e,h hÀ x˜$}[‚>û0˜(ÿ/\yðýÒÞ¹ 0Ú Ø£ÐØE§©` S°ØPâ«;°S KÀiÚ‘^ »º{½ ÏNîÔ1·&äÒ›ªˆïø`éL0=€ €l2š¹ êÃðx_ê© Íp4‚·7ÂB›^#ƒS V ëϪñF»{u\¿àˆ ` wjÞé'¦ŽR‰2™[€—Ë;åÛ(¬ p £×ÈóÒÎR¬ p+½âðPКLOÉ2¾¢ $¤™Nà»»çÒþúÕ°Zƒ gzyÀL¨x„ã¨;z e¿ŠËð¶@$ÿÞ l P ˆ ÀyÉô™Q Éxð³Ð2¾" ¾š‘·Óu‡©h$ëü­@P"„/žŒ¡!‰Cµ Phų6mÛ2èPÃ#^x™‰ Åè<0H±„XvþÍœy‚™gþéóäÅO: _UÓ°"3}(eE[„;Ö¬™UÕê fRDêóÏ 28]PØÃ=X£xñº“MšM&hÑ!ЩVyA€°`ÁG­={4Xf«§hFØâ¬F ]‘ ÅÙ²å\‡+r(¢DDžµ j-‹BŒó i™p3O€¥Cÿ!"yuëÞ[ÐàØŒÆÊóª¶u6m uã¢!èsWñ´dT‡3g:ôÙ)R'3£îè£$L `:˜A€ÖŸ?ŸÐ ^m…†XªÐ°F­  ¢ÊªªL›ÂUˆ¯¼x‡ p(+ât&'&pF‡ô b¯ÝzóëS–)¬‡7¢É$ŠIlæÇ"+aFd’„ÞÊ Î< #´ÑD3m 8âÁ̸ã-¸œ`J d˜Ä‡Ýt$/ƒ~n>IŒƒ‚Š6À9è0BO Q’0'„x‰&LÎÐGŸ301¯ èr– Î@À uþ™ Žø¢ƒ¸W¼Ñÿ!ÎQ%´0$\`È!Ðb”H"¥?Äx,… Іp´pb&'E’b¨¬KßÂ×Wœd .±aÈd,A—Ñc[èêdüèQ†€ òÒ&ÀsRPE§™ÎËÓ 6¾°bVZÄ·ƒº€¬'¥”/­Â2¡“«6 šIbµ’äV -V¸CÚt€e‚üÙ` ÒÑoDœpð' hXÅ8Xh‰åîøGƒ (¥ŠZ’ØA‡;xéäÑH}a„â'Úù=¼€E /¤ùâ rÊò ²q¤.X.A`¤vF]ü(¤CúEÿƒ[D €% •v´K)€Å$ඉÚnã™\,³Dh¬uÙ/P*Xg“y/ºa upf—<©ZžÐI}fÊÀ™ Ö ƒ&Vhbq´xÜk2·&C´ˆe”sxI\G(.kPª™ ‰XÌ8§Lšp&À‘K¦Ö™4î8ÐÃa$fàŸæ…9ļØ6WË b6k€o¶IÚ†¥™f)¤ˆúE¼@&œdÌa->f’£­;S Ú …¬¶””–ˆe¦ ä(Fù+™'5xác>4¤ÁcÒHž´¨ákG±…¼ŽI+˜æÁ·=i¢È€!6aÿM„ðñ -Ö¡ƒ3¨ƒcó!†'ŸÿUÃΈ/B*h@¥4¶»äZ·;HŒc €7ª diVùK»èSœãPÀ7hBõ®w=)B9ðB†Ð‘´#[XB þá*¤ÏG_Ò,tÃñBqÒÕîSQ(4 g±W`#÷¡‹¸ŒaT­ÃXI:Ánýc#ÈÜ&¦pIhÄã›Üd<¦@u¤H@4Š£$e)rø ©u1EmÇQ˜ÑB* † €ÀLhA{ì£GU¼Ÿ-jHê*€4P†HE®ŒBÿ0#¶iF2öQµvŒc[pÍüf¢…h3uPÀ$x.€¢HÊ8äf7nK3ÛPœj´ ÈC Šè?‹U Ó—=Ž4Žqð ‘.éCLd£ÆmàS °ñQ(¤#MƒGII)¨ì øA>Õ¹Vï Dêœ1Tj!ÛÁ ‚Ÿu(ìÀŸD·QH"mØc_ ŒDÌá7@kÞÜ@ñŠ`ãKÉÛ6RQMHAÞËE yDt%[Q…:˜ôgAs-BdÐNÐä4*¨fЉù5AæjÛ–èðÏWD "iXÇ:<š€W¬Âÿ tFPVQ4h¡è£9ÐÁ%˜&‘¤‰!&  øc$„)#ðÚRƶ”¯ÊTªrð¡Q,ÓB%ZÙ¼Ã^5ø!AÁ ô4¨*`.s{ا>˜Pgp†^ ‚Jö Âà®0ÚEÄ* ë˜Âr„z]$}óB8$Ñšã-qéxಠ/Èu®Ïú€^õª‚ÈE"‚ó›@8Œ§®vâb )Þa Dx€B@1Ù˜5â²Ø8å ô¡v‚ ðD Â#ì(¥¤2•¨Ä¸¶òé`QÝýòczømeü mhá ã…Nt0…J•¦¹KÿVAt`‡3ŒÄ |Àm"PŠ€^7«XE”zUˆ ÇÁFoz qbÛ @ ä× <GòBn1Ïiӹߺ²óGþÝ«äÌ€sè” ?1U}P4€ ¤@™÷6— x¢ èßa±š g¨ ‘0/ÌI¾Õæ`©˜B<ïÕ´øÎ§:œ<€"«ä5¯¶ƒAˆb«ØÆÿVaDï7Pðu8¦¯ôÍrMÐè©K(J ¨@-ÙÆ­‚Mˆ"?çàÄ·„·!u)N¥R¦Cc»„:°;u8y iciAEo@þ¾ÁzEð]Hb·XÍ8 <3 H›CJ$´ F·GR‡x+P+˜ø(¾âÛÎèºw Œ7ÀÈ€>¹3@U¸ƒyÐÕI…nË—$8†j ‰b‰%è Øá¹<¬‹yÏ);7Ù‰y˜‚ø›¿Úª?¼?|C2,C3$C>À‡É)®ãB†ÿœƒ™Bjè¼c¡&¨”ŸJC3l¾X0¥ ø‡šC€NX‚%ðŽjˆƒÚÐ €A­\h‡qS³(ÙÈ£Ë `ÁtAuŠÁΨƒ»R¾´AÀ‡“A;0=Àppkƒ³‚(ÏbÂN@¤ 5Áž9 À™R¹jð5`¶& l@P|7QE€ećЀ&D›ë“تü,”³„‹TDÉ?lœB {…ûмOq-x S1”IÉœLftHCð»A’ìÉ@Z”Ý‚-€ž‚LÉDÊ…r0`Ê!3ƒA4 ` 8[DÁ™5ƒA‹È²| ÞÔ…´TK¸+ÿ¶LH…,NãTHØg¨ËÐîØ´%ˆG1· É'8ô˜+Lïâµ™cGØåRgÄõ\OölO÷|Ïä,8ÅŒ/†ÂܵÔI€Œ©ÃÉåâxϸTYXƒÓšš „3ˆu€€QxP0Ásc‰+ 2“å€&Ð…Çøƒ?†`À¨%N8Ñøâ¨RTMUux¾&Õï†$P9ÅJ¤:€%8YXÇR5¸ ð› X9E32„Æ ¥’ú(g•ˆT[˜ÖÂx`KETEÝÖ00SxQ>0 L›8'0'è6>I(©’b¸_ãœü’$@a8LC¹§,90Ó8U<ðV€ XX‚XõÌ£ÕZ“ƒ]KR}³›wHX°N(ÿÆäÕ%Øõ$ÇYØH4Ó gÈ Û´>ZHƒv•?”z­×ª€T° ™ÝˆC=TœÍYÝÙÍŸõYªŽ ¡ B˜xh¬”­6–C uPÉ8ðÎzU9'‹…ÈM!XƒŸ‚ŸíZ¯ýZ° [ŸÅ¬Ð¼œèœ6Ã…›yÁ“×¼ öƒ…[ÚZ±ýÙä ×õج"ƒTœÈÙ†wX×¥u­”š ÃõØmhX\Æ ŒšåYÈ\=Ê[À[½}&vmV•¥­à›ù”˜y%ÀX½*g€ô˜ÇÙº¥\×}]Ø]Ù•Ý,*«5»`º†ÄB´xx=QðÿtH™@¹EÏ,˜ÝÊÍõäØ5ðØ(¥grÖióB©¨?j逎½8íå^pÜ0\ñ…Ü׵ܿË[Ø’-”úÂÒÐ>ÐÒHù…y…ÕÃÔA6D›ÑäÚãE^þíßÊÅg …õè´tpQð(Zx‡×› ðˆQ˜ ò<ãí_»½\¡E_–ÍàµÞdDÊõ‡a^\š_ÖYxHá¦Üo娼•1Ûò©æbÕúQh†¨BRÔÑX˜FNÕ( 0…#Pa#>b$Nb%¦Üèu®ë@TP`¡;-YàtèÌØ‰wð¼S-b%Va×ýV< ÇK© ÃaÿÇ^ÝX ZaMQ;¾c<Îc=NÑlèc?^áo½\’©1DS<@Ø”´µÑ…U_ÔY¸É€CbS€?¾dLÎdMÞä>*;°ƒQp^èƒ Qp-5¸Ê`I…bdÝSµdN¾d1d v®ƒ5íU"cõÄÛ8v€nšÝcdNf;Öd1VÞRl¾0”RŸcx°üÐ’Ó‚Â$] [Q¸Ìœ­åƒ, åZ>çs†‡,.LÐuì”u\…RàY@+à&ÑTpÌ~-gt¶e®à˜Äƒi>â>Vg<f9žã e~h=†‰žhÿ‰¶åÿUÏ‚6çl€€lˆÏÏHq„ÑM^˼„Æ”e<°dŠni—~i˜žèl8‚Y€…U9ƒQXǼä¬v0‡Ö8&Ñ `ÉY@Ï#Øè˜†iL^á×MaLvé™NNÓ€…^ÜÁphˆÎêMj™®å–Îxàé˜[d‡Í¬Ï ÑÁ†¢†£æj¸†ë#HHM&}ʉ¤H8 @ÅÑb,^<@ê¸l†x(c‡…æ^:Öj­.lŽþã$.â&`ÄE9XäÒÃF¸Z­Å< æ0.ml™>lœ…8a¸jÇÎj8HnåVn¨¾å‚ýV( !rÿ žÍL‚F0ITեЀüUÏço%mÔÎS€Â8--gH­QJl‰^nú®oû¾oü^nŽ>o ¢j9¶ê†>nˆ¶ïßVç±}Ñ™*YL-‚4Ì‹ùÉ–‚CØWÖ…Ì(¥LÊdÏŸuêƒÆX(5„ë<:i{ïü=‚ùÎooñüæè,Ú …ÿp¬ðd~qŽ>g~fh= À)§”AC¢Ë+ŽòHÖ2ÀCÅc<ÆÃ¿ ïUÊkPm š‚ÓÒ°QË€’r-årkpq3?sÿú¾r‚/îÇñ¿oކÕ†QŽË%j™нìˆA†ø®ú¨-€‚&Í‘y5xÁ”¼<ø$”QJ9%•UF!¸áãM+¾•ƒa²õÿd„CÄd¨á†õ•4vôaC}¬Kl(’ƒC˜ˆR 6bÑBŽ:îØÙKï¤hCb€Á Œ`ã YdÃdTVzú)¨RFx.°‰ ü¦ ˜a>ùYðA?k–Ѧ›&H! &v@`F$‘˜±(Í4ÓÈ>!„°Å9ý£AàÒCF|’Ùz‹2 šL² ä|-´@¤‘H*É©T¡ª»î”Xš™[óep­.ˆ¾’j ïc+®9‡BMü#'°¤À€æÈ3Î ) áì 9ü!­-.X‹­fšñØÞKÞ‚ûɤ%»ÀHO|à‘ÅRN¥ûÿ ¾1Ë<3Í5Û|ó̺K!>àË$Q ƒ½÷æËKW¹Ycë­7‡B 98ñ&wðrÎ0°)DÁ2†ôC¡œ,s;åpܱ¢Û¶'r¤9•<é¸E¢¦šRNuú$Î}ûýw¾º›¬ $°Á6P±8ã;þ8ä‹Ë\&|lÂ4ælrh‚&­ £±ôq€ƒ£¨£Œÿ8¡E!5ü µ‡¢$ílkËÒgpÇWÎÜsŸÜ>ê, ›“ª~<ò6C¡m¹-°CÈPõÕ[=öÙ×1yó–gŽùrðŒ&~(2Aê2R’¾ŒèÐúëœdl ™Ñ.Ží·£ÿû£»×Ô{Éêæ‰»áaS.KWò˜<Á!-0PÁ,"P°‚¼ 3HA™ªØ—÷¾°ðqŽo‚&ö$Z‚.Œ7äPغÛò‡;ÏxKwåÉæÖˆáRIÊ›S¢¤À%öÍAªÜóš €)R±ŠV¼"§ÈA’JV—ᚘãœg|Â.¨At h`€…‚0 ×ÅZ` Rr?üåÐcìñŒ£úg öN\ˆB)Ž„7ú‡]Ž\/b¥‚( @•¼¤%3)Mrr“nø$(C¹ÅÆ*„`Ô‡ö ¸Àœ@Å !Ëièâÿ® .8A­AmøÛcý¸ÃFùH7‘” ‰¬cùQkš¢·þP³šÖ¼&6³)!@qRÌ$&+ÙÉOV¡œæ<ç99ØA¤ï8e†6$> `•.XFÞ`𳟸ˆFlÑô2ÏØ#Bk×±,>M!Å%Ñ.Tk „’M-¥eÒü(HC*Ò‘’¤fzà,¼™Å*rÒ å|Lc*S˜ªìt'R«ÚÕ²¶µ®}-lUˇI®zÐ^d [¹Öµ’xÕkLù:!ø5§àsÓÀzÊ#`Á‹uAžP €v½îuªÃ•£»Ýµl! À^•ìhAŒa ¡žøÆ;â;…ùÒ·¾ö½ï|ã«ßýò·¿ûµÆüaˆT(.r‹Š ƒÔõ®/®páA\ãf.•] 8©O¸ä ÖÅ.vµU–x÷»<ì!ÿ¤l2^ònV\æ}1ŒÙá~Œ…Æc¹1sì~ìØ7Xø1tƒ,ä! ùƽùM½à"%AT €\}›Woi..…ØñqÙ©m³_SA,æÈâpÄÜ-1xºbºµØÅ1†ñ`ã,gæþ¸Îv†nsLä=ÙÈfIòp”€àK™Ê"²ép±œeò…ËŽvôu»<æìB•²((19ÒlÌÿ­¹Ín~³yçX¦žð¢µŒÜGóúÑ“¦t™-iM_¶ªö4¨_,j9›ºÙ§FõžUýg{€2¨«K÷ZåDçZ×ë5¸çøùk2O6[gö.±SÌé{ºÉõ²ëlSC›ÏÒFrÑDeZO9¸Û¾r·ã¹åpƒ{Ü俣°Ñ|b‹—ÝÈ~w¼å=oR×;Ú~Æ·½”@…k Û¶þ7®žJ‚óÚà"N8º^c;¼Íï^nÄ'NñŠùÞ¬.štqÿÚè_¶ÊÕ|l—C<æS§zÕ{ñ›­Ï{þõ€3Ú c'zÙ+}t´+áMàÓÛï·Ã½êWǹ 6>ëZ? ;TT_v224_html_docs/images/glass/green/logo_purple.gif000700 000765 000765 00000031557 11222361073 022311 0ustar00abwabw000000 000000 GIF89aÜ‚÷(‚,(ñññºŠåÆÆÆÀæÂl”t)--ÂèÄ7[FèèèqRyA½0œ5°Ö±z„ƒ,Qþþþ#q'U&™7±=g²8´>õõõb“m!j$l5²7bIµ…â&{*¸ÞºbŠl)…-+Œ06hHLOO‰Tǫ˭$u(EkTS–V ëëëV|ag2¬*ˆ/›gÒ¦§¨5¬;¿åÁ®Ó°¼â¾˜¶šJ0j——¤q¢y¥¸¦ºà¼·Ý¸†‡–D„­Ð®\Œi3¤8ííím™uåå墨¶Å·¬zÜ%S‚a-‘1Rv]2 7o›wÓÓÓµ¾»´Ù¶4©:ƒLÃ$s(ÜÜܽ½½¼Ô½a.¦r9¹–aϬ²µúúú&z*VAmu|}²Ø´6+F4¨:mvLt[Z‚eN|]z|†8Uîîî“®”\*¡ÃéÅ$x(*[5"9÷÷÷6®‘œ_…hk—sGsXR(‹kœt1a?#r'v>»(+6ƒ9^:ˆ?y£Î¦pru'~+°¶¸< d¨wÚ$N.¦Æ§z±}gœrNoW½ã¿jjs-|0pw¦xÑÕÏÚ6«:©Éªh‘p%w)·Ï¸Ž¨IxZ(W3',¾ä¿¼â½¹ß»¿ÙÀq8¸%z)s;ºo7µ½ç¯~Þ(€,µÛ·5ª:4§9%z*ޏA‰D²¤À%u)~] aC„%y)3£8¼²Æ(x+«×®#p&GŠ!ù,Ü‚ÿý H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë‰bÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê”&±§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª•*¥­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈážX̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËæì­¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹sã'JxN½ºõëØ©Ó €Šïߘÿ9“ v6èÓ«_Ͼ½û÷ðãËŸO¿¾ýûõóeaF…. T I$µ¼0Ç\|¡BgàG_>F(á„Vhá…f¨á†vèá‡ús†!È’p0Àì À"Ï4òu”€ŒŒâŽ<öèã@¹£=Ûy÷EpÀA&°£H#4– e u`AcQ؂㩙Ï`†)æ˜d–iæ™h¦©æšl¶éæ›cîçÝ\Ü£‹d”%0€Ž-ªëüQIR2PL0*Œp—p’ÙÁ¤”Vj饘fªé¦œvêé§ †*jŒ€‚Ü ìÈϼÿPB%Z1+ÿäªëj´°N1‡V²Žn˜Á˜£&«ì²Ì6ë쳜pw&Æ!É™dÂN;µÔQÉX¡†®äöйÿL`E¡•ÛB±èAéÐÖkï½øbZ¤ GVpg«™( Q³N jàŠ®qÄw»!¹鶀•„[ì lä“ÎÇ ‡,òÈù–lòÉžî×÷Ä¢b¶<ƒEŸè´`…Âä&Ó° B '¾ø25 àÅëÃÂG˜AŒ=Þ¤"õÔTW]53Xg­õÖ\wíõ×`‡-öØd—mvÖ˜j"ŠØ¾j„¬•\îèþ£³G5ÿà÷ßÝÞÊy¨A®ëþQŒ­J ÔÅ-ùä”Wnùä[p§‚ Ö*ÂN«Ûv¸×݃x€Ç'cü ¸ ÞÊPƒ‡ˆŠŽɨ01}].üðÄö*pá/«0C'\7à ¦¸xì²ÏN»/œàqD®«ÓÂMg ¾Dã´ïþûðÇ/ÿüô×oÿýøç¯?þ˜!,`¬fF+›Ñ ]wã™Ïº¡½íu£¤%>NPã㛀®°»4jg¡GHºã„(L¡ WȺð…0Œ¡ gHÃÒ" `&žá-¹ÙÊtH]ÿPà‹Âv‚ûžÐX0&Ža 4…&ˆp@ÀV@ÇZð7pÂߨÂ,fqŽ2šñŒh¬¡×ÈÆ6ºÑ…ÌØŽæB6œÐ¸a„lQzåBÝÃVÇ #n/‚KT‚¨‚FRƒJàD$‰ÐŒ,dá½8Â$4(· $ã¥(Â7ÆHF4š²ŒH¥*WÉÊVºò•°Œ¥,gIËZβTsâB(È ý‹Ã’j±4œåŠzñ < ͨäî@„M¸a-¸Â:Æup€QŒ¥<%mIÏzÚóžø|¥FÄÿ³TÁBJj‡Œj„ ž±*ÅW®x€½1°™Î|à÷š¸ÈP|"›‡x„F‘M<`œà¼$ ˆpƒ#à ´B9Q 0ŽQž¦Ì§LgJÓ{¦£Hk»V›$Ð͈JÙˆE žQ •þuªCÁš Qí=óeä'®™Q^âªW…†Fó° *ZRœw¸Á Hà 5\a‹GÍCJFRºõ­¤¬©\çJW9ñ I@žV‡ç©C‹À¢R$d 3Ÿ0 ;ï=Q b@ÁT³©QD`—€#H±2Pñá¼$I{a 7 ´†ýäZWÑV¸º°­lgKÛÚÿÚö¶¸Í­nw›[å²e¬rÕžf=ºÂ¼ò°Úµ»xÌŒî!g—ÈF&€ªÅjV5ë#|as˜Ã$TP†;€Sœ$åAŽÐu0@®ð`ÖFxºÖ­¼Í¯~÷Ë_þ²$2Ñ=R´Ó¼mV><`Ýþ¡ hQn¸rCþÑ$Buš‘½(vaYír×HÊ»ÓQ‡ˆ á -9eÁ\Áƒï?ŽŠµŠ² 8αŽuÜßûøÇºuND`Ðq«¯¤»ºNç†&.]†ðŒ[Ç@‰Bu ­&U«Úá¬^b³ÞùÏ=²Ü@Äì• Û(é„JÂàÿ½À.`‹(d WGðD BYßû¹ @´ û‹Ë»V xÒÓÀž=csgx8„dÅ'‚t­CÊ*ð…÷–Ykn˜ÃÚÍ,g×¶*<ø=lÂÖì„6g!½¸X¯-JPØ\¡ i¸CŠÀë^ûú×.¶°‡MìbûØÈN¶²—l6ð“edÖ«™e6«uh@ ÖC¡ú ‚Ÿ€\‘ÎuÐMNdA†qÍ"¢Ë™eDwû¥"#G¢¯¨EÎ’‡V·yÅrÆEÖA0ÃÎøM°Ã . …8üá8³'NñŠ[üØq¤Ö‰,À·õpnuK† õÆ7!˜¼©Ôÿ=„ °ˆŽšÍ˜ÛÔð4—ß­ÝÍ~ç ÊCt«Ì̧âb{zGxZÝŒ°¶˜²8Bj.öàThÂÞðˆ[=ϺַîÈÉ»HzY“!º|RWLä'|±Ø“›Ü¿€Ý…/è +üAn¼C,vi~UD€Ù?u*už`·šýAT @áo7ËBβ(ƒê ¨ô“º …ÎG á ÿ¼è¹NúÒ›ÏÎy¢‡Û§FOogÖcÛÝþ‹¸@³Cdp; T¢x‡@2ÊwhŒzãõæi-h­Žp)4©#¤¿Û\ô¨W~ dôº‰€°ÄÿÔ9úò‹^ !pAúׯþö³ÿýî?üç/ÿúÓÿþûéç˜Uä*ÂÏÊðÙ¶P‰×3J XLÀ´W{zp{„e(p]p;ˆÂê@:ΰ sÔ†¦$ ÃWãzi¬ã7¦à ÓWIDðxe ²psÐu`pn° ™7~g~æ:¸ƒ<؃>øƒ@„B8„=Ø?€"J’-¡Ck>ô|Ú6rCôˆ€³W{·'Q}ÐD»w…Àafà 3ÂWðbx0¾„s÷ÐÁ¥'=w07óznLJð oç7Ýà CNwqV] †ðµ Mgk0Pƒ+ opƒŒØˆèÿG„‰’(‰#pz0h0ú¶dÈ´:c0…TH{ Ø ðY8MŽð€×Tï†â  ƒbx%Xí m§ö ‡xqØPÔÐ Øp€'8œàjäÔ‡e° -8dwtóITy §ˆŽX“x؈#ð;ŲR\oˆxÕs=¿p€æ˜€WÈÐÄdYp]\ÈŠ­ˆpF %ð'ƒr1QPµÐÅh¥Ã‰Ñ· }ÀÂŒU;³Ã ¢e}rÖ]° Ú§†%ÀE]Ôá×C WŽ˜"‰Ì°#B;8‚À*€sx9DyãPÁ(Œ¡ÿ(µ÷ zð@?@QŽài«XâðnE)âP"0¥oê¢ê°\•à'×özj÷‰æ(Œ'·“ÕD]e}-æ‡ù_p‹/ðãâAT@â7hð‘ Ɉ!:H—sY—xy—zi—|™—}¹—~Y—^G-8‡\àK*à4#pí°-Q°N™7x TØP™SX… Ø“ê8í(”…ÀŠH‰”®øw‚ NRˆv“+jð`.3Ù‹ÜF‡BpŽ Ø“­ð¾0M1—-†  –]n€hFð˜t㆚GqɈùœ ˜Ò Ó¨×ý¢ÚÙ±ÒWøð0ˆÖµÿ¦+È:L`™Z¹•™©™·9H°{ ð™E銮x Ç·°Ð*íPçAG €êÀAç£+ Cr­P™7™“™ A§ØiT…eð›9‘xðˆ†ùöI›  Ò˜ˆ‹Øœ7H—I@¢&:—'Z¢(º¢*Ú¢)ú¢`*ÐÆzbP Ru ’øhpÿ Ę•¡¸“z¤Aêø}à 琢Dš~7o"vP £+MƒÛˆA¹% Û¡¥–- €!Dðdä¦EæÖEŸ€ '°¥ø '{]À² °Ž  »ª·ÀÀ¶*€аW÷ö<òêh§ó0#Û¨±üyLx ÁL`ºPÕŽ(°q ­{‹”Æfþt'ýGmš(“»b¯3ƒÿ˳q)ä[¾æ{¾è‹¾.ðuÈ÷®ÜÂ|h‹@P8Ux`8P†¡{Ô¤Äîé¦p½ÐÚmP× À@ »ªHð¦ ÁZ0»H.È”#08dõ©* •B°? «pú¬ò©·Hùeýá²§|H67¾+É +‰óV G@âê¸=ûÃ=›¾B,ÄI -FvÁå$»û^›‚jç •irz`;‡“EÃ"º­ú¿Ž½ 0 ,*,_æ*€ ÜNŠá§f-P Åð'Ù–@‰y´àPqpX°Ÿ2x!, ˜€?@»ž–Â{K«ÊÿSoÙò$5¢‰gGž4™_pp.‰£† â Ä üC<ÊrG+S´«×†6ãhG{׃ ‹€¿Ð €Ðú'AŠvÂ) Æ¡ÉÂ*v ag줜ù¼pV  «vƒ:á1´@ þ O!à #†PTÎ¥³‰Û°[ŸšÕ xÀu«Ôf±h7“¼ D –` ‰`GÐä¦NìÔž¾¡üºPÐ}Э ƒY"©Âq™‹qSÁÚF“ðȯ°¬ a Èzà¿dp;jP© pÈ…ÎÀL«Hü W fÀ·ð2ÝdÿàÀ*€N£RyB‹ñŒá ÇÒãy ¬Î¤y ) ýžïxÒb,oÃܾ7Íǽ %H° žÚðÕ_m ¢° úì « ÍnÐ Óx>üà ÐIà[.,v¡Ãç3ÃB„?€ 8À¯ a°Ñý»Ì-0•xç ðŸ™Îm°Î3ªWzòVàAH€Æ|°¦j\MPwÏÌEÅ‚Í> ÔéÐÌà[. °|§¿K=È4ý¼'ÝÂDF×d‡o½Ë‰ s$ÐDào‰Ö_- c½deVhõ}SБ Êo]Ð!`˜hOB0>ÇÊå ů€°ÿ ²- #¬¥x bp Å€`àbŒ°Î¤V©÷<ì¤×™Í%ü¦xYÔ|®Ð;Oa©`Ú¨­Ú;*P /€š*°T#Œ þ»Æp b;…´­×Ä {œ  Ó×xÄmÜ»°õ° þÍøj70v°ylÊog°9À¥C1C@Öös¼˜L,}Ý×~ Ø‚ Uû“ÛÅŸ GPh6†h†€*Ö‚Û¢£âgu0]ô?لܰáð€*ÐÌsnà ` ©­~uY¢rÐGP 0ét`rF®?`ÞpÂ$@±ò´¹°Ùmâ–ÿ  b½ ûP~à.¶% ¬,Þ–=ÌÖ˜~ª°éœ~C\ИU=+WÏwS“b Aî×üØ}ç_Ž5ý¼àÅÜf`‘€f ,XR/`4ÊzàØ+ó'®µ]Ž Ù&|Ó-ðÌ*å#Ð©ÝæI@¾mnÀu°4v`ä$ ë(pM~}Õ„!…Ô h0t'¨‡$nâþè’WÁzy@.žˆ™Žéœ® ºpPzÅðgpp³Ïå9?ñªþ ¬ÎÑëA ½³^ÃPë!C ž×F¯½riJÇñ›3¨“ « ™G€­ ì/Ž œ™ìI*ôsYÐÏép¾¼ûí·Çôë*@1 3€ P¦Ýä–©“[Ÿ•$R£… ÷>öc€è€+~âЯé›Î #¯"X á8Ѱ){µäÏ÷­nºûÿíñÃ@'mømfG€ðìPëàhÈ5¯xý0Ý ZÔóy@ó5OذºcþÆ#êrt©"XPUG40` ÁU0`ЃÏ>}nå9’ìß¿dܨ8ðH &)q¼JùêUaB0uûÀéÎ"7nðÀÕ³Œ,?²„Ä¥‡(->º)CÀÒ”!A\ ZµÁÕqÚ ¨³nÂG"Ü ‡š•i]º S˜0L˜HYìƒ$\¨ Æ¢ÓƯ_hfä2‡]¦X®|ýw䈰‘?Š€pDE€gˆ±áfº?Eh5qâ[d€¡0ÉJ1tVþ¹"„ÿÀƒWu7£ÂÊ:ëÔ4Ãg"Ÿ‹?cHÀqYÝÒ¶\ûê-¦Š?ưøt£OŸeº,*´Œ¡\±{±øÄDN¡J­jµÁ¸#‘8¼@ÇX„e<>ù`:êØz .BäÒc. 0B¼†¡£/¿.ad07Y@?vÉĈúûÌœsRé23Îð焼ñ& |Ó ¯þQa Ó,ºåAG€ÀŠ+ÔiÁ•Ñl“#·Ýtk­Ø”rãå³r"R0 ƒ _,Ð-B²KM 6È£§ÄëbÍñdÁÅApƒ‹ $’Jdû‚M¨ ¢‰) ¯¾ °Âç#òÿ%¼\É@¸H©ÈJJ/ªë®¼ú‡3T8BCI8°3vÚy¡Žœ,ZN †–53FÈF6¼I%Ÿ-:`f‚2¶Ù>1n.>.uä‘#ZÐ ´ b&„$jR·3†,Rƒ Fó%£ªÄ KaÂpi¥GÙ‚I.ºP ¯x5Ùo“/øt D%õ…J”I¨ PИŠÐTQ¡#ºZ¥éÖ‚iL,r Žoé#\äP{0¯Àû"Ž á ÃL‰‹(j±DPáŒÙGžÒaãç|‚î•cÜ\Á+þ¸B)ð0m.ÔÞUÿA (…kŒªe²IcŽPãÙØ\9"Ž?>–·ª30.9ƼòÚ«D±×Páä”WöP‘ZJ¸BÏÆ ñó`;žêñ h€7Jh$©÷v¬Ø:¸ô¸èÇpæFÁGÂ!‰[ª¬ºLFæ¼Ç3á ,PE§+h^*Íòñàw‡â>:é¨M‚7¬Í¡dHÙÔÂaÍ5§¡¡kkXÂ{ðPa5®¸Â«ÑX ãtמF˜÷á—ës»èÞà~½è(Ä/qò¶†<!=÷€…¿1€gœŠ·sXÜ@‚DÌM‚ãpA ._( ÿàÁm‘jÐÞU·aÜo¡R²Ô8b*˜ƒ2q@#œªWÐ@î$¨À þ`C:˜q¼ä… iKDžò2ØGÃ9 ¦GŠdÕCB‡:DT |K #¯’­ ´À|3;€ Ó±O\¡ß ñ—¿ QÈB•Ên8SÕ¡^ô!X’q„M$"‚ƒÊ 0øHhÐ ¨ÃdG.Óð\]T#Ã;JH/zYa8Ð+ÅpfpF%h‡ª§©¡‘éX,c† ül GtµäðË$S˜IxbAœŒ×Ë ¸bƒÜåˆÁ 7Ê‘ Òq›ƒÿ”Q› pÁø&°óåNxE(FÇõn}ápD™B™Ç ¦SC™¨:Ä—Õ!fh,%Óƒ .C‘¤ !IZ@Q(Ôò@GeÕÍn‚'.!3luVª ݘÕu,°‡’¡Œe0C‹t¤ƒgÌ0Zòpc]ÄÔ »1ã˜V¤#E­™U›ÛøZðbØôž6ËØ€@À¿QÇá\1ÎûᥜS-§ GYQ:”Œ08 ËfW»ààn–‘ ÉH ƒ:¥ säA/¸„ ¸8 éV< ¡wVt$±Á’a†Sç"vÁËÕ†%°˜´EÄHi|ÅRôÒÿkWùÞ÷šdTm²Ašë€D~° R`QY`Zöödje³d zàŠ £O †ñ——Pâž›â#1€?æ°•@Gu÷‘² pžÈ‚"ÉÈ *Ì­‘tA³nT6Â~™ªè¦:µ/I(¢Q¨m`O£ÊÖ4ív{â2Ç:öWÀCšò¬µZüÕaVÈ•pÅÁ’ÁyhÞóî¿#8Â?`‹4´n4®JÑŠ¶áBÎùÂB5€{¶£ú MîÆŠÜ’€]@«sýDÐ)°UºnÄ‚å¼óY¡Àwã©UÀÙ“TÏX‡ŽÄðƒqµ B[ÿ,Ÿ‘jŸÉwôm"1»WF@dYË[ær–Éhì­wJ;M 0f8Í)êèb$c—͘TÇ–Ä]G0ÈbDdÈ(ûm&üœÏ˜­£Ÿ'žLeH² M8w ‹S+ *¸4Dzºúc«ŽuXaB„†8´:À®zè«Ã•Ò!ŽEµBšÏâDˆÑ)#­—N¼ò´¬\çZ×»ÎuJ$/"éÓ#«çˆ` K6n8Ctá=@ðºÆKp ó`D¡sFÆ,s™Á汈žÖÛ©á¸@ HÀ P€ÂÅ/&@½'(;<:Ò3>(ô‘¸"W`€ÿ[`ƒ±@¾Õ„»í?4õH"0C+B[l>;Ù°‘ÍÎ`ŒúS¦Ljs®pr”§\å*×GB~ó‡jþàâsQ+­ ñÓÞÆ{¸f¹>¾w3@à#ÓüC%JpôÎá ¸Ç²ÑgêëNîòïAd}òf´Sî=…?:ûžîý ˆÎÄ•Ðv ^Ј­„xÄQ îø»ŽâFKkÃâêw€Ò>í´‘½M÷m“¯\ñ‹§´aqÔq\¼Ø~·Þ#šÇYn%CÔºJ´W®7€AÿH9…¾ ÏPˆ9w˜[ÁŸ´‹ Àm ­ç~ëöþ:Øíÿo¬Òd/»N®X;ÎÀ‰BjñŒvaîa}éc«µ#ˆAò%04 Wh¾—K*j–)½xô§ÿäh¼C%OŠªÉðjÏÒš $UØý¡ƒ{Púi‚0Ô«ƒ:À‚:(@´*©ËZðb8ƒ¬‡A Lƒ4Є&Ø@°‹1à ¾»}AÜ·=Ø 6ÈøÓ ©J¨„(Q·D‘oZ/8„÷‘¢ú[³g[ 8A",B#¾ ?D@Œ‡x@Áë¿ÇÈŨ¥‘h¯ `† 8‚  &½ãJ¬D¿S ›k* ȹƒàÂ=FxŒGyœGzœG aÉDc  ïÓºSŠÑp6ïBz,À‚bŽÑèšü{ÇÓ²‚ï™E´T"ÿo Z8ƒ3 …\*ã©ËY ¦'Ò9@Ë 0UXðê\øKÃìNï$L(ÏÄÜ@8ËäÁH˜Kc /»Tæq' €rüÉÁb§ô*)9ü{E0OÿüO PP0þ*+0›C€PÐ )38Åø 0ÜäÏOÞ,ËߌÎäIôdÏötÎøUXÈ ˜ðÍÎUÈ4øNíÎÿLLk=O&J}¶(ůP>ˆÂŸ„¿Ú""á¡ÛO @Ì }R(õOV€‚ÖPtà!5p†X¡«¢FPFà€XÇÙ8ƒ mR(MjüMÿè λL"%ʲ5ÐëPPQ<ìäÎíSÁ„@Ôðdm˜6¦bÒ2ÂÇŸR¦O ÒÌ UJ½sg‚) TMÝTNíTO Ï„8²‚ ½ Ã~y5;S(ðTM•ÒxHÈ« ˆ˜ºÕ[%¹%8?x,T]¸Ó<ÅNíäNf,Vc=VdeÆmXVfTBeÉZ•Ó9„“{G(ˆJ‰s…¨!Ò"dÃØ ¢ ¸TV€f=WtMWu]×m€›€p¼‚bà§I ZùI1%Ó ¬$ØÂx0Wv=×@…‚gE3ª¬ò«V¤|UAÕòüUu<­ÎÿíLVŒÍXeMׂ¬Ó6£Ö M‡…‡|PÍÌSŸœ†"EйϩÌB€Ø­Ùš…0H*Óuضž]|ð°Ãà€:pˆPZ„€µY‚ ÔñDA•ÙþÜÔeÅYòlI`­X‹ÍýZd±[±%Xñ„G'Ôs[ã¯4;$ðÉ"Í82T„Ï/Â?¦5W²í[¿ý[À[@U…ðˆpìÙ¨ƒ0;€Ë1ÚÙ0ÂÓ!„‚mÜÀEWAýOµ]Û¾Ý(@Á†‘€<]Ñ®[ÔeFÌÛšý\x³dZ¶ðIÚ͸)Ü€UÑ €Ü´ÜÕýÝÿß…ZP€­@Œ‚Ë e¤ÙÏ€^é^ÁŸSÒ-ÝÓM]Ô…ïý^ðýÛ§åÔÐý5œB<ÀÌbóVŸºB¡K}ˆ‡’…Uú¥Ùeõ[Ð݃3 ^DC~JPæÅ¥ú"×Ë_>`N`_x°^YÌ^½ÎíåÞ¯]àï-Û‚uÊ”Œw°®ÎÚ;JüIg°tœJ3`RiÔ`^Êù½\Öe ^CÄÆC"ŒL­%ˆ‡m°`îáÞ–EbÐÞ ¦àŒµ`±Ô¨EÈÅpÅ>í£ÄЊ?Ã[Öܼ%¡Sõ[<$”FÄìÜv݃%è¿1„ÈȨ½Ú¸áÿj©Üða7~c8Ø0ðMUb<V¾ôZ#ÖØ.[(àÍãó²üJ>ì™ÊGÀªy¦3£¿áP ªüŠdmº5”“Æðl×]Yì1T7øä‰Œ”¬K…‚6†cTFb(ðÍ‚`ÅÎ<Þc>NàhW(˜UŸ³¬kÙƒÈç‰Ä0Žq©OºÁDe2Slúš]^æ]Ʋ“CÊþ4X:^H (Îã<ôDžMƒNeo¦eMnåWÖ΋•eŒ¥tFg]VNè‰gy–gZÈÝjRƒíPjø„8Ò’Jd• ðb°„Nh…^h†FhoÈ–² ÜUÿ °ä[få… Î%‚ÓBV8e8Hg‘i’.i“>étö^x`ä;;–`à†‘Tš®i›¾iœÎi(iï cß oHQP†@£6êHj¥.€r8€4BÐÙx€,h†fÈœØ 07€’y‰¨hXx‚wس~´Nkµ~¶&k/x/˜e „Q†8y9 £g6XB ½YŒNaˆÎ XïEiÄNlÅNéLöM{P†—ÖN™ÖiÊ®ìš&iïx] e8jÐ>ê¢íMh¿=!,Xm«&‚ïàPضuì#Hƒh˜w8¨ÿߦànTnTèã>nä6‡S8ãVi cH2âD5-Ô†¡).äæÃ^lîîn‘ö^MÞJˆì˜žiË>ï›æi nÊ…jmø†or…&„ž€›È‰ïðþVR;Zpë'`nß®†ànânä^ðN0wðåÞJ€n馴=˜Ò?žÆ­Ör=eïþðãx††éÉFo§iÌÎd1iXƒ5ˆoGêU°g*ê…œðþö„肇¥€ˆ4€„UðÿíOðâfðã~p_îSÐQ  \.ÄðX}U±Ýnÿòņƒ€á$H‡åÿ_qô¶6glB ¨q9G€è<@&üt7Ø„^Øo€ /¨…Hø 8€€@òÞVráfò_p(ŸôN8…†|[{Gxèrð%i6uQuR/uS?õROéÍ^~ïEsóVsËuUc~x‡Ÿóø.mjp5'á°íeàþôX†˜Eà<(rnp€$7ð%‡tâ–ôI‡òåöeHØë!är/GgT/ws?wSws €óë¼N¾LsY¯ìQ§8Øì$ÈÏw]íH7PË4g8C0ö0<ˆ•ÁœÙà„D_ôwè„ÿ?pЧ&_pÈøŒŸt)÷†kp]ÝSirGw”OùsWçmqÀv÷Xwutnl…|—ñ}íÒ>€I8i;³º<З{à€LPŒ"ò‡÷‚ø‰¯xtäÖø×öŽ÷€H+Bnã“Wy²/{Z§÷Ín€|Èë”yšŸõ³ï€~Øù\ïy:—pÔ‚+¸JÀ.ˆƒ¤?Œ¨Í¥ø„4xøotj§z‹·úãÆzàøŽß0yN,ùt6{ÐOyuvqj;†ypû·§l›§€1„|(»Ç{¤.€j kó{¶+Àgà€ÿ@„v¨u`U8;pÞ.päüª·vT |Ëßv÷xHKÍn§€ÐÏþ•Wië H˜‡¨ ÔÏi›óxXo°û»Çû:<(Þ—C=,xâ–lTNÀ@Hn3Þ™£Qí ƒ4.Dåð!D%š«XñÆS6r4'íZˆ%@âÁ‹‡J *W²léò%̘2- „g[<@ª\œÈ`РB‡- ”R•bäd³æ)Ô¨RP­Zµ€ŒN¦Tˆø÷Ï••Ö­ÓÐB×ÉTlJ“¦$^vtªFînÂj ÷2„ˆj"E‹‚Íq,ìÁG ºôÿŃb2¥K¤’'S®lù2fÉ,Q.·¤Agì.mú4êÔ¤5Ód È©ÔØP­ÒÆZ<Òòî A5po!EóñD‡Á»äòòåë°ŽÁ‚ oÜáÁ#H‘$Sˆ™ù;øÌ.)ܲDWˆ3+Ö³oïþ=üõ“[³z-û>íÚYßAútB2½ýÓG`Š[5ÔÍ*^x€ÊAÊåÅÜ^ÏA˜`ad؈°Ø%ÙÔ]Ká™xâ|-‘—“*Iœ!Œ1Ê8#5Â8y`Øw_lùY…U5§x± 8Ÿ¨p„@à†*ä`‚Ä™àÀ;:D(á„9Q']v ]†r¸ÿãã‚vðl3"d3¹ù&œJÁ†>ªÈñâä¹§žz^ð' ¾1(¡…â8çŽp $ &¨ ‚Ä­âÀæ@(*»x%´¥_©*a®¾ºÃ;”¤€€±+Pl³M œ+ +¼0à +æµø¢1º¬h¼1ÇG;mµ‹^‹-V¨œòÄ &| n¸,Gcÿ‚^<Ñɺ2´+*…}Å+/†ôÖËѽ¯¾3J ̄Рúì±t<Cñ4ÔQK=5ÕU[5{|†žzñ­DcÜ1ÙSòS#7* §¼ãÅ ÞrÃM4s¯2º g— 6ßì®–¦îüWÏôŽ4¾ùærŒ;.„ ‡* ,±DÒúX~9æ™k¾9ç[ÈÖ¡¦Ú¥+ð5ŒŒM¶ÇóÁg£_mXÑ`ò;OxáÞ û„4ƒJNßÅÏnÎ •³üò^ÝtÔ}ï;dR"M.)ÐÃø5éä“Oá‹?>ùå‡ÿ=úé«¿~úÞœàO>TT41êª3Ëÿz”YðzìfÇ#e«o ÑÐ6r ‡Øå.Æ{ òÞµæ5/"σžE¤7=Ä íüà;ÐÌ`„$<áSèƒ~¬Ð.ô }'ÃÒp†'$¡VÁ( ‡>ü¡¦Ð*ÀÀ§ÓÓ²øç?ÊN€Öª]¶°²¾4ðVì[Ç –ÃyŒ«ÃÁÄ„O8#ÓÃ5²qwØ] k(GÞ0‡&à!óØÃ)ÔHÌXÙ\»&:q6ù‰""Y¼(^ÑxY,Õ)èÅyU$Œ#ËèÁ4rRwmü$ç(JÞÕqwÔ#*‡@*LazÚ_Ç–8ÈBöèÿ‰¼å-y<œI0’Ì›dá*FLjÒŒD#(“éÆQÖð†q3%Q©GKPAaKb,@ZРЏü¦.±ÈK-*O’|‡9Æb~ð˜ÈTæ'™)GgÚ1šÒüá@(à•€Ü˜,·ÉÍ´Ùò›à ç#õ2Asò ÑÓ 1Ù™;wzž¡”' é Í{¢r 0Â5ÿÙ:Í0q †ô¦A‰ÐqB²œ¿<ç*½ˆ²“¢µh1*Cž’£z¤‚%\y‘öO›„¤%SŠËpú Kä¤9‘tBtµ)N/ªSßñÔž>õa¡4 5›$¥I×T¥ªT— LåKTaJÉŸÍÔª5¥hV׸Ֆ²§_õáìpU¤=j!×ÊVF®Ô©-…*CrA ³ª”èDݙלnµ«â>êJXj, ;TT_v224_html_docs/images/glass/green/menu_body.gif000700 000765 000765 00000001621 11222361073 021730 0ustar00abwabw000000 000000 GIF89aÜ Õ¸Þº¹ß»¾åÀ¶Ü¸»á½ççç¼â½·Þ¹µÛ¶½ã¿´Ú¶µÛ·²Ø´²Ù´ºà¼³Ùµ¹à»·Ý¸ÿÿÿ9¹?®Ô°¬Î®«Ë¬3¤8%y)§§§®Ó°­Ð¯÷÷÷9¸?8¶>¥¸¦7³=­Ò¯4ª:þþþûûû6®;âââñññêêêëëëòòòããã¼â¾¾ä¿¯Õ±ÀæÂ°Ö²ÀçÂÄêÆéééÁçñ׳°Ö±¿åÁÂèÄÃéÄÃéÅèèè!ù,Ü ÿÀ‰°ã•DŒlÉÔ9ŸÏœt*ÅY¯8švëz_àðmL˜Í­t:Áf³Þoƒ\N¨×xñññ§§§8´>®Ó°¥¸¦8¸>­Ò¯ýýýâââ¬Î®­Ð¯«Ë¬ùùù8³=5ª:ëëëêêê8·>úúúüüü6±<5¬;ííí5«:7²=ôôôäääæææ6°<ððð5®;óóó3§9õõõøøø7±<2£8\0›5öööòòò5­;1 7'{+¨¨¨3¥9¾¾¾3¥8ÝÝÝ6¯<4¨9©©©²²²*‡.ììì.–3$t(ººº°°°ïïïr°u/˜4'+,2T[®Ú°3¦9-‘2.—3,Ž1#p&%w)¤Ó¦4©:ÑÑÑ.”2^¡a*Š/<9·?ŒÂŽ}¸€3£84ª9.”3[YÃÀÀÀ3¦8',6¯;2¡6ÍÍÍÇÇÇ2¡7»ä½5©:*‰/ÌÌÌ-“2¼¼¼Yž\>‹AÏÏÏ4¤83£70œ5ÊÊÊÛÛÛ k%¢Ò¥«Ù®1œ5/–4ÆÆÆ2¢8W2 7)|-160š5[ _Q»»»ÚÚÚ/š5+‹0½½½ÓÓÓ/–3ßßßf#4§9&{*3¤84ª:7³=%y)6®;8¶>9¸?9¹?ÿÿÿ!ù,Üÿm ¬E+ÅT\! Áa€‡! ˜Hq​ØÈ‘€Ç BŠ<@²$…“'¨T¡eK 0ab˜9ÓƒM›ræüÀóÄŸ?+Ú¡hQHAHXºô‚S§¢F…@•j†«W7hÕÊ¡k×`Ã2KÙ³ ÒªÁVE‹0d¬(@·.€»xñŽØ;"ˆ– ]Œ$!Ñà–a¶äq¤ ¦†#F¬X1#FŽ?z9²$I”)W:pù2¦š5ozй³'РC+=š”iÓ§¤N­ kÖ­¼~ –lÙ³fÕ®mû6îܺtóJç;âJ!=€Ì løâZ8L(ÿ’… È!$O¦lѲFÌ4oæ¬ÀógТG“6}µêÕ¬õäÓk±É6[RJÙ†[nºñÖ›oÀ'qÅÇrÉ)·["¸—\ÐE'^|ÉA bh§Ca‡ Ä‚ ±ÌRt §žDì àÞ{˜ÉG}õÙù‘¨aðkøÚÎÖ‚¶I° n8è[ Ç… Xx!†nÈ܇ÏA7"‰{UQˆ '8‘ƒ ,zç"-4ìÀƒŸ¤Ù娣{ðÅ'ö0d‘û™–ä’ºF`lRR© nXj !p^‚)&†”É¡‡Î…XÀšwñµÊ_=Q tvÿ÷b?±Ç¢ü ¨ ;ê#¢Bâ'š‘Hú§“NN:T¥µ]úT¦¼mÙå„~J¦†£6bˆ¨À*†@Û5Pç¬áÑ0cuäÑ ðJ(|¿Ò—è¢Ã6Ó£ÇFÊÓ“QØ,SW6í¦[uZ­… Šzf©Ü¢º%U`÷D 9¬xîw,ôÃ,>D!Ť·k޽Ò{¨½Á¢Ä¨KÅÒ©NɰQ–Œ©ÁUIË)µÄY‹œÃj›¦]¨ ±ÉWÀI.¬uÚ9x)QD ’œòÈ%ðÊk™¯+sv¯°+먱7!+©Í” ŒT•K¥)VÓzå)Ã×*—-š¦¢ÿZÊ€¼`@ ¦qwR'V x&Ð`µGÌ!…#À¡ž×­°žá[¶¾2¡“¿²½¬Û êü,ÏV!ÌÐbá=4¶o«f^•¤ÒÈ‹Œ08k5bSwܸ³ðËlp!ˆ,ÐG/ýôÔWoýõØg¯ýöÜwïý÷Ú¿ñ…–°b 觯> [€‰7ôpð9@uâÅÓbB ±ìP5Ȩ`…Wð€L ÈÀ:ðŒ 'HÁ 6Pž˜„*Ì ˆQ¼àƒ a‚ Ø D0‚’P?:ÝŠ« pPü`³øŸ|PƒÀâ‡@ ¢ÿ‡HÄ"ñˆHL¢—ÈÄ&:‘ˆqPÃ!2á…6œáXÌâ lÀÅ. ðF@B ¶£¾x³ZœñR@ƒXÜpCÄ,æHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ õèƒ@ÂŒèÄ ÉÈE>á Fœ0ÆšË\ˆ“Ó(CZèollc,FIÊRšò”¨L¥*WÉÊVºò•°Œ¥,Qù,À" Ð„JÀË^ú2 3˜Aýì‡ÉLjr“S[œ gHCO:ó™ÐŒ¦4§IÍjZóšØÌ¦6·ÉMkšàPhEÈИóœè$ÊhÆb³EÈ$ž2çIÏzÚóžøÌ§>÷ÉdÏ~úóŸ èâî,$‚¡@Ã%ÊP†¾Ó˜ñŒ¨D'JÑŠZô¢ͨF7ÊÑĘ`5XB˜ðÐ’šô˜M©JWÊÒ–º”¢µøhHGzÒš¾ó¥8Í©NwÊÓ˜‚T¤$µ©P ;TT_v224_html_docs/images/glass/green/menu_head.gif000700 000765 000765 00000015676 11222361073 021713 0ustar00abwabw000000 000000 GIF89aÜ‚÷(‚,#q'1ž6ôôôùùù"o&¬Ñ®·Ý¸.”3ííí2£8,Ž02¡7òòò*ˆ.üüü$t(&z*ççç0œ67°<ïïïP“S´Ú¶0š5(€,²Ø´l¦n¼Õ¾5¬;6®<$x)¶Ô¸Œ½/˜4°Ö²/–48´>ÄêÆ¼¼¼ÛÜÛ6²<-’2-1*Š/*†.¸Ö¹ÿÿÿ(„-±Î³2¢7§§§®Ô°°Ò±8¶>³Â´¾Ø¿ÂæÄ«»¬®Ò°¬Í®—Å™ÀäÂ4§9T´Õ¶ÈÈÈ&x*µÐ¶3¦9¾âÀ4¨9¼Ø¾e™hºß¼¼à½¾ÙÀ6¬;,y/2¢6«Ê¬&~+.–3+Š0¼á¾ÂæÃ,Œ0ºØ¼¹Òº+Œ0²Ñ³ºÕ»³Ô´b!¯Í°6®;0˜57‚:9¸?0›5ºÞ»)„--2$s'7²=¸Ýº­Ë®ââ⤸¥¹Ìº¤¶¥£Î¥¼Ø½$r(8´='~+¹×º«Í­·Å¸] %y)1Ÿ7±Ô³7³=.’36ª:©È«±×³2ž6)†.'€+ÍÑÍ5ª9,~0~¯0š6,1&z)%x)-”3-‘2 h$%w)<5ª:ééé4©:%v($v(&|*5«:'}+5©:'|+4¨:5«;èèèÃéÅûûûëëëððð÷÷÷ÀæÂÂèÄ¿åÁêêê¸ÞºÂçù߻½ã¿¼â¾»á½Ãéĺ༿äÁñññÁæÃÃèľä¿úúúöööÀç°ֱ¼â½¾åÀÃèŹ޻»à½¹à»¾äÀ»à¼½â¾½â¿%v)¼Ó½ÁæÂ¾ãÀ4ª:5ª;¿äÀ¸ßºÀåÂ'}*µÛ·½ã¾¹Þº$t'&x)8¶=²Ô³&}*5­;3§9§¹¨+Œ/(€+)….%w(4«:5¨9¯¿°&}+'|*ûüû3h6,Œ/#r'+‹/¸É¹-’13£8)†-)…-*†-\_6°;ìïìõ÷õ5©;(x+#t(3¤8­Ø°¥Æ§>‰A$w)&w)çìè&u*R‚T¹ßº+‹0»â¼©Î«³Ü´#p&!ù,Ü‚ÿ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱcÁ CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒò @´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯GʼnK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·oÙ3€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ<‚çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïߺ) N¼¸ñãÈ“+_μ¹óçУKŸN]ù¤ëسkßν»÷ïàËÿO¾¼ùóèÓwľ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hàï)¢à‚ 6èàƒF(á„Vhá…f¨á†JˆÇ‡ †(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8樣ˆôèã@)äDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\vée–•„)æ˜d–iæ™h¦©æšl¶éæ›pÆÉ¦‰Ôiçxæ©'ž™ôé矀*è „j衈&ªè¢Œ6z¨7>~8Ĥ”Vj饘Rzɦœvêé§ †*ꨤ–jꩨ¦ªêª¢fâM%=JÿjO{ÁÔjë­¸æªë¼öêë¯À+ì°Äkì±È&«ì²Ì{‰2ÒÀŠ82 %8£mfÍvëí·à†+.¸ÏFÛ£"ÙPâÌâÒFãÆ+ï¼ôÖlÝœ[<â4rÇ@,ðÀl°À$¬ð 7ìðÃG,ñÄWlñÅgÜð—dÁ3“œÑùÂL¤¬òÊ,·ìrÊÇ,óÌ4×ló̼z r]€Ã8¼,ôÐ,`ôÑH'­ôÒL7íôÓPG-õÔTWmõÑ\ñÇÙüsG.-¶ØW—möÙh§­¶Ù‚ðZ ”t±Am·Ë0ä­÷Þ|÷ÿí÷߀.øà„nøáˆ'ž·ÑmÏA=äS÷Ð8Tnùå˜g~yœwîùç ‡.ú褗nú騧®úê¬sŽõ%‰s‡Bknû혷®ûî¼÷îûï»2DîòåH$ÏÁòÌ7ïüóÍ£#ýôÔWoýõØg¯ýöÜwïý÷à‡/¾ôeÀÀ5ÒàÑ…!“«\yòH@/ÿüÌccÿýøç¯ÿþü÷ïÿÿ  HÀÐ~åÀ*¡ˆ;Ì£e–‹_ó„AÁ Zð‚¬` 6ÈÁzðƒ ¡GHšð„(L¡ W¸Al”AxÞxƈ°2øIPX ‡vÈÃúð‡>t€ÿ‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢…Øt”!•xX¿å £ ƒ¸G;@Æ2šñŒh4ã×ÈÆ6ºñp\ã9^˜¾; ,e6\^Pð¼ € äâHÈBòˆb ®ØØÑ†ÊãÑGAZ,Ȥ&7ÉÉNzò“  ¥(GIÊRšò”¨Le&l xx¤ áÀ-ƒ•¼¤.0…^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌfúÒ-P  !‰ZnÁØ¥6ÇÁÍnzó›à §8ÇIÎršóœèL§:×ÉNnNšeD"î‡zÚ³–°ƒ'öÉÿÏ~úóŸÝç>JЂô M¨BÊІ:ô¡¨D':Ð)° ñŒ€,«iÍ|ô£ ågFJÒ’šô¤(M©JWÊÒ–ºô¥0©Lg:Ò}°Àñ¬=í ‡+la XÐgH‡úÏõ¨HMªR—ÊÔ¦:õ©PªT§JÕªZÕ¨V‡ÐeìÔž>ªP‰JVO\õ¬hM«Z×ÊÖ³Zc éPàWëÖ –µ¬mÍ«^÷Ê×¾5 SˆææZW,Ü`ˆM¬bËØÆ"¬d'KÙÊZö²˜Í¬f7ËÙÎzö³ …ìë –§W¨ëaËÚÖ"v°­lgKÛÚÿÚö¶¸Í­nwËÛÞúö·À…-"°œ^ã©MîO±`X8÷¹Ð®t§ë\FX÷ºØÍ®v·ËÝîz÷»à ¯xÇKÞòš×º+@„¶zÜ䦖˽uçKßçž÷¾øÍ¯~÷ËßóšA½,p%r“Kø2W¾õM°tUÀà;øÁް„'Lá [øÂΰ†7Ìa3b `A 0à÷¸¹ N±s;Ìâ»øÅ0Ž1‹±€qŒ¸ †/°@«XÁ²‡Lä"ùÈHN²’—Ìä&;ùÉP޲Ëk88&° \Àcÿ¸¾R³˜ÇLæ2›9Ì*@DJÛ…Øÿ[ØqCAç:ÛùÎxÎ3ÏÌç>ûùÏ€² ̰f´ÙÍ[–ó ôÌèF×Y Ž´¤'MéJ[úҘδ¦7ÍéN{úÓ †4T@cÚÍtHt—Íê<“àհ޵¬gMëZÛúָε®wÍë^ûú×°F§P†C¿ÙŠnµ²ë,‚f;ûÙÐŽ¶´§Míj[ûÚØÎ¶¶·Íín7›à"¦€ c§zÇ 7hÁîv»ûÝðŽ7»½MïzÛûÞøÎ7½ƒ¼‚}Â܉N÷ äMð‚·[ßO¸ÂÎpgKAØkî–'‚t«{ϸÆ7ÎñŽc ¹ÈGNò’›üä(ÿO¹ÊWÎò–»üå09À͈õ¶yâȶ87<Îóžg<æ@ºÐ‡Nô¢]$PÁМW\ç>zÇÇ@õª[ýêXϺַÎõ®{ýë`»ØÇNvªcéJgAÓ)^q"\\êpÇøæN÷ºÛýîxÏ»Þ÷Î÷¾ûýà?÷14{ˆP{\°xêq‡;á'OùÊ[þò˜'¼áE€xµ3žñOwûÎ#/u˜þô¨O½êWÏúÖ»þõ°½ìgOûÚÛÞôÀ`†}4bñÀ‚Ûc0zÒûüöÈO¾ò—Ïüæ# #²ðû X?\ ‚ˆß€î{ÿûà¿ÿø»Ÿ‡ò›ÿüèO¿ú×Ïþö»ÿýð¿üçOÿú—_¹—‚ ¨}ëƒ@ DÀ}ã7€H~öw€˜€ ¸€ Xø}ûW}×ÇÛ:0˜áÇØø ‚"8‚$X‚&x‚(˜‚*¸‚,Èy g‡ ÖGÛÇ ˜ƒÞׂ<؃>øƒ@„<(†'ƒ4ÈدЄNø„P…Rø BX…Vx…X˜…H„"€ˆp„IhS8†dè„2p†h˜†j¸†l؆nø†p‡r8‡tX‡vx‡gÈy0]ø…hƒJ¨ 0ˆ„Xˆ†xˆˆ8ˆ °ˆŒØˆŽÿøˆ‰’8‰”X‰–x‰˜˜‰š¸‰‹(/}Œp„ZP‚˜ˆ¦xŠƒª¸Š¬ØŠ®øŠ°‹²8‹´X‹¶x‹¸˜‹º¨ŠæÀ€`xŒPHˆ„Ñ0Š1ैŠÊhˆ»ØŒÎøŒÐÒ¸‹½ø‹"`Â8ŒÅ¸}ȸŒÞHˆÓŽâ8ŽäXŽ«è‰|¨ ìȎƈŒò8ôXöEú¸üØþø9Yy™ú¨ ŽëØŽÛxŒ:pY‘ò¨™‘¹‘Ù‘É|¸ $©£¨^€Œ °’,Ù’.ù’0¹’?0“4Y“6y“8ÿ™“:¹“<Ù“>ù“@”B9”3YñÀ0ÈÉŽ&Y“P•,yTY•Vy•X™•Z¹•\Ù•^ù•`–b9–dI•?žˆ0’%Ynéj R9—0© vy—x™—z¹—|Ù—~ù—€˜‚9˜„Y˜†i—?Pi¹–%©5 5—rI—”¹’’p™˜™™š¹™œÙ™žù™ š¢9š¤Yš¦yš—© E`y0ké–°é”< ÕP™•‰ ¸™›º¹›¼Ù›¾ù›ÀœÂ9œÄYœÆyœÈ‰›Û°š 0$À–$Y;pŒ´i›” ؙڹÜÙÞùàžâÿ9žäYžæyžè‰˜p– Iÿ›Ò™’Õisi öyŸø™Ÿú¹ŸüÙŸþùŸ : Z jŸpñð ï›; ŸµIŸR¹ z¡š¡º¡Ú¡ú¡ ¢":¢$Z¢&j¡Æ š2Р ›ª´ù 2:£4Z£6z£2Ú:º£<Ú£>ú£@¤B:¤DZ¤Fz¤Hš¤Jª£› E  ð¡³Y 8z¥X:£Ó°¥\Ú¥\º¤`¦b ¤^Z¦fz¦hš¦jº¦[ÚÅð " ¥êUš¥xz£iÚ|ʧ:ŠŸé¨‚Jžø©£}Ú§lš¨Šº¨gÿÚ𬉰”J©—P`¥yº©2úžú©Ÿê¥` Ù‰ Û° e™ªªê•§Š›Ù©£e ª²:«´Z«¶z«¸ ªÓ` Ê4¬–j§™Ê©œêÈš¬ ªÆ` Û  ‰©æ8­¯¸3© îЬ°Ê¥ÊÚ­Þú­à®â:®É: ›  Gù«•j©<À™Z ð¯ò:¯ôZ¯ð®_0 ° ˜  Ô Š ‡Z8°"x†  ŠE@ š º¥äú°±äÚ’p”cpëºЮïj¯û±÷ú­ùº Æ ÿÊ/Hwe·²,[uÑVuuW~ ñPGÿÀ°0 _ ±<Û³Û˜P͉±ëº±îZ ›´õJLÛ´à©MÐA{”°¶¡ÞaNе^û“àx  e0$ `ñp˜° Mà©N·r;·t[·v{·Mû}pæ P´«PÀ‘P¸†{¸ˆ›¸Š[¸s›¯–@FÉ à êo0 §¹™[œÛ¹œ  º° ¤Kºú€ ¨›º¦°º¬{®ûº°{Ë0»´K¶KK»¹«¼Û»¾«ð=`êÊyðñð„` :»x½Ò;½tûMP±y€oP©`´ƒ»¸àÿ¾†‹ä‹L‹¬Žj”€ ô𜫹ð›ò;¿ò+º¡[º¥ëú»¿®Ð¿þK ÀF0À|»|»º»»¾»ÀdÐÀd  Üêp ˆ5Û¶ÓàÐKåÛÁüÁ Â"<ÂLË´y=À½ÞK¸âû‰ëÁ)°° :ذÄ ðÛÃ>œ¹ö ºø;Ä¥ë¿ÿÀLÀ LÌÄœÀK° R,Å ìÀd  XÜ !`Øæ@ ÐLÂd\ÆfLÂ4l Ô 0`–Ú½îú½0<Ç…ëÁ4|½B‹ †À ¹ÀÃ?üǧÄ£KÄClÄý‹ÄI¬ÄMÿìÄ ÅSLžkÅWŒÅºÐ i e _Æc|ÆžüÉ$œÐ º@ ÇP Çt Ã{ðÊäKä, |ÜDZ˺¬Ë,ÈÃðËÀLÄ†ì ˆ\Ì‹ |À¼ ¼À”¬ i°]¼¶– Á)@¾¯¼ÍÜÜÍÞüÍàÎâ Ë3< Ú ´ï°Â©ÌuÀÊ­,¾ÛŒå|Î ðþÐǸ¼Ë»ÜËA ÌÁ\Ȇ\̈|ÌÉlÀËÜ̾ûÌÑ,Íê ’ÐجÍã\Ñ}ÑÜË£¬ Y`©\íìnÀ $]Ò&}Ò(Ò$-,ýÊO ¹å 0Ó3ÿ­Ïû È=ìÏ¿,̆| >ýӽȿ0ÔC­Ìì HÔÎLÉ }Í@ ?` _ÀÁÛÌÒXÕZ½Õ\ÝÕ^ýÕ°ü´–ð2àнÒl ÒlÝÖ%]p½æ{½ñP!`4Ý ø¼×}ŒÓ=Ä<=ÌFÔMLÔEmÐGÔ¾°ÔX¼ÐÑÜsñ  mÕ{טٚ½ÙœÝÙžýÙ%ÖÓ E0ï°ýÒPàkíÖ®Ò˜-×Ðd] ò×zÍ×øì×ð Ø-ØGÀÇlØ¿`ÔS¬Ø‹ÐLíØ¨`eðВЖ}Ù ]ÝÖ}ݱ-×sí¤y€ aÿ!í0Þä]Þæ}Þè=Þ™m¾Óp2€ü€ÛºÏ£Pßö]ß?ìÛøK üÝßÌȩàNܼ nàÈÍØºÀº«›¦ ÀEP @¾r€ÝžáŸ-ÛÓð¦æ°q`†âÞ&~âêÙæKÛ à¸Ûó}ß÷ßöKÄýíßÄ>à†]ྠ®ÜXÌঠÍò* G Ñ®áNþär@¾°«déÀ30Z¾å\Þå^þåZnbÚ³MÖŠðâh>Ó2nß4.º¢ðæp~ãü=̽Pçu¾ã©@ܪ°ç{þã@®Ø Œ ‚Ž D¾Ð!ÿÑÓ°h°×bé’>é”^é–~é–×r Ýë0 ÔМ*0@°¤^ê¦~ꨞê¤顽´-gžæ/¾æøíÃA çq.çtnç½€çzÎçªàçAÞ»ƒNè ÞÔáŠÎèŽþè˜éÐíÒ>æš¾éæ» ñR@0£Jûíbî6 SîÞŠ`èžî²nÓ¹ÌÛ§€ëonãrÎë½€ÈÌpï÷ìªpÀÈÝ þîïÅÞ /ðDnÖ á0 LÛì,  ÓñOíš.×PåŒLøeØ„á.6Ph0 šëé®îiÎî±àîð. ò~ãôà;ÿ®ïÆ-ÅÿðƒþÌ Îà@V á˜PÙÝÍO^ôœÑ$/‡€@wïÖhò#_òç~òxòìÎòðþòýó:>óÀ^ó»pó­Pì:Oäðô0ýƳÈÊ´ <÷žì´MPåL/u´@g Xõñb ò_ æ€Võh®ò´îÃ-ßòrN ô. ’/ùxNóìçd_ìšöiO 2P?ж›³^š«¨Ÿú¹Ú˜p”" @ˆMØÇnÎ5 gôº¿û/ø‚Oø†oõëÎî‹ßÃïù“/ •ö—ÿ㙯ùƒÎù`  úæ ?ÿp³¨ùý¤©š )ƒ@P¯3º’ ð  à dÄûðïûh0ø…øÃoÓÅ¿Çëɽö’U°`*„U-\HÅ¡ÃU#¶¢HÕEŒMmÜxÀãd=Ô‚1…‘”1ò¬\iÎåK˜1eΤYS¦Œ !6¨³@/L!̘ñlæÜ™sСEö\ÚtiGþ5jôhÆkرgè81¨hÿ‚WB5}*ujÕ«Y·zý*V¬Y³jÓ¶u ÷í\ºvëæÕ»·¯ß¿‚6|8ñbÇŽ?z\VÞüùóÔ¯¿ Æ{4â _Ÿþü#ôï·ÕßÿÿþÞ{ox€‚HT9‘…AN˜Á6¤t›¥7ߪ² +­¸"ÎãŽCî,åÖbî瞃N馣n/Y®ûKín!l•îS,£ðïGôÐcoÈö40òÈ#ñSòýøðIi Ð@L°A,9Aa!Öø$)œòí ƒëðCCkD•;ÅWd±EêpQÆì´»1Çïxì±£? 2="×CòP –Ìÿ¯Éž„RÀ)´òÊ,ŒD!N@á“ÜÂÄð7ªÌîC5×d³D™K±9[$¥Î;ûš±Æ= Ó¼?M TÐAË+ÔPD“T”ÑFý/ÊH«´²Ò%ÀôNh`·OÉŽÃQ‰+µ6YAõÍU[¥óEëdÍS°Z+ºÕÏ?w%¯×e~U/Xa—$ÖØc!-PÒI™eÐY N"0=ÉðZá<Ô¶Ôn¿=1Ü]…µÜ„fÕ“;[ûÔ(Ww€7^yé5RQ&Å×?d÷UvAÞR‚t3ª2±U¸85.Ü8#7¯X+>w;‰øD ×vÝýXÞ"é%ùÞ“mI™ÊI#ñ›×A€kã”– ¥ª9a4·ÕÙ͇{†Nbr “!Z1VWã‹rÕUix™9ÑaMŽzj~—mà%¨`>ýúLR>uç²Wº‰Õ6—í‹‹Îøhv{ìxéE~Zï“ù^™Rfj˜ 7˜f„_8çÅÉVÕìè O›/¡)G×mŠÖÝ8é]9ÿõîÏ›ŒZj}©î÷o€Q9L©;TT_v224_html_docs/images/glass/green/menu_item_body.gif000700 000765 000765 00000006540 11222361073 022753 0ustar00abwabw000000 000000 GIF89a´dæ±Ñ²´Õ¶·×¸­Î¯±Ó³²Ó´¶Ö¸­Ï¯®Ï°µÖ·¯Ð±³Õµ±Ò²¼Ü¾ªÊ«ÇÇǩǫ§È©¢²£©É«¨Åª§Ã¨ž»Ÿ£À¤ÆÆÆ©Æª¨Æª¦Å¨š·šš·›§Å©š¶š¦Ä¨š¸œ¥Ã§»Ÿ¡¾£›¹¤Á¥£À¥¢¿£¥Ã¦Ÿ½¡œºž ½¢¥Â¥Ÿ¼ ›º¡¿£Ÿ½ ©Æ«™µš–´˜˜µš—±™–¯—³³³˜³š‘ ’¸Ù¹³Ôµ¶Ö·¸Ø¸¬Í®¹Ú»«Ì¬¹Û»ºÛ¼«Ì­¸Ùº«Ë¬»Ü½¼Ü½ÜÜܰб!ù,´dÿ€42ƒ2†‡†Š‹Ž‘’ ”•"—˜)šš-&  '££¦§¨(ªª0­0$°°,³³*¶¶1¹1.¼¼¿ÀÁ#ÃÃ+ÆÆ/ÉÉ%ÌÌ!ÏÐÒÓÕÖØÙ3Û35967:ãää8 é HìíìGðñGCôõB÷ø@úûEýþ;ú8P€Aƒ&ìÁa‚‡H”¸ â1ظ‘€G B2@’¤’“(S*X¹K—bÆ@“æ›8‰èܤ§O#@ƒ:ê` $$YÊ”étêܹ“¯ž=|÷öñó×/ @‚>"Th ¡Cˆ &R´˜Q#ÇÿAŠ,i2¥]–-_"9³æœ9wêôù3(P¢E&mÊø©ºuRßQguÖ¬ZpíêlX±dËšE›V­Å‹mßÂ+r$]»wñêÝË×ï_À?&Äða¢F‘*eìjºÈ’©V¶|9³æÍ^wx+ ´Ù¤Õ8Ý–‡ê¸ZÓ[¥l½|ØÆ[7ïÞ¾_L|©ã¨È'S¶zYˆóÍED7hd]—il¥öxâ½VÞIx)0[zëá¦ïùf„|Š Wß}Çå7Ùrýý]g`QgÝhhiÇ‚18—ƒF8am~±wa†ñ×a}öYdú‘Ø\f ˜"ÿ Ø"‚u÷k3–ô „ç½DaŽºÇ›† d )U‘••ˆä‰ xЊ 8Ñ‹MùQƒV^i#z8Ö¤£—„飘@–‰hòw¤VI¢Hв‘‹ Ö¹ •!w¥{jÙ§M] Æ£aaÒ÷¡‡&zV&r¥ä£L.$iDP¢fiŒ˜º–gYÂôém€íøeCÍç!q†Š¨\š‹n媣Å*ZœOÎY©[¸ÞYe]¼²t£L ha¤j*²¨*+‘¬®ùl›K¾)µ“Ö*å¥ÚfJcyú .—âŠ:l¹ÅþXhºDŽÈl»Œ²ù¬ò69kiÖF cÿG¹jªg¯´ýëg¨< ,”¹Ç6†ð™ +ʰ³ÿ@ûYIJÒKkŶb‹q¾ºrË/Ç[~pÈ›¡§>–jÊ«æãnËðB<–Ä2S¼–Å·Þ,—¾»îì-ŸƒúónA<ô¹&­nU +Ýð»G ó´gÕKó½Ù^3yoíi×À&pØ#L4ºf'¼¬Êj³ÌYÓn?sÜ3O]³wøÚ­q·yíÝ—Ï~Mnàc—ÜT²†¯›6fk3ÝöËŽÃ]µ’ÓmuxÛ⹄\oîuç`þ›àd~òTHÓ£fꋯ)ÔK½Ýµ”×M;Ö:ÃÖoǺ÷}“°€ÿú˜¤£|xÿÒ¨+ ËË?þºÜ±_¼Ηk¹¿Ùÿù·ï’ þðí¨j|³úhãXWy5RT³Ùû,·/ëñìWöó\O<ѧpâ3âÊ@‡I'^­sûž—ÀèÍOÕ‹Þè§€ñC"óž±ö‡Aâï+ë Û>è´2o}‘#áäìÄÀ¬9p…Øk!ç¶7® m†«aÿŠÇœ>g‡n áÄ8ÄÊMïn›º^ÏvÇÄû9QlP,~J‡¶ úgiÉãaã|¨>9µ¯j übüŽ8¿$†ë…£] ·Æ ¶‘|oDÞù˜>×ÙQˆ²Ë# m'?ÜiN‰dláƒFƒ©1ÿDl„»§CÕÉ‘€p: ½Ü'#êQ’–dáË(AN Ò“„¥!EyºDšïUsL%G'¶Œyëãµ§ÉZRð{Q,¤ 5ˆÈV™2‹tt$ì ÉÊŒ5P…Ê„ ÈzwÆ[®lҜ⠫HÊ+^„Ùa‹iBIÖ.Œä[ÉiK⺜æ!qØN*OZò$&ôˆ¨Çoš‰ËÜ' »—¿ Ò0É¡&A9èÎ8bS˜¤'C'‰OˆŠókÅ_©,$)ft ìä¨AOÙÈ„r1’ÇÜ#8céGÒ’ŸÏ$@Í$P^ºÑš…'H·)R/’4™<è8SZNžSx.ÿE÷Kô!t‹«ÄcNŠ1ž1¬(4?ITuj4¦¾,eR{¸Ô6UzO½Ý·ê7Õ@Z5xĨV×ÉU¹.ò o³iXéM#ît¯˜d&÷Tª¿hÔ­0-lGKÓ¯Fí¦Ý„Y±dR}ö5­+½èe_jÔj‘³5à0A+ÖÆ¦ð¡á4-JýªV¡bU°þƒ+Ra«TÙ†t¡N½'T!;Ëfõ‰ÿüíjûVÍÎ4¶?ñ£c‘ôž-¹éZƒ=ÛRûÈËÞkÿpçÂ/qÛ½瞆=ð<¯5Ýj”#¾ÞŠç;­ý÷¨;Säªmö™Ÿv¯=óÞ¼¾;wˆÏ½èu¿º¼³^WaO¸å 7kÌ×-wß ùÝ7G;q}z®³<¯£Žóã??uÉ{{ô†/ýåõÎvÍ[Ûã@w¸ÌLfØï2ø¤¾Ú·~×P_ÿåPoýÌ_ÏlàÛ}öx78æ¿xÜwýpOöú}i÷ËÞâñ‡qóW~Õ6Z —nÚÇ{®Ç݆hßVy‡—wÚUnN÷uÊxÌ'x¡çGˆ%€Ô‡z]v~øq¥–‘·F÷]€Z—xôg}¨{A‡kͧ‚±×ÿø/8€¦p÷W‚Ùr(dd7yˆt®6}Øsö÷v¬§Ü·l¿·‚:Ø‚§ÖZÒ½EÝ\Öí]vÚýÁ]wÞžxä•gzé©gÙeí½_|¢FŸ}÷á§ß~üù÷€x8 yx qÆ!§ƒÎA—V„RW¡…f¨á†ÞÑá¡x „hž$ªÀ‰íÕ¡b|´H0ª&£~ü`#Ž9êÈc>"ä‚D.ç`tHNH¡uêáä†}D9%ˆä]™¥‰ì¥ø˜b¾Xæiø)0cškâ¨#oú臜 YçGæ9á’}þ e‡àQiåˆèiÉ¥¢œ1ÿ:Ÿ£F:iþ±yi¦qÙiv a„z’Úd†€ š*¡ŠÚ*¢•uù%‹³–ö(¤g¾Fi®–ºÉ£¦œ ¬  +]±–Šì© zت:Ù«™MûY£Ö^k+š¸Ö¦«·‚뫸À–‹d èòy¬vÉ¢J˜ª…² ™«‰Ö»(µ¡yí ûjÛ¯mÝ È«áÒù©°'|v¦r§ìÃÌ.&qdТhq¬»˜o­ÙÂöñîúm¯ÃÍé)‘‹ªdº oç²Ã…Å,b¼ÏÎ[±{8ß[m}<³v«l• p$l2Ò(+-—±,¯ût»Ë¾1Õ×,íÅZgLk™ûÿ 6·b‹žä²S¾žå7ß.ŸÞ;ïî5¿žƒüûŽÁ>üÙ¦¯vu‹+ßøÛG ûÔçÕMûÝY_Ÿ;™›oïq÷@(xø£+ñÐf¾Ä-Muêc‡šç¾çÅ.~³›^í¼„7ûi®kùÙ_|ç?à‘-€ã+]s’fÀµ¥Cëc^û^ç@øa©j¤Ÿõ´5üaPRÜÛ ÷:¾þH€äáéÿ¦ƒ<º¨+… \!Ä Aéméj¬ ±§;õ­s:ìßm„À†p\$DÝ“‡BÊuK|à åÃË­wÔ^ý–Åýχ›"‡Ø•±iziYX¥¹5‘bÔ³Ý-¸7+òîgvô`oD©€b4!ËHÇI)n-tŸ˜È(Î_UŒ‘þè¨&ÀñS¢ó¢ÑöˆI"Žñ«ë$û>é¼B2q$åíÅÈì9r•Xl%·8¶I o–‡«e‹È¤\>i—î åä9Ì Nñ~»bïvÈÌ;:S|Ð,žJˆ¾MúiyIäe}©Fyµ±z‹üf9ÿÇd†í•#a: ¸ÎL¶“ŒïDâ™FÚS˜2Ì'*m(GjP™äl“9á„Né3Tì„ Û¨KÊ“ð:¤ÝÜ(+*R”Ÿeå?Ë)IŽ Ô£©AEz„šñeóL)0H/E¶œùëç8µ¨ÑšRò‹Ñ,¨-5‰Ð–™4›ôt( !ÊÒÌ5R•J…$èzxΛ°|Ræ-«IÒk^”Ye0‹jJ‰Ö0œä_$ÉjSYâ­:êAqÙVA*Qjr%*‰©Ï¯š ™KÝ+,»˜ÇJÒ2­I¢*a9éÖxbU¨¥+c'ŠWÈŠõ{“ÅcÉ,,ifv°lå¬aOÚÐÄÿr3¢GÝ'XcêOWÒ”¯O(`Í%XžºÓªž…+h·*Zo’6©¼ìXS[V¿žUˆ®E5øS4"v›+Ågn‹qž ±¬,T?J\µj6¶>-ir{¹ÜQ6WŠÏ½á×ê8Ý€Z7ˆ—Ĭv×Ê]ù.ô°ï³mxêUcîv¿e*U«Ç¨Ö½°-pgLÛïFï¶]…#y±eZ½ö7½«½ì…_kܪ“ß5äPA,Þ§ò±a51jý«^ábWÀ~„/ra¬\‡v±Î½+t!<Ó¦÷™ýñŠü^ Ï6Æ¿sݦúÙ7'xÎ/¾óX;}ã?zç.óñ¢ÚÒ%Æ4«¥mY2ßÛÓB~ñ£=¬RIט迺Í%¬õŽê<ŒÅ=ó§‡<÷QxÁu5{Ñ9vi¤ZémçtH÷4‹Z›‡·»©)w´=Ü&ß:Êa¸ó9ì/;7ߨ³]Õ:Î4…#_îNSþôPO}ÐÉ>tÎöj6¢iooÛ³ÔúûîWŸøÿë|½ß¹Nú•÷”ð—+©¹zwßïšäï»ÿY©¯rb›ÝóU¾‚5ß|¼?ïaþzk?ùãcŸ¡tŸ1â¹ñšƒ?ëÒ7~£W~=v¹i™Wjíç}ðÖ[á€ÿ5€<§q-‡zXw È4pÿ}N%z*Ötçöté§{ë—‚¶z×ñyóW|õw}r—}õ%t“Öz‹g^±·vòçcÂöv·‡~Dt'È}¬—_#oøÓ'^7‚X‚¨ì§VçyÀçx²÷käƒ;„$8„ê·}÷rWøzÐׂ³÷‚L„ö7ƒøgxh„ ˆƒ‡†ð—tkèƒç†2hyqˆysX†U7bŒ—vZȃ.ȇ]‡p_ÿW˜ZVvÎ÷}J€L(€!è‡Ç‡&ˆTˆ‚Ýv†‡øy%—‰¸‰Æ÷‡ÝˆÚ—€th…†¨ƒÁ‡sM¨Š1؉€ø‰¯8ˆ§xwXŠYz¨lä7ˆ|.7…“Ø{vø~,¨‡\¸t?¸ŠºØŠ¼Xƒ¼wƒHè—èOv‹ngh†&‡¡‹)HŠ´˜ˆÂ·ˆ¯Öˆ"ˆoQ(†&H†¿X‰ (]·‡ñX}æ†õXx ØŒÜØløj8Ä׆ä8xžxŽykÎØ 逘Žš8޹XŽF½˜Ž„ŒÐ¨ÒHo Y ‘»(‘!iÝ÷Œ–ˆ‘àØj È‘_ÿø†-égË·ë8‹GŒ™Š8x:iŽ9Š@‰ˆÉv_ùW fðŽ…¥y›˜™›f¸›¦¸„CiŒ–D.0Q°cp`À‰jŠ™œU¨™9”§ªøœ]e°TQRbÀðŸðéôYŸø™Ÿ°ŸüÙŸû9 B0 új 1  š Ê Dð Š*¡GP¡ºš¡ªÊ¡Cð¡ê"êEP¢%Š(Š¢<°¢+º.ê¢7£1Š4Z£6º8š£)°£<>ú£$¤BúDªY\oàLʤUpSP;TT_v224_html_docs/images/glass/green/menu_item_head.gif000700 000765 000765 00000006610 11222361073 022715 0ustar00abwabw000000 000000 GIF89a´dæ²Ó´­Ï¯±Ó³´Õ¶­Î¯±Ñ²¸Ø¸¯Ð±®Ï°¶Ö¸·×¸ªÊ«³Õµ±Ò²¼Ü¾¨Åª¢²£©Ç«©É«§Ã¨ÇÇǧȩ¥Æ§™º›ŸÀ¡§È¨§Ç¨–·˜—¸™ÈÈÈ—¸˜¤Å¦¦Æ§˜¹š£Å¥¢Ã¤›¼¿Ÿœ½ž›»œ£Ä¤¡Â¢šº›ž¿  À¡¡Á¢¡Â£›¼œ¾žÃéÅ•¶—èèèàààÙÙÙÚÚÚÌÌ̼ᾕµ—“®”ÔÔԪ̬ÉÉÉ­Í®”±••´–ÏÏ϶ٸ©Ê«¨É©ÑÑѰҲ•³–Žž»Û¼ºÚ»ÕÕծа¸Ù¹³Ôµ¶Ö·µÖ·¬Í®«Ì¬¹Û»ºÛ¼«Ì­¸Ùº«Ë¬¹Ú»»Ü½¼Ü½ÜÜܰб!ù,´dÿ€118F<‡ˆ‡‹Œ ’“”’—˜"šš(#  .££)¦¦-©©,¬¬¯°°+³³%¶¶0¹0&¼¼$¿¿/ÂÂ'ÅÅ*ÈÈËÌÍ!ÏÐÒÓÕÖØÙ2Û9@G?:Hãã7E4331B>PJZðñðYôõYTøùSûüXþÿV lB ƒ(T˜ aÃ'!B™8q€E‹ 22p‘#€ˆÙ dƒ(QrYɲå—/È” fM8qFÙɳŠÏŸR‚ ½B´è‚£ $Dx0–§Om,¹Qc"X8'Ï^½|úøíûP`À‚XÈÐa‚ˆÿ)B¹ˆQcG Œ$i2¥Ê–€aÆœ‰ÀæÍœxöüéSèТD‘&]Úªåh0¢u+×y^ï¥"v,Y,fÏ¢U»–­Û·påÎ¥«qãݼz÷š<ép`Á„ FœXqÆK©R¦N-CÝdH’ΟA{MºôiÔ©Ñ6aÍVÁk¸OdÓPû®Ü{ìö[À·Kà„  nü8råË1'Ùs•IUtæÙg¡‰ViS|—šâ‘çš[è©G›]·åß|½Ù·’`§Æ!W€Ì]1 eѸ b—]ƒÜA(ax«©UÞy±Éµ^{‚ôa_!ŠH¢ÿ‰Ã!ÖŸŠ, èŒ2>E£‚Ùiãh:ž6a…>^èP†Bn˜‘{ðé†dJ"ŽˆßL':™âʵø"tUÎX£VYnù w^òX… ‘†ÙQš#Èf›Kæ×dNOÒé˜SâYå•62ZŽ€’õeýˆa ÉᢪY}mr)œ“ê4'cQBvg2rÊçŸrjYfYª˜¡Z‘™¶±j¤«¼=ªä›4ÕZœbPÖ)åQÆh ¯ rågXbíX,© ! Û¡e&º*^Ï6ºæ_ÓÂĤM(bkécºfÊë·{†ÛU°–蹃†Yè©ì¦Ê,š­Êûj’öÍZ-ÿ¾rê‹«¶ýrKå¦÷I0¹ý<º­-<¦²³¹{f‘!A +¤Ô ‡1¥·űQþz+¸"o'¬Á¢ šÖ±*'Ûð².7 oÌGKoÅ5lj³Æ:_ºídšö2°B\rÑnÒëÆåpÓÇË×ÄÒRm¯¤7ÛŠurZwÌõ¿?íiØ$›FöÉ #ÝÖÊK·\×ËÎBý¶ÔõÑ<7­u_»ØÆyóìq×c ¶= M,áf§|¸Òj3½¸ÓïEüøÌõFùaW_ž5¿šïí³e@þÕÐc®ZágŸžvzí®Þ¶ãòÍyì%ÒM»Ý¶ã{s›óÍ»ß⎌O—ƒ_ºÿ©ˆ§®8{ï¶îvópOí›Å6OoùNÙf޽îyöþ7èÀ .<…(#ê·6åÁ,7QƒÜdw1ùU s×sQÏòǽî{ÃòǨˆg:ó0Ì|ªbÜÓø:н¯jÖzàí‚‚©ìí*úëÞ»#: m< 3™ ˆ>ªyŽrßo&×Àýd¬z+ÚÙýºEAÏíïwbóŸ ˆCÃy°|T]YǨÆí„DŒŸkG¿}±pkL™eÈ¿(FÈdâ«bñ®8@D°q$däb?«Q¯Œ<£ÞÒèµ5Z°{cøÈAÏŽ[\^ƒø¼Fovcü£ A~¬ÿb#i.Òɱƒ†áÃx¤öUŒ c¾˜«Ü²s¡<ä(1XCðP‘P:dY¹è:=*–—,â,¹ÂNÚò“¸üÕéºàMÑ”À¤ã#“IVÊÌ„CŒ¥ç·Éf¶jÌe<ÆÅKkú›9Ôæµ¨¨¶r’g sf=A>“s}3ä:½GCwnp|êšçùêùÃI:(¬œ ûéÌ%B3 êÔ"Û)ÅwÆ1›©ÌâBÓ×Ec‚ó>açD“h? º°‰ÕAÁ÷?cÍ1¤dhI) Ñ”îón,à®^h¥ t†4½æGã‰Snê´˜<Íg2eyDfRôœ·ÿĨ4EIÍþ)²¦L¨0W‰Ç{3œSU)?ƒêO‹t{Õè. ÚуžÒ‘ ¦$ÍzR–ôñ§´T¢KÑ Ê­ê²«n,åR­ØT>u}Q…Þ½¸ÖZºU{04ª\KJ82¡hË+YíùÍ/¢u²™$gý„:Átö¨¥ëW•úÙ»Š5qzõfûê&ŸJ´²‚*L_»Yuv‘6EåEšÛ²–Vˆ(ÕçojÙÁf®1e§l[[.7§$…êC¥ŠÚe–óªh¼(v‰+S¤fУÝeêw^ÈŽW²ÒKíJ«+\× ¶sM*|“‹×±²M·^„®_#JYê·µ…ýoÿq«Y×z‹àõáNïkÉòVõ¼l­¨uÕ›Ù¸¶7¶¶ë…ëH_ ‹×•=•nƒÛÒþF8h(~¯Šå‹áÓ¾0&o~Í»Ú¶Žø­%ÎîLula³Ø±õ"‡‘éa2‚˜¿ަ„O`&ÿÒÉÛ„²‹ŒOüb’Èf±µŒã.÷rÇŒ¯˜,å ›Y™.²š³¬Õ-k7ÅMŽsç¼×ç¾ò´CÎsš±J⢚øÏ^†§ ŸLÏ(;ÔÎN´•õÌh$;ZÉî}s o*çJ¹ÎeÎô™ÍÉNcöÓì…´¨¿<é0›šÎ—N5•5­IN§×Ózzô’g-iRúÖ…Þ­i£ÿ›VÀZ5Ä®&j°Acb/ÖØ”é©s}VfW¹×‹þõ«§ëatÔÊ=¶¶qÍ×e/Ø·3~6–_êß6s–£³pXCkà;’VÙ î­Œõ Üóy½~6w…im[¯;Ù >´·y­Úp{Ø1<¬qñÍ]ßV•v.À%þÕâ–vÆ|ïízÖãüÆíhÚî€ËŠÁw°Áé}cߵРOw¶›ûïˆÇ¸ÙÓ¥1kyÎfŸoÜåÈÝw0eò¢›ÔÝGz¼¯ü`¦÷ÙÞOz±…îp¢ÓÜÐGÿvÅQ~ñq¯|Â^í¸ÔåÙïnŠÜèB^õ¦-þO·k–Ë?ôµÉ.ÚÿªŸ}äi§ø~»NئO3ì‚o­ ïïÃãýÎTÝ;Ûû®ò¿ËúÜA/0Õ+¿aLïZïàÞüe;/ìPƒ~ì¢9é_¬kD£~íæLùpîú…ÃþãÌyék?ñÛ/~çÿºÓ)œo87œòv·zdUgÍç¾í¬§¶›_?øØßðÃïvɵžs¥yÍÊ<óåÞHàg˜ÝhÏ{õS}ÎïìëùÜ‹l_Ýæ•tòÆxוdåÖ{͇nÞ÷~÷$—ujw|K—|‡q§ís²}–瀉g|7k¼WmÜ'yÏWw…j⊂çwpX‚Ûç{Ýç~>Öÿ€Ówzó‡{è…}÷·|u8u¸‚ÜÆ[7oå7€È7‚äFƒgm(Hx*hi5÷€Khr¬V«„ê7„`U„t7z~J€[çk@XoB˜XZFø}³Gf-¸…äwr^xd~×z&hƒU¸€9è;h{=(1èuø†Ç5†rX†Gˆ…ñ‡yj¥s"ØhQhpH„ÈGˆSfˆ™G?hn†›èˆ¶¥tx†´w‡jØ„\÷„˜øv€yTssÈ€ hz¢X‰æ·gŠ8ƒšØˆ´¥‹ØŠH˜…xˆ0(ŒHŒŒÈqq¸Š»8ˆwçò7Š>mºwŠ\…‹'ˆåŒžhvhˆuxÏm`Žùlj֘Œ¼˜…X|Îh‰‰$XŒÔ+VvÂ÷ŠiˆszXŠ_Ž÷ŽªøÐ·Œ“H}܈ˆÐ…¶øy€HŽ¥ö‰ôŠö‘ëø=‡ŠÆ¨odXŽi‡É„ém’î(†Ç¸iމޱ¸’ó¦™8P·`Ö’ˆxÛŒNx‰çy —€¡‡ƒ„Ö‹Ä7~êˆY‹H‰€ì׉3y’,˜’\h}ɇÙw€¨”¿ÇŠó(} •/(•ìˆ,'Ž)“êF“(i“Ù…_‰~¼;TT_v224_html_docs/images/glass/green/menu_warm_body.gif000700 000765 000765 00000005463 11222361073 022766 0ustar00abwabw000000 000000 GIF89a´dÕÐæÑÊàÌÎäÐÌâÍÎãÏÌâÎÇÜÈÆÛÈÆÙǧȩÆÚÈÂÌÂÅׯÇÇǽо¼Ï½´Æ´»Î»¶É·ºÍ»µÈµÐÐзʷ¸Ì¹´Æµ»Ï½´Çµ½Ï½µÈ¶¹ÌºµÉ·»Ï¼¹Í»·Ë¸·Ë¹³Æ´–´˜²Ä´®·®²Ã³²Å´±Á²³³³ÊßËÈÞÊÈÝÉÒçÓÐæÒÒèÔÌáÌèèèÍãÎÏäÐËàÌÉßÊÐåÐÈÝÈÓèÔÑçÒ!ù,´dÿ@’cH,‹›¤òÁl:™™¨ôC¥F®ØìdË킾ߎX|)›Í¢t:Äf[Þp¸dN¯{îwŽ^Oéûÿ‚„…‡ˆ‰‡#Œ#(%')&”••* 9š›œš0Ÿ 0.£¤:¦§¨¦/«¬®®7±²³4µ¶·¹¹¼¼3¿ÀÀÃÃÆÆ1ÉÊÊ5ÍÎÏÑÑ+ÔÔ6רÙ,ÛÜ-Þß8áâãáæ  2îïï ™ô¡ ¤¥©ú¬­¯³oÜHC×®^‚)$VìØ€eŸI¬!mZµÙ2ÚàÖí›7r qœC§Ž¼“òèÕ³' Ÿ }ûø½ð÷/ ,‚¸ "L¨PCÿ‡!2›è¬b€‹5bã¸ÍãÇãF¦[×îd¼y*7±l‰f*™3ýÙ¼‰³–A;{ú$TèP¢+"Uº”©ÓP£ž›jÒª»”Yµ²tùÒë)°4ÇÆ*kV'Bµ¿hë6ÜfFçÒÝh×i^qRKVõ 8pŽ­„ –™X1ゎ{Až!™²ÛËq¥i¦Ë”ÅÝÏåöŠöûk`Ô.U«b-Ö5ã³i!×vXÙòåÌ7sæøxhªÄe”>>8¹rÄÍǾ†þXúOê•qc¯¦½w÷Ïßû’6žy×ó̽¢˜@ÏÅæ‹{lÁwÛure·™}žy'xÄ×_yÿ©†ž€Î•Åÿžl6tLuò5H߃yœHêg•…*ù—†ÂÒ!N¨Öt#ÆÇ nò–"8šÃ×h/ò#†3¶¡ê¨Kt;¾×ã‚pÍg ŠÜEˆ_‹H¢¤äJö¤ ?­Eé¡5Êjæ¯ë+ç2ÏÒÒ¡ß=ÿzä;› Ï÷ øÊ¬ý¶Ö±{Þuµ“÷x“^…{ãé–ãj5ÑXMüá3Ï^wò.)é<Ŀ¯-ø[»žqÜIà :È¢{ooó??§—|õÃsY¼ÒÛƒŸíä×°²íM|}ëÐT‡9E¥¯p°Ãžì@B;*Ol£Ÿ'‡ÀÊ)0ukžù§>¸i£}Ÿû·â‡AæÁÄyœºÕÔ6½Áµ‚ìë÷µâ„ícÓ ä–À´•¯†è#!O¨C÷©q?üD¬p§7Òb|¾c þF(‘jùO‚ÆKœ×lÆB fð…õ‹aNP—?N«‹Yû¢oR%FäYÿ°{-üK×Aè}°æÛ­'Çûï}+`ç‡Æ уFÔ¢¯6ÈþjŽˆÓɨH3º0&޴ߣW5]Q¯’%¼&³GÁ&ò‚žÔ£swÀ+‘|’ $¡ÇK²Žˆ„b¥ÄFQ”¶ÀŸôLiÃn.‡ÿsââÀ6L®|ò+i”š Ù¸Lt5S‰Ïdb4S8MVsг¬â#ýÉêò¼$¤/é¨É1Ú –Ä<#(©ÆdÎðˆÌL"*—X—&’³‡âi\Ÿø4>Ú’¸t'“á¶T’ž­Üä=ñKFî“–V$Ë-³(Ñ€RTs¯ƒ&whOî-‰¡ÿàÓÝCÙÑÈ4žEé¥áV9ArTð•Íç5QCmŽòÝd›@ãiÉþ²žvêKY@~ÕŸÜ,¥7—šSy:£>u¥0;)TY¤ëÜ&)ihRëÜ0œç!ŸHM²ZÓ¬U'2“U¶nõ¤oM©8W*M„‹^·K§CE Q’Út‹8ÅŒN#ÈÓ0B5˜uÅç]=ŠÍPö“¯kè_ÝêLÁÆ•°å¤fÑyV½~6}­R[Úõ ¶²,êXW[̼.v1X\`IG[Q‚^Cn–ÍhKï8ÕŽV­{…mhs9QÒ‚Ó´ÇEá\Ë™Ð(nö¹®½*h‘ªÕÙZw pÍÿ®A·kX…z ¦{ ßLÕJ^¿š·¸éÝŽ\IWsÚ•µ¾•/ciêXÚÜ”’Lµè<3©\Ýf6¨ßm¨€;Rá>v’§L°qõ‹ZöªÂî¬UMGßv^øîjS)ûÔcÖ¿¼Õ§ˆ¡ûZe–÷|´½®mO‹ÛÂ~¸¹eå,Q³I⣚ØÀM±d½Êb°êE£.}•s%,Ó—¸¦HÆð7Ñ‹]÷8µr„cZK+˫ۥŠüU‡ÊÌ•rÁû[U„'®.~»ŒÜܾ¸»çìíŒÃ[d¬Nw¸÷EéŽÕ»ßËöÐÿô=+^éÖW¶8>¯†óÛg‡YÎcŽo•ÿ)ÜX gÅ^ó†; æ( ¾Š°KçSëYÑ&äq‹ß¼\©‚:Ä“q¯\à4G67+Vé—=üéWS•Êe&5Mml%#›ÍMvó“{½[Kz5”.ôx\íT/9Ù·Ýõ¶ coË8Ø4®´í›é=/ÚËêX,f`ƒ[Øó=s±lîk¯Z»üåîa÷l2‡TÚĦ6Á·¼i>#ÜÑ w/ÞDíYO»Ö妸ª9}q?zá m8Çîñˆƒ|â\=7¶•ïàÀÙ×Ξ²ÃÓ*p‰'¹à^\0+yÍnHÇx¨ÿŽ·¸-Mn˜ç˜Ë÷f5³]XX·¶Î¼kúÏE.ÿóƒ¯7áíõ®¿—îa÷üå[¹ÁIþuŒ‡=ÐïN:¡ÍnèKS·­öÎ5£; öÿúÛd¸™ë®u-«=èmúºÿŒò÷ª<Ö£nùÙyëÀF½äDg¼Æ{uYgÍN×ôÈ-Þv“g\쀑é>nЧýé¿|é3òÍ[=À‘ÿüÀ_/ú®³½Ñ¦{¤ãx¥³žé®7<ìG/{àÓþôpGzñçpÂ'Õ\_;é¿øÚ£žøª/{õ[¿{å÷^ûÍç»Ûýžó9C›åº÷¹ùó®Êš³èæÝîwꋺôycZ±§wøædú†üöwàÇÇçwG\¸VhsÜv€Píj×qñ‡vó÷€¥m8í¦ ¸zã‡|å‡}‡7Y4÷‚FçnÒ~‚q“—TõÆB×SÝ}à X‚ ˆh7hy(u}W!A;TT_v224_html_docs/images/glass/green/menu_warm_foot.gif000700 000765 000765 00000006307 11222361073 022776 0ustar00abwabw000000 000000 GIF89a´dæÌâÍÎãÏÊàÌÌâÎÎäÐÐæÑÇÜÈÅׯÆÙÇÆÚÈÆÛÈÂ̧ȩÇÇǽо¼Ï½´Æ´¥Æ§™º›ÐÐлλºÍ»µÈµ¶É·ŸÀ¡·Ê·¸Ì¹§È¨§Ç¨˜¹š¦Æ§¤Å¦´Æµ–·˜»Ï½—¸˜—¸™½Ï½´Çµ¹Í» À¡›¼œšº›£Ä¤œ½ž›»œ¡Á¢£Å¥»Ï¼¢Ã¤·Ë¹ÈÈÈž¿ ¡Â£µÉ·›¼µÈ¶·Ë¸¡Â¢¹Ìº¿Ÿ¾ž³Æ´ÃéÅ•¶—ßßß¼á¾àààÌÌÌçççÏåÑ•³–ÙÙÙÑæÒÆàÈŽž³³³–´˜©Ê«®Ð°æææ´ÑµÏÏϱÁ²°Ò²¯Í°ååå¶Ù¸ËË˲ĴÈáʪˬ“®””±••µ—®·®²Ã³ÑÑѲŴ•´–ÉÉÉÊßËÈÞÊÈÝÉÒçÓÐæÒÒèÔèèèÌáÌÍãÎÏäÐËàÌÉßÊÐåÐÓèÔÈÝÈÑçÒ!ù,´dÿ€Mƒ„…†…%‰ŠŒŽŒ"‘’0””—˜™›œ'ŸŸ;¢¢¥¦¦2©©9¬¬¯°°³´µ6··8ºº½¾¿&Á ÄÅÇÈÉÇ>Ì>bY`S_ÔÕÕL rÚÛÜÚjßàjhãätæçèæiëìîîqñòónõö÷ùùüümÿ8€Aƒl*Tø¦¡Ã‡"F,C‘"œ‹3šÙÈñŒÇsBŠÒ€I  8°`Ë—/dëF38råÒéd×î]y@ãÜêFß¾~*%Xð €…PJ}#qbÅ2³ÂáØñ£G’`çœD©’%̳2iÖ´)';ÿy¦ñù3¨<¢øŒ"MªT S§O¡2œê°ª€«XµbäºÑë×°#Ǧ\ÙòlÌ™j·±m‹n:¹s}Ú½‹·žQ{ûú%Xð`ÂT«"V¼˜±ã3#Ÿœlֲ˴™5³uûÖó9ÐtGÇ+mZ/RÕÿ˜híš ì††gÓÞjÛqn‘’ËVö <¸œÍÄ—›\9ó¢ÎûAo#ºëë±%j§ÍØÌíï%í&žo¿azn©§{¢¹ÇÜi©AWŸSÕYw]vWmÇWÿe®QÞÃ%¨ r Žö„ÏIø…Õá‡aEö×áwöFž™!ØÙ‰ ¾£œPÆç‹¬Áxßÿ…²e¸Þy( ˆŽØc‰?ª‡¢–Æ¢|H6uP…26Iã“Ýy XSêh™•jù˜“–AÂÓ%^_©Ú„cÆÈ¤~Nò—&HRšÄÛxoò'–s·¥*©O„{¾Øç’°ÍhšF‰c›ˆ¢¥èZ6¥$OíEꥑ|Ušä¥‚• 虂vªf¡dQ¹£yÞ0:Ž‚t~ô{›”ßQ÷ üÚì+Üë4?ïu.iõ#Ñóå™Ýé|Ö×å‡9Ãðxs›_íx¥b‹||Ûê¤ö¿Õ ï5t_Öb—8˜lâó Íè´Å[× ^+8@NPq„¡ýdØ´ÒíN„½ëàÔ‡=e¥°xðàüÀB?!*PtУ¡§‡Äê)1}« y¨BØi¤…ßûÇbˆEÂÅܺ!åT7Áᵊ,ì•÷¹…î&£Ó¢ôž–ÄÔ•°Ž($#ϨGª‘yüF¼ð§;.Òc„þc¢Ç(•ŠùPÿŠLžçìÆF@fñ5Œc^ЗC1N¬“™û¤Ò%JZ±ƒmü %Ë×E~±•&Ü!,-(Ëð…kb.gˆÊ-Ò‹†Ô¤+/7Ìžk–ÈÓ I©LSº1.δá*#X9}Q°še¼ 63HÅ &óŠÞÔ¥ ówÄK’„Ò &'!Ëk³–È„d)%ÈfRœöÀ¡ÍiÇ'n/?täò@7PÎ|ó3©”œY¹P”5T‘edDÓ8Q?Vt’ó¬ä3}Í0êó•ü$¦?i©ÍQÚž=%8ªÊ„Îñ M$:Y›F’´"j^¯ˆø8^Úšøt)"âºt“¦íÿÜæMqOf–$Í=3)Õ RU{ïƒ((÷hS.Š© ÔßSYÕè4¦…é§ñÖ9E’Tñ\ÍéEÑGŽó—ePcjͽþ³¦¶ì[—YDžÖ§-§G›W™:«~u§@»)Xy¬+Ý(9éhV Ý1¤Eé1IQÒZÔ´_U)B›“YÖnö¬¯M«H×*Q¤Œf÷K©SÅ U²Úu“xÅŽ^£È×PB6 µÅém½ŠÑpö”·«êo]ëPáÆ–¸Gå¦vQzZÝ~>½¯b[Þ·ºlìh×[ÐÜ.w9˜\bYÇ[U¢^DvÖÍj[o9Ù®Vµ»…oÿxó9Uò‚Ô¼FãlKšÔHn÷Áî½,x«ÙùZx¨°Í°Q7l\¥z ®» á\UKbßš¸À)ÞlJ[“Ú–½þ•1séê\úÜ•šŒµêL³©`ýf7°nª±–sÜk?‡ZÖ£Žq¥©Ü\+gÍY^õ–» êH ÆÊ²­ËësëZÙfäs›_½`É‚;ÌÓs//]äTG7?kVë§½üíwS–Ò¥&7‘ÍmpE#œÕvõ£û½_0K{=Ô.öˆ]ñt/:á÷Ý÷Æ gË9àt®¶mœí]/ÛÓ*hŸ,j€ƒ\à3>uÁlò‹¯[Ã<æðq÷pR‡Uâ§8Ñ7½m^#ÝÙJw1îÄñyO¼Þ%§ºº¹}u7?{éKm:ןîõ¨ƒ}êœ=9ÆžóÁÚߟ´ÓS+t©'ºèž\2;ùÍrÿhÇy°?¹È­Mr¸ç™Ó7g7ÃÝ\x··ÖüküßÅ.÷£¯8é-ö°Ïò÷ýí›»ÑÉþy¬‡>Ø/O<±MoìkS¸µ6Ï7³» ú?ÿû㤺©k¯yM«>ð­üÊö«=ÞãnûéyïàF¾ì„g¾Ö“{yygÕŽ×öØ­Þz³g]ôÀ¡i?rð§þñU¿~ù³öí[>ÈÑÿþÐß/þγ¾Ùæ÷zÑ{Á§xìÇxîg|ð7~ò€ôw~°‡x8{AG| ˆnœ·zäç€ËWèG€êWzØ~û§€ý§ È{®ç{y7kÇvúçw&˜{êTwlrw×ÿséWX‹7sØ&Lñ§{8çh:‡ƒ1át¸5l˜`¨7ƒøVƒDhwçE@O J(h²×„·F}¸…W¥qEX…kR U(!(|P7}‰Usb(x}ÕD0?pQ Fàrnȃ胷G`u˜|wX†‘eA0H°?ðB@[°˜˜‰˜ÈœØ‰à Š0ФXŠ£ø¨˜Š/°Š«¸®èŠ1‹±X´H‹:p‹·èº¨‹(Ћ½ˆÀŒÁHÄHŒ <Ô…VËS|±c#c¥\Ù²B°2oæœÑ3èТݾ5:µjÖI\¿æ0ít-~0н[1c%¿û—LÜ ñã˜Å.§h€óçN¢‹$M½zÝë¬iwlÍö] ŒGÞ<æù–Þ?±×Þ{_Å'Ñ|OÔwßsúIwRÕ©†vêÄ]¦“à‚ BuÞƒZ%!q"§Ü|¢…_~úñ—ÿÙEb‰Ê–"‚ .ÈÛÿ‹0®7Ü„ïÙ(Žéˆ_‡>ª¤ˆC X¤w®Èâ’>è$Aíq¥…QÙœ•ö8Ýþq ‘'™¢˜J6(ŒVœY”ÆIy¡›gq´#–sjY'€x•ÈWž`~Ç'ydþÙd„OÒ¸æC7.—£¢WÊù!!BZž;ug ¥IbêçTfrŠ&¡–Ú¦¨U’gtY®ô¨wzIé«´]ª[¦´¦'èdžʦf¼¾é+hŒžêhªÄFʪ_z†ë²³6¶©ŒRVã´ŽÚQ©À6*,·wykl«(î9.bÌš[+º·F›+»ˆÚ'¶¦Âµ-jvګݗȦ,¿å¢wîÿU«ûiX‡V›è»¿Šìiô®VìÃÇ9±SýZü/ƃ ì•®Ônæîg!·5ò–ª¶v/¸•&»/Ëúlšë‚:¥Ç_»VÂ¥¡ÊpÏÙ}ëªÊC'VôÅͨ±´Jwls¯ #¯¶óNÝíª?_­/‹Omýr×én•4Ç»ŽmmÙOŸ­pÚt5Ì6Êø† +Ü-mkÌ_vÞe‘³Ù"ËK²ÚõîÄX#.·³‹CÛøÌ3½!å:[ÎóÚ>tÄC­¬µ‹e‚0ãvoœÜÒzdá°\h<"¶Ñˆ[_Ň»%‚‘Nä!+xÆ*°ñƒŠèÄqJLO8Æ;–1ÿS¼ÞK¬h@à -¼_ó×<:–®ŠŒ"(9ÊG^Ñ”óCåÙÅ~‚a<sRøI¶ìli|!ü^×9-îR•ñb+/ó<;3gÆT2Gt²eÆðä:â%ohH`"²“×D]6¸Í.Á‹§tæbàM_Ns!uÜáÁz¸N=–Œ›ïb$›éÆyòr•Òœ#5uhº}.ÒŒt$o)¿ØQ²E©\`/EXHM²‰è|"ûJ Tˆkôc< Ú›ƒÖ“£™,ÎG99L‘³$Úü§;½ Ï\ʳ¥Ð+ŠÏW&Ò¡²$)-­cËRVt’º4hPÕ3Ôѹ²šúÿtÚCgÑZNÔ©’DRTªQ„Ú“¨ðÁjCµšTœ²S§Ý(3»Èg–õ¥˜üeƒiM›bÓ­þlßIÕ˜6®´®R½«PjÕ…ò5«ÿkëhr*ØÊõ›‡ gFA¸Ñ¼Þ3­ …%R=R½’¶3®)(]5kWΚ¦z½jhÊVÒð‚M&$çZDÖ&Öµx%§GÍ ÒšÆÒ¶Œì*S¿úN\Zt¬5¤peJ\šÒ‡Œì[+‹Úªԧ,ng§ëžMŠÑ¸£åQrqëUÝR4¬²«ßf‘xÖÆU­¢­­z!ÊÞ庬E,Y»ØúâP¶]kd‘Ë_*¶w°Ê¼lÿOŸûSñ¾Ö³h­~i»àýrµ¿,É^„SË[pRLœ6¬[9÷zNôê·´K 1)›ûT±V˜ž†íg5<Û×ÃJU®Œ›Jcø^4n(–®Š‡Ëââ^דÙÝeÑáÝb¼¶pp—LÝ&[7CØU'`M ×€’øÊ/Ž©ÊØ;¶ÅON'?Çã 1—§Î…ê]šc Û´ Îo‡a,d;ÿ·Èöí€é«ã çSÁPdð‡ìß*¿7Ñ'žï8¹\Þ™ž7Î~³vKeËžyÂzV3ŸÙlà#Î`†²¨¥¼ÝRww;ªím¦[Ëh?»ù¾=vñ oKé!ßYÂy¶±ª§ÿÊ9þ™Çæp¤LçB‹ØÊ¨Vv–×ÜìªþаNßMGMfîšÙ»¹61Ñ’<^N«ÉÓÂõ bC[À«Ýõo{MÞwW÷Ó±–óVƒ\ïk_:ßëÖtŠGÈäW;9࡞3¹ëlp|ë:á¼Þ4ûìð/‹;Ê"unïh„ÏNáJÞx§ÿoˆÏ›Ø¢¬´©Ñ]âÌê{Ñï(ÇßüðÏ:äå¶õ¹q]s,+ZË}îw Ãf‰ÓZäž9ÑÑœêm¯ºÛmv5Ï=ÞôW»à3Æsã[Iå]Xéæm¹ÏtЇÙc?²%®ó•{àk÷úÄ­ýöS'›ìÍ8Ýcj÷ÿŽã½ë’}zÐG.õ}7ÍVgvŒZÝð­^Öl?f™QJsªkûèÜž|£ŸýhAO›ÞŶwãM”n›c|ß9'¼¿ï®vÄKšà©¯xÉ/~rÁ§¼î³7|í1¯wÅ»Èb72tC(okØÑöqzQsc:ù˜~=Î[Ë_à‰o;ß‘wåïYòÍÏzå¡Ïtâ‡_óææüÔ³ x$£¼Ý*¾÷ûúòõæ¾ïGrgv[–K×s¶Gm{väçwq·|W'z¾ö|à†€îw{_÷ €7€ìvvîv€\w h|ãwlh~˦X¬6zßmí~¸€ˆ‚ø€çÇ´‚XGy;Ç~(ƒ%(~ hƒó׈~Îö‚¥'m#•Õ§z·æx­gt7‡t-8ëW#„ÔgR«7)Sy éǃ…·uz0ç…QÈzE'†UÈ|IH0øƒW|BXƒ×W~Ù×{°Ç};¶„Ò÷bkxZC'…oXucˆ„Η…u¸…wø~SÆxm†‰øyqH†s舂(ljèO¨{Øgròå{ø|"xy\Xˆ›GXE8v;TT_v224_html_docs/images/glass/green/osi.gif000700 000765 000765 00000005033 11222361073 020542 0ustar00abwabw000000 000000 GIF89aF2÷ºººççç2…Aåéæììì‚‚‚ÞÞÞ‹¥ZZZMMMVVVB°V222(l5•­šIqQ³¡………©¼­CmKyyy­­­´´´)Y2@«T‰£Ž^dïðï5b>DDD555nnnÚÚÚÕÕÕ!Y,~~~¶Æ¹ÝâÞêìëfff"\-ÄÑÇààà8•IÂÂÂÏØÐHHH5Eçêè$$$ U*1?@«S²²²!!!»È½ŠŠŠ===§ºªQQQmr6‘GÜÜÜ^^^:fB)))ÎÎÎ%d1ÆÆÆ@@@:™Jb…i ?¨RV{]-x;€œ†:::|™‚,u:'h3RRR¢¶¥ccc3ˆB©©©èëé*p7@¨R;M™™™¯À²³Ã¶$a0S)ÑÑÑ,]5=¢O‘‘‘ÌÌÌÊÊÊÄÄÄqqqˆˆˆëïëqw¨•*r8ÙáÛGpO*^4ËÖÍÉÔ˽ÊÀ```¥¥¥sss:›L®¿±>kG!X+>¦Q>¥Qïñððòñ=£P<žM888ÔÝÖ+t9/}>NuVLtTw•}nŽt¥¸¨$a/SzZ3‰C1‚@j‹q-[6#V,.]8'X1&W/õõõïïïúúúóóóîîîB¯UA¬TB®UA­UB¯VA­TiiiA®UèèèëëëÖÖÖhhh?§R×××ÙÙÙ---åå寯¯žžžãããØØØÓÓÓ®®®B­Uêêêãçäääätttââ⪪ªÒÒÒóõóééé§§§íîí¦¹©ÒÜÔwwwÑÚÓéíê¾¾¾0>‘©–„Ÿ‰ãè䑪–3`;7“H%X/NwV.`7÷ø÷˜¯œgˆlûüû4ŠC´Ä·›„*[3x—~ÈÒÊõ÷õîïîh‰nâèã#_/¡¡¡“ª—[€bØßÙA®V¤¸§—¯œ¹Ç»áæâòóò@jIêëêz—€r’xt’yt”zkkk.{<°Â³ÇÒÉöööøøøíííýýýñññüüüùùùôôô÷÷÷òòòûûûððð@ªS!ù,F2ÿí H° AƒÐæ¸Y§2D-ŠgÚÁ‹3jÄ8@…G¦@¢–C[¼Mr4ׯ—ñÉœI³¦M™ÚÊUòvH Z :}úЧ>@ ñIWâ¦Ó§P£Î †h$?¡>ÙøÇµ+× ŸH z"¦ ©hÓÚŒ€á Nž¼Ê• j‹#DT¨uÚ¯¯ß¿€ ¨¹ˆåvJõÆR‰À#KžÜœ˜G¡2$ÞÜUT†)׿PMÚ/kBmåÌÚS†-Ø”žY …B¤V³nêÈÚÀÿJñHÔîãÿ:±&x?MУKŸ®)˜¥G vgØ®{3©BxQÿO¾¼t)GšhÞL«Ó¿T©lÀå *ÏŒxæÉçÛÏ¿¿ÿnË`Êf6€¢F*©¤çÈ‘¢ryR%L:)2VbùO($¢§¨¦ªj¥—"¦)§ªîÿꕈ‘jj¬¸ªÊ§ŸˆÚÈ1±nPÈŸs)êÈ<¹&;éež)pê0—Ä™Ò(é<Üvëí·K69—(‚ŒÎ·ÜbÂM¨þã€5èÆ+ï¼ÜÎXãµÔÌp :Þ& yéj‘ŒÐ/&'¬ðÂhÈá\b‘Bà ¬Ç3G° 'bÀp8 ‡,òÈ!'ÓAj2@Í%. ‚d·™([,A2Éúä¬óÎ<ë³Nzë!Êè|Î28K—}zôìôÓPïìY.9;·Á.ÄBÀAÔ`‡ópe`êU't`ËÎæÌ ±g3#Æb× õqlJÐYÚÿ@…\2£89¹?!ù, #Xc$'Ê)sêcÛÛZ‡”ø‘Õâe(§Ž­{­É¢v|$;TT_v224_html_docs/images/glass/green/show_menu.gif000700 000765 000765 00000000714 11222361073 021755 0ustar00abwabw000000 000000 GIF89a(ÕÙÙÙåååÉÉÉÊÊÊËËËÚÚÚòòò×××ÔÔÔÞÞÞáááèèèÑÑÑÓÓÓØØØÛÛÛìììçççÏÏÏíííêêêÍÍÍÈÈÈøøøõõõúúúùùùÆÆÆöööÇÇÇ÷÷÷ÌÌÌûûû!ù,(é@pH,ȤrÉl:ŸÐ¨rP\’v+x$/ ÄB˜)W,I¤Ì.Ððx¡ÍŽHÐú'Ž˜Ðÿ€lq‰Œ‰”Œ‘•‘‹›‰“›–‰§Ÿ¡§Ÿ²Ÿ§Œ†®§£¥¶—ª¬žÄÇÈÄÈÏÇÌÐÌÏ Úàáá ÏÙéÆéïéÖÈðïÇð ìÁ“g­žÀt0pw°¡Ã‡#J„È¡¢Å‹3jÜȱ£Ç1ˆI²¤É“(I;TT_v224_html_docs/images/glass/green/show_menu_roll.gif000700 000765 000765 00000000714 11222361073 023005 0ustar00abwabw000000 000000 GIF89a(ÕŸŸŸ¹¹¹———   ÒÒÒºººììì···®®®ÓÓÓ¸¸¸ÅÅÅ£££¢¢¢«««¡¡¡ÖÖÖááášššžžžÛÛÛóóóÇÇÇÕÕÕ­­­¯¯¯›››ààà”””–––øøøõõõùùùúúúööö•••÷÷÷ûûû!ù,(éÀ’pH,ȤrÉl:ŸÐ¨‚±ˆ’v+($E D*?:Æ¥Ì.Ððx Í¾0Ð: ž‰Ðÿ€lq! ‰#Œ‰ ”Œ‘•#$‘ ›#‰“¢#— ¢ž‘¡¨ŸµŸ¨#µ²• ¦¹ª ®žÈ‹•È ¹ Í™›"Í”×ÝÞÞ”Ö$æ æíæéñòîí éî õÜÁ“—Ž^@s8`w°¡Ã‡#J„(¢¢Å‹3jÜȱ£Ç?ˆI²¤É“(I;TT_v224_html_docs/images/glass/green/tab_cold.gif000700 000765 000765 00000003455 11222361073 021525 0ustar00abwabw000000 000000 GIF89a (÷×××ÀÀÀ"n&!l% g#!k$c"0Z"o&#A$!j$Wb!"l%#o&"n%!m%"m%#p&YW2!i$ h#!i#!k%"m&[ f#ïïïééé!h#\ `!ÎÐÎêêêd"ððð e#a! e"@[\ g$HÑÑÑîîî] _!?c#œ‘c!d#Ne# i$\ =_!«««Ab"ØÙØX!j%œ¦œÐÒÑ5B¿Â¿ÅÅÅßàߣ§£3ƒ‘„KB f$O¡ª¢e"‘›‘^!ÜÝÜëëë2·½¸;ÒÓÒG`H.A6èè胃‡‡‡XmYZ j$Z h$ˆ”ˆR¼¼¼yyyP»»»i{i94ÊÊÊB:L¸¸¸···b!ÓÓÓÍÍͯ¯¯94µµµÈËÈ/G18]g{hSæææ6R8hzh1¾¾¾ÒÒÒTI¹¾º¤¤¤^ ÇÇÇÔÔÔÎÎÎÛÛÛŽŽŽäääÜÜÜàààÞÞÞÝÝÝâââáááßßßóóóòòòñññ!ù, (ÿL   Áƒ*\Ȱ¡Ã‡#Jœhp Å‹ FØa€Ç CŠI²¤É“(Sª\©’c„ƒ/B€ ÁÍ8sêÜɳ§ÏŸ@ƒò\@´è¡H“ê4JÔ§M›f>˜:¡ªÕ©5 ,¸`ÊK¶¬Ù³hÓª]˶­Z @d¸pªÔU§Î,pSJL¸°áÈ+^̸pƒÇ!7žLypäȇK”H‘¢† u£B˜ú€¦ƒ P  ¨Â‚‡bËžM»¶íÛ¸sç¦@¡ƒßÀWà­»xqÞ¾ƒ Ž`‡!õ@A#G Cl0PÀ 'DDÿáÁç€ùóèÓ«_Ͼ½û÷éÈŸO_üûøëë?…‰‘=3¸0H (ÜÐÂH°ÝhpA OâG%™Thá…f¨á†vèᇠ†(¢ˆJXÄŒÔÀÅ‹°pG:h0ÀF,ÐÁRŒ¨ãŽ<öèãŽPÃtôpà h°@ˆ`ˆ&@F)å”Tþ8‚?bÃg``Eh"æ˜d–iæ™h¦©æšl¶éæ›pºI… ÐpB'È Å%qöé矀*èšD¨ƒ…Ç Œ6ê裂6áÅ2ˆ`†–dªé¦œvêé§ †*ꨤ–jꩨZ2† dìP¦©Æÿ*무Öjk§[‚ƒŠX°É¯À+ì°Äkì±È&«ì²Ì6ëì¯Yð¾>kíµØf«í¶Å†1ƒÕr+î¸ä–k-&…ÈaÁ%ì¶ëî»ðÆ+ï¼ôÖkï½øæ«ï¾î"ñÅ!ü,ðÀlp½htÉ 7ìðÃG,ñÄWlñÅg¬±Ã/ü±ñÇ ‡,òÈ$SŒÇ•¤¬òÊ,·ìòË0Ç,óÌ4×lóÍ8³œˆ’ôìóÏ@-ôÐDmôÑH'­ôÒLýBD-õÔTWmõÕXg­õÖ\wíõ×`SG”möÙh§­öÚl·íöÛpÇ-÷Üt£G‘ä­÷Þ|÷ÿí÷߀.øà„nøáˆó„4îøãG.ùä”Wnùå˜g®ùæœCŽˆ„.ú褗nú騧®úꬷîúë°“nG#“Ônûí¸ç®ûî¼÷îûïÀ/üðÄã.Æœ$¯üòÌ7ïüóÐG/ýôÔWoýõØ3o Ùwïý÷à‡/¾ôÛoþùè§þö´ïþûðÇ/ÿüô×oÿýøç¯ÿþüÃïÁý  HÀÐ~ÿ; ÈÀ𞈠'HÁ Zð‚Ì 7ÈÁzðƒ ¤ Àšð„(L¡ 5ƒ¬ð…0Œ¡ Sè+‚8Ì¡wÈÃúð‡@ ¢ ‡HÄ"ñˆ< ;TT_v224_html_docs/images/glass/green/tab_pre.gif000700 000765 000765 00000001350 11222361073 021362 0ustar00abwabw000000 000000 GIF89a (æ2#o&&z*$s(#s'"m%¼Ó½%v)#p'"n%&y*%x)$s'½Ö¾"p&!j$¼Ñ½¼Ô¾!i$"m&%y)¼Ò½½Õ¿"n&&x*4$v(·Ã¸¸Ã¹!k%¾Ù¿!k$¾×¿"l%&{*¾Ö¿%z)^ a!S!m%%v(¾×À»Ï»_ ¿ØÀ»Ñ¼ h$¼Ô½½Õ¾½Ô¾3^ %u)M½Ö¿;¼Ð¼¾ØÀf#½×¿#n&&w*Y!j%$r'!i%_!I"q&3!h# i$ºÍ» $ Na"#o'P$r(`!%u(·Ã·#n'½Ó¾ g#b" g$4»Ñ½ f#"k%b R·Ä·` Be"$w(b" i##q&»Ð¼4] \0Q#t'·Â·b!%w)$t($u(·Å¸¾Ø¿#r'¿ÙÀ#q'#p&"o&!ù, (ÿ€x‚ƒ„……wˆ‰ˆŠ‹ Žw!v˜˜x™šxžt¥tvx(Z¦§W& µ Aw aK¾vM@V8pÇtLXqÐpwH,ÐqÒ(/4áqE(dß)éQ ÔG%oñpvïñoóõ÷ ÿoâÐÁó€Å h àà× "b80Á(FhTð‚&2ˆ)`A;ÜdÐ(€£GHȤ †MC.0èôQãÉ!CÎZØ„hXJ§L‚;Ò` GUÆüPs¢k—5Nl£¤ŽÙ:-TŒ°ÃY´jEÙº}«cmòΙ¢ ö æaáoའ@܈A%džĈ` ÂŠ62ÀQÙÅ )BWÎâÂL’ rR«Ví%;TT_v224_html_docs/images/glass/green/tab_roll.gif000700 000765 000765 00000003356 11222361073 021554 0ustar00abwabw000000 000000 GIF89a (÷!l% g#!k$c"0Z"o&$B%!j$Wb!"l%#o&"n%!m%"m%#p&Y!i$2W h#!i#!k%ïïï f#!h#"m&[\ ÛÝÛõõõôôôd" e# e"a!`!ööö\[_!ååå?=c!H g$âââd#Ne# i$\ ] —£˜_!@c#b"ÖÖÖ¤­¤^ áâá9………klAÅÅÅB341B f$X^!©²ª\p\KÜÜÜe"ÞàÞ‰—ŠÃÉÄ h$8 j$ÈÈÈãããÐÐÐÔ×ÔëìëÍÍÍR62Lm€n:ÂÇÃIàààZ1I2BPZOËËËçèç4®±®JbKl~lººº5]˜£˜š´´´AìììS”””TßßßÀÀÀb!‰—‰!j%;ÉÉÉ8T:9.ËÏË"n&äääáááëë뜜œÓÓÓÚÚÚçççîîîúúúøøøóóóòòòñññùùùððð!ù, (ÿ 4¨ Áƒ*\Ȱ¡Ã‡#Jœhp Å‹ :Øè€Ç CŠI²¤É“(Sª\©’£ƒƒ/6hð`M8sêÜɳ§ÏŸ@ƒòD@´(¡H“ê4JÔ§M›f2˜ ¡ªÕ©5 `AC…`ÊK¶¬Ù³hÓª]˶­Ú 4XpªTU§Î AC€QB L¸°áÈ+^̸°‚Ç!7žLypäȇC„1"C u£6˜Ê€æ J`r‚bËžM»¶íÛ¸sçŽB‚ßÀSà­»xqÞ¾ƒ ^‡|à ¡cÆ ‚lH40ц "J°ÿañ†€ùóèÓ«_Ͼ½û÷éÈŸOÿüûøëë?ÆC+¸°‡ $Äð‚<°Ý\ i±”Thá…f¨á†vèᇠ†(¢ˆ˜èá†TÜÇeœÈ 4\ÀF AMŒ¨ãŽ<öèãzpaàC\€À” G%@F)å”TþèCÔÑÂgTЂ RT)æ˜d–iGè B"¤0H$•Ä)çœtÖiçxæ©çž|öéçŸ~öC; ÖÁ€&ªè¢Œ6ê(ŸSäQC %œ1Á£˜fªé¦:áÂ5Pp)§¤–jj©?X!Ã}L`É«°Æÿ*무Öjë­¸æªë®¼öêë«d°à…®þjì±È&«ì²µ²ÂÅ2+í´ÔVkl$…­µÜvë-µˆ|&ä–kî¹è¦«îºì¶ëî»ðÆ+ï¼çÞq½øæ«ï¾üöÛ. hø+ðÀ̯ p¬ð /¬B‘D,ñÄWlñÅg¬ñÆwìñÇ SœEŒ”lòÉ(§¬òÊ,·ìòË0Ç,óÌ4£lä¬óÎ<÷ìóÏ@-ôÐDmôÑHó ‹4íôÓPG-õÔTWmõÕXg­õÖ\CÍÄ-öØd—möÙh§­öÚl·íöÛp“­ÅŽÔm÷Ýxç­÷Þ|÷Ëí÷߀.øà„ãM$®øâŒ7îøãG.ùä”Wnùå˜3ÎG’tîùç ‡.ú褗nú騧®úꬃn&­Ç.ûì´×n»é¯_¢ûî¼÷îûïÀ/üðÄoüñÈ'ß» (ïüóÐG/ýôÃÐ<õØg¯ýöÑ[Ïý÷à‡¾õ“”oþù觯þúì·ïþûðÇ/ÿüô£B$õç¯ÿþü÷ï¿û÷ûŸHÀöï~ŠH ÈÀ:ðŒ 'HÁ Zð‚d ü;TT_v224_html_docs/images/glass/green/tab_warm.gif000700 000765 000765 00000004120 11222361073 021540 0ustar00abwabw000000 000000 GIF89a¾(÷"n&!k$c"!l% g#0Z#p&"o&#q'#r'$u(%w)¿ÙÀ&z*$s($t($s'$v(#o&%x)%v(%y)&y*¾Ø¿%v)#s'&{*&x*%z)S¾×¿"l%"n%!m%W»Ð¼½Ö¾¼Ô¾%B&"m%½Õ¾!i$Y¾Ö¿#p'¼Ò½!k%!h#d" i$!i#!j$½Ç½¼Ô½a!¾Ù¿[e"e#d#"m& h#ñòñäæä»Ï¼ e"½Ô¾!j%¿ØÀ g$"p&½Õ¿ÃÌÃËÐ˽ֿ] [:V<T%B'$r( f##q&b!½È½@¾×À¼Ó½Ž›Ž$r'¹Æ¹"o%ÓÙÓ e#Kœ¨ö÷ö^!_!`!\ 3\29ÔØÔúúúºÌºÈÐÈG5—£˜b"$w(!l$&:(»Î¼#t'A<2@H8ME\A%t)ª³ªÜßÜñóñE¾ØÀc#4¥¥¥^s_½×¿^ »Í¼¸Æ¹Räçä"q&ííí i#c!Bn‚o»Ñ¼ÏÖÐÎÕÎ\øùø f$P"m$Fœ©9oo9U;pƒq6S8ºÌ»ºÍ¼ùùù#n'¯¸°]"j%½Ó¾íïí#r&½È¾¼Ñ½R!g#:b"Š•‹?3_ Q&w*B·Ä¸F?!i%ºË»¹Êº¹Éº%u(b d#AB#n%ºÍ»¸Ç¹¾È¿§=$t'×Ý×VS$x(¹Æº%u)øøø h$½Ô¿IKdLõöõ½Ò¾œ§d"¼Õ¾ÉÒÉ@_!ööö!h$ºÈºÂÆÂLïðïÐÔÐëìëçéçæéæOQñññ÷÷÷êêêâââ§§§ûûûýýýþþþÿÿÿ!ù,¾(ÿD  Áƒ*\Ȱ¡Ã‡#Jœhp Å‹3jÜxÑ ˆ"ˆI²¤É“(Sª\ɲ¥Ë—.AŠ8ȱ¦M!B Á3€ÏŸ@ƒ J´¨Ñ£H“*]Ê”'O9'H=@µªÕ«X³j¥º3 3`ø @¶¬Ù³hÓª]˶­Û·pãºõÆ 4<:a«ß¿X¨€A@ˆŽ+^̸±ãÇ#KžL¹²åÊ1b"ÅÇŒ¼  †è ¸ôVœÜs&GŽ&bËžM»¶íÛ¸sëÞm{ÅŠÀGðÖí;¸pÙ¿G¬0Ð$G™2ŒÆÜ8´Ãˆ "z@ТE‚ïàËÿO^¼2íœ!*À¾½û÷ðãËŸO¿¾ýû'òC1ƒæ~ýü'ì×{ùµ—.o„òË0qF¨ð ÛuWÞ…ŠÇ2– 2Î= †(âˆ$–hâ‰(¦¨âŠ"†A‹,ºh"=ðü„ÝhCK6gP±ƒ /ˆ€Àß)`ä‘H&©ä’GV¢ ŒPF)å”TV9%`¤qÎ<\$D2)æ˜HŠb•h¦©æšlAÊ1«P2!0…ä©çž|öégžë°)è „:b3Vä` 0 à]D*餔Vjékªé¦œF) bxAD$)¨¦ªêª¬¶Úé«°Æÿb¼aÄ$  ôêë¯À+¬¬Ä[¨"_P!ƒºò*ì³Ðöjì´ÔZ©Ñè@‘h`Ç„+î¸ä–Knµè¦Ë¢áˆ3 hñ 1Ôkï½øæ‹¯ºüöKb…ÄA¦.'¬ð +ìïÃýÒ3Š4:¼0¼ÜðÆCìqºjÜ’ 9!$ P òÊ,·ìòÊÇL-~x3Ç, ôìóÏ@ݳÌDKOHуÉspÁÓPG-õÔm5¬jXq<8 öØd—m¶W§Í)(nì€B 0`Ôm÷ÝxçmÏÞ|÷ÿí÷߀.øà„nøáˆ'®8àk M Ä öÙ”—MÏå˜g®ùæœwîùç ‡.ú褗nzçéèQŒ \h Á4t ûì´×^;<¸ç®ûî¼÷îûïÀ/üðÄoüñ¿ÃáK-¬¤E ìÂÁôÔWo}õïd¯ýöÜwïý÷à‡/þøä—oþùèƒ/I)ºÄð <A5ÔoÿýøÛÏþü÷ïÿÿ  HÀð€L h9·?'~+7²=8´>!k%7³=8µ>*ˆ/,Ž19·>.”3"l%.”2)….&|*+Œ02£8'}+5©:$s((,4¨95ª:0œ5$s'-’2*‰/0™5%v(2¢7,Ž01Ÿ6,04©:6­;'|+7±<9¹?4§9)…--1/™40›5/˜45«:-“25­;6®;*ˆ..•3',4¨:1Ÿ7(‚,1ž6+‹0$v(0œ6.–32 7168´=&z*%y)/–4$t(/—45¬;*‡.7±=)ƒ-3¥8(ƒ-6®<-‘2+‹/0š5)„-,15«;7°<%x)-‘1*†.+Š/&y*#p&"m%9¸?!ù, ‚ÿ€‚ƒ„……ˆ‰Š‹‹Že’“”•–—’ š›œ ¡¢££d¦§¨©ª«¦®¯°±±´µ¶··&º»¼!¾¿ÀOÂÃÄ ÆÇÈÉÉFÌÍÎ*ÐÑÒÔÕÖ××_ÚÛÜMÞßàcâãäLæçè êëìííðñò1ôõöøùúüýþÿÿ€H°€Áƒ&Á°¡Ã!#J´B±¢E*3jܱ£Ç CŠÜ@²¤É0(Sª”²¥K0cʬ@³¦M8sêó§Ï,@ƒ -B´¨ÑH“*uÁ´©SP£Jµ@µªU.X³jµÁµ«W0`ÊÅB¶¬ÙhÓªÝÁ¶­[ pÿãÊÅ@·®ÝxóêE·¯_'€ †B¸°áˆ+¾Á¸±ã#KÖB¹²e˜3k.Á¹³ç# C‹VBº´i"¨S«nÁºµk!°cËNB»¶m¸sëÞ½{…ïßÀ=N|€ñãÈ“'¯Â¼¹sУKŸ>†õëØGhßÎ=ˆ÷ïà_ˆO„ùóèI¨_Ï^‡û÷ð»ÈŸO?Šýûøyèßφÿÿö à€^aà à‚ 6Ø F(¡ Vháf¨!vèá‡N âˆ$–Xâ(¦¨b,¶èâ‹/R ãŒ4ÖXc8æ¨ãŽ;^àã@: äDY¤H&©ä ’L6‰ä PF)e ;TT_v224_html_docs/images/glass/common/talkbox.gif000700 000765 000765 00000004171 11222361074 021607 0ustar00abwabw000000 000000 GIF89aú<æïïïØØØààà­­­¨¨¨¾¾¾ÌÌÌéééëëëêêêìììíííèèèäääççç©©©îîîæææ«««¬¬¬ãããáááâââÙÙÙåå媪ªÐÐÐÍÍÍÛÛÛÕÕÕÝÝÝÏÏÏÁÁÁÖÖÖÈÈȼ¼¼ßßßÃÃÃÚÚÚÜÜÜÎÎή®®±±±ÀÀÀÂÂÂÊÊÊÞÞÞÓÓÓÇÇǹ¹¹ËËËÔÔÔÆÆÆ¸¸¸ÑÑѯ¯¯¶¶¶µµµ´´´»»»×××½½½¿¿¿°°°³³³ºººÉÉɲ²²ÄÄÄÅÅÅ···úúúûûûóóóòòòõõõôôôööö÷÷÷ñññøøøùùùððð!ù,ú<ÿ€H‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦GGQQP­®¯°±²³´µ¶·¸¹º»¼½¾º«©£ª%9ÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÕ:%MPQGœ©©QL2= ìíîïðñòóôõö÷øùúûüýù zˆ°¹ƒ*DÈJÆ)#JœH±¢Å‹3jÜȱ£Ç CŠ”²AÄ“‚áª\¸*Š“€FÊœI³¦Í›8;ÑA '-ƒ J´%”&#ä\Ê´©Ó§4IA ä[Ñ«X¡0ù¡ª×¯`ÃâTp#&à°ªê$ɱpÿãÊ;q‚I€®]۪ɓ·t Œs‚ O¾ýе`Â#KÎ8ƒ‚‹_9q„' C‹Mº´éÓ¨S«^ͺµë×°cË=á‚ÙŸ›sëÞÍ›wçϳƒ N¼¸ñã°kc8Û»¹óÜLGN½ºõëØ‡O€aîçàuGŸž½¼ùóèoïþ=üó&M’( Ÿ¾¾ýûøÿòh  üÿ(à€òM Ä&¨à‚ 6èàƒF(á„Vhá…f¨àûõ7à‡ 6±ÄJ †(¦¨âŠ,¶è"†„@U#Öhã8æXâ‰/öèã@¹bŒ3*‘ã‘H.ÁÿO$À£PF)å”.JÐ <±ä–\véå—MJĘd–iæ™h¦©æšl¶éæ›pÆ)çœtÖi¦•Xjùåž|.¦€*è „j(xfÙç¢^þyè£F*餃&ª'£‹Ž)ÅbRêé§ †z¨• Å À)¦¬¶êê«°Æ*무Öúª,XÖÕ+ª*­À+ì°Ä,0¤À‚ Äо+í´ÔVk­«R„C 60³F{í¸ä–k®­È¦@„ ÍJñì„ AÀ@IÖkï½øæ«ï¾üöëï¿ãûD5¡ |ënj ËKoÀG,ñÄWl±ÿ½é²pí.lD 8ððÅ$—lòÉ(Cü1àðA $ÓE!œòÍ8ç¬3Ɉ ì (ðíÌÕâÑH'­ôÒL7íôÓPG-õÔM(@Ë/Ǭ°DFSíõ×`‡-öØd+í€Ï%x ôÌì(AeÇ-÷Üt×=¶Õ1œ u;nÃm÷߀.¸Ü CTÀñ·@€¸'ùä”Wnùå˜g®ùæœ7'…á ¨0´`hÝøã‘wîúë°Ç.ûì°~¸ ¤D ´ðATAê /°@ ´NûòÌ7ïüóàÙz¨Ã+”@C Ø‚ $P0<ÿ1¼òЧ¯þúì‡'=îÕ_¿ 4ˆà/„€  >ä3žù’—™ð€L h‹Hà:ØÁüêw¿üàp*@ DÀ@@x>šð„(L¡ ñ€ø Üßþ0¨Az0 8@D¨€ò¯‡ ÀVHÄ"ñˆ|À „ð» ð°@<è€&`‡äë¡·¨€ ‰` £Åøhà."­ˆE.ºQ‹"d€¾8Æ:ÚñŽ |@ :àTñ:Ä¢IÈBRŽØ‹"ÉÈF:ò‘Œ¤$'ÙÈlàp€ ÉÉNÆqÿŽ” ¥(GIÊRšR”@Á,@Oº’“ â)gIËZÚò–ŠLå(ÐÊWú2Ž˜pIÌbó˜Ž\BP`^þÒ—Wt€tdZóšØ,&R J hòŠà §8Ç9N4@#HK6×ÉÎv> ;‚ 8Ðóžø§9=°ƒ¬äŸ ¨@JЂô M¨BÉñˆ`}´g>' N@š“¨Á* „…zô£ ©HGºP%T`7 @‚zò¥0©LgÊ€Pà3Á2@€žúô§@ ªP‡JÔ¢õ¨HMªR—ÊÔ¦:U©J ƒœà3ÖͪVaê€T€3@ J°à¬hM«Z×ÊÖ¶ºõ­p«\çJ׺Úõ®x…«²Ì x~ܪ`³Ê€®Vàx>° ౬d'KÙÊZö²˜Í¬f7ËÙÎzö³ µlc?€¿œ ~Ìá`W ÓÂ6€$ð€ .pØö¶¸Í­nwËÛÞúö·À ®p‡KÜâ÷¸¿¥í)ZÖ:÷¥…@^k T@ØÍ®v·ËÝîz÷»à ¯xÇKÞòš÷¼èMïw­kæ6àƒª}îV;TT_v224_html_docs/images/glass/blue/col_blue_in.gif000700 000765 000765 00000000644 11222361074 022055 0ustar00abwabw000000 000000 GIF89aÕ¡ãœÜ-S¤è\¦Z¢0YVš–·Ñ;l™Ù–©·–·Ð›Ú•µÏ9i–ª¸•¨¶/U_«_ª^ª@s]©;kZ¢;m*LQP•¨¶–·Ñ”µÎ–·Ð(I4¬A–©·”§µ3[WŸ]¨68·?-Q˜¸Ò•µÏ–ª¸\¦pK[¢P“^©+OT™˜«¹OŽ(F OO5®?K‡9dQO/V+–CK†/W5¯?,˜C8c9¸?©Õ´6®;¥Ñ¯%y)¦Ò°§Ô²3¤84ª:§Ó±7³=a¬`«`¬b­9¹?!ù,Ý€$4„…†‡‡$ 9Ž‘‘ <˜™š›› 8¢£¤¥¥ 6¬­®¯¯ 7¶·¸¹¹ :ÀÁÂÃà # ;ÊËÌÍÍ #"5ÔÕÖ××"=Þßàáá/(éêëìê0,213õö÷øö-*!.+„H°  'R„ ` €ƒz(`€À€ ,0!¢À&øpQ€I%PÀ²¥K J0)à‡Í›8sê¼ ¤§ÏŸ@ƒúôA´¨Ñ£H‹YÊ´©Ó§L;TT_v224_html_docs/images/glass/blue/col_grey_in.gif000700 000765 000765 00000000644 11222361074 022074 0ustar00abwabw000000 000000 GIF89aÕ´­«°¨¦¹±¯-S\¦Z¢0YVž–·Ñ•µÏ–©·LŠ` phP"¢À 8 øpQ€ÉtÀ²¥Ë00)à‡Í›8sê¼ ¤§ÏŸ@ƒúôA´¨Ñ£H‹YÊ´©Ó§L;TT_v224_html_docs/images/glass/blue/col_left.gif000700 000765 000765 00000001106 11222361074 021364 0ustar00abwabw000000 000000 GIF89a æX Z£[¤”µÎWŸ\¦U›\¨[¦Z¤;m[§UšX¢R˜Y£VŸ]§Q•S™Z¥W¡f±Tš”µÏW sš¹TœV›Wž>qFu›IˆVœD~Uœ£¤/;6.1¯#%+ º ²:324,90!  7 8??åç&BêìááKñ=óóêêñøùøDüýþüF ‰Áƒ YȰáB%#J„˜¤¢Å‹hÜÈQc ;TT_v224_html_docs/images/glass/blue/col_orange_in.gif000700 000765 000765 00000000641 11222361074 022376 0ustar00abwabw000000 000000 GIF89aÕñx-S÷{\¦Z¢0Y9‚ J´¨ÐH“*]Ê4i ;TT_v224_html_docs/images/glass/blue/col_pink_in.gif000700 000765 000765 00000000644 11222361074 022067 0ustar00abwabw000000 000000 GIF89aÕÒÒØØ-SÝÝ\¦Z¢0YVžT™”µÎ–·ÐHpQ€I0˜À²¥K*0)à‡Í›8sê¼ ¤§ÏŸ@ƒúôA´¨Ñ£H‹YÊ´©Ó§L;TT_v224_html_docs/images/glass/blue/col_right.gif000700 000765 000765 00000001105 11222361074 021546 0ustar00abwabw000000 000000 GIF89a æX Z£[¤\¦”µÎWŸU›\¨Z¤[¦;mUšX¢R˜Y£VŸQ•]§S™Z¥W¡[§X¡;nBy†ªÅ”µÏVžV›q˜¸Fu›L‹[¥UœW ]©TœS˜Z¢%Z…R–UIˆSšUžD~R•VœTšY¢#X„>qWžE}XŸV@uf±‘³ÍY¡Q–^¨•µÏ\§–·Ð˜¸Ò]¨–·Ñ^ª`«_ªb­_«a¬`¬^©!ù, ¢€A‚ƒA:<+,C‹ŒC8 @”•2*0">ž- $ ¦9'5.4& ±3!(%)¸ /76;  1 ßá??äå?ìBî#îî=óóKö÷øùDûüýûF ˆ¤ Áƒ‹(\ÈP¡’‡#>LB±¢EŠG2jܘ1;TT_v224_html_docs/images/glass/blue/footer.gif000700 000765 000765 00000024415 11222361074 021103 0ustar00abwabw000000 000000 GIF89a¼Ü÷U¥Å¢Ïá¨ÖéšÙŸÌß¡ºÅŸ¹Ã¤ÖêŠÃÛ®ØêÉÉɲÝîäääyºÔ¡Òæ¹¹¹²ÞñŸÎâ½ÊÙÙÙ¡ÓèªÔæÐåv¦‘Í«««¡Ðã}±°°°«Üð¤Ô饾ɽ½½¨ÂÌ­ÆÐŸÒç¢Ôè¨Úï”ËáŸÊݱÊÕ¦Øì²äø„½Õ¯àô¯áö¦ÖêÕÕÕÍÍͱâ÷²âö±àó­ßô®®®¢Õê¨Ûð¡Ôé¢Òææææi°Í Ðä­ÞòÊÜRs¤×ì‰Á˜×™ÓêÀÀÀ”Ñ¥Òå°ãø¥Ïá°àô£ÍÞ ÊÜÈÛ©ØìÝÝÝááá«×ê¥Ôç®ÞòÒÒÒ°ÛìÐÐÐŒÉâ²ÌÖ®Üï¦Õè¯â÷¤Ðã…»÷÷÷¦ÀÊ­àõ«Þó¬Üð©ÜñªÚî···¤ç¨m™ðððòòòíííêêê7µžÄÓôôôùùùNm¬Ûï°ÃˬÖè©Óå¦ÑâŸÎá«ÄÎe®Ë¦Ùî¯ÈÓñññüüüýýý€´ªÙìžÌàçèé›ÎãïïïîîîÇìììöööúúúõõõøøøØÞàpŸ–Ô>™½©ï¡ã§ìp¤èœÜéééœÏãóóóœÎãÍárŸËÞ·ÁœÍâÈÙÉÜqŸâââ§§§:”¹©î¦ê¢åÝUxŽÈ¨ìÏä¥éÞÞÞ¨í¦ëÞžßžÑ壿ŸÑæ—ÕÏã¥êŸá¢äœÎâÎâÎã£Öê âžÐ奨ì«ÝòŸÐä±äøèèèÍâÌàÍàŸÑå¯Þñ¦Óæ›Ûãã㤽ǤÎߢÑå£ÒåÃÃã¼ÇËßžÐäŸÐå¤Óç¦Òå¦Ðáßßß¡ÌÝ Íß§Úï¯Ûî²áõ²åùÂÏÕEš½—ÖŸÊÜ áœÛ¡äÅÅŨÙîâäå«Úí³âõÒÚÝcŒÎá3±œÝ­Ýò®Ýð8O™ÌâŠÄ¨ÒãˆÀ­Ùì­Úí®Ûíëëëûûûþþþªðÿÿÿ!ù,¼Üÿý H° Áƒ*\Ȱ¡Ã‡#JdHª”©SR¡úDZ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµ*ªTN™*Ej¢×¯`ÊKbÅ‹7V]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ó½šukײˆ+^ÌXâYŒKžL¹²å˘3kÞ̹³çÏ C‹ “°V®S«^Íúëã´¤cËžM»¶íÛ¸sëÞÍ»·ïß,MnM¼¸ñÖ¯#_μ¹óçУKŸN½ºõë4…£>ν»w×!«ÿÅN¾¼ùóèÓ«_Ͼ½{àÚŸO¿>ÁäãßëßÏ¿¿ÿÿ(à€ÔÅgßr‡ 6èàƒF(á„VH’ f¨ac Zèᇠ†(âˆ$–hâ[n¨âŠauxâ‹0Æ(ãŒ4Öhc)²¨ãŽ ¹xã@)äDid\9ò¨ä’ùxä“PF)å”TVùc’Lf©£“Vvéå—`†)æ˜Ía©å™rIæšl¶éæ›pÆ)•™hÖiŸšræ©çž|öé'œtÚ)¨wxþi衈&ªè¢:è£ÅÊ褔Vj饘úæ(¤œª&i¦ †*ꨤ–Š$V§É×éªÈ…›©°Æÿ*무֚ªÃ±ªëjŸÚêë¯À+¬¡›îj,X½«ì²Ì6ë¬Å+mDÉ>kíµØf«m€ÑNë-E®*·í¸ä–kî¹ÓuûíºU‹î»ðÆ+ï¼~©Ëî½¹Kï¾üöëï¿DÙ‹/»úlðÁ'¬ðGümÁ G,ñÄcÛ°ÃÓB\ñÆw챨c|¬Æ—lòÉ(Šëv"·Üd¸ù¥,óÌ4× fÈ.³J²Í<÷ìóÏâœs§;môÑH'­žÐCCZ´ÒPG-õÔ»1Ýô OS­õÖ\w]™ÕWÛ™µ×d—möÙl6šc£íöÛpÇÝ“ÚkkÙ¶Üxç­÷Þ#Ñÿ]7“wó-øà„—í÷ßJ^øâŒ7ôáˆï¨¸ã”WnyÇGÎâä—wîùçýf®¹Šœƒnúé¨g+úèiœúë°Ç¾ïê¬'Xºì¸ç®»¥´×~àí»/üðyöî{}À¯üòÌ[iüñó%ßüôÔWãóÐêºõÜwï}—Øg¯àöß—oþùW®¬ªøœJþûðÇ^øìGJ¾üøç¯¿€ô×ß*ZâÚŸH@ôôϼº_ÈÀ2ç€LûHÁ ZÐ.Œ c&xÁzðƒPÉ ÃAšð„(ü‰Gˆ˜¦ð…0Œ¡KVÈB²¸P†8Ì¡;BÊå†; ¢ÿMØC"KCL¢—X’"Ñ+@d¢§?'>Ñ1H¤¢·C+^Ñ,Yä¢ÇØA/~Ñ!Q$£×;3ž\ŒçHGü¹ñ Ic÷ÈÇÂÝÑcIȸýd!ÉÈ®‘÷ c#'IIÏ=’ù’d%7ÉI?ª“›Ód'GIJC~”¤e)WÉJGž•­‹c+gIK²]“Ь¥.w ¯[B2—¼ ¦0U÷JXÚN•ÃL¦2%æKDs™ÐŒæ¬š ÈgJóšØ5ñhÍlzó›ŠÚæ» ÎršSOâ<#9ÏÉÎv’)_\§;çIO*ÁóŠò¬§>÷9ÿ¤{>1Ÿü ¨@eäO#t Mhˆ êÃ*ô¡…CkèЈZô¢ÿ™( +ŠÑŽzt=!G?JÒ’Z'¤©IWÊÒÓ˜¿CfKgJÓ¡4‚*­©Nw:š›"0§< ªP3ãSÿu¨HM*`ŠZ¿£*õ©PÅàKaŠ<™FõªXí SÙçÔ¬zõ«NÙªøº Ö²š5`S¥jô¬zÖ¶ºõkiU«ödùÖºÚU3bÍYïÊ×¾¢$¯ÐÛ«_KXöx‚-¬bûzXß%v±}kck÷ØÈZ¶¬“e]e/ËY¬fvt›í¬h•úYÍ…v´¨ ji#wÚÔº–¦«E\k_K[“ÿÆöo³­­n;zÛºåv·À…ho×öÛàw Ã [qË\}&÷jËm®tÛùܦEwºØgu‡vÝìz÷šÛÍYw¿K^e†×eã-¯zyyÞ–¥w½ðe{EöÞøÚ—”óÅX}ïËßJæ×aûí¯€ùß¹‚æ D# Š~8øÁް„'Lá [øÂΰ†7Ìá{øÃ ±ˆGLâ›øÄ(N±ŠWÌâ»øÅ0ޱŒgLãÛøÆ8αŽwÌãûøÇ@²‡Ld"Ã'®r-Î#–|`H”£ 懔§Lå*[ùÊXβ–·Ìå.{ùË`³˜ÇLæ2›ùÌhN³š×Ìæ6»ùÿÍp޳œçLç:ÛùÎxγž÷Ìç>ûùÏ€´ MèBúЈ4øÐ‡>D˜7þÖ’—¬Š2àb¨ÇºÀéN{úÓ µ¨GMêR›úÔ¨NµªWÍêV»úհ޵¬gMëZÛúָε®wÍë^ûú×À¶°‡MìbûØÈN¶²—Íìf;ûÙÐŽ¶´—­E¼á ˆ2£!¬›HKkÒ …*X‘ XÔ÷øAÒ°‡v»ûÝðŽ·¼çMïzÛûÞøÎ·¾÷Íï~ûû߸ÀNð‚üàO¸ÂÎð†;üá¸Ä'NñŠ[üâϸÆ7ÎñŽ{üã ¹ÈGŽñu§ánÿHÄ!º€m~lûÁ¸ñ¶±&M WD¢e Ç Ì8ìãçkºÐ‡Nô¢ýèHOºÒ—Îô¦;ýéPºÔ§Nõª[ýêXϺַÎõ®{ýë`»ØÇNö²›ýìhO»Ú×Îö¶»ýíp»ÜçN÷ºÛýîjÿù> ¡B bipÃ!¬írG;ø62ßÕ’ÅýŠ[Lð8wü„âò˜Ï¼æ7ÏùÎ{þó ½èGOúÒ›þô¨O½êWÏúÖ»þõ°½ìgOûÚÛþö¸Ï½îwÏûÞûþ÷À¾ð‡OüâÿøÈO¾ò—ÏüæŸ `€ˆ±Cü]ðŠÈ¶áûa›Ä³jñªxÿ+f X~8C;æ!Šö»ÿýð¿üçOÿúÛÿþøÏ¿þ÷Ïÿþûÿÿ€8€X€x€˜€ ¸€ Ø€ø€8Xx˜¸Øø ‚"8‚˜ÀðÑ0 @ û@Çrü°}µá}2i® ~³à °0\plÐpV„'$ei O0 ÑàÄ`hp 2Hƒ³aƒœÂd‘p ;ˆ~`V°°Dh„f˜B]0@ °0xo0ƒ‡w…H–dŒnª€sp E  *°3@†gXˆ(Ä P jpÿ(‡Ü'Xø(L&~¹ àxð * Þ0†WPd¢8ФXЦxЍ˜Šª¸Š¬ØŠ®øŠ°‹²8‹´X‹¶x‹¸hað/@ X…sH“8(”†s¸\àßÀ‰žйøŒÐÒ8ÔXÖxØ˜Ú¸ÜØÞø8ö°ˆ„@…ˆÀ0'Œuh‡‰n‘À ¦ B  C°Œø‰dŽú¸üØþø9Yyª8 à•0n Ã((áö w Aà؉20Έ ’"9’$Y’&y’(™’*¹’ÝÈ„ °hqhxêX,ÃŽªÿñ®P ³€ ˰ 0 Ù‘É’Fy”H™”J¹”LÙ”Nù”P©ŠD `ŽøèŒ 1‘vòypC°‘*@”ù•h™–j¹–lÙ–nù–p—±˜0: 昕=µŽ8I^y ¦`~  G0 GÞà‘T€Ö˜Žù˜™’9™”Y™–y™˜™™š¹™œÙ™žù™ š¢9š¤Yš¦yš¨™šª¹š¬Ùš®ùš°›²9›´Y›¶y›¸™›º¹›¼Ù›¾ù›ÀœÂ9œ‘™  •€n0“Zé\Y'^Inæ' ÃP‡™˜°˜Ä¹ÜÙÞùàžâÿ9žäYžæyžè™žê¹žìÙžîùžð™žçÀ†û°p˜•‘øω&ðŽ{X Ôiˆ©˜ŒŸz š  º  Ú ú ¡:¡Z¡ª›oÀv‰—]pŽÍÉûy&ýy‘z&z˜I °˜‹Ö¢.ú¢0£2:£4Z£6z£8š£:º£<Ú£>ú£@¤B:¤DZ¤Fz¤Hš¤Jº¤LÚ¤Nú¤P¥R:¥TZ¥Vz¥Xš¥Zº¥\Ú¥^ú¥`¦b:¦3jœÈ©œÌ™Ÿ¢Z2¢ `’p¢(:ˆ,J¦vz§xš§zº§|Ú§~ú§€¨‚:¨„Z¨†z¨ˆš¨Šº¨…ÿªôiŸX™ŽkÊ—})n §r)º¢(À¨žú© ª¢:ª¤Zª¦zª¨šªªºª¬Úª®Ú¥Š ¡w™—JT”Z©`q© ZЫZÐ, X@zhÆz¬Èš¬Êº¬ÌÚ¬Îú¬Ð­Ò:­ÔZ­Öz­Øš­Úº­Ü:f­pœÉ¹œ9©6¹>¸ÚŽ‘ðxpê«¿¬ÃZ¬Ý¯ò:¯ôZ¯öz¯øš¯úº¯üÚ¯þú¯°„æ¨/ ©øI®©r®¡«’Ð ¬ÁÚ ¯[±{±›±»±Û±û± ²"K­] «ê¡jj«åª°w˜®oº« ±É ±;²6ÿ{³8›³:»³<Û³>û³@´ëàŠ¦ãŠW·Ê²Á°1Ë;±BµR;µT[µV{µX›µZ»µØJ°õyŸ’Šlš%Lë°_ÀR ú0±ˆÐ¶nû¶p·r;·t[·v{·x›·z»·|Û·~û·€¸‚;¸„[¸†{¸ˆ›¸Š»¸ŒÛ¸Žû¸¹’;¹”[¹–{¹˜›¹š»¹œÛ¹žû¹ º¢;º¤‹·‡`²´š²–1¶LR¶-p¶i»¶zPº´[»¶{»¸›»º»»¼Û»¾û»À¼Â;¼Ä[¼Æ{¼È›¼ÉK´g*®4©² «´èª®»úÖû4ÐX ×ö½àÿ¾â;¾ä[¾æ{¾è›¾ê»¾ìÛ¾îû¾ð¿ò;¿ô[¿ö{¿ø›¿ú»¿üÛ¿þû¿À<À\À|ÀœÀ ¼À ÜÀüÀÁ<Á\Áìëµ¶pµ²Ò‹ {½Ø«½Üë½\Â&|Â(œÂ*¼Â,ÜÂ.üÂ0Ã2<Ã4\Ã6|Ã8œÃ:¬Ã‰€ºª—b›´Ü KFœ½ñø0$¼ÃNüÄPÅR<ÅT\ÅV|ÅXœÅZ¼Å\ÜÅ^LÁÌ®iÄ<ÄcQÄGÜI¼ÄMüÅnüÆpÇr<Çt\Çv|ÇxœÇz¼Ç7ŒÁ¨Á’ÁºK‚Æ4ÁJÌÄÕÿ¶ÈŒÜÈŽüÈÉ’<É”\É–|ɘœÉš¼ÉœÜÉžüɠʢ<ʤ\ʦ|ʨœÊª¼Ê¬ÜÊ®üʰ˲<Ë´\˶|˸œËº¼Ë¼Ü˾üËÀÌšì>Œ²—!ÈJBȆŒÈl,ÌÎüÌÐÍÒ<ÍÔ\ÍÖ|ÍØœÍÚ¼ÍÜÜÍÞüÍàÎâ<Îä¼ÈDû ùG;ÈÌ# ðlÈ P0w0møœÏú¼ÏüÜÏþüÏÐ=Ð]Ð}ÐÐ ½Ð ÝÐmk,“ë,í¼#ïÏÁ0Ïõ|ÏÝÑýÑ Ò"=Ò$]Ò&}Ò(Ò*½Ò,ÝÒú| w™?ÿ ÈQÑ:°Á°ÓÀÑ.=ÔD]ÔF}ÔHÔJ½ÔLÝÔNýÔPýÐÙ@­@ åXÓµÚ8Í":ÍÓàÓ@-ÔQ=Öd]Öf}ÖhÖj½ÖlÝÖníÔ‰ˆœ‰ÕY­[½"] bÐcðÓA}€Ø‚=Ø„]؆}؈؊½ØŒÝØŽýØÙ’=Ù”]Ù–}Ù˜Ùš½ÙœÝÙžýÙ Ú¢=Ú¤]Ú¦}Ú¨Úª½Ú¬ÝÚ®ýÚ°Û²=Û´]Û¶}Û”M À k œÀøhZ-Äf¬y½×}Ö¸ÜʽÜÌÝÜÎýÜÐÝÒ=ÝÔ]ÝÖ}ÝØÝÚ½ÝÜÝÝÞÿýÝ…­P З0xÙVxI‹¨P@ æÀ ®0Ügì²p*ø-7ðM t‰à>à^à~àžà ¾à Þàþàá>á^á~ážá¾áÞáþá â">â$^â&~â(žâ*¾â,Þâ.þâ0ã2>ã4^ã6~ã8ná@SÀ Œ¸‚×Ö†m‰+hí]å ò=iôý ›ßúÍßþ à9^åV~åXžåZ¾å\Þå^þå`æb>æd^æf~æhžæj¾æþdPO û hpr)§r­l?P0¸PªnM> {†~%ÿ€0ånÐèŽþèé’>é”^é–~阞难éœÞéžþé ê¢>ê¤^ê¦~ꨞꪾê¬Þê®þê°ë²>ë´^ë¶~븞뺾ë¼Þë¾þëÀìÂ>ìÄNêçÐ Ì •0ç~‡ÐíÒ>íÔ^íÔ^rið÷€µ ¹À ª@ ‚>èQ臞è‹þßžîìÞîîþîðïò>ïô^ïö~ïøžïú¾ïüÞïþþïð–Îð0Ð O}ÓG •Ððÿðññk§wpÀ…P@eP ‘à â¾däî [&ŸèMà`! ð.ÿò0ó2ÿ?ó4_ó6ó8Ÿó:¿ó<ßó>ÿë»X*SðàNÐ J¿ôLßôNÿôKŸ ÂÇ pàA€â0 ·ð á.ò#Ï%òèÐß+ßò?Ÿöj¿ölßönÿöp÷r?÷t_÷vßï•0‰H(h‚~ÿ÷€ø‚/ø8íp~€B 0 ¬àõ!ö Á°ÜPùy) ÊP^p žÿù ú¢?ú¤_ú¦ú¨Ÿúª¿ú¬ßú®ÿú°û²?û´_û¶û¸Ÿûº¿û¼ßû¾ÿûÀüÂ?üÄ_üÆüÈŸüÊ¿üÌßüÎÿüÐýÒ?ýÔ_ýÖý^°;ðgÿÀ ¾àø¯à L.ùÁ°—ù)Y°ù^`rðÿò?ÿô_ÿöÿøŸÿú¿ÿüi$XÐàA„ .dØÐáCˆ%N¤XÑâEŒ5näØÑãG!EŽ$YÒäI”)U®dÙÒåK˜1eΤYÓæMœ)½`³Wa…?Nùšu+’«Gü-eÚÔéS¨Q¥N¥ZÕêU¬Yµn}ú(Ò$H”IÊS6OŠY”Õñ’Óí[¸qåÎ¥[×î]¼yõîåÛ×ï_À&\¸¥—:ʲ¤ÀTXÊ”REJ)WÌ™5oæÜY³W°b%¡%í"Ê5lm ¯fÝÚõkرeϦ]Ûöÿmܹuïærçµ(.Ràg@¬\¬^!½ìÙùsèÑ¥3v,i´¦Q«îÝÝûwðáÅ'_ÞüyôéÕ¯ù;xв£¸,Ã5YUÒéùõïçßõ«uI€ˆ²ˆÂ$>ØcAtðA#”pB +´ðB 3ÔpC;ôðCCqDK4ñDSTqE[tñEc”qFk´ñFsÔqG{ôñG ƒrH"?@ˆ(²8`¬ÐDˆXLa%Ëú³òJ,?ûO4!Ð@$rL2Ë4óL4ÓTsM6ÛtóM8ã”sN:ë´óN<ó¤ÓH$•­Q‚8’I^©2KDUÿÔ©êDâQ=°f‹ѰôRL3ÕtSN;õôSPCuTRK5õTTSUuUV[uõUXc•uVZkµõV\sÕuW^{õõW`ƒvXb‹5öXd“UvYf›uöY#·°Æƒ%Ýaúf)©E»õÖÊFÇ‚4ÒI+}ö\tÓUw]vÛu÷]xã•w^zëµ÷^|óÕw_~ûÅ7Úi«=ÀŠ Ž3…²æ¾UxaÏ•äˆðÀ#¶p¦3ÖxcŽ;öøcCyd’K6ùd”SVYÕfœÙˆ‰#¶!`1å–ûÖygÌŽXbŠ-Æxe¢‹6úh¤“Vzi¦›vúi¨£–ºÔ–_Žÿ9bIjN.gž»öz*‡{ÛI¡ÙB iQ{m¶Ûvûm¸ã–{nºë¶ûn¼óÖ{o¾ûöûoÀ|p 7üpÄW|qÆwüqÈ#—|rÊ+·ürÌ3×|sÎ;÷üsÐC}ti”Øšim»IjtÊ„¿–ýë°Ç.ûì´G×}wÞ{÷ýwàƒ~xâ‹7þxä“W~yæ›wþyè—/ýôÔWo}ÐI"‰}vîuvØðm !‡gЦBÒW}öÛwÿ}øã—~úë·ÿ~üó×þû÷ÿP€$` x@&P d`ø@FP‚¤`-xA fPƒä`=øÿA†P„ÐFž‘„Ï’h%¥½îÅpgß ßøÊw>æP‡;äa}øC QˆC$bxD$&Q‰KdbøÄ%’Є(T! ]˜½íÉP‹‰r¼ˆ 8@æ+€ÌxF4¦QkdcÝøF8ÆQŽs¤cíxG<æQ{äcýøG@Rƒ$d! yHD&R‘‹dd#ùHHFR’“¤d%-yILfR“›äd'=ùI)jÀø"¬øÂ,nQ•àÚÒXJÆ1žï“³¤e-myK\æR—»äe/}ùK`S˜Ã$f1yLd&³˜¡e)O‰ÅUF3K£@5Ãø ÿlC–Êäf7½ùMp†Sœã$g9ÍyNt¦Sëdg;óHÂmhࣴæ3a(M|ò‡šÖt6µYFwT %hA zP„&T¡ ehCúÐ:ÂSžô¬¦=S™OŒvfŸxm,Á† iIMzR”¦T¥+eiK]úR˜ÆT¦3¥iMmzSœæT§;åiO}úS U¨C%jQzT¤&U©KejSúT¨FUªS¥jU­zU¬fU«[åjW °„mD€A=[ˆÊŒ¦:íèGC:Ò®ÆU®s¥k]ízW¼æU¯{åk_ýúWÀV°ƒ%la {XÁ~5¬c-kEÏ MµF–ÿ3AeG€ aØã0À><ûYІV´£%miM{ZÔ¦Vµ«emk]ûZØÆV¶³¥mmm{[ÜæV·»åmo}û[àW¸Ã%nq{\ä&W¹Ëensû\èFWºÓ¥nu­{]Œƒv2,;‹JV¼™¡¬e1Ívöºëeo{Ýû^øÆW¾ó¥o}í{_üæW¿ûåoýû_˜¿Ù%@ºûÝðŽWÁY)oeÏ›^GX¦p…-|a gXÃæp‡=üa‡XIJ%°½kÙ/XÅTq-\L‹jD@³œqm|cçXÇ;æq}üc YÈCv-íj¼˜)ÿ^q“ýš±(¹Âé "gYË[ær—½üe0‡YÌc&s™kœ ¬ÂHò‹™ìd8ûÃa² ó/¨a‹bXÄüüg@ZЃ&t¡ }hD'ZÑ‹ft£ýhHGZÒ“¦t¥-}iLgZÓ›æt§=ýiP‡ZÔ£&u©M}jT§ZÕ«fu«]ýjXÇZÖ³¦u­mMëJ,B›DlA_ÐYoŽs“«sŠZHBØ¿øžA€6È¡·¦vµ­}mlg[ÛÛæv·½ýmp‡[Üã&w¹Í}nt§[Ý⮄Ú@€cøšÙ¾Z‹g¯°ÈVvíl ;‚Çÿº ~p„'\á gxÃþpˆG\â§xÅ-~qGƒc×€°Ã¯çMçzÃîÞøV+r !HÂ+_ù*xáŽcl‚ ;ÒQ œç\ç;çyÏ}þs ]èC'zÑ~t¤']éKgzÓþt¨G]êS§zÕ­~u¬g]ë[çz×½þu°‡]ìc'{ÙÍ~v´§]íkg{ÛÝþv¸Ÿ=샘°‰c¸ƒ«`ùÊ[‹­]tä’}„*na ”ƒÂ}_…-v‘ clÂm',yÌg^ó›ç|ç=ÿyЇ^ô£'}éMzÔ§^õ«g}ë]ÿzØÇ^ö³§}ím{Üç^÷»ç}ï}ÿÿ{à_øÃ'~ñ|ä'_ùËg~ó| ´Á›0F&va ¾³\Œ¨Ù͸6ø¾¦ˆÅ.€K0Þñ™8Æ4$ÿ‰O0Áó§ýíüç_ÿûçÿýÿ @@,@<@L@\@l@|@Œ@ œ@ ¬@ ¼@ Ì@ Ü@ì@ü@ AA,AìC?üC@ DADB,DCTITJ­TK½TLÍTMÝTNíTOýTP UQUR-US=U;¥‡Àƒw…{X å`Ð$ÔUJ ÷aNa^ana~aŽaža®a¾aÎaÞaîaþa b!b".b#>b$Nb#~à[(…Rx…HÛ6àBE`R WpUPàHèb/þb0c1c2.c3>c4Ncê5^c6nc7~c8Žc9žc:®c;¾c<Îc=Þc>îc?þc@dAdB.dC>dDNdE^dFndG~dHŽdIždJ®äIÞâ,¾bžb*îÁMþdPeQeR.eS>eTNeU^eVneW~eXŽeYžeZ®e[¾e\Îe]Þe^îe_þe`fafb.fc>fdNfe^ffnfg~fhŽfižfj®æVîdlÎfmÞfnîfoþfpgqgr.gs>gtNgu^gvngw~gxŽgyžgz®g{¾g|Îg}Þg~îgþg€hh€;TT_v224_html_docs/images/glass/blue/header.gif000700 000765 000765 00000035023 11222361074 021032 0ustar00abwabw000000 000000 GIF89aà‚÷¼¼¼xxxºººÄÄÄU‡‘Ø|||Z—¹¸¸¸¬Ñå¦ì®®®´´´šàTw²²²¶¶¶|»~~~©îÕd¨¬¬¬©Ñå©©©­Óè¢èHy°°°f¬ŠŠŠŠÑ„„„žä–––‚‚‚žžžªÎâªÌÞœœœr´’’’œâ‡‡‡j¬–Ô¢¢¢   ŽŽŽ¥¥¥˜˜˜­Îàm¶ŒŒŒ jœšššŠ¶Ðˆˆˆª¾É±ÉØvvv”Ú…Í`£”””®Ôé˜ßGjŽÈ æ¤êp¹u½‰ÅyÁÉ–ÂÛ}ÅݪÒèj´®ÀËŰÔ꽑Ռӕ݆əډÍn¸‘Ð}Áx¶‚Âq¥Ã—Þ°Óèu¸m±Í.E‹È…Ä…Á¦ê–Ü;z °Òæ°Ðäm¤Nqj²²Òç\‘r¼¡ä±Ðã¤èÎÃÑÙb¥{Äüüü³ÔêwÀ¢æèèèñññ“Òh°°Ôéc®b­d¯g²^©i´ýýýúúúöööøøøõõõçççìììîîîïïï°ÏâO€¤ÎäB…«°ÃÏj¯þþþ²Ôêi³a¬f±e°h³f°^ª`¬_«]©_ª`«i²²Óèg°²Óé²Ñå±ÂͲÐä²Ïáâââ§§§óóóeªg«f©d¦ªð{{{ÞÞÞÖÖÖäääÁÁÁÚÚÚÉÉÉÃÃÃzzzÑÑѪªªÒÒÒÓÓÓÏÏÏÈÈÈÂÂÂ×××ØØØÍÍÍæææÇÇÇÜÜÜÊÊÊÔÔÔ¿¿¿ÀÀÀ«««ÛÛÛÎÎÎÐÐТåÌÌÌËËËßßßÙÙÙ¾¾¾ÝÝÝãããàààáááÆÆÆåååÕÕÕ¦¦¦²ÔékµÇƒË‡Ï²Ñæ²Ïâh­r¬¯ÐãŸã²Ñäøùú±Ñåc¨òòòðððíííôôôêêêùùùëëë÷÷÷éééûûûÿÿÿ!ù,à‚ÿO H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sꌹ¨§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ã®¤"KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“Gż¹óçУKŸN½ºõëØ³kßν»÷ïàËÿO¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€îgÊ&¨à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã6¦"äDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæ©gœ¥ôé矀*è „j衈&ªè¢Œ6êè£F*餔Vj饘fªé¦œvêé§ †*ꨤ–jꩨ¦ªêª¬¶êê«°Æÿ*무ÖÊê'¸æªë®¼öêë¯À+ì°Äkì±È&«ì²Ì6ëì³ÐF+í´ÔVkíµØf«í¶Üvëí·à†+î¸ä–kî¹è¦«îºì¶ëî»ðž‹È¼ôÖkï½øæ«ï¾üöëï¿,ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñÅg¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ4×lóÍ8ç¬óÎ<÷ìóÏ@-ôÐDO|ÈÑH'­ôÒL7íôÓPG-õÔTWmõÕXg­õÖ\wíõ×`‡-öØd—möÙh§­öÚl·íöÛpÇ-÷Üt×m÷Ýxç­÷Þ|÷ÿí÷߀.øà„nøáˆ'®øâŒ7îøãG.ùä”Wnùå˜ŸÈæœwîùç ‡.ú褗nú騧®úꬷîúë°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üòÌ7ïüóÐG/ýôÔWoýõØg¯ýöÜwïý÷à‡/þøä—oþù觯þúìïÊûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ  HÀð€L ÈÀ:ðŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHÂšð„… WȺð…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡@ ¢ÿ‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £³Š2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNRR  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎvºóðŒ'0EAÏzÚóžøÌ§>÷ÉÿÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽzô£ ©HGJÒ’šô¤(M©JWÊÒ‘zâ¥0©LgJÓšÚô¦8Í©NwÊÓžúô§@ ªP‡JÔ¢õ¨HMªR—ÊÔ¦:õ©PªT§JÕªZõªXͪV·ÊÕ®zõ«` «XÇJÖ²šõ¬^e„Z×ÊÖ¶ºõ­p«\çJ׺Úõ®xÍ«^÷Ê×¾úõ¯€ ¬`KØÂö°ˆM¬bËØÆ:ö±¬d'KÙÊZö²˜Í¬f7ËÙÎzö³  ­hGKÚÒšö´¨M­jWËÚÖºöµ°­lgKÛÚÿÚö¶¸Í­nw‹W)øö·À îoUAÜâ÷¸ÈM®r—ËÜæ:÷¹Ð®t§KÝêZ÷ºØÍ®v·ËÝîz÷»à ¯xÇKÞòš÷¼èM¯z×ËÞöº÷½ð¯|çKßúÚ÷¾øÍ¯~÷Ë_ïÎaÁ=‡€L`³âÀN°‚Ìà;øÁް„'Lá [øÂΰ†7Ìá{øÃ ±ˆGLâ›øÄ(N±ŠWÌâ»øÅ0ޱŒgLãÛøÆ8αŽwÌãûøÇ".„(ˆë àøÈH²’—Ìä&;ùÉP޲”§Lå*[ùÊXβ–·Ìå.{ùË`³˜ÇLæ2›ùÌhN³š×Ìæ6»ùÿÍp޳œçLç:ÛùÎxγž÷Ìç>ûùÏ€4™ÛÁŠBú¿R(p ÍèTàÑŽ´¤'MéJ[úҘδ¦7ÍéN{úÓ µ¨GMêR›úÔ¨NµªWÍêV»úհ޵¬gMëZÛúָε®wÍë^ûú×À¶°‡MìbûØ©®…²mÑC«"Ñçh´´k„j[ûÚØÎ¶¶·Íín{ûÛà·¸ÇMîr›ûÜèN·º×Íîv»ûÝðŽ·¼çMïzÛûÞøÎ·¾÷Íï~ûû߸ÀNð‚üàO¸ÂÎð†Ã›| ‡²›ýl3º Ïø6ÎñŽ{üã ¹ÈGNò’›üä(ÿO¹ÊWÎò–»üå0¹ÌgNóšÛüæ8ϹÎwÎóžûüç@ºÐ‡Nô¢ýèHOºÒ—Îô¦;ýéPºÔ§~óK\¢ï@;61‡h/:ãÿƒØÇNö²›ýìhO»Ú×Îö¶»ýíp»ÜçN÷ºÛýîxÏ»Þ÷Î÷¾ûýàOøÂþðˆO¼âÏøÆ;þñ¼ä'OùÊ[þò˜Ï¼æýž1¸au¨€-¸.…€= ¨OÂæWÏúÖ»þõ°½ìgOûÚÛþö¸Ï½îwÏûÞûþ÷Àþä[‘ƒ: [Ÿƒé»úÔ ÿùоô§Oýê[ÿúØÏ¾ö·Ïýî{ÿûÝ_Gÿ&„­›ÁôÍG}'ÖÏþö»ÿýð¿üçOÿúÛÿþøÏ¿þ÷Ïÿþûÿÿ€8€X€x€˜€ ¸€ Ø€ø€8Xx˜¸Øø ‚"8‚ 8v@µÀuè‡zvЂ­ð‚0ƒ28ƒ4Xƒ6xƒ8˜ƒ:¸ƒ<؃>øƒ@„B8„DX„Fx„H˜„J¸„LØ„Nø„P…R8…TX…Vx…X˜…Z¸…\Ø…^ø…`†b8†dX†fx†Chjhñ7vnPí |Ìׂt¸ vx‡x˜‡z¸‡|؇~ø‡€ˆ‚8ˆ„Xˆ†xˆˆ˜ˆŠ¸ˆŒØˆŽÿøˆ‰’8‰”X‰–x‰˜˜‰š¸‰œØ‰žø‰ Š¢8ФXЦxЍ˜Šª¸Š¬ØŠ®Øˆ/¨†ï'vNp ·° f0‡th®Ð‹¾ø‹ÀŒÂ8ŒÄXŒÆxŒÈ˜ŒÊ¸ŒÌØŒÎøŒÐÒ8ÔXÖxØ˜Ú¸ÜØÞøàŽâ8ŽäXŽæxŽè˜Žê¸ŽìØŽîøŽðò8ôXиøHúh‡/è~b÷†¸¨‹t Yy™ ¹ Ùù‘9‘Y‘y‘™‘¹‘Ù‘ù‘ ’"9’$Y’&y’(™’*¹’,Ù’.ù’0“29“4Y“6y“8ÿ™“:¹“<‰‘ñà‹û¸ ­À†î'P¹˜v L©±ð”P•R9•TY•Vy•X™•Z¹•\Ù•^ù•`–b9–dY–fy–h™–j¹–lÙ–nù–p—r9—tY—vy—x™—z¹—|Ù—~ù—€˜‚9˜„Y˜†y˜cÉì@½Hv(‹ì÷µØfIДLù š¹™œÙ™žù™ š¢9š¤Yš¦yš¨™šª¹š¬Ùš®ùš°›²9›´Y›¶y›¸™›º¹›¼Ù›¾ù›ÀœÂ9œÄYœÆyœÈ™œÊ¹œÌÙœÎùœÐÒ ›š  ±` x0t@/XÞY p ”ÿÉ|˜©pžè™žê¹žìÙžîùžðŸò9ŸôYŸöyŸø™Ÿú¹ŸüÙŸþùŸ : Z z š  º  Ú ú ¡:¡Z¡z¡š¡º¡Ú¡ú¡ýÉù°<` óðtÐßÙ âY™K©€£ :£4Z£6z£8š£:º£<Ú£>ú£@¤B:¤DZ¤Fz¤Hš¤ê <ÚI†ðÞÙ¢)°”1£~¥Zº¥\Ú¥^ú¥`¦b:¦dZ¦fz¦hš¦jº¦lÚ¦nú¦p§r:§tZ§vz§xš§zº§|Ú§~ú§€¨‚:¨„Z¨†z¨ˆš¨Šº¨ŒÿÚ¨Žú¨©rê$ oðP¥U`TÊ”€À *©¢:ª¤Zª¦zª¨šªªºª¬Úª®úª°«²:«´Z«¶z«¸j¨÷  óp¢d@RÚ©0 ªL«Æz¬Èš¬Êº¬ÌÚ¬Îú¬Ð­Ò:­ÔZ­Ž \Z þ`­t*š`¢˜ª©SŠ‹e0¬Äê蚮꺮ìÚ®îú®ð¯ò:¯ôZ¯öz¯øš¯úº¯üÚ¯þú¯°;°[°{°›° »° Û°û°±;±[±{±›±»±Û±«®» ¾À ²€ø° Ï@ õ èú•° ¼Ð ,û±4«®¯ÿ@ïp©d0ß)ž)P®ŸÚB[³D[´F{´H›´J»´LÛ´Nû´PµR;µT[µV{µXK´€®ü û0þ@ à Ýð ¼ €  Ò0 Éð ßP â` »@à Û` ¿àøÀ¯”ðõµïú –³;˳SZ™e´BÛ‚û¸¹’;¹”[¹–{¹˜›¹š»¹œÛ¹ž«±.Û Íà Ê@¼ð Ì0 ©+ÃÎ@· €°%%0Ä Á` ¿ð Ò Ú° ðÒP ý°µöúáÇ0 ÑÀ ÃP » ü¹S@– ³Àš¸?˸Cÿû¹â;¾ä[¾æ{¾è›¾ê»¾ìÛ¾î[¾ý Í@½ð Ë  Åð ²P ½0 Ô[ â  Öà ÆÀ ư P °Îp ²À Ñ ¿à Ýл2Ô0k  îêÁõ° ùà Úð Öp ¿0 Ö  ý² ¼° ýð X{³Û‹©Ý[— ¸Aû>ü¾@ÄB<ÄD\ÄF|ÄHœÄJ¼Ä[ ù° ’° ”` ϰ ÌÙ° ù ÏÑà ²p Ë` ä  ùP ËP ¼ ßð Ȱ àÐ Ë  ð ÝP(02€ ÄPÌð Ùõ ‚À Èð Áÿ ÀäÀÚ Ð È¼" s« Ì À0Û@Ê`R›½–Š©ˆ«Ã•©L ´>üŽÐÊ®üʰ˲<Ë´\˶|˸œËº¼Ë¼Ü˾üËÀÌÂ<ÌÄ\ÌÆ|ÌÈœÌʼÌÌÜÌÎüÌÐÍÒ<ÍÔ\ÍÖ|ÍØœÍÚ¼ÍÜÜÍÞüÍàÎâ¬Ì€´ðÊÅð Þ ¼Ñ Ù ×° âP ÕÀ Å ÇP È€£ë À Ű Á ` ßàùð¼ÅP ¼€À ð#`( Ô 0 Π˾ ýÌ×Ð0ɰÂÙ Ò  ³0Ó`Ç‘ÿ ½lË á€­ÌõPã\ËÙk D=C`åšÊO€NýÓPÕR=ÕT]ÕV}ÕXÕZ½Õ\ÝÕ^ýÕ`Öb=Öd]Ö²Ì â€ÍÐÊp Ê` Í¿ÚÀ Ëp f; ¿ ý@»×0Ù ¥[ ×ÀÌ0Ñ€ ×0 ½ Ͱ ×à €/PÎÇ@ $À1€ðÙp À€À °/À Ð À0 € Ö `Á°¾  ­‹ Þ PÂÞà ‚àçLÕÙû ð`ÔFÔ‹Û>ìÔè Ú½ÝÜÝÝÞÿýÝàÞâ=Þä]Þæ}ÞèÞê½ÞìÝÞîýÞðßò=ßô]ßö}ßøßú½ßüÝßþýßà>à^à~àžà ¾à Þàþà÷Ý 0 ÃÒ%°Ü ÷½Àr Þ€ ü< ² ÷ð ÁÀ Ù»À ÊÐ û@Ñà •€É0/~Æ É Æ0€» $ #Ó0 Ѱ Á’ Õ` Áà  Ý "]ÁÝàÐ 20 %ð—=0ÑÝ@ =0½û ϰ‚ ÎÝÙK 0ÔDÝ—ð³``ÝØÝsè‚>è„^è†~èˆÿžèоèŒÞèŽþèé’>é”^é–Þݰ ŰÇàÀ÷ ½P ú ûÀ ƒÀ ßðØÏp Åð ¼à ‰Ü àÀ ÑÕð ¿0 ùð â0Ò@ãà »ð ÐÀ03ðé#0 ž ¼À»¾ Ð 0 œ Úà ÝÀ ÖðMÙ ðÓpîà*° ð(À¾À ÷@ì£+èuŽçÑ=Ý?ËÔèÐéðŸð ¿ð ßðÿðñ?ñ_ñ‘N ’ Π* ” ´ð ÚÍãP¼ “ ºÅpáŠ,˰ ÁÀÍÿð • ¿P ú Û°àÆÐ ÍÐ t\ ÞÀ 01  %0 Iÿ 0/ (€ 2À õ¼¶Ú ¯^ *ÌÛ(Ý ðX## ` 2€€ e» ËÀ аsÞïþNÔðMMðoñ„_ø†øˆŸøŠ¿øŒßøŽÿøùá Ü ,€Ô ¢. ú ÷•P á ‘ Þ°I_0 Ô ÐÀù0Ë0“  •p Ç€¿á ¼`‚ ãË Ý  À*ð6`Ù@ ÌÀÚÀÚÔ êÚ Î 0 ×^ ÕÿPÁ0 páÀ •Ý P âà Áp ²n Òð Ѱ Ð Þá|Ÿç~Ÿ`LžPiR° $„ .dØÐáCˆ%N¤XÑâEŒ5näØÑãG!EŽ$YÒäI”)U®dÙÒåK˜1eΤYÓæMœ9uîäÙ³ä,$ƒÔoXQ„”Â-ãU öycQâ…¤ Ë6àØ2pÊxåkÆ — gä¼mÛµk€åŽ+1 cð"Ú_Ȥ xðb Ⱥ[pMÀ‹aÁ¦=`€`–áf @Æ@›3mÚ¨`!À„ÀÜqÛU‰ç”4$ÈP»6ÿ`¢k’ηOàÁ…'^ÜøqäÉ•/gÞÜùsèÑ¥O§^}$·:F0Xi¬=„ø¸mã–íÌ„ … (ô@ÑMÜ^Þ¸%{¦,Ÿ½I¾ù…—zª ^à(g bXÀ™a¬‰ì^0+ðæ—p€†˜²yÁ²l¤Q`x†dÈj@8@ f „ž‘r–¡%§h6Û2   @¾à­7ßø±òJ,³ÔrK.»ôòK0ÃsL2Ë4óL4ÓTsM6ÛtóM8ã”sN:ë´óN<óÔsO>ûôóO@tPB 5ôPDUÿtQ9uˆA‚_Pàgœ|¬¤å™_®)&˜G¯` ÂQAbÀ`„Fð „côª†–p¦¹gI*ÉšJ*ÙÆ ŽÁ ¸Y6ëb0ø…m˜F’õÅ™nœ™ðXÀšcfဒ@†d   †!f¸Æ‚hG@¡„‚¡Ϭ‰˜J Ýáf‹bàŸdBÊÞ€P˜Q†vøaˆ#–xbŠ+¶øbŒ3ÖxcŽ;öøcC†ª ~±rm’Éf <˜!g’‘@‚$Ag HP šk@~ŽÙÅcðùå—fÆ9F»ÿŽY®H&g€a¶Y ²ÀYÑ—aJðhJ`˜0 º)Äm‹!`|ÉF}Ži¦ÐN€à‚Áˆà *BdÐC}tÒK7ýtÔSW}uÖ[wýuÕuVøñ&~ð±‡fÆag!P°!BPofÁ ÊyA†id8f›~®†™H¤±†œp”If€g¦a˜gŠéð—CÀAœq$‘·©7h8æ0d Æ—j!Ç/Š! %H3K 0ƒºÈ ¾Æ1¼¡Œ{ªr–#&ÿ†/$žûìLxB¦P…+da ]øBÆP†3TS>$0Œ@üX?öÁ nè¹™@Ð< y70à ^@ÃÌàÅ2¢‰f0cÆ kúÁ‹\%ðF7ŒI<#[Ä@Ʀ±mð‚ɨ†1(1hcÊ€@‡ø1€e~€^ðb@ÃÓ(JàbŒ@ÝF`àÀA‹C ˆÑ¡bðw‚Úàåæ„:lŽ SG+ñJXÆR–³¤e-myK\æR—»äe/}ùK`S˜Ã$f1yLd&S™Ëdf3ùLhFSšÓ¤f5­yMlÿfS›Ûäf7½ùMp†Sœã$g2Çaà˜Ä#ÐRŒ”ã†30€D`€_äà @@=IÀj¼  †88# nTãÏØ×.& =à‡[2œ±‹n,ÀÌVµ–%¹^€Ã­Ò¼1G´¬×0Æ5œL%„™Æ5¨1¡òƒ ðE#ÐÓ" PAP„ƒÈÄ67x L AˆÀÖJW–S«[åjW½úU°†U¬c%kYÍzV´¦U­kek[ÝúÖcÎ8Ú¹hÈÀ, ×>%  @, G‚zR£È0†$(! IT#ÿÊØÇ0ò! e£5ÛP†ôÀòˆdì¢y÷X›Á _4ãßxF5ôi¨X|†3Š!e¤GlÒ(‡3âSd` à˜1˜ñ,pÐM‘!ƒÂè .ñ™2ž¥Í§b.qá±ÚÊH„W¼ã%oyÍ{^ô¦W½ëeo{Ýû^øÆW¾ó¥o}í{_üæW¿ûåoýû_XÀ&p |`'XÁ fpƒü`GX¦p…-¼_ ý Ex'‹‚&""¸çÎHð(0À †40 +£“h†$xŒzƒ¨„5²1ެ‘ãÃø…4á]”Íÿp†/0pq0 Ê8Æ ÄqŒqT£Ç0 "Á€¶A ÑðŠ/ €k0àS%H†4¦á j<ÀåÀÀ4`³h ÃúÑ , ‚”ßXðS£TF MÐV?ðè GZÒ“¦t¥-}iLgZÓ›æt§=ýiP‡ZÔ£&u©M­_ s÷ ô8À€y"ðŠ8‚àÏ*0¬ñ YD£‚àE?$!J€Ãƒ†4zÑŒgpJ‘3zá‹jôãÔØ eP mHBÆ>¢qŒPB ÎàÀ4h1 ã~Ö˜„š‘ €£/¾× d`dãˆð@ÿ9fp¢,ݰÀT ƒ3`¶ 6ôÀ¶Û] 8úÑøàxÇ=þq‡\ä#'yÉM~r”§\å+gyË]þr˜Ç\æ3§yÍm~sœç\ç;çyÏ}þs ]èC'zÑ~t¤']éKgzÓþt¨G½æ¿`^€}„äb€X#Úèô@bƒHZÀ¼ˆF5®!ˆI`¯²€† ŠñŒ{8vÙ@†2ìÑ8i €‚ ›  hÄ߯8¡ rl#ߨ0~alE#Æ(3Äá ;7C àÀNÁc”^#XÀMG ŽŸ¢ ·/HâÓX@âÉøFÑ+ÿ~\|aÑtñ? uä'_ùËg~óÿ|èG_úÓ§~õ­}ìg_ûÛç~÷iÎ t “Ðú=ŒAö ƒ`g:C§`p HcŰ7dpA4C¿Hƪë!‹g‡I°‡jP†c|0 ‡Ax5Y) eˆ†b€jȇh…~Іl„l€©oÀ€m(A¨r€~ †dP†i`†`mð…àX<(ÀcÀjPYظq˜¢{*L8€:+H‡F+>,ÈB,ð>.ìB/üB0 C1C2,C3`N`^`n`~`Ž` ž` ®` ¾` Î` Þ`î[{‡ê‡jè…}„q ÔÕnH3˜]8;Ð…À"R`fD‰F0øKn¨ÈqØI†kX†AÐP‚^X ÌÚ†Ó…Iàqð50†oèÜAÀ‡GàHÐ}p4Ncÿ5^c6nã4ö8Žc9žc:®c;¾ã9.*T.@_öýãöí`AdB.dC>dDNdE^dFndG~dHŽdIždJ®dK¾dAhÒ½„|°²PZ+m‹i PPVZ0å*ëÀ€™q^"ÔÀX€ØAH³eà††$R¨D¬#>І •l@(b Å~¨ZxHp8öƒF¨fkælÎfmÞfnîfoþfpgpÖc+øT ¸@Nç¼]gvngw~gxŽgyžgz®g{¾g|Îg}Þg~îgþg€hh‚.hƒ>h„Nh…^h†nh‡~hˆŽh‰žhÿŠ®h‹¾hŒÎ苦eX­bø{x†k(dà 0]¼mðða˜aP¿&a0͈aX€zJ@•Yh‹_ðŠ^Ö†m°a8–gØ–"†IH†F€m`dø†ÿÀ~Ðhnþ².k³>k´Nkµ^k¶nk·þ‡"ˆ€rFÜtVg¾k¼Îk½Þk¾îk¿þkÀlÁlÂ.lÃ>lÄNlÅ^lÆÖçh€Hi{Eà·rÐkà¿xAÈ[Ahj(¬* ó* À8¸@?E“Ø…ìgaøºm@ÿ†Z†m(Óe¼lf¯v?Ðæ·^nænnçVk=ÎX,@ç¨në¾nënlíÞnîînïþnðoñoò.oó>oôNoð‡ŸÖ†_€°»o‡ð€‰ ¹eg]ÀaÈí͘™`d†Î3c8Ÿ6¬,±ˆ†aXÅ@†}à?Ød£~@îl~n?qO븖î+ÀnÏnõŽqŸq¯q¿qÏqßqïq·çhꛆ3€xX†øxçhj‚½RaІ°€!wMHB €È_H†À0Fk D˜rÿx£hÈp@Žº޲†fðÜOnlNq<Ïsç^q.À‚¨î,ø@tA/ô\9tDOtE_tFotGtHtIŸtJ¯tK¿tLÏtMßtNïtOÿtPuQuR/uS?uTOuU_uVouWuXuYŸuZ¯u[¿u\Ïu]ßuPò›¾ ði"¼IÏ™*¿a À(Ò*—p!ÅA•(†c‡Ï³Ü:¬éáÎa € @Ag+áHk±æ=oww_k>ïXAÏz¯w{§w^Ïw}ßw~ïwÿw€xx‚/xƒ?x„Ox…_x†ox‡÷ôl¨iÿ"d @-Y˜ôrö€#ž#ljÅYmø+˜X.ð…x†|€^¼n†Ag˜bð3aㆄ°¾ówz¢—ƒPƒ4÷6Xz¦oz¦§¨z©Ÿzª¯z«¿z¬Ïz­ßz®ïz¯ÿz°{±{²/{³?{´O{µ_{¶o{·{¸{¹Ÿ{º¯{»¿{¼Ï{½ß{¾ï{¿ÿ{À|Á|Â/üµ‡fP†€‹z^˜†®úÂmÀ5–À€÷xbPd@4_`€YmX†U)™yPb†9qgw¢Ï}w7zÿ>nñ6à~á~Ã/~ã?~äO~å_~æo~ç~è~éŸ~ê¯~ë¿~ìÏ~íŸ{ÛúIXœ*ß'€ñ§aÀPÀõWÿ½r"{‘èÎgØxSÞŽŸˆÓzíôHŸ?N ÿ1lèð!Ĉ'R¬h±¢œj>\ùÑf È"CÞ+iò$Ê”*W²léò%̘2gÒ¬ió&Μ:wòìéó'РB‡-jô(Ò¤J—2mêô)Ô¨R§R­jõ*Ö¬Z±ö{0 „HH0 !€°ju©õ "jÃz!d± ’“ Fºþüú÷óïïÿ?€ 8`M¼a` Œ*ÈÝ0 Í1,ð‚‚ ˆÐ›1ÈP‚ ”#M"Ì`€*ˆ0Ë@$ÞxçÉ8#yrXaYGíÅ·cúø#A 9$‘Ey$’I*¹äPÒŒ0 $x‚rI B3¤Ô uèœ. èbÿ€Š*¼@ 8%NI‡%¶˜?qB#uRfÅz\цŽ<Â7   :(¡…z(¢‰*º(£:ú(¤‘J:)¥•Zz)¦™jº)§zú)¨¡Š:*©¥šz*ª©ªº*«­ºú*¬±Ê:+­µÆÚ 2øÖC,¨°–ZÚŠBÙé2&•¾]‡Â ÚŒeV¯åpçx0Úy-¶Ù˜§G ¬ð-¸á‚k+¹åš{.ºéª».»íºû.¼ñÊ;/½õÚ{/¾ùšÚÌ0ßHÌ0JƒÂ€±àA $ˆ¥7‰’— ’À•1xÀ/¿@ -¤Œsf;òµÛêñÃÞŠ»ò û¸üÿ2Ì1Ë<3Í5Û|3Î9ë¼3Ï=ûü3ÐA =4ÑE}4ÒI+½4ÓM;ý4ÔQK=5ÕU[}5ÖYk½5×]{ý5Øa‹=öÔù”SÎ*ðë ÎÜU± 4· X<38:hÌ–X Ñ\2ÃôªKƒn*ÆXŒ$+.£ixÁžÊ,‡K6å•[~9æ™k¾9ç{þ9è¡‹>:饛~:ê©KÁ4Óà`ÃXȱP1ˆõeº×óƒ"„) ° ‚/ÀˆÐ•Òv÷]x‰/þ|V8î+„p=öÙc¯:÷Ý{ÿ=øá‹?>ùå›>úé«¿>û/GC‚ÝÀÀC %47u,°EÿÝÏR,Œš£ ¼`3AÇò±A¯åiœÚà-íQðzí» 3¨Á r°ƒü C(Â’°g€\J ìƒh‘ |7ˆhÙÈZÎ&¼À '99°ˆ’‘ÃÒ@ V°‚%|"£(Å)R±ŠV¼"³¨Å«•€û vT8Ä bh¹›Ðš£C,逳xÁ>¸¡ý)Pƒ*Ô¡µ¨F=*R“ªÔ¥2µ©N}*T£*Õ©RµªV½*V³ªÕ­rµ«^ý*XÃ*Ö±’µ¬f=+ZÓªÖµ²µ­nÿ}+\ã*×¹Ò5ªãê\6”; À™ ƒ¦M‹D=¢zGÐb«ØÄÖµ±Ž},d#+ÙÉR¶²–½,f3«ÙÍr¶³žý,hC+Z¸¾ W* VZ·¼À qr^`¥ÉP"hs±¶Eìhs«ÛÝò¶·¾ý-pƒ+Üá·¸Æ=.r“+U G9XÚŸY0P IБ¦±­©Ö dó·µ­rÃ+Þñ’·¼æ=/zÓ«Þõ²·½îë1P  °bøãX0Æ1‰z<¶×½£Ô°Ýl~¼ï=0‚¬à3¸Á~0„#,aÊÞpJ60Æjsw¬€ öˆÄAÿkÓì^ìÿ„S¬â³¸Å.~1Œc,ã•b%A f€já7jQ›7úQ |@âµ±4'îš N~2”Ÿ,ˆ)S¹ÊV¾2–³¬å-s¹Ë^þ2˜Ã,æ1“¹Ìf>3šÓ¬æ5³¹Ín~3œã,ç9Ó¹Îv¾3žó¬ç=ó¹Ï~þ3 -èAºÐ†>4¢æ¼@>ðÁ_b0‹GÀ1€2úA‰™É U²Ú…ÃF¹ÔNV4ªS­êU³ºÕ®~5¬c-ëYÓºÖ¶¾5®s­ë]óº×î…£%€‚GæÑ>P¢!ˆ{Ôƒ!öô§ó¤SR›:ʾ¾6¶³­íms»ÛÞþ6¸Ãÿ-îq“»Üæ>w™¿G—ÀØ–¶–ÑfÄÈÐÆî¼°…Q#Aþþ7Àÿ-‰¼à?8®ð…3¼á8Ä#.ñ‰S¼â¿8Æ3®ñs¼ãÿ8ÈC.ò‘“¼ä&?9ÊS®ò•³¼å.9Ìc.ó™Ó¼æ6¿9ÎsNqY€£>E1±_ ”ü}ö½ªd}¯àý8Ô ó©S½êV¿:Ö³®õ­s½ë^ÿ:ØÃ.ö±“½ìf?;Ú/Þ‹µ³½ímwøÚ½ñ‹a †71 {|ç GNºà¸-ÀO:Àg¡øÅ3¾ñŽ<ä#/ùÉS¾ò–¿<æ3¯ùÿÍs¾óžÿ<èC/úÑ“¾ô¦?=êS¯úÕ³¾õ®=ìc/ûÙÓ¾ö¶¿=îs¯ûÝó¾÷¾ÿ½í‰!üáŸø•þ €`Øû0:>œm俾ˆ‚×7<qxÄû[Þÿ>øÃ/þñ“¿üæ??úÓ¯þõ³¿ýî?üã/ÿùÓ¿þö¿?þó¯ÿýó¿ÿþÿ?    & . 6 > F N ºß7ôÂ84ƒ äÃ$T àÃ#@‚#L_õ}šžp_À‘ ¶  ¾ Æ  Î Ö  Þ æ`,½Ì$Ü%x`=€ $ „È õ•  Þ5™˜ ÿÜ DÂ#8Û!4!6¢`þ?d¢&n"'v¢'~"(†¢(Ž")–¢)ž"*¦¢*®"+¶¢+¾",Æ¢,Î"-Ö¢-Þ".æ¢.î"/ö¢/þ"0£0#1£1#2&£2.#36£3>£*BÂêÃú$vÚ$*]¸áåL8†£8†£?”£9ž#:¦£:®#;¶£;¾#<Æ£<Î#=Ö£=Þÿ#>æ£>î#?ö£?þ#@¤@$A¤A$B&¤B.$C6¤C>$DF¤DN$EV¤E^$Ff¤Fn$>úA¡ecààxã8ž$8F¢J®$K¶¤K¾$LƤLÎ$MÖ¤MÞ$Næ¤Nî$Oö¤Oþ$P¥P%Q¥Q%R&¥R.%S6¥S>%TF¥TN%UV¥U^%Vf¥Vn%WveQŠäu9€¸Ü $J‚¥Z®%[¶¥[¾%\Æ¥\Î%]Ö¥]Þ%^æ¥^î%_ö¥_.ŽX’¥Y¢åIþ¥a&b&¦b.&c6¦c>&dF¦dN&eVæafYž%aŠ£ev¦g~&h†ð¦hŽ&i–¦iž&j¦¦jNfbL@.ĦlΦl®¦mÞ&næ¦nî&oö¦oþ&pç_¶ækÒ¦qƦp&§r.'s6§s>'tF§tN§H'l'mR§vn'wv§w~'x†§xŽg]Z'vf'y¦§z®'{¶§{¾'|Æ'nšçyÖ¦|Þ'~æ§~î'ö§þçŒÐg}怨(‚&¨‚.(ƒ†¦€ÖgƒF¨„N(…V¨…^(†b˃žg†v¨‡~(ˆ†¨ˆŽèwn(v’(Ц¨Š®(‹¶¨‹ú¥‰ç‹Î(Ö¨Þ(Žæh€Ž%¸æuh@;TT_v224_html_docs/images/glass/blue/hide_menu.gif000700 000765 000765 00000000714 11222361074 021536 0ustar00abwabw000000 000000 GIF89a(ÕÙÙÙåååÉÉÉÊÊÊËËËÚÚÚòòò×××ÔÔÔÞÞÞáááèèèÑÑÑÓÓÓØØØÛÛÛìììçççÏÏÏíííêêêÍÍÍÈÈÈøøøõõõúúúùùùÆÆÆöööÇÇÇ÷÷÷ÌÌÌûûû!ù,(é@pH,ȤrÉl:ŸÐ(ô¢@,†v+x Å™)›Ë‰ÅR)Öðx¡\YK"çüy‚ˆ4zqy‰Ž•މ–ŠŠ›‘“£—™£Ÿ§¤Ÿ±²š§Ÿ¡£¥”§˜´–«‰ÃÈÉÉÏÈÃÐÄÙà ÏÌÚáÃÏ ÚéêéÈÕÉéÔëüý ìK7¯š=v `ðǰ¡Ã‡#J\Ç¡¢Å‹3jÜȱ£Ç1ˆI²¤É“(I;TT_v224_html_docs/images/glass/blue/hide_menu_roll.gif000700 000765 000765 00000000714 11222361074 022566 0ustar00abwabw000000 000000 GIF89a(ÕŸŸŸ¹¹¹———   ÒÒÒºººììì···®®®ÓÓÓ¸¸¸ÅÅÅ£££¢¢¢«««¡¡¡ÖÖÖááášššžžžÛÛÛóóóÇÇÇÕÕÕ­­­¯¯¯›››ààà”””–––øøøõõõùùùúúúööö•••÷÷÷ûûû!ù,(éÀ’pH,ȤrÉl:ŸÐ(TdÁ@†v+( !‹*›ËF§ó(Öðx üX3.çü9’‰Í÷l£‹±Â,Ì6§É¬ñ§§¨*B†›¬CUD™Íj«°áöŸ·Ã¬Þó`‡£)‡§r¼[‡¥:µØ²äùt±@•ÊÈÖâ£Öê8 ×‹“²åú4Cááá#,2›Å×S{AÆìažÈ…©Å1•ÐAÂ}›ª |ÂpžˆÆ=a>¿äC¦`«4a&¿]”½ Óè`”¹wÀe©UjF‘Ä0QÊã/¯ k¬Ær¶¢Ú_­d•j²"Ïn¯8—Ï%]} Lk0NÈ±äø³æû«ñCÐø¨Ýô½Ðà g¡ÀÌ× —Ð i¢c©Æk´p±s»²Ð卨ë"q‰ œÕm¶qª¯æ¤Óç”Åàlµ!ù,Ü‚ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë‰—bÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£Jm* ªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý¸EòêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ _Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ›v‘Y.õN¼¸ñãÃGP‚“¤P’æI&”“9•ëØ³kßν»÷ïàËÿO¾¼ùòd0“ ›)>?*10¥Ì¹$ppßÏ¿¿ÿÿ`¸”Ý'yðáDꤱÀ?00Œ*;$!…€Ùµàᇠ†(âˆ$–hâ‰(¦¨âŠ,¶HbÊM„»´¡ŽQä¨Î„ à# 0P¡bȳC~º¨ä’L6éä“P–hpbÈ,g¤±`Ž^,Ðc.PÀà@øÃ+éäòc.é˜ÄPåœtÖiç#R€ ÂA 6•l…iü€Pø DJüãè£h8péˆ@.4DPN9qâéé§ † ¢'¸ì0Á¾ì¢ ƒÊ€éÀÿ0£>ÚµþƒÆ ”‰Ä ”p*g“ekì±È&«ì²Ì6ëì³ÐF+í´ÎÆ8#>mx£Ž^àÆ¯/€‘k Ê1Ý;àÒ‚£æñJ.¹À D°žtº$µøæ«ï¾üökì”å–‹Ú¥¡¹¼„häúÏ”Ì!r–|ñ…%aM!;xòÏ\ÐàF. ÃQŽ'EÔK›Ã,·ìòË0Ç,óÌ4×lóY”) A¡‡BÑÁ¢gÁgt]ð…LŸ¢ƒÓ:€rŠ%¾"…£BÐŽ³Z…'`ƒ}A½dmvÙž\¡öÚl·íöÛpÇ-÷Üt×m÷Ýx· …Œ©fÿÛ ŽCº!ë ÖJª©IXƒ‰%š0í8Ô§H}Êúq µÈ,QŒ’¼@„'Ѐ(  Y@Ä V Š(Zñ’Wì¢&7ÉÉ.ÎÏJ³ØET1 9$¡Ø-Ô…ä"FÈUïªdˆàáÑx9¬Üûg\ *1ÉF8öar‡\&€ê)ðIˆÃEILvòšØÌ¦IÕ§?UâF„âÑ…¢Ó ¸ÁJá œâ~wÄŸþtI†Lðq¾p´§ÿ=ÄÃÂà!ʃb# Ëp@…ð8‘’–¬&õ@ÑŠZô¢ͨF7ÊÑŽzô£ µèM…*UùlGªP±ˆ(,  }dHÃá鞸̥ v¹…pP¡—?G@Ô¢jÅ(A Úˆ#(B¡Jü.º‚IVR¢ ©V·ÊÕ®zb…ƒ-lô7Úu LP€‚,%¤ ‰¡ŽÁ0qÓVà4§Øi=û¸ŸÆcŸ(jQe°œB{Hê@oÀÀ6ƒ¶æ%Xv°Ã*®ŠU)zõ³  ­V°+¡`;˜û€ st æpD– 1ÿ€ ñ(ìÊ[Ї:­ç=ó™¡V°#ˆ£¹Re SH xX,c‹aF# H À@‡B$À‰Ø¬=ÆKÞò– èM¯z×ËÞöº÷½ð¯|çÛ^:èÌO=[ÐVH´–½ I S)z§átyÝ%>[Ô, ¹R(Ç倭=ˆ'A†ÀáCR—œH‚<àµ]hÆÁ“„¢yW<^úºøÅ0Ž1}ua9&!U«ÊÔ1¤XÍàzÈÕá6%ƒu™ÀBkT,á8ï”[pÆ7~ ºÖTK…,PË%·6, à02 ÊMp“ R‰'`… xÿ³¢ˆ³œç,gÛùÎx~o¨V|:CÓœvðŽ[Ô?G¬dý[íÄð­9®¡˜$«  ‰n# ùøÁ[57à àÀ6@‚†;üá G¶Ä'NñŠ[# )‚rܪR mVE+PØ©4xòvdÿˆF!À ÐWÌà pˆÆ=¿Q„*³ûÊs4>²TÖ. ÚÎ.’`}¡ fæE’0 Ÿà-(D,âX'¶Îõ®{ýë`»ØÇNö²¿¶Ú}tŽMo$üX\µ‚£éh Þb wo-h‘ý†a“uä ,0p|cÓVNî‘ëMŸAû}­•Ÿ ÂPˆ.@Âè7 ®&Œ+‚/e¨7áƒ@á O= TŸú²»þõ°ý×IV,i)µg½ ]«YZéuÇ€ðï~÷½ïxò6¾AØÐ[h/ÖöØ *EÇ>s¬dE+ÕêTгÁÿ*&¹jC£ßJ/@4&”Ž Hµ ¥?@ PÏúÕÛŸá²Ï¿þó_ŠT&! ·>Ж(‘GmGÃN6 ÃG|Åg|ðÉ·WePs2°–Â&>¦§D Á2ac¥vÜÒ#ßrnT+T#tG<{@~¬bxKg iÀHà(ÖP¥wówuõÇz¥ðƒ@„B8„DX„Fx„H(„†_:¦}>Ö}r8§2C_°€Â‡wÆG ð€ ðd¨° -à ¶äP!`’& ôÞ r@0sV Ã0òc}µÄd¼u?Sƒyš× Ì` b0÷9xz ·ˆŒØˆIÿøˆ‰’(G²hµã-àwr(¨8–€€…´€[Ø…yåö„ ° šÖi•Ê0ƒnVkå# ‚?ãqC?/t4†4§À€YØ4–ÐaÅoÝ€ˆ¶PÐ0—å9¸ƒX '‰Ø˜Ù¸¾°-^€0s8mµRmw¨€XHŠ¥è…` ÎPccsEUaêÀF0Hð.@ò À#Þ’)„#dß7Šs…x·€£ø[ûc ŒåX –ŒÊØãp#ðtÿV9ØVgÕˆ ’"9’$Y’&y’(‰¥à½Ã2``’¥@ Ÿ€#Àñÿr½h ¿èNXФ¨Ø….à Ð P66ws3(ætP æ /¶åïã.ô(‡FK‹sŽÂG B¹w¦è´põžpX¸Ð Õ“@@À‹ÿ Uè“–9|–y™fùž;5¨°}E†¸ ÝÀ–Ìà–âùB0z0ÓÈÌÙœp*º¢,ª Š!̶e#!)$ ЃâŸB Ö&<Ç ø Àží¹™ï©ð9 *š#p47V#>#p>ЕÒñ:Ä`[¯°DqE–¤@ ŠA*”sP¤Iš ª˜ J†%l‰G€³Ð õ&¯@Ä`Þ`¡ð§'Úœ,:¨„Š 12<Ãq¹x(nÿ°5µe£¯?- CÁˆ@ŠJ ™¹™HZ” ê ÀF‰”WÀ¦ée:—%³ãsbð 1ÕP¨TÞà%n÷F †@¦B:¤œz¤¥*Ÿj:†¨JTÕ§Œ˜ÐIð mÐ kÄ&´h[µ¥ †P ¨zI¨ÜJh ˜Ìá c%(l'83àæ€ [¯°VYŽ]€©Â'¤œj¦E9GI™ ¯à¤ ° -PcU€€âxàè\ù(;P±°a°^4tåÐÁè dНG‰”°àBõiŸí6ˆpcÀkg(³˜VÕ£&>+äP¨ÿ ­Xæ ³<»³>Û³@û³B ´jP V²sZ²v>w)ºÇ{¹ò>Dé@è4†ð«»™Ãš”õе°€ ¨ ¯l@ªúŠ É —}=Æ}…Ó¥›…` ’ èÔP¾Ð«õ:¤í™¤ Š2²ö©=˜sSV p)ŽÔ'0B0Që®n÷ `¢6Ûœp¹˜›¹š»¹œ‹¹,™!ì ÎÆ> [€ãXéBÿÐ în … di™e*¡e‹ õð· ItðÉ 0¤J¶¨ Y ÀJ‚é€P‚B"' ˜r@±àŽ‚ Ö |@ª·ïY¶Ðÿ ú »¡ÉOü¤\Œ‡ Š 4ßÂZú(p"Cžp­€ju8»p»¿ük±°7¨â„÷*QØ•’3$5CãÀh2 +„î ™ºy”iú š:Sa ¼cK¡õP©c ‡Ko²ò¾ŽV Y /<±hNî 6нCú½hZ\¾æÛ¦¥ŠÊcÌBwëV­I)é ‘­÷{³Tluü{Å—kÙÉð‚l— Ì뼎‰s牘Z–8` RpHD ³¤òYW  ï¸mZ%…à»ÿ:ª: ÿ@ Rn •à~¬§ÿ$±ðÂðÈ„ÇkôŸ;pBÚžñÉÃ>l¾ƒ»€&oÝ2‚ ‰¢†P¡ 3².Y“€3ûR\ÅUŒÅ뢥e{¶´˜²0A7›Ìq‡½ŠÄ,»É‡Ià D@”à ²-@ÜóÃ`ôâÊ c” cË  ¤Ð`Y`•Skˆ‡óp  Ãì @j ŠÀ0 …pÉâŸJ@ÍöG9×lqŽÒV‡†]PoàÇPà J ôÙ Ë”{¿]/p¹ÍÑÒ€ ±À£~(¸¸_Bcº‰¼N¾€Ä\ÌÅœÃ_ÿ˜ ä@ 5µ  …à ![Ÿ?œªVa]’#úФŽÀ|…¿nàÆÿ0S” ìÌÎjÕt  &àp  ^’ñ#w+»sðͨ üœÇ¡Æ)­‹ýU+9&[V` zÍìà -ÇP†0Kpz}Ø ÝÑŠØZL%%åÖëCÄÛ÷cmë(THJÓš­00{;°Y0@ ³0¨´ÖÚSšVЩõBP¼À«ŽàÇ L gˆ”°ŽüÈY­º  ~àÈ€ ¥Üp¸0àBl™ ÏKª žàQJVk'Ùæ*Æÿÿ w&ÛV j“t z}Þ|½ ÇÐ#ði¯2P‡€—}Ø‹}ßh BaÚ‚˜£<.åBwšÓœýÙ ]¦âðÍðÓÅ›—’> ó@Á²3œ‹¯B·ÿ0û€¤ >¶}; „…D®¬ž#Ü[mÜÈ `hÐ Èb@¥Ž’_ðÙe:ªÀÃK˜ g`a]ösNW|†8~ãG~vpÞ€Þ+pÌ`3À&OwY¦Wßý\Þå/Ð R¤ £¸'ÐB Žé¤Öö‰ÓSÐÙ ¾à~Œ Ó@Ÿ:B’†lBï †iWV’-­ dˆ;ð ÿâàLI ð-sY± tÐÕ.ãÍ𜗫p ¯òtñz;=€Öu^¶°-¤ë>ð#yM¾×ìåÅÐÆ0¯à-WŽpô}Ø€êå\ pŒšO׈,רN§ÐænÞÙe:Š>âJ  ¬½¤0!iè®ûx{Cδ' ฑæ``µ‰¾ÔJJçIÐ 3 • UR Èé;‹¹­å 8yå0ꥮ¤‘à ÆKE<+•ýŒ4>™…_ ë«V~vÀ¢0~7Ьày@’ †I¥·ËIìð)ï2Ïš#*ÔÝ÷ÿ6…7G“ùÒ®ÙSç¸ÛÓ€»M)…  °¼øµÕV4Êê,ýh>àHæ@…àâPõâ°ÔР˰€—PPžê¡ È`ûÎÑÆ.aá$ó0ˆPíÖŽõÐpÐHàvÞMÆ6OC.ñF‡L7<ÐQ¾ñÏ 0X¾@!çôE¡ˆ å* ò* ÀŸ‡ûõ»ç0¾gÆ9ßÙpNê×NçÉPÇ€k¾{ƒ "¨½³’ÒHð2‹,TlÙ˜-‡Np€ `õîžÛªh¥P¼º0êjö^žòº4p)UJx]Ø=põLM P»[‡Á¼8œÿÝæ—Ù ÅHPÇhœÀñ`ø0ƒÌ¨ ð ±ßS'R¼å)oC¿ 3@Ê2Ê%1tÄF+ .D0Åá”9=Ä)`CÕ4=ºèxò”%‹…,ÈØ1Î )õ¯Å?˜z̽xaN LœF”,.s¯ Dø'Å—qI±@¡W²BB|¸yõâ_ ÈšU ùÂÁW^‘M€‘+ŒR )øóG)¸l>M°3‹@‚G d¸pІ9XâÁ£X1Œ4i†‡«8‘#ê’*:@`N°âÁá% 8¨MZXJ»Ò¨¤Q§'\%'t!pª¯ÿ߇{D·t@¯eJ4zü(A¤"Jp š…2 „¯ÌmN2çu˜¤(Ÿ@ —5Rv¼ ‘®C' ’®w4€ð &fPño‡”1[½‚å_¡Ð $r¡Áª p@J)GtDœqLš`¶ÚnKhІrË2±%1Ŧ›=˜‘,2+ @dœ”~€bº É!‡ø@4ÓLûÊ„ ð"ºéþÁE9k0ùBB…rÓ­‰°è j(ã :²0θ¶ë‰”<*ñ" .Óà×þHŠ ’ØA†Ò”b $Ê‘<5âT#–$„èÀ $\K‚Œõ–lr)dŠt|ÐãG­¸âÿoQ8äsc(û¢Q@tI q’È !’®Pe æÃ=ReFDc èDHi‚(È¥>û ÈÁƒ™q´ÒFûŠUÒH#!`¢Ä8ít7‰z«TZß(èD‰(³ˆ¯ |Ù…/h}NpˆN`aE$`„äÊœ )b‘ó^]L0!‰fæ{%Y8fIJ¢¥šŒÄ8¸@"$ÌQË3¸ÚoQd”PÌY׸,S‡$|h·%›êeáÔÈSMf0 VoÛ—Ër!êO yc×­QØ á'•`ž¢pä¤àgªÁéÿXA&{уEx’Ÿ6Ô7 u`À\$fèÑÇBÞ”Ó5à¾WÎ|Mðc dÌØ!!Òˆ+dc`‚ÁqjšBˆ øg‚X̘iâEM€ÃÒye%&˜…ê«?dŠÑêtŠhÙ0œ‚HÀЃžB’Áefl8‘B¬{‘±wŠdaBDW } X`0! ƒ¨-ékä–bÒ©H–Y¦—^(°š  DJ˜“e‘›£ðbrsy!и® J&ám?ò×__}óÇÛ 34ÃOˆÅ„ðŠt % p ’zj bp€EJPO¨X„ðÿ•~¥Op€Pò48P€ԠƘà,€¬t‚p`Á§?h$JÆI•l ‚¤èØÍÀ8C~æ™,áW b r gÉZnPW=¦8e`P‚pt¡=L£{àxa‚ · =$áiàÒP.1@¡BÓu²@‰6ÁÉnykF!˜·¼°Oàà$¸b†:M VIB->†$,\/2 ÌÓ‰ui…&$%)¨ œ P89à ‡^ â+´Ú ±C,$(ŒÀqw(¥TI9ˆøDÀUÄ;2@ æ™AÿaDtáEÅ M­É!ÿ(Bb0W²(ñ ê‰c—­ËˆF€‚ÖÅ0Œ,ߌWfUŒ)‚B€!Ê»%óÒ†ó›°ðƒf£ ÿ‚¶ÎR½Ô»ÀÖÃ@ÕÛ@V{özÇ[À½““¨[Ð (‡K 4è@ƒ¶ ŒÁ"  ˜@ƒ ®ƒ¾ü»ŒpI ré?N{|ºØà 8(+€V?'d…A°»»S¿¼k¿½ ²*ÊÀ¨: ›WÈ4–40~ó·ë@ƒx…9+Ê˽ÿmë=C >Ë‚$ÈÌ*>!8¾ÖÛC>ìC?ôC!Ø bÀ¢ðD9-K/©`J’€ÌÚÀ>Ô9ÿ2丘ˆ8x+狾³9X"àê.8è=w‘&|ŒÇHVŒƒéT[)b¿ö[¸+ \¼ÅÖ;= €ëø‡TZ˜¬s®÷qùÁí Àkû$“Û¶[ðƒ:¹“I7r[3.øCnìFoœå­è3õhCi0Am0‚øh:û‚fx5óF!È€x)(uƒ‰+¨!ˆ€€ôP<Æë îè½úª¯S\EV\‡´ƒˆÅY¤ÅZÌE‹¼Åÿ½ãà ˆ8ÈÇBë ° Èà +#X¡“®‚Æܽ„bG7™¹xüFš¤É'H‚7=!,pÃa+d”€«úÀ…rI˜ÉnœÇ˜5Ø•²Äµ›Ê•a“3‘€2ÓûREH‡Lø…°L;X¿ ÈŠLKµl?>Ü,J”µ©„‰#L‚$ƒ71X˜€ ˜ 0‡I0–D¹ì=>\ƒw,½š\Loœ€~¡ §›³[(0ðƒX¦úX—ˆQÊ¥¤ÇIh ØBp (ƒµó„à©Î‹…¬4³»93}Q„°ü…_H„ÜL„D°´\KàTËÿˆ€=Ìb˜Žì\ €åèHØÌJ~ùÀAA€F”¶\Á+¤œÉá OñOò,Oòl½zq€ß >9P¤3dÐÊpƒúH@Ë€Ö3Ï=<½ã|‚0E`“ð 8Hù’§¸)³3‹¹f ƒXØÍ!¨‚ åM;P8… N­ÈøÐáœãœj;ºìEXPþiPªã”0C”†ë,@ºeˆŠÅ©ŠÇ‘€¤ÔÏøP R!R"Òá,MÑj:d¡ì„Ê.’`€pÇñ̾òÑ"=õϦ|‚•€XÐ&m²—¬dQ3>F¢9šÐÿX¨‚** "pÓÞìP;õP%NýÏ0ÚdP3 EB.@ qLʻΖ<Ád›¿a()¸ÒøÑ,­TKÒ †$È€ÐÎIoè ô:p—´¤Y1)‡üœÔJ ÑÕ3ÎzÐmÐ1ø¼3 AMS $_íÒXSaÓ¨;¸Sdm!ÝRbhÊèÓõS¬™ ,bjd=q½Î켋16=@¡x,½Tt-ÒálX¥IB%ˆÏR='@Òè˜p“1TJµÔÍY%QmhV4=x$€å‚Ó X ÓQÖ*XcMVÿ;ŒÅXÕf]Se¤jMX…XÇ„ÉY˜Qhܶ€8È$Às ƒB0ƒ¤tÕŒ½YœÍYÝÙU)H¥Uê€SÚ¼Ê. XªY±DZ=I8SsØÙ›ÅTâôÏfmJ5ÍZ‘]ØýÜÒ}ØaÓ‰ÍP‹íМÍSŽõÕÀêÕ‘eØý”‚(Löì”Ìf(¤ Çœ¤ä‚•ZÀ Ü©ÕTs0‡LÄ ˆµy9P9àð86dC3IZÁª]½y4N_íܑͷÔ~=ް Û±-[³åY-†XØuÛð RIØ 0°R C”¥Q¼…rDÿHÉ €Ë-^©=)%¨H³H1P[0&Zñ‚•ø·$ˆÊUXâ5ÞŒÍÜ]dØmôÛáÒœ%NY=]a¥Ó ÷}_ø_ùßðû½_ûÚ<OóÍX‚ ˆŠ©ÐÑ=AÙsD:Ÿõ¤óH'àÞ¨Å_Ž` žàûÅØI  `ì€ú CZ1"à3˜Ø0³ïä‚¦à ÆÙ,ÅÙ‚ᬆãTßõíMú­a~_þ_Òãm”…²qèÖëd&x‡[Ðo£=×(„1˜е\ï5^>X(O(´ÐAnâDÎÄ Ð§ÕÏÎaÜ2ÖR.hVÿ[нa7ž_2†`ý%ÒÐ&c\0ºQÁ¬~IEhà Ýtåᛕàᔬ€‰R‚耄Ÿ+нA³ã8ÎdMFã 0ݰ[~cQvßLÆÜ 5Ïð´!X˜†Q‹DÅNóê…Œ0’@JÐEe\.OCþ_4V|ŒËƒAÌÕ™äÐddÞd×¥Ç5vÓ6eQîižæcSÏð_m悎3ÆÙÛ:Ûãì„C’C# CšUØjØfvng·}gÑ-ßýÞÈ€1$)È‚µøÂ¾dû¥fh‚.hƒh^Nc"`h†f_hŽæ‚Î_ÿÌN†­†j€]Öhbƒjó ú„ÆÌ^@âE ·$€ïüÜni—ÖhŒßÙÍØá4NI¤+‡r8PûÁÕgí[âõƒj¢.jææ…nh¥†èˆvcƒÎ_4æfÎõ\ªîÜ:P2„QЦŸ—|§“1@ʤ¬j³>몎]ò¥Ôe>ÎàJÐ&I°Õ3•I¿‚¢Îk½h¬ç¤vhPnߦ¶a€,ìiÎß6Î'0I0UÇ~l P„ È%¶=¨Ì®…<À}€‡,(ßc%ÉÞXpìÆ>m @mÕNmÖ–û’îÑ XçñDj}Ö‚=ÓŸöÕ»jÿH.lànánâ.n€¬f6N æfn7­‚ÞN}V^u`ßþmãqq䎖hn8eßënqÇîà®fxabU¸†>oñÖñs¨ÿq/0)8‚†#7 ¨oa(„ðÄÀ–BH€D ‚~x€ ¸-.ïr/0s1w0w'¸ÿFȶOŒæÜ²öÕÙîmq;¿óŸqn–„`PñçŽîôêî‡á1ÀèE_ô?‡>hHô&¨c „=[h*ŒÂ0€ÄÐNà„$ȇí;¶yHVø+¯,ßr/ou1127óYw‚bPsA®ò¼è9'_ j<va‡j>n6ðstf?˯æšïgtF—ôH¯ƒ*˜lpsSG XrOï<(ü{žP‹øï~¸‡U¿ƒVwõXsZ¯w'X‡[oâ9—gÌuaË èax<lPvèöÍfgv$høãÞîj0ƒÿ3ptk¯xl‡ô:‚P`:œ†ÀaNè’?9X¥}¦þfww×rx÷.õXŸuY·÷pFhZu.ß_Çß:‡†z¡z¢/z£?ú¢x Hc>oî?Wø…ô Wú=†Š¿ú‹Ÿô:(Ep€l:@K¨ï‘'yf@„g —WX"\…5H*…{x—¯û—ùyÏûš§õ¸ùkÀ}×õ vàFzÃ?|Ä7zÞñj0x§‡n@úzbH.3¸z¬ÏzH€0xÄBfùr·PÀ|€/ã4ñ.Þ¼ %®|ðcÁÑ(ê¤cúo¢¨R‰ôsrUkÖ®²»Š­Ö,ÚÜ d™ô6‚¹u‘è-n¢JŠ'"T !!£5)– ®^2åb %Mî.³ÉMV¡,üS2‰1üø WsMã%)5E""ÀÖ:{¶mâ–[ ÷Ô°V[ÕX4×@÷àƒQ¤]òŒ!I,a¼±!‡zø!ˆ¾2" *ùPMK}²âŠÞÕÞV2BS¥ ÁAMýcA}ªM5Ê=üõw$€Öf“ºÑÛ[@!P] x%–Yj¹%—]^™ Q(ÿOf³Ä!iª¹&›mºyÈ—‹Uä‹,º8Ó9àÝq1¡PâcSJ\è?RR+÷å·ßkG–¤’·1yZ"ˆ€ [œ \• yù)¨^*–sL‚ 1¨º*«­ºúªªqv@!wur§LçäÉÂ÷¤P@RÄCè?žÈ0Aƨ&U›é(’²E:Ö¤dXƒ œa‚o NIe§Š‹—œJ骻.»íº›î—40F§­¸Æ¤«žN P/2A”P²Ã…taE K7•~FBûè´)Y­µZz * zË`˜yü1È!‹<2É1öWŠp Bº,¯ÜÿòÊ*È<3Í5ËŒ¥‰(ÖZ§½0áÛ {ŽRÅ/kSÒXÁÊ K5¸öpK, Å×Z*B ›lŠ\D ƒà†y6Úi«½6Ûm‡)@@ (Ï*»|wË5o°7ß}÷ à¯Ð0s’Øz8Ï‘éšg,qÏ( $òË/Ŭq9æ 3,µ‘,xî9ÕþI;qÖ׿æ„Áä%Š-ÙpË>;íµÛ~;í,™ºïª;sß$?<ñ$…à„·„8ó’-Î8¯÷ôCDG”K%U ”o4Š+Ntþ9è¡o5:ÖÕšn±®“‡ !ƒbë º>?ýõÛ?þ÷ÃOÿÌ©2|k Ѐߩ€oÅ+Þñ’×Â1qÎ{xW ~p¤ þðˆG¶×"½|Ÿßø®fŠ9á|¹ÙZ  ¨ÂcÁ$äA bdÀ-ð»!s¨Ãò0‡ÄÇ©Æ@Ž7-¡ˆÔ `Ë x@á %Z`KÐ!Å)6ðÚ‚àé¡`D@AûÞÁƒaÉ7Bè„[ Uh `#ªÄ%¡Ç=ò±~ü# ÙG H  ‡rƒ,‰2ÛÛw¼'nŠTlžâž÷3СW÷Á' ô€š|h„ÔÙX17níq „+^0Ò²ÿ– @Á-s ‚]ò›øe-ƒ)LaÞ² ‰a–p€äà ø€¹%6‘’Q´$:ª˜IM6¡›Ý Ú£°´Rž„¨\’*WY©V²Óés<ã-гžõü%>ó©Ï}s˜Ãäå1­ófæ ‘1ƒ$'¹˜JbS›5Ñdž¼ùMrR´œâ;'µÒ©5vn-ž•ç+í)R-ð³¤ýôg0Z.Á98D V†PâUs¡×´¤CñQ‰òÔ›-å)ÕˆN¢£ïü(Hã8R{š´¤(%æ.*иš2&M EI`3›˜|(7{ÊÓŸš1¨"ª*7jT¤zT–Kë½gS÷ùÔ”Fu¥Sý@žyÕ„Κ\mèWuV±ú”¬¦4§P3šÖ¢r”­I…ã[éW¹Î•–*Eæ]ñ†% p¦LÔ*CqØ\í”°…5lø.šXI••ul,CÙÉê³²–­+fïš×˜¯N´é_EëÀm^Ñ´@CmjC‡QÖ.ֵ턭[gK[|ÚŒ—½«H˜Àbõ³}nWsJÚÁš¹É¥ÚrÁ’Nub˨Gektß:]êV÷ºØý€f9Ëݬ~w«áí½Jk\ó‚SµgU,ÕúZÇÆw©ó=ieí‹Ý%l¶³Ý%A@;TT_v224_html_docs/images/glass/blue/logo_orange.gif000700 000765 000765 00000030531 11222361074 022074 0ustar00abwabw000000 000000 GIF89aÜ‚÷b­ÙÙØs¬ÃÒë3Oü}S) jM!hšJhrr–˜ÛeZ…‘íííÅÄĪÜñ^©†ªºÌ¸ž™Ýf°ÈWË8s£²0KU•—“Óúúúãk®ÂÎñññGos£ª å9q…èèèm2¦Øíþþþ%0µ§“ÓœÎâžÑåÿ€ÿš#ööö–@ƒË›³¿DzŠ®áö²Ôétªs´ÿ½Qºººi´ÿ“8gzëëëŠÎ§Ùîšà±ISy†„9ëpe†‹–k,ÿ¹Ls¦½$04qnjX‡œâs› ¬ÝòòΩ:#NMJŸÍâ–Ýÿ²Csœ«¢èÿÿ­=ååå`Œ“©x1°â÷¨Úï¤êÓÒȦìžÊÝ1Vex„Ãm¸ñtËÎÌ¢Õê¦Džä&i”–d®s¨¿–Ù5Ž´òâÒs°Ä{²µÆ§§¥s¨¹’Ù°áö‚¼g²pºf’§ÿ¶H}¸s¥¸¬Þós ¸ò­Er‰Šr¼|Ås§³u¾oŸ²äùk¶ê¦A£Öꟷ²åús¬¾ÿ¥2ááẅ6õÚÀšÃÖ”ƒÒ̽žÆÙÿ„ÿˆ s˜ÀQÿ ,Ñ]ÿÀU¶h)ˆÆ¨š‰ Ó葘öyw¯wÀs• k¢º¢Ñå`œv¸Ô{ļµ¢C\e¤Öì‘¡§Ö˜<[¦Çj𝒻Ìã¡@}ƒ`«€\'~ž®!>Is«»åœ8}§n§ÿ©7_~…—ÀÒ¢Õìc­Ì©ï§Rd§ÎbŠžbd`\ZVŸ–xyqR€~¿Do°ÍàâŒ$2@CÉ≯Às˜¨x¶¤´s¯Àr‘n³Ñs£»¾Ø•ÕÈ±äø³æûªðHœ¿s ¯sŸ¤kÝt ¨Ýô¨Øëñ1–aÝž?N;°±®¿­˜ã€ø±Fq®y•¢~™§Áz#¤Óç¯àô²ÑåRr~ÐÑÐß”0„ÃÜö¤7ñ©A¹K!ù,Ü‚ÿ!H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë‰¸bÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£Jm  ªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý¸mòêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ SMº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ›v›UpõN¼¸ñãÕ|8 Œs0 @ø¹žëسkßν»÷ïàËÿO¾¼yòV} êÉ-zõë§NZ½uíÀL?Ï¿¿ÿÿ( €¬ÊÁN74xCS\ $-´ Ã'€òÁ€Ùåàᇠ†(âˆ$–hâ‰(¦¨âŠ,¶8âuJpí!KFÜàɃÀpb¡@¶À ':XaÅ9œ D‡.6éä“PF)å”%*GOä"I©È¯À+ì°Äkì±È&«ì²Ì6{lÊÍX£\šÚG˜V`’ëÌ Ä <±†skøí†çnÍîóL³Æ¢ìÒ\¥”Spȯ|òÀ‰îüóÐG/vŒØ¢£'ZÀ¡¯¿º°¸aí„—_¸áTP±ûúš 2È4WPÊã áôøç¯ÿþûïáÿÿ  HÀð€L xÀ2ÄH ‚ºB TÅ*›Í g:ã™Ï‚ˆÂáNhé[Ÿ­ŠAÄ8°Ä2H°‰Ž-íÈÇ%¢Øð†8Ì¡ ÈÃúð‡@, ÿ×C€"*þ;´ÐO\AKÛ·øÖ°¿Î|Ì"úÖ‡ MxÑ‹¨£&Há/xÁ–p€ ¿UuâHhD4¢¡Ã:â0ˆxÌ£ƒX~a)EÐBr‘¬‚ë`$01„î-ê{`˜Æ+œ¡Å,j„ê#¡Ý7"p’“u°„͈Æ$`]«ZÀ?Ö€ J„Žv¬ãgIËZþïúS Œ!HøÈ ëÀRƒ©ÊGæÌa-lgÉKnwbt‚Œ|X3Ô¼Å-B9Ê3¢qk¨@Ç Àæ£3Œe ÁÎvºóðŒ§<çIÏzÚóžøt§”#ÿ*¡nGS˜/‰ÔA,‰™(§Âžp‚žñ¡™=Ÿ Ô'Fm¸šÖ„Fv°ƒ$ÀšÍ¨»‰FK @BX ^(„iÄ ¯¬¡:o˜ÏšÚô¦8Í)!Ô#­\X n^ê…¬ *eB-€¡¬`†E  `fD;øLMZtÔ B>4ÊÑ®ŠaHpP0ÒQ~s¢0Vj†MÀ1˜£LÕYCÚõ®xµ'.û¥%€]LÚ¢*PN,À íÊ„b!÷4€!S½d+ÚÉ`hÐèjW1€„¬¡Fû†œDÑMo`ïXÃX ­MØ/ˆ+ ñAÛÚÿÚ¶¶‡È­nwËÛÞúö·À ®p‡K\ßR T-{Ù_ ¦ªš%ŒQ‡UZ)ºe€WŽÍ|&e§YÍ­j–£ØEO©Õ >´`/€Bi¿) ¬áîêÖHÑJt@®·Í/>ŠËßþú÷¿ÅÝC´>k£Rt¨«â€_µ·piêB,͵†d4“…¦ÚWÙËfV³_eŽ{$±ˆf/òÅ>ÌzÚö"¡D-…5×ûÊ•†8ÆGŽ£àûøÇÀõc;|[­CìÂIˆ%ÀwBPWȤ(0 âpí¢E§éá¢rÙ?opHè ¹¯[ƒ;¼°â3žöÿ(@Âè&ãUÞ"1hDöÌç>ûù€´ MèBúЈN´¢­‡\€Äÿìs·‡¨„A2|×¥j> „M ¶B…3‰ lÙ²AÀì‡7ÛYÙG×›[¶¶•·LC¸6­àü„sЭ©«t‡>"ÁlÀÈN¶²“½èf;ûÙÐ6´"ûR¥ŽÌf¦`¥/È·õÌÜ·¸Gk$ ŽzÜþñ„t±}\Þêª9bii 0S]˜ V×%Lk¨D®ÝŒÚw¤Ö °ÂºE­bb»`Ç^¶ÄÇ@ñŠ[üâϸÆ7ÎñŽ{ü;]á–oYÛmÁzÿë6v8q»|Üä è4^°ÖTÂQš–÷¾<£ÛÂÄ“vî …XàºÍ&ݵ*a€¤&´±HpÀ°G`ìc[ÝW·ºÇ·Îõ®{ã{µ÷–®§o %ّƬâ+ðò¶c71/õ ^a€Rd4[ ¦ÍyƒA Ê÷©Ì\· æmQièvC@}œá ¹NºÁ%°Œuôƒ,°™  õHPâYǺèýõÒ›Þô‡lÏ{~¾\í ýU8Ÿ”î#¸»o¹54¡iÒý¨xÿØ„°r „WZE8 4Tmù{VTŒ$à § ǯø ìÅ®× )´ ‹2@ÿ:_lˆþüVo…ú×Ïþö»ÿýð¿üçßþÕH¹^|‘œ(n÷Í¡âf{¶×vtƼG—µ P!xÇ&s„4d’àù&if·=Jæ= ã0káFUä  ÷xì…•ðIÐÀ0 ·(kP÷y Wƒ6¸ô—ƒ:¸ƒ;x °d-HFkSDãbE/'€nw6sLPjÚ`9'uõà}()n¢€oùÇ\4³m°—3;3{´°„ÜЄÔw^€}&å ( )øû T,Ð-i€8yÄVu7xƒ<8ˆ„HˆÐ×ÓDb0È(—ÿöÈ ‘¨†Ü`€ºÇÖ{Y5o»ðWÐ:@&¥ &˜€T =Â:ý†r°¢x|€{“‚Hƒ`Z¨…Ì•¹ ¸n0Ô p ðpxƒ…ÐŒÎøŒÐÒ8ÔXÍ(V‚?JpÍø p]bTA–&à“L6pJ¨Žì8€P‰OHQhjDÀe©¶VØU»°¸HLSX0?’¢XŒhiLÆrÉ ‰’ØŽêÈ„”>%dR (€À‹PÐSp˜§JŽ…ÅXŒËÈŒÖx’(™’Íxêá6€” PHðOÐ .X Åÿ”rÿ‹êè ù“GðŽp冉šè © V˜ŠJ;ÿŠ£;Љ ˆ=÷h%Özg¦¯²+1≠X¯c`Üp¨íx™C™¥R¸žH™j"àwH€Æ¦’px7eã&…GI€ºqjƒ0ð Á:¬ÂZ¬Äz¬Æš¬Çú ë!v°f¤üö| ]+ÅXpd¨Ujª;*¥fj  LÀŒš£ ¥ã2¦uc&ýçˆk@J°  p‡W ŪØJ ™y‰:M©”"À”âõGÿ37 —º=C XgÒ.F’+º §½j—0P±{±›±k±Ð©z$Vdƒâzdèˆ9s.²R+kR 6c 0žµ¹¯òh”ëÉ Pæÿ  âJ:Ê? œ0^P¬C„ fŽB9ЊÀÖRTJ™0;ëÙ¥A ‹Vª(ù–=³özŒ².‰u0â'±¾Z’›¶j;VmFv`ûÇ®7Óm<ãQûˆ4ò3e6óApžWZÖ ³DÀHiµÐ Aà æ®ã:”ä©HPW$Ú2²iP< õPf˜`3ŽÅÙú•¥6³Uë™X»ÇW:v=ƒG7 ÆŠÿð-/À(¹RPkàoÚ¡½úpÀ»j;¼û 3y%ÓT¤9„wsx³}I™áÆÓ€4ãTNO‰*µƒ[¸W°ªÿ» ΡT0”ûªž@çÀZ­Y† # €«0¿J°?«á'âé“ç«æÀ§°K9¤>…o‰È¼˜vk0 í°$ +.4]º:½¼L¼Û±þR¤ØÓ#üv0h§08;ÿé…Z¨þDp@Ð SÖV$€1Ë™Î`¸LoõYë$å{™‰¥<›kp»Hšx: '¿ô‹ÇÅð Ìzœ Og?O{¾Ú ÀAŠ"ДþâWAt¹ki ³PÐ ïq–Ož6eªsyÁ¾»Çl±×*HðÓ²— ¶ˆg†H0{ßÿ‰ÂŒl¨0Kw*E?ö œiµ,¤;˜8r,ÐRå ÄÚªžø¹ZHúòó[¿õÅTü ò ð Câ–3Œ­ð¸ @–¬º¡Ù2¤bdd63äè ¬ àoœÌo< Íð›@•Hjð‡»ÇÚ0€ÍÚœÍÜl¼"7*|`°Ë*²«ÄkÐPÐÀ3šÂŒ,*|D‰‰Á°fpw©ÔRù ÀW»Zë/øWœ0œ` ³``<Љ3·VýC†$ÅSÜʯl ×p × ð`f§É·† ÏåÀæà Ð ^#T¯[xÍ;Eá‚Ëp îðxgàʜ̓ÿ0 Ëð‘¼n$° "©ÇÖÌÍÛŒÍß#öF^ù·:³&­°;Ò— îŒÂOÕ†jиÜ{A°,pf+•+/IbðeïY¢ÀL(¬£JkBlÏ ð $àBm%9õÑ} Ý Ïð ×™pÀ¶2:£™I ÐÈä•À¨Ô—‹ÍP0Ù2=Ó5íiÅx·n{xŒtiÍ×Ü Ú…pŸöÏ_†rưÓóŸîœÂR-žjý¿,Ò;°:À ªÂZΓOð6&-khÚÐÕu™G ÖýÑDpÄóƒ“ÿJàÊò`×§ð …ð ß@û Oÿ ¼­Ù'`ËP¼ E 0f욌{g6€ ‘=ß– Ì5= NàïðP0šr9’Õ¼ÇA JÀ¤Œ†Ù6†ì}È„ޝáî³íkÐ<› A* Ø#½Í&]È WpûÖ: Ö°Û³ O¥Öv`á†PÞ˜xµò8Øû®| y½Ý‹ÍðÝ-ÀH ƒåIán™Ì½-ð‰ãÜ*ÄÜPʵò=ß0=Ë\ÙNÐ^i…TB¾‡pŒÈéÙ =Ëa¦"A(-» 6.Îç²=Ûã ­lpÛ–°b½`^«2ЬeIu"² ÿÞ ˆ¥²ÑMjmávp `Þ 5'ÃPÝ~Àã@ÚˆðY ëG/î¼`á’^Áð£H´z.G篠€ ŽW‚pè€åYÞ^*x¾Äªdk3è~ÍdÞ?(ž ëºÀ$\E€#çrNáu~çœÎpÃNÀ’ A.X3†•&¾ '†çiͪķ®Ü j•²àXÕ]ÚøÞÞ]ÙÒT/pE~êvã @`.«-;¯ P-áá™™Sn‚g%ùÝbÇkÒ-à©ÿ@œ'—|ì.@æ) `ðË-ÀªM²à0bà ©@íÕÿþÏN¸Þí|.^O 9ò}Ý‚ð›`XЮ:9.2"0üB$ míϳ`Àf@?«´ :žÍcž\Ïõ×°‘¢-`?Žná0~Іð kP» cŽïó2?ÛAIÚ‡§5‘‡íµk¾ŒL~· u= § §]ÿE°‘ßçšæÌ3Ê$2çPùþ“Îl€ó:Æ’J°©“ò/ºQö\ÑðZ¿pJòGðâ¼À ‘žùH` ¤\Nð¦ð ZÏõøž0'fýâ.®Ö¼' . •´0ù¯=Ûç;-6–©‹)Ø÷¢ÿ°‚¿È‘™7»`’Æò.pø#Ÿ¿°`œà–¯YE².ýîü²MᕯÜå]Ø"ŠØ ¨'´,2âÉá:ýûG‚ÀPk òB‰'`@]DðëWÉ_JÖp(Å¢ÔD0´ì¸áõÈŽ¡ å˜` 3›„œ¸ö FHS,]Úƒ€±!˜ ùgà•!;Y³òªùH€|ä [Ö¬Y^vþäd¢@[3W®ê `Æ,C†J•Þ‰jIB 7<ËÄ"‰e8è 0¢#»XJ °)…)˜æŒìسg=âåFëÖ´7Ùfq&C ˜]Ûi‘eD°ÿ§S8éÀd¦Å ” @ „P N\Tò ÑI“&åÉUa‹†ŸäËJÚ NÁž°tÙ yÏÈôPÊ”é>Ë¿@ráÖ­£¿Ê :´€Ñ²¯0‡ˆ ¥®»îª$ (ÚYã€"zéC° É„ªÒ£Åô‰Ä1È$ƒl)0t¸¢…R(ƒTú+KF²H» 'ûîÃO+C@(‡ vØå0ÚÉÅ‚ 1올À¤”!&rŒˆ‹îyL*é9é¦3åškü àù†Ø„ f-­ @h ŒÌÀnÖPâšõÚs/…Æ“3»MÖÈíèê3þh¬ÿ1-œ|l‹,h h^i0ƒf–™¦È#ã¹·> ÑÃ(ZCÅ`ÄÇJ,1yžÐ+¨:/™¯rõÀAp” `Ë!+®nr“ žÈEAlsȈ+v“Ê ~£h³>ˆNžLñ–ÛéjàöË0ŸQ % à —*HãCÜͦuBŸ¦ªêS¾ …©;R˜)0:Y€Ý—è–Ð ­i?×4Öͳˆ´5× Ùa1nQfš5”ÕÂg=v·L¦²öŸ'SìŒUGð`fšgFf¬àÄØÅ,ÐlT' µ8 6˜–X®zd‚¤™Â¡®ÿ5 8òÚIƒ”¸-×ÜgÂÓ?Ì%ƒŒP`¥‡gÀà@ÎRè\ƒ®H3ÄrÊy%>„7 OøðàëäºÌèä ”^xo‡%VÍÑ¢/–aó 0ÒÂ#ÂM·°6#J®_hÙBŒ‹Vkž9%„°‚7ÃHC?¡Û$RI1–Á’.go®xqYÝáÄŠ”ÍX`®ÿBÖ©¹è¾<†µÉø¦|2Ü>Š=¦N€ ;à HÀŽyéõ‘ˆ•Zzé0~1J©€p)~(X'ZBªN¬á –Ò|E¨öíQØ\óš!©(’ Ñÿ¤' ázÙ‚À„ؽ,fµ³2”@‚ŒŠ*$x…€”9Ö¯sAˆpŸš¤ÅG €Æ®ƒ —”êZY²¥Dpé5(WžØsÅ·]QO‡û@O~!Lƒ~óržÊQ0ÆiG ~8ÊRîÀ7&>›X×O8° 0¼‚ {dCÚR =FJR›» @„D$#1«d}Xo·€•]ë ƒ2Ü;²Êv5»Ã* PŠL<©B¨¯D<¤ Ýêñ €ÀPkâÌ'Æ™A{“ É÷¶ôp‰/}[Ü“öFdþb<¥¥‡Æè6¹idúÉ à‡õÿ™ÈL)À„M ],BÖ€£¥“Å#äÅÀÊ„HÂñ¸ÍÉtP=­e¯kÝCÂ2nÉØ9à ŒÁ‰693 øa ChÉT•€ ¦ƒQ;Œ0T X!c½Øp¯|Íp$UªsLR”~iÏÈC6¹M˜Æ”›pú“ݲ0šldÃ~åH€ºVàÌ!›2ãžðë½á€°ãµ³"€ ‘(T›`h ´‚K¢„=®mŸPhˆRP m m÷FPŒ]X@ÖpƒˆÜ`Ò¢5°á™6iþ¶€/þc(&â¸Î–¶µ±ïÿ¥D¥ìŸR¦ª¼b^:-c9Ì‘?ìÀÏøe+C‚l JMYŒñ„``ì\U9…¤E2ÉIP‚$ _`€ ! Ì8ëY P˜­u±si&;eÀáTªZ‰+LÁj äm$_\ºÖé¦9•ƒÿ°}ÔÓ:¢úئP²·ù†)Ã[â§xÅ)~‡1aÖw¼ ¸Á$·šÖiy@ Ä-þF ô x(Ò –Ô[Ú-hœ4•Þfï·!yâ*ðCcCèØˆ@Ñc¡¯*Ý…t¤›û¨·ê×€šÙÌë–`ÁRÂ…uN‚tàßÕlDZ7°a%t£‘‡P ãÞ°xÝí~÷7  Ø¾¡N ÞYÜ+*ÙÙÜv÷7"ƒ ó_Nj3”Bò«[ÀŸCÉå@Ñ9Äù¹Ð‹^ ÐÇ€±P:˜Þt§G]õR?ñÄåKÇob³Ï9×m‘ -á;ÿ^p#ŽR‰ß²ù†»'_ù'h%Â?Zp<§e|H`$RE×,mò„BÍk Ëõyþ4pO$$AiIÝE%D t -ì_‹˜~ûgnêýÿÿÔ£8d0–c³ó+ïa¿UXƒN ›,ûƒßó80û¢3!’;¼åË@»ã¯^3€|àŠñzš,(¢Rè*í;l’;勯ðË5 °;@oûšX…ök?oÉAS@%¸?a  Â@=,Bœ€  º¤P‚ЈŽH &z¢D©¸<íøµDÑ)´#¶„K5d‹;è’$,C3œdüR„8ð …AôƒT%ø€F„"X„D´Éƒ–böÇ|áºÂ“;äëFÿŒÌHbœdèE@€”Íñ €uÐç³õèC)ÀÈ€ô HöÇ„œƒ”Åv|Ç,B†@†p$ƒUˆ¡Ê|ÜG<Ê(F$„¸” w¬Ä„ÌIxŒ;…"ç‹ ˆü;^ð•¿qျmÔH±ÌH÷9—XúØ#h' X`èh‘}ÉÆ°ÔÈ¥Œ¯ŸDJD›IœÄ%ÛIdÐ3cJTD¡T…¡¬G£DÊ~\ÇtLR”‚78Åð“ÇA\&óIÁŒ¯êÀªȇ¬ü»ò0/0 - xn|LÖlM×|MØÅ*²³$i€†‘ ºk¤·›DÿmlIØdM€LBoø>ð«ÌxŒÇÐLÁD>2üÆS¿¡LL}äGÆE×$EäTN-zNÍœ;éü6ì±7 MÃ%_\ƒUˆ;oXÍâœOú|ÌèÈ 0 x30†58]8ˆv`lÓ]R,Åõ€®¨OÈôNÉŒ/ÁìIŸäÉÍôéDBb„·ê4ÌëÄÇìÜÎP,Nï|¦¼Pä+Cb\Æ/|^H”ˆD;W³E‹€Ï pP%Ñ9ÒÏPb+¨‡u g‰K°%5mÐ}PoLBÉ4Q(NnE×DNðóÐëTÌFà.íR/ýR0 S.­Ïã4ÃatM èź©ÿ±V¾2JÀq Á92@†øTÒ%ÝÓ èxàQ9Ã7Á0ZAµÍ €˜°|=ÝSãDÆúDBoH,ÅÎ}SMÝÔ.UOýTPUû4F} Æù®PÏ2ú¬Ò„ S…Ô|TH¥OQ]‚ P0Hc—7£¹&!§k±ˆ$#¹>lÐP=Vd ÕùLVO]o¬Ô¸T¢ÌNN­Ö0eÖcíNdô†ù¢À0RÕz!²^{%¸Ó<Ën|MPuÌ `<@E*R“¼R °ªW”E¸CG]líWõWoœLëüP-µVƒíTeRïTà è“V=é‹È2%§ÿ ËødXECRµÏ x\u¼óë'›YL6 XÍ]Y–ýÔ€M9iÑL=Xƒ ›½ÙPVgmÒ}R(ýÙ7èÈ8ñÅ'`€`Ë©zñŸ:62 L Z¨Z¨•Ò)ÕÓ˜LZ$?]ÍõãœÌ×}Uœ[²-[³=Û±U$ôIiUÌ™¥Ùj=ÛfuÖ¥|o€IÁÌ[½Ì˲ãŠéC;ÏZ;©h;È×ÀÜ[Å]ܽ½Û»5Q}L$<ŕˈ'.žC2YTȸSM~E[Ð ]ѵÕÉD†¶ÕÇ·…ÛM•[ÈüØÉÌ ]Ù …ùb—Þcž¦1#8:ò/øÿFe/Ù^â-ÞÄÕ€§UÑ—H<ÇFD„šdT¶ÁÓ]ë½^²¥ÛS<]MÜRÕåÔ*ßð½Ùf¥ÔS$ƒ@Î[_ö-,ãs(*A„[˜/V!Žáh_ÿý_΋¢”ÊWÁÄÐ3,]ytǨtGÄõ\± ñ` ž` ®` ßœµÕíU¾G·Ø?a.aÞ¿ÆYµ˜tA8`jÀƒ-˜a®a<¸‡&@‚"#¼'È/øá¶„W¨8"]z:†0XF(ð˜b*®âxâ'†F€…aPjè†m˜8ðDxU§UÍ2´[ÿŸd/¸»L¶yΔmЛ½`:®c;Î`6]jè`™½„!þàhžhÿ&äcž ˜bH„pÈfpØfmîæ-Àƒ0X(ì ¸5p…r6ç:°‹Ñ[ƒxçtg@ çzÆçX–ežæi`_xU`ÖÐmPùôTaVh¥æ Ý<€fö`Ô}fŠŽæ.¸êñU[oð8i¯Îf‘–a$¨€WÛh†!&â–® ehH†<´«j¨…0°‡šF囯éUÖi|Öç|îé˜Dð§ÕP~դ߫^lÆnlÇ~lÈŽìÇÎjoDenf‰®j«Æê…ÕÉD„èè¯æænÆhÅ–nOpè^èxVS˜…0PÅÔnî†fï>fo0VøèñîðDÀ@@L›«!x­i€MY-È*N(€ß8l ƒZØíÞÞoàVeÿÖiâp.P8˜XõÜ%°YçVp#?ò 7dŽD„qÈîí®ðþ)ï‚ÎÆèX÷ð&‚'Ø„cM°\XÓÙ:É,ÿù£kx¶éßîïwå÷ižð9fcfÆ–r=ßs>ïs?ÿs@÷sÎfh˜4_`}¤p(d=¿êcNftÈò¿á&x…ûrMã4`p–)h8sú(º%®kS¶ñÇé7ßiY6nèñFê"Ïó@¯u[¿õ)_ìïfaŽ‘'_tnô.hjŒFIïð‘nl@@ §–6N@Ç¡Éù£ƒQfý6u½îTÿëâfuYp?@^$|àY_l\_wvv¬¦æP(G¨z¯w{¿w|Ïwzßs*7ädNGø€?vmó~€[zW²Ž¼Sƒ’­yuÿa ñm7ußvó7óUbr uL"¿êvy’ÿ*_èêFJü,H7—y˜y™O7~'ödx'xNvЄiÙÔÒ'¯I€Ï«…l6·øSÿv8×øçr7÷Û/y«¿õw_˜tÊø^N­y 6vœwOF>xX ƒWÐZ})„>ø¼Q…Wzþne¦×øp7îèø ¯^"O÷«|>wt æúÈp7Åw·bh|)tD{²×ù³¿a.°‡0À†W@D4à².sø¼ù›xUÐv»oón¿gÿÖ{V—b)Þ_¨óåF÷tGrÛì*0äJ …ÿp•Äÿ}Épá~â/~hüb0ùÜ/v€Çù²?{ó„tP…0 :Є|x…H" ºj¸öZøA(夷ûÔW}áf}V¯â‡\6÷rœ]jú·h›]5žÇ™þn(hðàÁb ‹}©b‚DŽ&R¬h1ÆŒÁqÜ‚ç^“töÂPV‹Nµ”*éЩ%,Œ*F\4ãæÍš:wòÔäçÏB‡åbôèQJ—*-á”S¡¼y{3áê’%j´ª áõ+ذbÇ’-ûuÉoBåùàá-ܸo 4a÷.^ :L+Ñ"`Š5rìøñÈ($Mÿžl,LØ%˜2›Ô¼‡3gÏÌ>6!êùÒÐLGû(áÔyi :ÁêÕØ²gÓ®mû¶mªÈØ~hÀã7pà ÀX7/Þ½ zûðàŒ… ƒô‘8 IJÚ)…‰3ÝÊ€îY¾¬93çΟ‡†FJš©ÓŒÐtç«Æœ<¡B!cÝú¿ZR5 Tx`€*˜`lÍñA$J!b1ÄyàÂqÈ™ ˆ uÁ"á˜xâsŽD·Ñtàl±Å=€€&Ò ª¨â*ö0e—ù8Ãy=¥·{í9Z|N1"?ÄŒ‡/¾ R"UZy%–Yj¹%—Y"€€JPÿ™ešY‡;8èƒE†r¸‡†øÅˆ~ˆâs+&ÒbG[Ìcg¥•Π>„7Þ>ÉÓD‚fd{H&™$#KÊ—N:•2²§œª°Â§*ˆ:*©¤Žrj§©ªºj¨£b×#È:+­èƒCgŒ0œqp"¢8"’x§‰)êɧ‹/¾$£ã‘W^¢˜-ZS£DB)|“Æ ·Ýz;áŠî©åš{.º¨®º.¨*`wI#´Ê+oî8À¦›ý:gÍޱ+"«¬²?>íÓêTíz׊–­¶%x;1,šV:.Æh¤»±ºìª*ê»ñÎ;òX8€C$˜Í„tzÀf3Þï–\n¨×x|dAøý „„‡ŠŠ““.–– ™™œœ6Ÿ 0¢£3¥¦1¨©%# &7´µ<·¸¸ »»,*+ÅBDFHJLKPÏTTXW[\^]abdcghjmnp stvyz|€‚ …†ˆ‹ŒŽ‘’”—˜š ž >"eªT*U¬\Á’UËV®\¼z&Œ˜±!EŽ$iæìY”hU¦e©Vã¶l2¶qëö \¸qäÊC—ŽOvîÞÁC”h^=ÿ{÷òéÛ×Ïß¿€Â(hð`ŒU­^ÅšÕðÆCˆ=LDQ±˜„cÉ42kæñ#H‘#«™|2¥ÊnZ†³\‹™éØd‡ '¼<çøyO€Ð}.Šþs€Ô†Ò¥L>M(•aÕ«º²žHÁu˜W°—q¤QÖ ÈÓH–4ÙV%¸r_޳‹·æ:œîþöY¯ða¢ý7~Ìt†d¨ §VµŠ™GÄZ9w½ˆ,ôFŽ¥wœÖVõÚÖoY~›[Wæ¹¼{q Ò-·#ßù+>Š”xd§È+SmØÜ¹féžQ–hØ•¶]w$}‡’k°'´gÛ|ùµS{‹T|Ài"®\}Jwe íçfÏE×™E_a¤Ìudx‚j±¶`xgÄÖFysÔ–GzXXÈnö¶!%òG_@ö4bT%.×_Š›­ø™‹b–Ý"ygc6 Чy³™gz·™Û…‡¦a$¿]2_'Ã…xßAùEyYsTÈ"h/ŽÕ„Œgu™à—ÚlÓà˜ÆaæÞ¤æzlöTä{GVÒá&K†b§“ø‘¨Üž(þge1A;TT_v224_html_docs/images/glass/blue/menu_foot.gif000700 000765 000765 00000004222 11222361074 021572 0ustar00abwabw000000 000000 GIF89aÜ÷²åúèèè²äù±äøééé¯áö®áöžÑåŸÒç¯â÷ Óè°ãøŸÑæþþþ¬ßô¡Óè­ßô£Öê«Þó¤Öë¥Øì¦Ùî©Üñ«ÝòªÝñ¨Úï­àõ§Úï¡Ôé¢Õê¤×ì¨Ûð¦Øí³æûçççûûûÐå÷÷÷©î¦êñññ§§§¨ìÊÜÇØ¶À¢åÌßÎáÐäÏãýýýâââ¥éÝùùùëëëêêê¨íúúúüüü¦ëžß£æíííôôôäääæææóóóðððÞŽÈ âõõõŸá¤ç¥êøøø˜×šÙ˜Ö›Ú™ØUxöööòòò²²²¨¨¨qŸ•ӓω—ÕÝÝÝ©©©¾¾¾¢äìììu¥Ì瀴³V©ÊsŸ‚·=˜½šÕí•Ѻººu½ÚœÝoœÊm™ŽÎè“Ð8Ow¨ÌÌÌt¼Ú~±]ƒPrg‘›ÜÑÑÑÓÓÓ½½½ÇÍÍÍr †½ÀÀÀ‚«¼¼¼ßßß|¯Rtb‹„»¨ßõ‰Á‹ÄŒÄ}°k–šÚ¡äc±Ñ?™¾ïïïË áÚÚÚ…¼ÊÊÊ•Ò;–»ÇÇÇÏÏÏ»»»Nn‘ÍTwŠÃÛÛÛ°°°ÆÆÆ¯ãøKj˜ÓìˆÀTvœÜ–Ô¤èp¡ã§ì©ïªðÿÿÿ!ù,Üÿi œ¥‚‰ #N1 Á!€‡! ˜Hq​,ØÈ1ÇBŠ4@²¤†“'!¨Té eK 0a^˜9ƒM›ræüÀóC†Ÿ?7Z¡hQHAPXºÔƒS§¢F@•j‡«W9hÕú kW`Ã"K–Ù³Òª%A"† /V°hA ®ÝxóæÁW„/BÂi2¢A­Ãi<á‡1ª:Œ±bÅŒ9vüèQäÈ’$Q¦\ Áå˘hÖ¼‰AçΞ@ƒÝ`ôhR¦MŸz:µj¬Y·rðú5,X²eÏšU»¶íÛ¸síÞÕ«·¯ˆ.¦† r£ðáZ‰géÿ8ñCIHw$‡ \Ù²EÌ5/àÜÙsСE“.mujÕ¬µæZO>Å6mµ%¥nºíÆ›o¿'ÜpÄwr(·s°å\rÑ%ÔU×W ` w<†Ø@&ôðJ,64R‰zìIäžðŧ} Øw~¢i°Ÿiø§Úºf±ep`m(ˆ ò6„Àu0!qX¨†jÈa‡Î݈%îÕ×à€;Ìà"x0ÊRCcNœ¡†d9>´#ðÉ7}Bâg@‘Gö‡Ú’M›³Qi%ƒºiÉ¥„Â)&™2p¦‡Ï…8"‰mÐ×!€AD #Øÿù]x‹-¡š¤h ƒöh(‰©iH* kNBIéP–Þ†éSšúÖå—Zª™’ª¦ˆÒ¥ª*_xB@It×À´êÐC `øðD”4(½*°ö)Ê(±ŽÆ)²’òå” :ËT–JËéVžZ‹a¨£¦ ·ÓµÉ×&_hWE ;´ˆnx&¨p±¡f ²¯;úz/¢ù ‹R£.KS¤:) ÁF]zp¦ W5m§Õw­r8ñ©ÞqÊ]ÈYn¬wâ9x²0ñ6¸BF!cÌ[/f¿Â왾îTì£ÇÞ”ì¤;WZ0RW",Õ¦XQëÕ§cÿËœ¶K³Ùf&VBEA˜ÇßY­Ø,â­»µ’¬‚E'mÈÁÞØ•ÍY° í«v¿2µSÀÆÍìÜ þ mÐV-ÌUÑbõt¶›*x^¥øaÈvˆ€x{\ubW‡,y,>´")ˆÔËôÔWoýõØg¯ýöÜwïý÷à‡/>÷oÄÉŠäAG ì·ï~ V°ñÉ9ñ;P]µãɫЯp|`ƒ(<Á Pà\ÁÀ:ðŒ 'HÁ Zð‚Ì 7Á,hŽXRAƒšÐ„B€ ThBþì´?þ=n&Ð,NPƒ%¸ JðÿŒ`´âˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*Z‘‰Q€'.±4„"` cp@Æ0¸DHB ºÃÖy´‚œòxø º ±È£÷ÈÇ>úñ€ ¤ IÈBòˆ$&l …5az@$')É*TAHÖ8Ãs«q³‚cq¨Yôà'`B jðŠVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉËYnÍ PÅQ‚bó˜M¸Á ò§¿O‚2”¢¼äp˜C¨ ”²È¦6·ÉÍnzó›à §8ÇIÎršóœèü&y”ð„9<‚#ˆ§<ç9´ÑÎ|æ‹¢‰o¼iúóŸ ¨@JЂô M¨BÊPÈé “hE1 OZô¢Õç3ùÉÑŽzô£ ©HGJÒ’šô¤´0cºv„)hô¥0…&JgJÓšÚô¦8ý¨J]ÀR—Æô§Í©P‡JÔ¢u§=ªR¿;TT_v224_html_docs/images/glass/blue/menu_head.gif000700 000765 000765 00000015560 11222361074 021533 0ustar00abwabw000000 000000 GIF89aÜ‚÷¬Óè_«íííòòòt¾¢Õê§Ùîr¼pºüüüh³¥»ÅHxŽÌœãÍâ5Ž´”ÛT…l¶’ÙçççØžÉ܋҈ФÊܦì«Îáïïïx²ÑåªÝñn¸¤êf° æ®áö—Þ¢è†Ï„Ͳäùw«¬ßô®ßô‚Êjµ`¬k™{ÄÛÛÛ³ÔêwÀ²åú©Ñç›Ûÿÿÿ•Ԛᨨ¨“Ó¼¼¼±â÷­Ýò¥Ðå¦Ùî°ãøpžX²²âø¡Íá‚°áö­Ñå¨Úï²Óèžå ÓèzºÉÉÉ®ÞôªÚïÇÙ¦ÍàªËÞu¸Õ«Üñƒ»¯áöq³œÝ©Üð¤×ì˜Þ«Ýòj­Nn[¦Ç±È× â Îã`£²â÷ŠÅ™Û¢æ–Îå“Ôž¶Á—ÙŽ¸Ôc’d¨’زÏá{Â}§¦Øíx¿¤Ïä–ÝÐä±ÂÍ|Ť髿ÊÅ×¢Öíc­Ì˜Ïå©ï¯Ôê äšÞžâ…Ç€É}±âââ”ÚОß~Ç{³Ê”ÓÏ~¿v·¬Üñn±œàšÐåšÜœ´¿˜Òëf¬¥Øî—Úh• ÇÙÊã¦Ùðn³Ñt»ŠÎÔo¤Á‡ËËÑÔ~įÓèv¾”Ö‚Ço¹rº{¿wºs·]>{¢˜×c®^©g²d¯b­ŒÔ›âÈ×™ài³ééée°]©kµm·èèèŽÖƒÌÊ}ÆÕ‰Ñ‡Ðûûûëëëððð÷÷÷ôôôùùùêêêãŸæñññ±äø¡ç­ßô«Þóúúúöööõõõ³æû£éøøøŸÑæŸÒçžÑå¥ë§Úï¥Øì¤Öëªð¯àõ±Ôê¦ë­Þó§íHœ¿h­¡å¯Ïã¨Ýôp¡…ͿٖÉß–¿ÙÕÞäêîñžÌß9uõ÷øûüü!ù,Ü‚ÿ‰ H° Áƒ*\Ȱ¡Ã‡#JœHQ!®‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8gØÉ³§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªUŸ0²jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóê­»«¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘ßÚ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶mϺrëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN÷°ëسkßν»÷ïàËÿO¾¼ùóèÓÁ¾½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hàïå¢à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–Ø (¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨#ŒÁôèã@)äDiä‘H&©ä’L6éä“PF)å”TViå•Xù–\véå—`†)æ˜d–iæ™h¦©æšjfÙc1pÆ)çœtÖiçxæ©çž|öé矀îÉ¥›oj衈&ªè¢Œê#ŠN 餔Vj饘fªé¦œvêé§ †*j¦qöñ¤Êɪ¬¶êê«°®ÿj̬´Öjë­¸æªë®¼öêë¯À+ì°¸N g0`ä²jœÄáì³ÐF+í´ÎkíµØf«í¶ÙÛc.ñ4ë¬ä–kî¹è¦[nì¶ëî»ðÆ+ï¼ôÖkï½øæ«ï¾ü¾;«¤È†ë,-0`ðÁ'¬ð¿âðÃG,ñÄWlñÅg¬ñÆwìqÄìNP ²œìB ýœò;4´ìòË0Ç,sËÔlóÍ8ç¬óÎ<÷ìóÏ@-ôÐD}³Ã!ˆ F÷¹ÿNÐáÌÌ^-miÎt”—ËH¨BÊІ:ô¡¨D'JÑŠZô¢ÍhBùðOY”Qœæ9šÎG˜ô¤(M©JWÊÒ–ºô¥0©LgJÓšÚÔ¤Ëð§GÃ9Ðrr`ݪP‡JÔ¢5¨¾HªR—ÊÔ¦:õ©PªT§JÕªZõªXÍjR¡ŠÆ¤j,g.JÖ² U«hM«Z×ÊÖ¶j•«ÿ¤D8@Wº*á–ð5öÊ×¾úõ¯€Ýk"KØÂö°ˆM¬bËØÆ:ö±¬d';X_¨Bw „$P׺âU¯ ­h÷ªŒÒšö´¨M­jWËÚÖºöµ°­lgKÛÚÿ–6\…f9ÛÙ»Î#¯£ .`]@Üâ÷¸ÈM®r—ËÜæ:÷¹Ð®t§K]â*ò±Åf; ßW¸àÝkuÇKÞòš÷¼è­®2¡Šì΂·žUªàqØ÷¾øÍ¯~÷kßdø÷¿°€LàøÀN°‚Ìà;Ø¿.`/< _»Ê—¾üͰ†ï›‚{øÃ ±ˆGLâ›øÄ(N±ŠWÌâw8®°ì(QaÜàÂ~†ŽwÌãûøÇ:¶‡‡Lä"ùÈHN²’—Ìä&;ùÉP޲”…œ¸B3®±n0ßùË`Ö1 ÆLæ2›ùÌhN³š×Ìæ6»ùÿÍp޳œçÿ˜Î€´ MèBÓÙ)¸²niÁ]ùòÙÏÖ±3&MéJ[úҘδ¦7ÍéN{úÓ µ¨G=iØÃí•…nÀêVs ËÞˆµ¬gMëZÛ:Öȵ®wÍë^ûú×À¶°‡MìbûØÈNv® DøbO E«] ë[[ûÚ±n†¶·Íín{ûÛà·¸ÇMîr›ûÜèN·ºµ “ „´§Íe*Ð÷øÎ·¾÷Íï~ã{ݸÀNð‚¯»Ýö€w´é]oúNÃß8¾1@ñŠ[üâϸÆ7ÎñŽ{üã ¹ÈGNrŠ7#¨ÿPø¼§MhÀÓˆ¹ÌgNóšÛ<æ%ϹÎwÎóžû<ç(wNoØ{߸¹Ò—s^8ýéPºÔ§Nõª[ýêXϺַÎõ®{ÝéhF³‡¾rVÁèUXÓ×nó¯»ýíp»Üçþu ”ÂÝd/:Žžt¶û}̼àOøÂþðˆO¼âÏøÆ;þñ|ày  “ EÌ~ƒ ì=í½èGOúÒ›>ôÈH½êWÏúÖ»þõ°½ìgOûÚÛþö¸Ï}ê™QyT`^óA~ð°w ,àôÈO¾èÁüæ;ÿùоô§Oýê[ÿúØÏ¾ö·Ï}æ#ƒ¥Hyÿæ…ßyâSÁøÊO¿é»Ïþö»ÿýð÷‘Á‹ðÃøÂ'¾Яþþ‡Þ€8€X€x€˜€ ¸€ Ø€ø€€¿` Ðlã·yÁg~üçêGø ‚"8‚$X‚&x‚(˜‚*¸‚,Ø‚.è@¥€˜úg|؃:¸ƒ<؃>˜ƒ/„B8„DX„Fø‚Ø3ˆø—燃?…R„GX…Vx…X˜…0¨„—‡xð…O¸Ñ0†dX†fx†h8†°†l؆nø†p‡r8‡tX‡vx‡x˜‡z¸‡kH1~HÂ7|7(†ixˆˆ¨†|¸ˆŒØˆŽÿøˆ¸‡Œ ¦Ð¾x`ƒ…˜ˆœˆ†‘ø‰ Š¢8ŠlH‰–ˆù†ûgˆØŠÑ°‹²8‹´X‹¶x‹¸˜‹º¸‹¼Ø‹¾ø‹À‹à‡§ˆ‰_ø…Gp~ °ÐŒÎøŒÐÒØŒÁXÖxؘÚŒÃh’ÐlÆø…e@G Ë8蘎ÎhìØŽîøŽðò8ôXöxø˜ú¸üÈŽy0‰¦0ƒ˜XxPep希° Ùù¹ý8‘Y‘y‘Ùy”()ŽiŽ ‘$Y’ é(™’*¹’,Ù’.ù’0“29“4Y“6y“8ÿ‰’&À‘‰p`@‰  m`’F ‘À”J¹”LÙ”Nù”P•R9•TY•Vy•X™•Iéÿ( à“@iyP”Gy– ©•j¹–lÙ–nù–ZÉ•Œà•`”GÀæh–hy”;З~ù—€˜‚9˜„Y˜†y˜ˆ™˜Š¹˜ŒÙ˜} &ÀlÐhð“v‰—D¹—gÙ œÙ™žù™ š¢9š¤Yš¦yš¨™šª¹š¬É™;àž0™hð a‰üp™©™FÙš¼Ù›¾ù›Àœ­ùšžÐ € ´y™¸©—ºI’ðœÐÒ9ÔYÖyؙڹÜÙÞùÏÙ ÀÿPœ’0›aY·¹œÐ°žìÙžîùžð¹žÖ0ŸôYŸöyŸø™Ÿú¹ŸüÙŸþùŸ : ó醭 ¥œ@É·I”ñ¡Êžþ žz¡êº¡* ðš jžaé ê9¡&úžM¢*º¢úžÂù¢¦ û¹¢4Z£6z£8š£:º£M` ½àn` À ™žz¢Hºž8jŸàš†`9¥Rú’Oj;À™jŸ<º¥\Ú¥<ê£@* CZ›FÚIš¤×¦jz 4j Mú¤i›žà nP§vz§xš§zº§|Ú§z:§€ê ^§Oz ½ ¡‡@£kº¨ŒÿÚ¨Žú¨©ŽÚê=0¤©@¢SðmP  ª¢:ª¤Zª J¨šªjZ‡` —§uÚ ­À´Ú¶z«¸š«ºº«¼Ú«¾š«´¬²*«ušiP¨Öp‡PjšªÎú¬Ð­Ò:­ÔZ­Îz Ö`nÀ˜ª©œê©¦®âªÐª¦­úª°9«l ìÚîú®ð¯ò:¯ôZ¯öj¯ÐìÊ®=À­ÀnàÈš¨kj­{°[­Øz Ú­™J¢®ã:±¤ª k±©J‡p [@§‘ X°õ$[²&{²(›²*»²,Û²%[õ°+€h ¶ÿÚ np¬† ¬dà¬û³@´B;´D[´F« $@ › 1 ©{ÚÂ0µT[µV{µX;µ?«ªM𪠲1V Ipf{¶h{¶I°¶l›ëð¶o{¢0·tÛ v{·x›·vÛ|Û·~ €¸˜ ÷0 bu³5Û8{¬—` Mp >{´–{¹˜+´$PÖàL‹N{›Q›µ¤[ºT{¨{˪š ŠP¡¶²+»m˶p{»¸Ûº»»Qл¾ëÀ ¼@0¼Ã[ Æk¼W¼Ê»¼RмÍ bP3k³8k—°¬…´©»½ÜÛ½Þû½àÿ¾ß« ¬º–J÷ºP멦۾X»½»± «ð° Fp¿ø›¿³{µ»¶¸û¿ë°»¼ë»½¼ÂK¼@p¼È»¼ ì¼Í»Ík0½k½‡@¹?+¾¼Á ¾HÛ†›+N{ë« î›ÂT,ŒºH{Ú # à g¿ú;»ý»Ãÿ+À>¼»ì<Ä@ÀÀ ìÀKÄK`V ½hÐ:[p½… ÜËÂXœÅZ¼Å\ÜÅ^üÅXŒº$p™àXüð°¢û(¬Â)ƪ˪zÆ*PÇ*€Ã9L»;\»=üÃ>ÄDŒÀF̼H¬Ä,bPŠÿ ‘³†` …@Ú°½`\É–|É[,Æ0l©1¾›ºÆmìÆí+¤ÌÂÚ ´çÛ5\ÇxŒ¿ûû°Ë?пœ»Ä<ă¬¼,†¼Ì¡0ÁOÅSܳj Å¤¼ÌÌÜÌÎüÌÐÍÒÌÂjÀª™ gœÆéÙ©šp ÞüÍàÎâ<ÎÞ¼Ì,<ÆÚŠð`ǬÜÊîl²Ë´\ËpûøœË‚¼ËWÐË¿ÌÁ¼@ŠÅn`Á’|Y,Í ½Ð ýÌ-¼¹K»b©&ÌÍä|ÑýÍæ°Ñ"Ú@Æ:°V ìüÎîϰܿY°Ò,ÝǼ 0 Ó€œÏ»ÿÌÏ¿¬Ä°‚@Ì=` ™°Ë:É}ÀÌ]ÔF}ÔHÔJ½ÔJ-}pò@æÛ1øÊÕã\ÔýÑ×\›ÀÎb-Ö'Ò*ÍÒ+íÒ»Ó2ÏÄ«Ïû\È7 Ì9-=Ð:à ;›½MÔLý×€ØF]ʪ öÐ+P0Ü\ŽýØÙ’=ÙŽ½–m}ðÑi D@cýÙwÜÊ(=ÚhÖôü¶l½ 3M¼_ÐÚ­}ÄÎ˲-Û†ìÏ9½ h ¶€Ž@VÜ}`Ô–]ÜÆ}ÜÈÜʽÜÇ]ÔOÕ ‹ÍŸ§ š@ÙØÝ]ܘ-Žÿ: ýÙe=Ú²\ÚYpÚ¨ÍÖ«=¼®ýڄ۳͵mÛ9}×=-ÅA}ÃMÜÌýßààÜPMŽ€:€Šð <ðàá>áþàïpáÐjpà‘à` âãíÎCPâ&>(Þèý¿©ÄÜðâ/þÞ_×óMßsM×°ÓºmÌ¿ÜæÐÆ}áB>äD^äF~äH.ä–Ý}PÍá €Š3°V~åXžåZ¾å‹ ä}àÝ!â#ÞÊ'nâ)®âhÍâìmÀ0ãïMãó}ã8žÄøÝÛ[ÜÉ,Ü@~ÜIþ瀞äÅݘ Õ[` åÿ9åìI±Œ®ä" Ù=àácnã Úg^âi®æ¦}»-îæo.ãr>Ûtnßv ã»íÓ¿½,,E-à®þênÔ™}ip©X9èŠS˜ƒƒÐëï`j@8ÐD0é”^éc}é(ÏšÞÒ¸›Ú©ýæÜ ã ¾¼5>ê¶m £PŠ QìÛd@j°çÂ}î‚îé~îåhÊsøFk`ÖëƒðëÁŽœ­“ŽìÉ~é™®élí0-íÔçÖ>ç7Nêv`° ð0³àŽç¿=îòPîŸñ¿ñßñ¯ñòò®ïQÓ€|÷ Þ cÔ0TÓdïƒÐ'ÿ ì:PìÆ~óÇþïÊ~â;épKð1-íðÊ{í oÛBôBÐ LLÌ: x¾Ž0õ?îVõXŸõZ¿õ\õn ‘€·ž†9zÓkâÐò4”lßö9ó2Oó6óýþÙ;æ=ŸÞÏôÛ ôŸNôÉkôsmßJŸô ß<³ 0ñ¶8ðø™ðø’?ù”_ù–ù˜Où`ß ¥Êž  Ø0ß Ôð 1äöª÷3àsO÷dn÷woây?ðï÷0^íE¯ðƒô…ßðp𠽊@³hжúôÌßüÎÿüÐýÒïüËùR\¾ ýÂÿ  à âÐ ¨¯úm¯èï} Õ5OÃîÿá8ÚÙ0ÿôŸ —ž÷%ÿúÏ÷Û, äV°à„A,\ÈÅ¡Ã%%Jd¶è ÎêUYµjUÑÕk×laÅfRÖl´iÕ¢-ÑÖí6¸qå$h[B… A<„8q¢Å‹…pìèñc!<¦cœÓcÈ‘M¦\™²Ìä4o×Ùs9СõŒÖÃÏôMŽ c-ìØë׋Rùूÿ€hD»!]š´©º§Q§V½juëñ¯_ÇŠ5{vís·oåN§ËÂî]¼z÷òõû°àÁ îR¾ñùÆÔ¯gÙýûÌ›5{þ4i=ø]˜¢iuk×`;F5af¨mhrç¨Þ˜r *©¨*θã¸J¬åÈjnˆç ‹®„騣ë:¼¾ÐŽ/.º£è;ÁòbD=öj,>图qì»4ýøk@ÖšE ðah°ù†—ú-¸‰+®B /ÌPÃæ:\ëCCŒ«:³Ó E#ìð\/FófLÏÆõp„OGrxìÑGü‚œbH"°‚ ”¤Pq}Ð ¼-Ñ(}{pX+±’Ye7d–-gŸÖ PÏUER[4U[T»ý–Õp_å1ÖY…´UÝ\UÛµIov“rÞ*!5ß —ÝwS=xÚ†î®`l&/ÎT7>ùȵ/âZU—Ý f¦ƒi¨YÔAà%öÊ{)Í·Ë‘ûåô߃PÞî¡4—`MY#—aL8æogvÂaú 6Wbqåyn XF9~´Ø¤µ Yߦ£{v¨±K(Tª­µ¨Ô^ܶÛtdžìún;çtwæ9mD\* ;TT_v224_html_docs/images/glass/blue/menu_item_body.gif000700 000765 000765 00000006426 11222361074 022606 0ustar00abwabw000000 000000 GIF89a´dæŸËÝ£Ïá¢Îß ÌÝ¥Ñã©Õç¡ÌÞ§Óå¨Ôæ©Ôæ£Îà­Ùë›ÇÙ›ÇØ›Æ×ÇÇÇ›±¹›ÄÔ™Å×›ÂÑ›ÅÖ›¿ÎšÀÐµÆÆÆÆ”»Ë›ÂÒšÂÑšÁÑŒ´ÃŽµÆ™ÀеŴĕ½Ì–½Í˜¾Ï¶Æ”¼Ì–½Î“»Ë—¾Ï‘¸È’ºÊ‘¹È‘·Ç˜¿Ï·Æ›ÃÓ’¹É‹³Ã‹³Â‹²Á‹®¼‹¬¹‰±Á‹Ÿ¦³³³‹°¾‹±À¤Ðâ¦Òã¡Íß§ÒäÈÚžÊÜ«×éÉÛªÖèœÈÙ¬Øé­Øê¥ÐâÜÜÜŸÊÜ«Öè!ù,´dÿ€70ƒ0†‡†Š‹Ž‘’“‘–—.™™$œœ)ŸŸ'¢¢#¥¥"¨¨&««®¯¯(²²+µµ1¸1,»»*¾¾-ÁÁ/ÄÄ%ÇÇÊËÌÎÏ ÑÒ!ÔÕר2234;:568ãää9 é GìíìFðñFBôõK÷øù÷Düýÿÿˆ `ÁþX¸°‡C‡"FDB±bE1ظQGB†ôA’¤“'¨T  eK%0cÊ B³æ›8èÜY¤§O 8 aBI’*Uú:wîäÅ«gOŸÕ~þHÐ ‚„ þxQ"‹h3jäà#H‘ÿJšDi`%K—dêURÓ&Λ;yúì T(Q£H—.mªnÔwRçQbõ*V"Z·rõú¬Ø±dÍžE{Q-Û¶áÆ•K·®]¼y÷ÆìKó/àÀ@:´èQÅ‹¦{ YêdÊ•ó]Ƭ•kÎ`|&ÛC4éÒO»U-×Gk»`ËžMÛöܹuî8SáŽG–L5¹òË™C÷,–ºõëH¨Åƒv©ÁÕÝw¯á5L´azº±Þa¿¹—cO7ßqöá³\~›yÝt¡™`€¦±µ¬Ñžx 6ø nNè[bîa8œ†‘qØá6¢A#öW¢D' H ÿGܵˆÒ‹ ÆXžmªÇ…8§c|Pm8Ù@â'ä@û%DâCÿ]§¤ŠŠt ‹ º´ _SþUå`6¶gá–Äáe}? ~"òÇ&¸&G+ºédJq¾$e_3Vã•7Zx!|}þYU‡‚4äA†6täDЦÈh›#=êÚJ0Ž'#•4ZiX¦{rÊ£q_*æ £vf¦‘h&ª¦ª±ºZIÂ¥¬uæT+ž˜ê™£®òõØ+¨¿ŠJf¡ÃzêhÇfÇ&“,2 §³rNê—ÓþTm…×6Ö©¶€r‹ˆßY*hÅ"™ª¹«¢ë¨ºOF´”Òj©­ìÑ«%¶]âû©ÿ}¡jÖ/©áš0ªå®Uð[Ï•0»’2ü®´S{«µÛ»«<>ê›° –¸“KÚ¢ÉÜ*¢¼°l³ÂÛ²¼/K¬Ÿ3Oµ-ÆÝjÜ•¿\–À!x.ÉC›\ô]íª\›Ã‚¹q–OS•Åô€™1¡XïìñÖ ÿŒ,jB/+ö«d§Œt´·-½[Ól's¶¼æKõ¾c^ͱÝZWg¬Þ ¶ßÞ­øÑ{%ÍrÚL¯­)Ԍӯ,„·C`¬àw¶ê¡PmAŒÙ¹WDâÑx®£á¸˜GÀÚq®Y¹sWO˜,âJˆ;j!ãÒÆÚà³ÎxÂóÍñ}7ÜÇ '3À©ïW¼àõ>¸Êß<Ól¯xÛþv7T©Ùi+‹ÛâñÄx £›nd¯[ÙndöÐ{cOß\›9OùÒ¯Ýt\ÛW×^µÈ}=Õ’;ºÏ×ùÖÎd—{Üá‡2«%þk³ÿwͲ&*©íu'÷;êÿžú™ëÞèÿ»Ÿ<ëz7vÏ[ûr°«:äÞxÍÓLp¬§]ëµf¹&Oýv˜?œ×sjÑå½\œ_>ñ“ÖqËçêø˜KÝÌy®ºÑçmú¤«=óß|Çm¹k¹îe/<¬=áHã8õ¥Ö½ÛyvÈÏ|ä„÷‰ïÝ?ï|ï‹·tç[ÿyßGžæë%½„«_îµk¾¡?‡rÐ ~=Ûüèµo«¤‘©zå³þïü <ìŸý~Ú[Þö˜wnç§n_‡b%tû'p”wuGvcI†||çsÉt€‡€Î¦€¯Vy ØfÅÙÇyÌ÷x2'x±7zýWzÿ'ÇGɇ~¨~È~Ð|ÒgrÔÇfÆ÷ÿ€,Œ·}H\úw“— iÖg~¹ç‚OGùgð~'8~8x„¸Giö§m0Ø„2Hv£Uƒg7nˆz;ø»‡iÝ'vß7ƒ]¸Ó‡va^8h¸„Yx€[|k&6è†*¨ƒ‚†m=‚®„Oè~ )ˆdn†}rˆfwhø|\ø`v7||¨ˆ8†¨}‚x†ÎG‚üwˆþ·9¸ˆŠ·‰ øˆív‡¢Gr§FX~UXJX€P§…Ø5‰Œæ…†wƒy‡šˆœ¨Šë—‹xH‰¯X„ÅG…˜„èw·h‡ÆØŠÑdž{†}hŠq(Œ©øqž8‚ 8„‡sˆ¤ÈŒg…µL( F4h_ˆtÙ˜‰Øush‹ë„N(yP(Š(XŽ²ØŒèøŒüúÈŠD犼h‰Øˆ‰Çs¨X†Þ‰ŸŽýH„ä‹J7‹-H÷ƒ×kǸ‹ðØ‹—è€ÚŒö船Š{;TT_v224_html_docs/images/glass/blue/menu_item_foot.gif000700 000765 000765 00000007605 11222361074 022620 0ustar00abwabw000000 000000 GIF89a´d÷ ÌÝ¡ÌÞ¥Ñã¨ÔæŸËÝ©Ôæ©Õç£Ïá¢Îß§Óå£Îà­Ùë›ÇÙ›¿Î›±¹›Æ×›ÅÖ›ÂÑ›ÇØ›ÄÔ™Å×ÇÇÇšÀЕÀҵƺ̔»ËÆÆÆ™ÄÖ›ÂÒšÂјÄÕ‰µÇ–ÁÓ´ÄšÁÑ–ÂÔ—ÃÕ™Àеʼn´ÆŽµÆ‰³Æˆ³ÅŒ´Ã•ÁÓÈÈÈ–½Í¶ÆŽºË˜¾Ï·Æ•½Ì’¾Ï–½Î”ÀÒ—¾ÏŠµÇŠ¶È»Í’ºÊ“»Ë»Í¸Ê˜¿Ï‘¹È‘·Ç‘¸ÈŒ¸É‹·É‘½Ï¹Ë“¿Ñ“¾Ð”¼Ì’¹É›ÃӼβåúèèèààà‡³Å¬Ýñ‹³ÃÙÙÙ¦Ò䇯ÀÚÚÚ‹³ÂÉÉÉ‹®¼‰±Á¦Ö釫º¬ØêÛÛÛ‡œ¥ŸÌßšÇÙËËËÔÔÔÕÕÕ‹Ÿ¦‡³Ä³³³‡²ÃÌÌÌÑÑÑ ÏዲÁÏÏÏ‹¬¹‡±Á‹±À›ÈÚ‡­½‹°¾¤Ðâ¦Òã¡Íß§ÒäÈÚÉÛªÖèœÈÙžÊÜ«×鬨魨êÜÜÜ¥ÐâŸÊÜ«Öè!ù,´dÿ·0ȤƒÁƒ=(\èa„Ç"Jœфŋ@2f”Á‘#Žmˆù¢dI(Q*Y¹RƒË—/{ȔɣfÍ%8—Ù¹sˆOŸB‚A”(Œ£G1(]Ê4…Ó§'¢JAµ*‹«X§LÁÒ&-oÌlK–, Ò.Ķ-Û?pãþñC·.¡»xóÞÝ÷¯¿ < páˆãY¼ØŽcÇ"GD¹rå:˜1ؼYgB‡¾Cšt€Ó§¨VM uëA°cËîC»¶žÛ¸óèÞͧ·o $<€0!B’+W^­Z·n寭kW¯õ¾~LØð€ÄŠãÿy Y²Ëè3kæ|à3hÑJ›F`5k×dëTÛ6îÛ»ñæ[oÀ GœqÈ-·\sj­Ý[ÒÍEÖ]‡ÝÚmÇwß'Þxä™wz—©Ç^{ŸÁŸ|ôÕg~ùí[´ý`€y H`pÃwœ‚ :—ÖƒJ7!…æu!†ÚqW‡à%ð!yvˆHb‰™èžŠòÝÑ¢}À(ãŒ4Ú¨Ž9êX`Éœ>¡„Ô%©ä…: ¥‡âQiå•‚¨W‡–)Â×å—/â7&l4öa&š:ò±æ?ºƒÏ9ç‘vâµdžzå”!šh &²·¥¡,Ò¦˜‹6ÿú(Ž‘Nêc‚nb:¤¦rÚ)!Ÿ6ªa£öYªd§ J¨g\¶ŠÚ«ŠÆZ¦ªÉ#¥¸©kœÐm:á¯Àâ)ì`{&Fêc^©¬ª…Šv¨«‰º¶(ÓþW퀶¶ié¶Dâm¿ ˜ž¢òɘŸ¦º.g«ºëljñ¾&m³Xëµ·Zz)œýþ[]§6ìa7vìd §Êp»£=ìâj°Ž)+µ´Zk`ÆûrÌ«‘ß,îÀ#wh®±è&¬®Ê±¼biˆÂ­ÌõæV3¾뛫ÎröÚ3È?‹LnÁC|òˆGgÉ.³¬2 ¯ÓòN쟽SÿVu¥W7رÖs¨_ÿ[2ˆE#›²Ù+£í°ÚÏF#ÔÓl±ÍlÒ­-ÖÝâý±!kØ7Éa›8Êe¯Wø{‡Ï—8Û3þ¶ÔS}³Õ“Û½³\¾êЛ žØŸ“MâÂIÞ2⣾¸Œ3ÃݺܯK® ¿³O·5æ]kÞß^žà¡z6éÛ^ü}m«^£ãºy¶ÏSåt›9ÁØïîùö ÿŽ4ŠÂ/-þËäKò¢v£åí¨yì ’ì²Æ³¼Qooãºçì§½*M„ øü祵ðxûIëÒǼõi z ¤Ýô’4¿ ‹wøó]zö×°ðuðtœ— Hš0g ¬\ÿ/ÇÂêÑo‚R"Z “EC¥½ ‡azÚ§¼Jjn |Sß7Äøù ‚¸“ î’C rƒ¢Ó`³ˆÀ(–oŠ«ã¡n.†Àº¯-ó¢íøÂ71¾ð~fÌß 3È¿ >q|n` x¦¸ù[vÜ"ᇤ=2)ŒOvÆA¦±kü´Þ¸H*ŽpŽƒ$3•Bé9°ˆ`ôšÿÆIAZx L›(§CFÞ«„ª¬+…¨ÂWV¨…¹ûcÓ…Fï.”7DdÌàx¾*¢R}ÁŒÝ0¹XL"Óˆ.¤åؘHÈr°i9t[5O™&lâL˜»j%\j÷ÀÛÉ2“õ## ™éÿIgªQ—Ñlã4KÇFðŠu\e<‰éJoZ(–ÖÃ'ϵÄÁ}Òœ‡¨ ºN9¶˜ïÔæB¹ÙP=Ö“”è)HÞ²‰ýËè(©ŸÔŠùrž·9É.Vò¤—¼g¹69N‹ú3—¥ èLAXS_:¡?„'·H:Ï~¢G\©[J΋:ÑeKí¥)=JǨŠtª=í¦IaiψUŸË¼`?—eH°òRŽBß5A »öI²Hjý)[QŠÉ·²”Ÿ/-çWÙV¼V §XŒ$O[RÁ^µ­YUf-]Š%¯ÆÔ®ÆkAùÈúu²þ¢¤üÀ™Lqö®«GÅ(hÓi¾¼ÿZó£¥íëNGšÖÊ®«áÌÞfaKWh¢3‘LSšÓ,&… ­ª1ŠÙàõµF-.@;ЦŽõ¦{Í­NµˆÚ¯YÛå@SxÐa¾´¡3èMŸ¹Óù1’CÝG•jVЕÎõ91MSMÛ–­ö°‘…­Zb§Ô°[E¬©å¼ì]7»×Ï&k*¥ýÜ;†˜žƒµ‰mMé's[¦@¦f¸ëí"—û¯4µ%‹í2j›2¸”mªi+o![ÍžÞ³£eMb.ûÍ_Nñ? -ÍC3j¹Š6k°a½ð$ó;ÇÙÞñ¶-ÝíŠóúâ/ÿþµÆ_­ptûYݵ&5gSK™à7ž¾ñ–[ÒgrÈu¢W½ÇðõvrÁÍö¥wýíG;Pƒ>Ñ¡—úî§F;¿òD9Ï o´Ëuº“ÝîfÇûŠMÎxz¥<㮞6Ç'?ëÇÜð3Ï|âóÎù½7Þ× '7à©÷ÁW¾ðu?¼êß=Û¬¯zë~w;t©Úqk‹ÝòqÅ|À£œv¤¯]éîdúð{kß^«¹Oýò¯Þ|œÛYçœ^¹ÿè}>ÝÒ;¼ß—×ýöÏl×{Þñ6Ë%ÿsóÿyÝ2'.Éî}g÷=ú7}çV w§—}úgt½×b¯~*z^xµ—n„‡}é§}5Çzurï{Çsó]Å'wK†{˜€§k­7_{ÒgnùV}Æ7w&˜|ê—›·gS;'ãGåW€0÷p“q¸–‚%§ƒîǃá³7zè)´F„^öo»· hqØ‚èƒH{kF‚’V…e·~ØX¿mÁÇ``¨o¶w|5Ø^‡T*¨„,ø|€0øtoHƒhƒxvg¨v߇‡â%|{(xx}ÇvkÉÿ†„üç{I|ˆˆN§ˆ/WØnE‰YÈLø€²'€18‚}X‚(‡GH‡Iˆ†“¨†•ȆP„RhzTÈnFøˆ¬‰ ¸…†Hdzx‰˜‰ŒqVh†9èŠÏG‰yh‰p†§8†¸xŒ8Hqv¨u°ØŒ²H~#V‹ç7v€ˆ‚»ø‰;ˆq](~_8‹Ý¸Sˆ~áfž8p’¸ŒÙxˆÛ„ë.¶èŽª¨‹‡u½Š.ŒÏ膋‡©ˆlòæèø„Üøhö7„ü¨8Ž ©…yŽNHŠ|x~¸‰¹¸ ¸‘ ømw"HzB¨‰ÆX†ÕX‡ÊXˆÐ§Xÿ6‘ çx‹ù ©’k˜“øH‘/YŒEH‚˜Œ„è7iFÙ’QÈŽûŽýh’ñ(”)ùy9Љ8Œ”‡$É”šg5 •Ì(•¹"^P2(†£†zâøÝ76¹–Àè\_aPpiŠ"‰Še)“M‰–OÉwQ¹—–Bn àƒ)?9‡v¹xKH”±$TàPà\ÐUàꈔ°žë™îùžïò)ŸGPŸõùø‰ŸD°ŸûYþéŸ: šJ  p Š º *Рº¡Qgp`sÐ`àÊ¡c°PðO;TT_v224_html_docs/images/glass/blue/menu_item_head.gif000700 000765 000765 00000006477 11222361074 022560 0ustar00abwabw000000 000000 GIF89a´dæ¡ÌÞ¢ÎߣÏáŸËÝ©Õç¨Ôæ§Óå©Ôæ¥Ñã ÌÝ£Îà­Ùë›ÇÙ›ÂÑ›±¹›Æ×›ÄÔ›ÇØ›¿Î›ÅÖ™Å×ÇÇÇ•ÀҺ̙ÄÖ˜ÄÕ‰³Æ‰µÇˆ³Å•ÁÓÈÈȉ´Æ–ÂÔ–ÁÓ—Ãջ͹ˌ¸É¸Ê“¿Ñ‹·É»Í”ÀÒŽºË’¾ÏŠ¶È‘½Ï“¾ÐŠµÇ¼Î²åúèèèàààÌÌÌÚÚÚ¬Ýñ‡³Å¦ÒäÙÙÙ¬Øê¦ÖéœÈÚŸÌßšÇÙ ÏᇯÀÔÔÔ‡±Á‡­½‡œ¥‡³ÄÑÑч²ÃÉÉÉÏÏχ«ºÕÕÕ¤Ðâ¦Òã¡Íß§ÒäÈÚÉÛªÖèœÈÙžÊÜ«×鬨魨êÜÜÜ¥ÐâŸÊÜ«Öè!ù,´dÿ€227@=‡ˆ‡‹Œ" ’“!•–˜™›œ*ŸŸ'¢¢/¥¥,¨¨.««1®1)±±#´´·¸¸+»»$¾¾&ÁÁ%ÄÄ(ÇÇ-ÊÊ0ÍÍÐÑÓÔÖ×ÙÚ88FHCADKEåå5G4332štiSË–…(ù±£ógÐ^G“.ýï4j³h°fkà5\'²i×þx[¯n¿Oz N\øpâÆ¥ O®b¨!Iïé’‘ "‰Ÿq&öÇœŠO%Œ†6ã•6j™P„íXQ…ê‰ä†(uXä‡4…ˆØš‹µùX“²˜ÅœZMYå‚xfi„9J(…=Z(¨HBjæKˆÖ¤fbJ6Æä›NJ:é‹•Æh§•™’uãžöé埡 $©„¦tªo1i_’l.é¦d±JJé\]ynºeCžNôeF¢;R±»­äa²i.ËèOÎ> k¤PÒJmW·bŠ­¦mÛš¯Ÿ~;›°ì JææŠn¢«*Öh»E½»b¼RÚš®÷êªgÿZ\v °`†0±›Z𙩧.«ÍºúìË)¯¥õ^Ë`¶ùòš1¿Þr .Àw¼—È‘|°ª'+Ì®ÊîB ¯Ë×9±½3㫚ÍÜâ¼q\óœ¡À?;2ªC›,³ #ݰÒ-C7-ÌOËÌÍSc\u[ýêü/m£Ž²×Aƒ=ÂE—²cI³§Ú/KŒÏ—¥-ÕûÒ3Ö;ã-.n{—Û7²=öºÇ™½Ú‡[¶¶â_QµÅËyy¿R~w]——Êw|w.öadMøÙ†ËzºÓ‹«þ¶ÔœÞ,ùÕèkùÇzw­9îBë®hï¡ÿ>zðÒ&N|êPÏzÿÍ®wY·ìaÖN®¡ÕÓ—îç(—­=Š—ÕðÕÆ¬Ï•\Àüܰ;_ó²ö¼žE¯L_ãœû?£e(¯"ð¼—¿¶í/WŽ#ŸxzµuðŒÛ¡I¨ÀCÑÿ*ý$xÄ:ÎÃZdâwZÇGú }™ä­XÈN¾ï“‰|à"¹ØH:>Œ‘4Þõø¿×½‡³›¢ú2ÇÉžÐ0Ø åü •6ÓQÐŽaLå$›x±V3vÈD£&×w,gîšZ\á(¹çÈyRKÜæ*5hI?2:”eVKsfQˆºŒ ;}éNìÜQ›â£d1mxOçåsL#,'ÝH¢ÁÅ‘—KCß©DþÑr b2×3NfJ4lÿåYØKšÒ ÙŒgB¹ÉÊzŸÊL#9èOжjšõsáK©O’¤f´›8õ¹É“¶1p…ã.YšQkn¦Áÿ”aZF«‰t©%$MxΜ¤S”Ô´_‹®ÉуÊt˜\EªW1©µ°Òr¬žD'@¥yQªVó~lŪ‚ð>q®J¥]ù‰×[êU¥êL«P‰Í¬¶AÄìê%[W®‰5wdMi.ù:ÕuÎÑ¥”mkLšY¹n–ä]A›W³îu¥¦m©U‡ŠÊ·n•¦ôä =¿ªXÏζ}µ½Ïm#ÔR¦V°’œé<+)Ü›:4§%(O' ÕŸö5·UìU‰ÚQ —º}´î±ËÔ^¥>µhi%ëÜ‚’×­¬ëa_ÎâÊ–±´u¬m!‹Öæ¶“mø5ïtšTØr±·k,ÿ;ZÜÒ÷À¨³,Báz^#ÖÁ5.€‘+`娤Ä0$»áß.X³Ã¥ëƒEáOxÀfnŠ ŠàÕ*Ø‰Þ ©ŒCüß“øÆ&ÎqwŒZûö6¿†±z¥HÒöšt»ðí®|zÚÝ>÷¾>V%m NœVÂk´ñ3qUErY·âåmQÜM2 ÐÌ¡bS±üTD¶9 E„óZÇûd:×´ºe¾î™iœæ#¯9É&í›Ã;h9—WÌuFôçej÷½}Æe¤-l`g˜Å¾-ìQ÷cÎθÈ6d‰EtV´É=Öpª1«ß 7¸¿±åˆedZ/wÉ·ö²“çÿŒéC§7Ñë]4¬›É]?{w¾¥Æõ©£Ëá»¶Õ f/š©eko9Дž¡™-Ï1kúœþ‘N¯ êÐÆWª“þk¥¿\èf÷Ù›Žv§çýé~V[Ô×ηZÕméû½®„6•žÝÏ:º¬N8ºõÍp~³[ºî8¼.Ø6ö‰¿{aS¯˜Û.yÄ>ñ’[¹àNù¢Žmë.ÇÙã—nw¦EÞP’ëÙ½/7ÂÏÍÈt㯲¨†²·Y=å‘RüæG9ÆU®äž ºãË:ȇ>ó‘×üèôNz¨)Å«w*ßÐ:þ¦ \úß驳.ë-ìȳßÚ¾Í17ÈÝP{ž<¸pÒÅ[¶eØ rÅ­Ï.ƒ;zmÛ˜ë^çá‰gá/žÌb2pø“Ð9™ Ž#6X¢%¡h¥ŠXfY$†!9 ’cJTf[9ŠX‰=f÷c•ÂÉO…³ Öe€vnˆ'{{Õ'”iòˆÝHƒr÷æhC 6ç¢6*£C’y ™!Rú§šbÚ&V]y(‹[ºXÓ‘_¦7£s¦~ˆªQh®jé”™Ò³)VÒš(r Ö™k’»–ªç©|>W”²¹¡Aê’œµé¥BÐ’ºä´¾V{ÿ¦Ÿ±z©;TjZ(§q"Ð…Íâ$ªYÑž«V“ê¦zm¥Ršø*·±z»¸Ëâ{ë¸:éjnžÿFjѤ [°¶¾!œ’¬ßÚ+³3úìýRl#ˆÀ² Žuk z°¼ÝÒ;+‘áÒ©ïÉŽ¦ )µ’Z{¶1»º-Í Û²²÷rYr¨<ê¯è p˪¶;¬ÁG;/²rõéÓÎ’‹òÄ?§ôºY¿ è»QÍìuÍ`×ËôÈ„«Ù=£í¡Õk <4ÁÙÊÜu')*½°ÈŠ’½3ßRÓX5[WìÖÞ1Ò+œåcë 1˜b¦ øÅB#¥qáFo>wÒußìiÎùþ²ÿ/cþMyàXgŒ9ëð‹ø±+%‹sÃN‹n2äüúÝëéa<øêE/÷ð_6L´;n{ÔÍO-mÅ@£Î¶ïn»KìõUÑ­½ÝÇ7m«òP3»ÏºKö«å.Ó¥>׮Þûòa¼Ù!o~Ù[ÄÊ%>­l "Z«¬w¸öÁî}²[÷èW¶ž­*ïø×6ÿmcÛy]ç÷¹Ð%pt¡évg>Á©îwÕ‹[ñC<n¯+|áò<Ø7æ,#!úL˜¹Ö¥P€ô!ü (?q ‘t¹{ £—:¹.‡a³'Å rï€V¬#G5ò©­†½›'¨ÃZÿp…±[Züð–k§ÏR–îˆ7bfÿâ©É‚&²‡Ôœ¢BÑ™Æ[j³Üäb@oÎgn2šͨ(J†®ævÿ¦ ¤.#úΉ¾m}%£JzÆ…z¯¡‘ä§¹K‰–¢8'FYRMÓ´ô§/ÝgLûéÎn®rŽ'ñXÎYž³–êüãGÇWU‘ÚЋ¬Ìê+¥ÉU„zu£`ŦXÙIÖô¬˜LkRQºÔS€²§ÍgTzJ¦Òªð¼)ùªS¦j°q= 2?¸M‹™5Ž$¨<ךRǮԚO}$)ƒ:Õ¡Î4‰W-)Aµ*L•Ø“q$-PqiZõ¦GU, ÝÔX¿6õ. «Géê@»å’Ü Z ÚWÀ<–¥>•í`IûP¢Ò±6ýßnaÕÖ¾²±µ%$i[Ùò]Ö›™EÿêbyëIÏòºuiŒ$ RËÞ³hÅê^Ù;M÷~¾‘5Ï:)[_óÞ½ùUíf™Û[ç~Ö©ÑïhÉ[à7ž7µš]nNÛëÛç‚6ÂÂïX‹kßãŽ4ÁÞ/wëÉÂ{ƪójy-|` «w»cñ"‹Z ÏvÄ!,1eNœWý®wÅÃ|m#Ãâ y†‡½pbµ Lþv׿<±\‡Kຠ™6DNn&Uœã$·¶yóñt)ìe›¯bÖë‘ËìÚ3/9ÍMþ1qƒìæ!Ù:FÆ1çtÜÕ,¿Xº1.íŒ+ùfüYÁVjƒ‡ãaZ͉®îiy™Ý_:ÑÊ„v«¡ÿ¬@6“¸Ï`þó‚Æ<çA›yÇ.&õd‹¸è6ÁNq«éùêBÇšÉ[ñž¡|[ìæ–ÊŸFraæ>æyÍO†(j§ìiq2–Ã~ï‡/ýìL¶¬5¦v8¡ ê^‹ú×x¶“‡-mN»ÚäV¶_”LK`KvÀ´®0£ýìè8ºÊò ³ïìluë¹Ë§¦ñ­m¬[€ÓyÞv®wºï=W„óYáüƵ¿!MfW/Û×ÍN§Á¡ÍnëN»Óã>i¹?~îwTØ'öu¥Œr“ZTÒØ¦ôƒ{MŠs9ßmÆxªû hŽïz«¡öî¨í-àŠ=áûºÆ‹®kAóšåJGwÁ}ðó§_<êÒKoÓýpƒœà"çúºcÞn£.ñÆ÷8Ä.ñ­7ýçl :Ø‘Ku¸“]îfo9Ú_¾v¯ËüäïNùͯÝßïÜ8=î6L5mÛ™‡»æ«ålsu®mKËßy‡º­3Îpd[{ås?{ÝÓ~÷®‡þ룗zéá­ò€ßƒÞ_ez©£mrw¿}ì§·½w"žû‰·¾ð¯?¼ïê÷à—ýöć«îgü¶ãö÷¦÷ó‡O÷âÛ}÷%ß´Û™|íúÝ—¾ñÁÏöÞ_ìÙ¯ýö‰©uÖ³ßðÖ76öi¿xÔ>ë.'XÞ&S•‡xû§x;TT_v224_html_docs/images/glass/blue/menu_warm_foot.gif000700 000765 000765 00000006162 11222361074 022625 0ustar00abwabw000000 000000 GIF89a´dæÂßêÃàìÁÝéÁÞêÉæò½Úæ½Ùå½×á½Õß½Ù佨ã½ÌѽÚåÇÇÇ™Å׫ÅϬÆÐ²Ì×´ÎØ´ÍØ•ÀÒ¬ÆÑ°ÊÕÐÐк̮ÈÓ°ÉÔµÎØ™ÄÖ˜ÄÕ‰µÇ•ÁÓ—ÃÕ‰³Æ–ÂÔˆ³Å‰´Æ³ÍØ–Áӻ͎ºË¸Ê”ÀÒ“¿Ñ’¾Ï±ÊÕ‹·ÉŠ¶È“¾Ð‘½Ï®ÈÒ¹ËÈÈȯÉÔŠµÇ­ÇÒ­ÆÑ±Ëֻ͌¸ÉµÏټβåúªÄÏààà¬Ýñßß߇³ÅÇåñËˡ²Ã³³³¦Î߉±ÁåååçççÑÑч³ÄªÃ·«º‡±ÁªÃ͇­½»Ýê½ÞëÌÌ̇œ¥šÇÙªÂÌ ÏáÅãðÉÉÉ›ÈÚÏÏÏÙÙÙ¡ÊÚ‡¯Àª¿ÈªÁʪÄΦÖ骷¼ŸÌßæææÅâîÅáí¿Üè¾ÛæÇäðÉåñèèèÂßëÄàìÄáíÀÜèÀÝéÈäð¾ÛçÈåñÆãï!ù,´dÿ€I<ƒ<†‡†Š‹Œ‹‘%”•—˜™š9œœ-ŸŸ¢£¤¦§§5ªª­®®2±±7´´8··º»¼¾¿ÀÁÄÅÆÇÅ??cNQXbaeÓÔÔGÙmÜÝÜvàáâátåæçålêëwíîïðhòòiõõqøùúpüýý¾H €ƒ(T( aÃ9#J”C±¢E53ÖÙȱãÆ5 C(ÀÀ@,pòeËØ´yó6®&8t8é¬c¯§»yôì¥ÑG4Ž¿£,ˆ0áÂJœj±ªœŒ=j )’¤I”*]Š…©mÛÌo6ÇåD·SÏ·@ÿÑZ4ßQI,eÚô)Ô¨S©Z­ˆ£Ö­\׌,y2åJ±/cf;‹6-¹µæÚ²yë3îܺvïòË»×`ß§Qž8˜ba5‡=&VìµqXÈ,ÉʤlYæÌm9÷ô,4>Ñ£“–Ø€ßÔ«#¶v]8vÇÙ‹¿:Æ[²Ù³½/ÿÖ,<ÐÏÆ‘Ã!½¼ùsÀÑçL¿ZÝúÇÄÙm?Æ­{2ïðvü–Npåýt^qé!Ç^iî¡_tó½fß}\åÖ~õ÷ÝL( y¶Cœ=Æ¥ rí¶tñEXŸ}ØÕv!wnhHY ¨!ŽxO‚¢-¸Wƒ+>¸š‹XMXGÿŒŒÍÈÿ…§#ˆ=H"w ¹‘ ’YÁˆŸŒÛ=éÝ9~Èc>ÒšzZò…Ð{Å'ßtNȤv·ñwf”½M¹fym–'Š ªØe-âù¢u{êG#”à(èN!ŠhåožÐropù£:š¤žc6Y¦Ÿe¡i©š˜fZ(–H!:¤¢£JUjkyŠY!™}føg¥RÂÊS•ó ×i¶n‰+‹»Ö+¤©ò‰áXÃrøêxƒ 7ë²Y6+§SE’z¤©aRû«ªÁbÛ* –]z,››ºYסŸ¦8§ƒæ~‰®a¨®kí¤ÙÒ´-fTÒ›,‚àÖšo¢û–«ë¹¼>[ÿ¤N²º±ë–¬õê©R“»èÄþV|ª¯]±{­K”j[,·±"Ô• ã%®iŸ¬Z£*§{qµ’šù.Çñz¼È ã|ïÈzékr®?GkÕ´C \´Æþ!–¼Û,ÃO3ûð­=Sm'˜³ ’…« {´ÌÓÙ/ÿÝa!3(É,rðˆ–¬!!£G9ª®Žý› §¨Ç Zqñ[\ q—@Aª“8Ô¤«ÅOÒ2”{L^.—w»æqñy« ¡ô\ Á‹tò:Æ„2m9Ê!⤈ZD¥Þ>hÃPerzÃc1)xÌ ð–63wéL_v˜D'"¡x½žQ{„gMäÙÆ@îŽLœæ‰ÙOF°–íf$¿ùÇá44—Œ£BÅKEÊÒŸ¤"7•‰E]R’—H£úÒ©¾n…W%¥Z“zÊ¥z°©Ñä©!…¹O©–‘ªx)VÙRQó´õ¯oÝi\{êÒŽ®s–U)$qYÒyž´ž*ýåWGXY±ÚÑ“ìÌì;%ÊY¤zv« Å¨hYJÚ°õ´ØLmbѺØs€³¯\ÍidzNŸ¦Ó²0½+y«WÆj¸±=B¿¸Q«™6–dªLW›Vç®Õ¢}&9;ÙÁÎ5‘—-+Q5+PµØ”yd/`ñi^ã¶®‡U.]Õ\ß6ön ­WiëDÛæš‘¢jÚ[à<—­~•ïÿpÉûTÂÒ¹výá~áÕÚ½¾ºñµ'4é[Ý^×£ÙEìrùëMïòÂÁukœ¤ VëÞ»¨ÅìnY„Np6ÕœçD·¾¹óó„©ìi#›·¢Öí¡KíÞS/:Õþ3íêAÚB†Æ3÷ôÜÙL¿YÂq.ÿùjZÉZVl“äe([ÕÉ®ðyù™á:ÒÒÄv­±ƒ¬DV“¹× þõ’F=ëa›zÏn&÷t ¹ìŸ6ÉÏNs»iúîbǛћó®!}_ ç—ÒßFt­áê^æzÕ†*z'ím‘2—ËN~ñ—¯ýðl·´u¦xH! î~‹û߸¸£.qn¼â$W¸oMO€KwÈô®2³}íìX»Ò2Ãoíp•ëºÓç¦ó½í¬_ Ózæ¶®yÊo>[¤óZé<Ç·Ï¡Mjw/Üß O©Ñ!Îr O¼Û#?kÉ¿~ò°wUàV'ø…%v³ZUÚ§ö“|Qªs:ç­Æzº{lÿ®ï{³áöð¸m.äª>é;¼Ö ¯oaó›íŠGyÑý÷Ç_=òLqÓþt¡ƒèbçüÊãÞrÃ.òÎN÷:Ô‡.õÍ7þï¬ <èLyØ“^ö¦o;êß¾zÏËýì/OûÝ/Þã.ïÝ@}î8\µmß¹‡¼îëånƒõ®qkË繇¼½³Ît„[|í³?}íSû·ÿóã—|ùa®ö ß„æŸe|¹#nv—¿~ôçguù7uíW|ïw|þ'T¾3W@[Ö|÷c÷}Ž—€­‡_ÿg~,±[`T—æ|ÝÇwÑ7v'WÕ‡|HBÐAðl€wÈ}è}ú7ÏoخǀègP@àd€S è|™çv•‚”e`ä'rì£Bp^à>àA\À^ø…^Øb8†fx†"†jhl؆ð†pHr8‡t¨vh‡+‡y|ȇ,ð‡‚(ˆ=Pˆ= ˆˆˆ'°ˆ‹ˆŽøˆˆ’(‰3P‰•˜˜ˆ‰;°‰›èžè‰/Š¡h¤HŠpЍHª¸Š!Њ®8°‹C0M`PRðV@¼È‹EÀ@À;TT_v224_html_docs/images/glass/blue/menu_warm_head.gif000700 000765 000765 00000006012 11222361074 022551 0ustar00abwabw000000 000000 GIF89a´dæÂßêÃàìÁÝéÁÞêÉæò½Úæ½Úå½Ùä½ÌѽÙ彨ã½Õß½×á™Å×ÇÇÇ•ÀҺ̙ÄÖ˜ÄÕ•ÁÓ–ÁÓˆ³Å–ÂÔ—ÃÕ‰´Æ‰³Æ‰µÇÈÈȻ͒¾Ï»Í¹ËŠµÇ¸Ê“¿Ñ“¾ÐŒ¸É”ÀÒŽºË‹·É‘½ÏŠ¶È¼Î²åúàààßß߇³ÅæææÌÌ̬Ýñ‡²Ã‡¯ÀÉÉɇœ¥‡­½ÑÑѽÞëœÈÚÅãðŸÌ߇«º ÏᇳÄÙÙÙ»Ýê¡ÊÚ¦Î߇±ÁåååšÇÙ¦ÖéÇåñÐÐÐÏÏÏÅâîÅáí¿Üè¾ÛæÇäðÉåñèèèÂßëÄàìÀÜèÀÝéÄáíÈäð¾ÛçÈåñÆãï!ù,´dÿ€++1=9‡ˆ‡‹Œ’“•–˜™›œ%ŸŸ"¢¢#¥¥¨¨(««*®*±±´´·¸¸&»»¾¾!ÁÁ$ÄÄ'ÇÇ)ÊÊ ÍÍÐÑÓÔÖ×ÙÚ..>2C36<5åå07,PP+FB@:OòóòXö÷ø÷VûüýûNfH° A%.Y¸°ŠÃ‡¥Hœ81€E‹Q2jÔ cÇ A 9’ŠÉ“(§¨\É’‰Ë—WbÊœ³‰Í› Hp@ƒÖ %ÒÉ(1‚8!@€½|Píù›j% @ƒX &TÈp įU(нˆqãFC Y¥[–pÿ§¼„I³îMœ:yú*´ï ,và`ÚÔi½¨ù¨ú³ 0«ã­JºzûP,E²ÌžE«v-[·o㮜벮ݻMrîìù3h_¡-’9BØðaÄúócìÄqVÈ’)W¶,³fŽœÕ²:¥h•¤™˜¦‰:u^Ö|_¯{A£á†qãÓ½›±o¬À» wH¼8ÙãÑè¼¼ùÉçÐIOŸY]µÞÖÚ å€wµÙ&^näñvÞA[·^{RŸ|ô}føÉ¥ß~5¡æv®8àw¶=q TäUeÞ‚Z5¨ÞƒíIx…ÊYh_†ÑqØá]î¢v#Þ‰)ªh‹-&ä ÿpʨ!Õw!ŽrØßu>¸NL•x"E*ˆdé1´^X1¾7arQÚØ•séxÅ•«e©%—à9õe˜+"YfC0ç¤YPŠä&hpÒe¥‡Xx']HdŠbú颙Z6èfUHÒ…â—£Žtþ—ˆæùÔ¤ öÉ⟓1™æEðEQ¨gŸN)j•û• ¢–Pàé%«ºUúꥀÊ*¨š3²ih®7î'©ŒÖé(ª$Jz ŸGŽ ë™M2û¤³¸¶ís£.Êc£§™ê°ÛRêê‚ßf:–¸„’+å¹¢¥Ûkµ¦þøš°ÚŠÇíU–*ù¢²šâËiZmBû¦´Šþ»®ÿµíünÁ¸ܘ·ÈÆJY¸´®Ùi#JqiÔ^0°o«Ý&̦ ß[r³'GlîÄèò:¯vb+¤žÄ*f,½!ƒ;kY¼æìn-àÆ‰#æqo “îüÿW§óõ|(SM}ðm¿þvÑ?Ïž‹lsd ë®3꽫~èú‚sÝi ?ÙÉï6ɳÝòÄÖ4{•wCŸÏǺ pÄ3\ü÷9Å…Î~Ã_Þž9þEÐSêsNõ¤Ó² kÜë ÷ê¾û-I4áÙü—2Âepî#`ì`8»ù%*Kc øœVBó¥N‚i³ÜÊX˜9ëh f1Dž•':%6‰»Óa|ôõ?²ÏzÄÞÇA-Îðƒ5 á IF'öŠ•[Û©x=+ïpª2bíx»Ç4l1Û}WÆûLQN°Ëh¢#N%‰¸;$ Áâqÿzf´`ûèÂ!n¯ˆÜ¢»˜É%:“b´{Ê :ï3å–²(Èr­üâ+ÝÓÉEò0…Ž\!$s)ÉSR’~p™4IÇýÙñ„é£ ðD‰Æ –²™»De%yÉBþ†šäƒ^ß>ÙH“\Žiô£ ØÆ^ªò—¬4¤+IÌXJ¯¡Rf ÕøÇ 2•oä"™'ÂÒ¥³‰Ñ›%2ÝùÈÊó…ά'B£ò=i殚9¼¦'Q¨M¶ä–üa¦öÂùLK.ÆœèAgDÔy>’JQ UÜ8ƒÅËB¥£á&?#¤HY2’–ÉÜã2…¸Ó®¹‘£4ô¨L‡ÑuÚTÜÿ„§7 :ÏIjtœ¾,'0õ)ÔMöS¤Æd'R)ŠÓ>êt¥<'4G†Îñ¡uŒèQ'P¥Zô­X”«KûI²6t|3­jM³yS¿æ4{m)9_:ÖsîÓ¬D-¦QYÒZžô‚[½¨.ã*Ù°R6Ÿ–-+Ha‰Öͪ•¯ï\ê7áêT{&t• õâaÁhM½r¶±Y•-W1ÊүηuÕí]›W«2«¶-)‡;ÚÚú41Q ên‡™YJ´³I î_!ËÆƒ‚õžbEmL/»Ú³úöµàe«cÝJ^@ÂË´„…)ƒØ‹×Þ:w‚Àî(qÉTÚöô¼·Ågnƒ¹Ý¡nj¤Ï œÿ€»9]Ñ6õÀÇUpr¼\ª6w±†îgœÒGÖ¸ƒ-Oe׫Úþ†ô½W•ðˆ)LàٞؼNï‚ ÛaöÐô‰1®à„µZaÀ–÷¾è=íŽSÛ`Ì>8­AÞæ…ka v²ù]ñ~[Ì\ÿ‚8Š" JeI+—6ÉYVï–›ÜÞî¶öŸkí«x»Fûr,Á:Þ0ó׿'»6Ê&³tkLÝ _¿*VsA>êbÖÂ8ÂBž1‘ ]å#ÏJÖ3“{Œ&ÅÒR–4•lçîA5šÚåtùb šÄdV©¥ï|jºJ•¿]~ñÁìêü ºÄ6>2­š]ò¹ÑîÝu{ÿ­¡_ÇÚÄÂ65±Qmì"Ûͬæu¤_Mc`ÚÌ(Ær¢—Ìb6_ÛÏp†mEé\Pzâ8ÅÿÐêcOßОåö¤½]éh˰ÖȽ5—=ìåO·zÛ¾†õŽ‚]êOÛÖ©>v®­lP†wÊã­³A/ p ÜÜOö——ðf+|N²ö÷Sðˆ[;䨮8@c›ñv{õÝ⎷–çk‚ëzä—ïœé«qwsœåw¹CaŽîïXÔ5ïjFqŽh+:I¯÷‡ ®íPë{ÔõÝø°±Km9JÜçúÌ×Mt›Oýèd‡xµ—Žv‘sä^Ox·ŸÍp±K;î-Ÿ;bësÿµÇ™æì–zq©ŽæqkºÜªþñ½Ah½ï›ïßžõßÇSl³¿œðMßk|åŒñÄ—´á®º‘®>F3½¨é=âÛ®xÔ3Ói&÷š#ool<ï&ßûÂ3¯rÛv<ÏçýÖ'ÿûÊÿòÃïwÃWø¤ ž·?¿{ÐIuÓWÃð^½îyžõN/ß÷]w>‹v£óe·ëÙµ^pæ§?ß–{ÑowøËÝótGÙgx§~c}¤æwW}ȧtƒ'€i§}k×Vñ”€î·yòò÷yhw¸}³WíÇï—€h~õ‡~ˆϧn·xýg‚Ö‡‚Ø8gó%‚û÷v%ˆ"ñ§\ó§‚È‚ Èv<ƒ¶7ƒ@¨BÈDˆƒF¨ƒC—„µg]v|™–|C¸j2wxHZH‚Ø„'¸…8…`Hb8‚>X†`Òyh˜‚^hxêæ†ì׃[;TT_v224_html_docs/images/glass/blue/osi.gif000700 000765 000765 00000005033 11222361074 020372 0ustar00abwabw000000 000000 GIF89aF2÷ºººççç2…Aåéæììì‚‚‚ÞÞÞ‹¥ZZZMMMVVVB°V222(l5•­šIqQ³¡………©¼­CmKyyy­­­´´´)Y2@«T‰£Ž^dïðï5b>DDD555nnnÚÚÚÕÕÕ!Y,~~~¶Æ¹ÝâÞêìëfff"\-ÄÑÇààà8•IÂÂÂÏØÐHHH5Eçêè$$$ U*1?@«S²²²!!!»È½ŠŠŠ===§ºªQQQmr6‘GÜÜÜ^^^:fB)))ÎÎÎ%d1ÆÆÆ@@@:™Jb…i ?¨RV{]-x;€œ†:::|™‚,u:'h3RRR¢¶¥ccc3ˆB©©©èëé*p7@¨R;M™™™¯À²³Ã¶$a0S)ÑÑÑ,]5=¢O‘‘‘ÌÌÌÊÊÊÄÄÄqqqˆˆˆëïëqw¨•*r8ÙáÛGpO*^4ËÖÍÉÔ˽ÊÀ```¥¥¥sss:›L®¿±>kG!X+>¦Q>¥Qïñððòñ=£P<žM888ÔÝÖ+t9/}>NuVLtTw•}nŽt¥¸¨$a/SzZ3‰C1‚@j‹q-[6#V,.]8'X1&W/õõõïïïúúúóóóîîîB¯UA¬TB®UA­UB¯VA­TiiiA®UèèèëëëÖÖÖhhh?§R×××ÙÙÙ---åå寯¯žžžãããØØØÓÓÓ®®®B­Uêêêãçäääätttââ⪪ªÒÒÒóõóééé§§§íîí¦¹©ÒÜÔwwwÑÚÓéíê¾¾¾0>‘©–„Ÿ‰ãè䑪–3`;7“H%X/NwV.`7÷ø÷˜¯œgˆlûüû4ŠC´Ä·›„*[3x—~ÈÒÊõ÷õîïîh‰nâèã#_/¡¡¡“ª—[€bØßÙA®V¤¸§—¯œ¹Ç»áæâòóò@jIêëêz—€r’xt’yt”zkkk.{<°Â³ÇÒÉöööøøøíííýýýñññüüüùùùôôô÷÷÷òòòûûûððð@ªS!ù,F2ÿí H° AƒÐæ¸Y§2D-ŠgÚÁ‹3jÄ8@…G¦@¢–C[¼Mr4ׯ—ñÉœI³¦M™ÚÊUòvH Z :}úЧ>@ ñIWâ¦Ó§P£Î †h$?¡>ÙøÇµ+× ŸH z"¦ ©hÓÚŒ€á Nž¼Ê• j‹#DT¨uÚ¯¯ß¿€ ¨¹ˆåvJõÆR‰À#KžÜœ˜G¡2$ÞÜUT†)׿PMÚ/kBmåÌÚS†-Ø”žY …B¤V³nêÈÚÀÿJñHÔîãÿ:±&x?MУKŸ®)˜¥G vgØ®{3©BxQÿO¾¼t)GšhÞL«Ó¿T©lÀå *ÏŒxæÉçÛÏ¿¿ÿnË`Êf6€¢F*©¤çÈ‘¢ryR%L:)2VbùO($¢§¨¦ªj¥—"¦)§ªîÿꕈ‘jj¬¸ªÊ§ŸˆÚÈ1±nPÈŸs)êÈ<¹&;éež)pê0—Ä™Ò(é<Üvëí·K69—(‚ŒÎ·ÜbÂM¨þã€5èÆ+ï¼ÜÎXãµÔÌp :Þ& yéj‘ŒÐ/&'¬ðÂhÈá\b‘Bà ¬Ç3G° 'bÀp8 ‡,òÈ!'ÓAj2@Í%. ‚d·™([,A2Éúä¬óÎ<ë³Nzë!Êè|Î28K—}zôìôÓPïìY.9;·Á.ÄBÀAÔ`‡ópe`êU't`ËÎæÌ ±g3#Æb× õqlJÐYÚÿ@…qX¡UY¢IˆUžL‹+GÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞÐ+<8/2* Fíîïðñòóôõö÷øùúûüýþÿΡBB ˜¡À 'R ™H±¢Å‹3jÜȱ£Ç CŠI²¤É“Sœ€Â…‚8€p‰ ::Ð(³§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§PyÒè c " 8p€& &°Ð`Á‚ hÓª]˶­Û·pÿãÊK·®Ý»xóêÝk×DY ,&(°B 6@Ã@ #D,˜< ²å˘3kÞ̹³çÏ C‹Mº´éÓ¨GO^ b„‡b 8°A… $Hp#B ˆN¼¸ñãÈ“+_μ¹óçУKŸN½:uà5"ÜØûöƒp <‚óÒ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ?ÿùÙåÞw%$a`†Þx 6èàƒF(á„Vhá…f¨á†v衇 €`&Q‚( ¢Š%¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã0®¨"ŠDiä‘H&©äÝ’L6éä“PF)å”TViå•XJ±Ä–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›m6!çœtÖiçxæ©çž|öé矀*è „j(¡N$ªè¢Œ6êè£F*餔Vj饘fªé¦œvº) †*ꨤ–jꩨ¦ªêª¬¶êê«°Æ*ë¬´Ê Å­¸æªë®¼öêë¯À+ì°Äkì±È&«ì²É>áì³ÐF+í´ÔVkíµØf«í¶Üvëí·à†+.¸Q”kî¹è¦«îºì¶ëî»ðÆ+ï¼ôÖkï½øæ{o ;TT_v224_html_docs/images/glass/blue/right.gif000700 000765 000765 00000000136 11222361074 020714 0ustar00abwabw000000 000000 GIF89a ¢ŽÈ–ÔUx¦êÝ¢å©îªð!ù, #(Tc'Ê)sêcÛÛZ‡”ø‘Õâe(§Ž­{­É¢v|$;TT_v224_html_docs/images/glass/blue/show_menu.gif000700 000765 000765 00000000714 11222361074 021605 0ustar00abwabw000000 000000 GIF89a(ÕÙÙÙåååÉÉÉÊÊÊËËËÚÚÚòòò×××ÔÔÔÞÞÞáááèèèÑÑÑÓÓÓØØØÛÛÛìììçççÏÏÏíííêêêÍÍÍÈÈÈøøøõõõúúúùùùÆÆÆöööÇÇÇ÷÷÷ÌÌÌûûû!ù,(é@pH,ȤrÉl:ŸÐ¨rP\’v+x$/ ÄB˜)W,I¤Ì.Ððx¡ÍŽHÐú'Ž˜Ðÿ€lq‰Œ‰”Œ‘•‘‹›‰“›–‰§Ÿ¡§Ÿ²Ÿ§Œ†®§£¥¶—ª¬žÄÇÈÄÈÏÇÌÐÌÏ Úàáá ÏÙéÆéïéÖÈðïÇð ìÁ“g­žÀt0pw°¡Ã‡#J„È¡¢Å‹3jÜȱ£Ç1ˆI²¤É“(I;TT_v224_html_docs/images/glass/blue/show_menu_roll.gif000700 000765 000765 00000000714 11222361074 022635 0ustar00abwabw000000 000000 GIF89a(ÕŸŸŸ¹¹¹———   ÒÒÒºººììì···®®®ÓÓÓ¸¸¸ÅÅÅ£££¢¢¢«««¡¡¡ÖÖÖááášššžžžÛÛÛóóóÇÇÇÕÕÕ­­­¯¯¯›››ààà”””–––øøøõõõùùùúúúööö•••÷÷÷ûûû!ù,(éÀ’pH,ȤrÉl:ŸÐ¨‚±ˆ’v+($E D*?:Æ¥Ì.Ððx Í¾0Ð: ž‰Ðÿ€lq! ‰#Œ‰ ”Œ‘•#$‘ ›#‰“¢#— ¢ž‘¡¨ŸµŸ¨#µ²• ¦¹ª ®žÈ‹•È ¹ Í™›"Í”×ÝÞÞ”Ö$æ æíæéñòîí éî õÜÁ“—Ž^@s8`w°¡Ã‡#J„(¢¢Å‹3jÜȱ£Ç?ˆI²¤É“(I;TT_v224_html_docs/images/glass/blue/tab_cold.gif000700 000765 000765 00000003522 11222361074 021350 0ustar00abwabw000000 000000 GIF89a (÷ÀÀÀ×××\¨\¥Z¡WT–)IKˆ;W]¨S•VœI„^¨Y ]©]§Z¢[¤]¦\¦^©[£I…ïïïR’T—\¤L‰[¢éééU˜VšU™U—V™+JQÍÐÑðððWžêêêY¡YYŸXŸXœ[¥NŒ8d7a,N^§ÑÑÑW›OŽ[¡N‹X \§Wœ1VN‰T”îîîXžÊÊÊ6`æææ¸¸¸Z£'D*MfØÙÚÐÒÓM‡···U–Z ZŸÜÝÝ*K½ÂÅßßàÒÓÔAr1Wž¨±-PÜÜÝ=nµ»ÀDwW™DyL…ÍÍÍ4\8aT˜GS–ÇÊÍFzOŒ‡‡‡M‹ÒÒÒ/R6^èèèU•P¤¤¤QŽ`xˆ=Zq*LG}¢¦©X¼¼¼¯¯¯˜¤­ÓÓÓO‰}Ž›yyy*IBtV›ÅÅÅJ‚3Y8b4Z>l+Këëë‹™¤Cu/PAoO‹O_vˆ«««µµµN-Q,KR“LŠŒš¥K‚}Žš$BW`vˆS’¾¾¾»»»7`=m„‘›Q“·½ÂV˜Œ™¥Ni}ÇÇÇÔÔÔÎÎÎÛÛÛŽŽŽÜÜÜäääàààÞÞÞÝÝÝâââáááßßßóóóòòòñññ!ù, (ÿT   Áƒ*\Ȱ¡Ã‡#Jœhpà@3j! * I²¤É“(Sª\É2å„–0c®|™2d :ØéÀ‚O XaÂ,<‘CPÜ $µd©æšl¶‰å t’†/°À #²D-|öé矀*è „j衈&ª(¢Œˆò$xqŠ †È²è¥˜fªé¦œÊÇ :|ÐÐ驨¦ª*§ÌðÃ&€ÿ!E,´Öjë­¸æªë®¼öêë¯À+ì°±¤’~R±Ì6ëì³ÐF›km4²É%Ø¢í¶Üvëí·à†+î¸ä–kî¹è¦«-ˆ Ñ…"êÆ+ï¼ôÖko¸œ¸ñÈ%÷öëï¿Ï;Kc” ËÁ'¬ð 7ìðÃG,ñÄWlqÂS8ÈÅwìñÇ ‡ 1)HÌbòÉ(§¬òÊ,·ìòË0Ç,óÌ4ל² جóÎ<÷ìóÏ/÷Ç+DmôÑH'­ôÒL7íôÓPG-õÔG³¡G+Xg­õÖ\wíõ×`‡-öØd—möÙ[ÛJl·íöÛpÇ-÷Üt×m÷Ýxç­÷Þo‡ÿaÄ*€.øà„nøáˆ'®øâŒ7îøãƒA +”Wnùå˜g®ùæœwîùç ‡.úè—²‡*¨§®úꬷîúë°Ç.ûì´×nûí«ƒ2 ¼÷îûïÀ/üðÄoüñÈ'¯üò¿7!‡+ÐG/ýôÔWoýõØg¯ýöÜwïý÷Ó«È-ä—oþù觯þúì·ïþûðÇ/ÿü磠ýøç¯ÿþü÷ß¾ýþ  H@þÙL ÈÀ:ðŒ 'HÁ Zð‚ ÌÀ0ÈÁzðƒ a5(šð„(¡sÁºð…0Œ¡ gHÃÚð†8Ì¡wøÂ ¼‡@ ¢/‡HÄ"Ö00¢—ÈÄ&1‹(,¦HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £¯;TT_v224_html_docs/images/glass/blue/tab_pre.gif000700 000765 000765 00000002230 11222361074 021210 0ustar00abwabw000000 000000 GIF89a (÷c®b­²Ñåd¯g²^ªi´,Lf±_ª_«g°h³²Óè²Óé_©²Ïâ²Ðã²Ðä`«`ªa«e°²Ïá]§`£,Kd¨d¬`¬²ÁÊT³ÁËQ+Jf¬i²Hy²Îàf°i³b¬²ÍÞ³Îß²Ôê³Óéa¬`¨]ŸYœa¦f¯`§bª³ÒæRŽ]¥_¢^Ÿ²Òçd«_¨[¢³Óè\›_¤²Òæ³ÑäY›]¨]¢b¤e®[]£M‚d­Hxc¨e«,NW™g®S”Vš³Óç[›³ÑæZŸa£±ÁÌ[¤ZœS‘\ž²ÍÝ^§,MP]¤²ÊÚS^¢\§`¥a©Z¢4Bpe¯-L^£\¥ZžX”:`*Ha¥YŸFvZ¡²ËÛ[¡(F²Ñäg¯+KZ˜_§]i±` P†Z›TŽ\¤S“²ÁË]¦²ËÜ]ž*K²ÀÊ\¢c§QŒEs3Y^¦RŒQŽU²Îß²Íß³Ðä?k²ÌÝc«b§c¬e©b«²ÀÉCvY–a¨Q‰h²Xœ^¨±ÂÍ]©³Ôê^©!ù, (ÿW 8°H«ƒ[¥Z˜PáÂ" H”ØJ †3 2&xð E‡ˆT @* pÔLXIBG>ìt˜9AA+ [ðPqÁ³‚KJ>P! @4E…8ôDE4@ =Æ`™2 €Õ^(‰ÓŠUX=Ša©Ñ€³RÐP#„ˆ³„¢a„ˆòøô¢n?'·áPÊL¡H(¶À$Í.!4˜ŒI In˜L òå̈&0£/e X}ª:Œ>0@›Á2`|CÛ€m¹?¸!A\PG:° ù žrX©¤a„õ'N²èøcJÄ†ïŽ u"‡ èsèBêÒ’=%â7¹#‰Í¦9kXégÕ¢ÊM+€°?Ø0D€¶Pà °à  ì @*xàÀ… 1a… t¸ƒ†@ð…”(@`Â"¢HàbŠ*f’‡#Ôx ˜¨À ‰¨âã?j;TT_v224_html_docs/images/glass/blue/tab_roll.gif000700 000765 000765 00000003423 11222361074 021377 0ustar00abwabw000000 000000 GIF89a (÷\¥Z¡WT–)IKˆlM‹ÀÀÀAoããã8bDyÁÇÌ………Rl€U•6`4\G}6^çç胔 S’OÝßá/RLŠÉÉɺºº´´´8aÉÎÒDwZ£M‡Š˜¢Cu*KW™*L?\s+K*I=n «µGJ‚Ar-Q'DFzßßßÅÅÅ­°´QŽO‹S–O‰Ne|ŒU–T˜àààÓÖÙ,KL…d{-PK‚ZŸÈÈÈR“4Z3Y=mc{ŒP&DYV›’¡¬1WOŒÍÍÍÀÆËQ“”””ÖÖÖƒ”¡Bt\¨äääáááëë뜜œÓÓÓÚÚÚçççîîîúúúøøøóóóòòòñññùùùððð!ù, (ÿ< ª Áƒ*\Ȱ¡Ã‡#JœhpàÀ3jèÀ$I²¤É“(Sª\É2e„–0c®|™2¤.ع`‚Ï ~rÿ4òûˆýûøóëß_€ 0԰Àhà&¨à‚ 6èàn!Ã#2¡„!åÈPC Ì0J"B‰%·FE¬±F0Æ(ãŒ4Öc X³Œ;ÿôèã@)äDiä‘Hþ8?I&¹äü Â’drK 3àA„p‘[E‘„d–iæ™h¦I&(Á4éæ›pÆ)çœqâa@ ¸±è¢Hkè¡„j衈&ŠÄ+þÐéè£F*)öTRÀž pÂÈH„† †*ꨤ–ꊤ¨¦ªêª@fÒÁ qhÿé¦~Zê­¸‚:«¼öêë›ÁtÐÊäÒ Ÿ²ñòÌ6ëì³Ïþ*í´ÔúÈA%âÌ'èÊB+î¸?Tkb“@ *‹ìgœļôÖkï½õ¢«ï¾t~SB‡“K„/¾' ¿ 7œ¤$¸°‚«ÂÆh ÁÄÆwìñÇ;,òÈAr@»DàÆm´±ÄË0Ç,óÌ/“lóÈül`Å!)\°€#g0±DDmôÑH}óÒ 7+Ú ð3K˜a†Xg­õÖ\ Áô×û@ êø MXÝõÚ\ƒí¶¹9W*{³„¤<¡÷Þ|÷ÿí÷Û€OÛ@#ˆPÅÞìA P8áøãGyà”ûjÀ;,¬ó€ð˜ñ„ãD„.úè¤îÏ騧®úꬷîúë°Ç.ûì´×n;ëlPÁ R‡Ò†çN”.|éüoüñÈ'¯üòÌ7ïüóÐG/ýôÔ/_ á̲IÐ0à=ãà‡/~øø”oþù觯þúì·ïþûðÇ/ÿüô³-$d µQ´±ÇR HÀÞã€L ÈÀ:ðŒ 'HÁ ZÐßè†X  `õp€,¢@šð„$̇ WȺð…0Œ¡ gHÃÚð†8Ì¡ ³ŒZ°à¸Æ0ÿ°‰MLáˆHL¢§ &:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈE+>ƒÍPED€ €˜¨‚×ÈÆ6îãpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úÓÀE hð‹Ã°ƒ"­ÀÈF:Ò‘•‹ä¯Ž€tHwDê„Nzò“  ‚$GÉ+nŒ£ÑÀ¤&CÉJO’ò•ªG;ä rd²¾he(oÇË^úò—À f/ P†IÌA YPÃÜ€…fb ÐŒ&¦ aZóšØÌ¦6QÇ‹0ƒÈTæ2ÝÀLgš³™ÛL§:×ÉÎÔÍ#Æ”C’©q^ážøÄg;÷ÉuÏ~öRe˜Àæ -ôažYH¨Bêφ:ô¡ªK"Dá‰/¤c¦CAµÀÑŽr¢ )?5ˆs cž`F).ñ…–ºô —è‡LgJÓšÚô¦8Í©NwÊÓžúô§@ ªPiJa˜C¨ †ÊÀÔ¦J ;TT_v224_html_docs/images/glass/blue/top_grad.gif000700 000765 000765 00000001700 11222361074 021374 0ustar00abwabw000000 000000 GIF89a ‚æ›â¦ì§í¨îg²pºr¼È^©ŒÔd¯[§Z¦™àc®b­×žåŠÒ_ªzÑٓەÝq»s½u¿u¾t¾’ٔܠæ£é¢è¥ë¤ë¤êm¸¡ç~Ç{Å|ÅZ¥]¨i´šá\§‰ÑŸæ…ÍäyÃe°^ªƒÌo¹œã†Î„Í‚Ê{ĆÏãwÀªð€É_«’Úi³¥ìvÀ ç¢éÕa¬jµ`¬¡è”Û˜ßxÁl¶k¶§îY¥‰Òn¸‚ˈÐf°[¦f±h³ŽÖ–Ý‹Óm·£ê}Æ\¨ØkµÊ‡Ð—Þ`«—ß]©x©ï!ù, ‚ÿ€T‚ƒ„*†‡ˆ Š‹ŒZ‘’ ”•–——.š›œcžŸ +¢£¤k¦§¨ª«¬­­5°±²´µ¶B¸¹ºi¼½¾LÀÁÂJÄÅÆÈÉÊËËÎÏÐÑÑ ÔÕÖ××4ÚÛÜYÞßà[âãäæçèéé\ìíîDðñò,ôõöKøùúeüýþR ŒB° A0*,Á°¡C+#J¼A±¢Å3jܸƒÇ ˆI²dÉ (SªäÀ²¥Ë 0cÊÔ@³¦M#8sêüÁ³§O(@ƒ eC´¨ÑH“*¥À´©SP£JEAµªÕX³jõ«×`Ê=@¶¬Ù³gƒ¨]Ë֌۷pÿwÈK÷ŠÝ»xmèÝËW‡ß¿€cL8‡áÈ{(^ÌøŒãDZHžLù…å˘«hÞÌY‚çÏ ¿ˆM:éÓ¨S§Nºµë.°cˆ@»¶íÛ·ÉèÞÍ»‚ïßÀ;N|ˆñãÈ-(_Î܉óçÐ=HŸNý‚õëØ½hßÎ÷ïàÕˆOþ‰ùóè¨_Ͼ}ûðãË@¿¾ýû÷qèßÏ߇ÿÿÊ à€F`à&˜ 6èàF(áVh¡ f¨avèa †("$–h"(¦¨b,¶è" 0Æ(ã4Öh£8æ¨c<öèc@)äC `ä‘H&™äL6éäPF)å”S¶aå•Xf©å–Váå—`;TT_v224_html_docs/images/arrows/large/000700 000765 000765 00000000000 11222361074 017454 5ustar00abwabw000000 000000 TT_v224_html_docs/images/arrows/small/000700 000765 000765 00000000000 11222361074 017472 5ustar00abwabw000000 000000 TT_v224_html_docs/images/arrows/small/blank/000700 000765 000765 00000000000 11756705152 020574 5ustar00abwabw000000 000000 TT_v224_html_docs/images/arrows/small/blue/000700 000765 000765 00000000000 11756705152 020434 5ustar00abwabw000000 000000 TT_v224_html_docs/images/arrows/small/green/000700 000765 000765 00000000000 11756705152 020605 5ustar00abwabw000000 000000 TT_v224_html_docs/images/arrows/small/orange/000700 000765 000765 00000000000 11756705152 020760 5ustar00abwabw000000 000000 TT_v224_html_docs/images/arrows/small/pink/000700 000765 000765 00000000000 11756705152 020446 5ustar00abwabw000000 000000 TT_v224_html_docs/images/arrows/small/purple/000700 000765 000765 00000000000 11756705152 021014 5ustar00abwabw000000 000000 TT_v224_html_docs/images/arrows/small/purple/dot.gif000700 000765 000765 00000001032 11222361074 022255 0ustar00abwabw000000 000000 GIF89aæ[ÿÿûm3´þþÿb-«U¦&x&{7^w=½[(¨[)«|?ÁøùóŸvÍmc}XÌhÛw>½m5´]*¬O†wšêî⪦±øø÷ŒOÑôùëÿÿüqT¯½µÃyA¾ôùè~AÃQ˜ÐÏÑj3¹wN«c0«¡—­yl‰¢mÜ–Œ¨d.®øúùn5´ hûÿñV¦€GÁoe|k7]\*ª€G¬¦³ŽVÎ`@…ÿÿù’u¸ÛßÓH¾üüý œ¥}Ÿ£©ÍËÎñøäž—£r:¼ÿÿýkpWŽg1µ}?Ä2W›lɯªµ+„ wÒr7ºE“V–_ÕÄÂÇq9´@!løûõÿþÿw@½v:¼ÿÿÿ!ù[,w€[‚ƒ„…†‡…#M7TF‡:@; LH†O)8J9/„B%S16="„'U ZY!„*0P-EQ(ƒ$&+I.?ÃVN 5 4C„RG3K< …A2D W>ˆ‚,åïX†;TT_v224_html_docs/images/arrows/small/purple/dotminus.gif000700 000765 000765 00000001031 11222361074 023330 0ustar00abwabw000000 000000 GIF89aæXÿÿûCœþþÿÒ½éÿÿüÊ´äkk Vme~¾¸Äa¯ÍºåLªÿþÿ2W¢zÕWËáÏônUŽôùèÔÂë“uºÍÌÎ]+ªøúù”…¥Ô¿é̺äxP«H¥!h|n«¦¯øùóž”­hÚêïâšmͪ§±^-«ž—£7^ÛßÓôùëüüýDœ`@…^,¬OL ¡\¯mc|øø÷ ¥ÖÃí£©ÊÉ͆w™-…R±vg‰@Å}žm%¢pÚ‘ZÍ`±(y'za±¥¢­ÿÿùÜÊñÀ»ÄñøäP—h+°øûõM¡=_-­x2Æ7]@"lýÿñ£wÒÙÈñÿÿÿ!ùX,v€X‚ƒ„…†‡…9!GJ‡H?V&<%†:AB$>/U„R3CF @L'„#MIO „27 WP=ƒ E È.6ÃT;Q0(DSK5„,*1+"…8 4)N-ˆ‚äî†;TT_v224_html_docs/images/arrows/small/purple/dotplus.gif000700 000765 000765 00000001032 11222361074 023161 0ustar00abwabw000000 000000 GIF89aæZÿÿûþþÿÀ©ÞÿÿüèÞô*zj`yeüüý‰È°åêïâ(zȰä2WxP«ÝËñÀ§Ý¨£­£©ìâõËÊÍôùè‚S±øø÷ª§±h+°ÿÿù¾§Ýʰå”u»p(Æw™øúùž”­™kÍÍÌÎÛÉñÔÃïM «×Åíñøä„CÎAÆ8–`@…”…¥À¼ÄM¡j`zëâõ=7]ÝËó¾¸ÄI§!høùóvg‰P—ôù래£ÿþÿ ¥¤|ÖøûõÛßÓ~ž£­ýÿñ Th’`Ë P8^˲äÞÎònVŽ‹LÏ@¢;šÔÀíz6ÇL¡†@!l;žâÑô.‡|nÿÿÿ!ùZ,w€Z‚ƒ„…†‡…D/‡C#HM † @NL*+-E„$RV KO;„"5 2W0Y„.S(%3:ƒ6 'T 78?ÃUXPQ&,4)„†;TT_v224_html_docs/images/arrows/small/purple/down.gif000700 000765 000765 00000001053 11222361074 022441 0ustar00abwabw000000 000000 GIF89aæew>½WÍYÍ€HÂûÿ÷n5´€GÂsËkd³&bGBøÿï20wt€HÁhHm5´*Qub|CÃóÿç´°¸ÀÄ»XU·i3²i\~‰KÏ[§Išc-¬òöçúúûüÿû;ýüþ•rÀØÞÒ1aOÓáçÕX)¦±¬µÿÿûîïì}Bݬ¸—ޤøýóO¦™ndz¯¸ÿÿÿ!ùe,ˆ€e‚ƒ„…†‡eR"[d#_]‚GU6c™c:3I eX2¥/H!B*e?)L&1FAa‚4 7Á^M>‚V.9'„S$8OJK,%„ bEZN@Y;†` (0\T‡W5-<ˆD +=ˆe†@ñ…P ;TT_v224_html_docs/images/arrows/small/purple/left.gif000700 000765 000765 00000001056 11222361074 022427 0ustar00abwabw000000 000000 GIF89aæmm5´b-«v<¼hg#¼<r$zW.‡‚KÃ3 ja.­÷ýðB•w>½þþþx@¿‚›o6·àéÖâëÖw7Ä|?Â|oC—}C¾n3´h›l6µi8 ]2Š*b@’o6¹S%¤ÖÛÐçíÚäíØÓÕÔR§ìñå©{Þ EäíÛL3j„|¼ºÀ„Gʳ¬¿cSyY(¦JîóèiÖ;[e/µ`&°¦˜·“‡ X*ˆw=¼ÿÿþþÿþª£²ˆQÆKž"v¶±¹šnδ²´QΕXÖHÂæìÙ‰{œ²ƒãÚãÒÞçÕ‹m°ûþôšdÖ›yÂ( Vb‹y¤XëðâöùíšeÜÿÿóÜåÓs6¹{aŸ]*­õõõF{€GÀ«pæf2¯k/¹Y'¦†QŘbÕöüñ^À»Ç­ŒÔM$~ÿÿýÿÿÿ!ùm,‹€m‚ƒ„=„‡‚O?9ˆƒCTja;*ˆ%JQK4GL>ƒ3:N(Pe@FZl‚-\Df`H.kM«iX[ <_«/ c«m67b 8 $„"+h ]1d&IˆERS!AU#ŽY,2B)VÒˆ'05g8te—6;TT_v224_html_docs/images/arrows/small/purple/minidot.gif000700 000765 000765 00000000443 11222361074 023137 0ustar00abwabw000000 000000 GIF89a Õ4kÔÔÓîóæihe1³øþñk4³t:ÀŒˆ”KXl0³Ó×;ÇS©Q«™– ÒØÊQ‰OÊFœ°«¶|[¦nA ãèÛy:Áôúîy?½ŒNÖøüñÝãÕk2±Š—<ŽÌÌÍÆÅÈT¦Œn¬CÅ—]Ùe1²¶´¼ Pq8¹¸°À„HÈx=½œ“¥”hÇ[Ä”žÿÿÿ!ù4, @@špH,žIp ˜b2Œªh¸ \”ÎäCt04/Ω#¶*,Ð!š7H!õXHŠ–` ˆ3! G„…DA;TT_v224_html_docs/images/arrows/small/purple/right.gif000700 000765 000765 00000001067 11222361074 022614 0ustar00abwabw000000 000000 GIF89aæuÿÿø˜aØv=¼w>½ôúëZ+¨x<»Z(¨KÀ\&®y=½El5´ýÿöuSœDÃv<ºW÷÷ö}v‰øúù•[Õm6¶»ëœ©c.°üÿ÷„JÄ^V%£_,ª¤oÞÿÿú8†¡™«mJ•;m@£u9ÀŒSÎg/¶ùýízh8uÇËÀ!kP"¡N%ƒ…EÕ~EÊZ0ýýþEe1±]ƒlœQªŸiÛð÷äc-¬a-«™bÔøøù|¡n5´FÂ÷õö˜iÊuR˜‘YÔüÿðn3¶ÿÿöoT‘üÿóWž“ªj1³a8y‡PÅÿÿüø÷ù„S¹ŠSÇÿÿþ\Lrÿÿõ—aÔZAýÿôFÁþÿôüüý& OW/Š•žÂÄÂr7¹?ŽG3eÁ»Ë§¤ª=‰‚IÂùü÷gA“}`›"¢ž«èïãh+¶áåÚÿÿ÷ÜÞÓÿÿûÿÿÿ!ùu,”€u‚U‚…†…f7o‡†tlCDnWuJ9=SIb #PTX%*q†Hk'A\iE2L…rN1 0!"‚`&M @Gcp-atu /(<;5hKOBut4 de,]‚Q+8.ZY_gF>†6m :Rý ae 3,ÕI±EK;TT_v224_html_docs/images/arrows/small/purple/up.gif000700 000765 000765 00000001042 11222361074 022114 0ustar00abwabw000000 000000 GIF89aæ[ÿþÿc-«ÿÿûb-«¥rÜ`Aˆ\aB†¯ª´b-ªza˜tl‚‹RË^,¯w=½|b˜w>½|H¾ùüö›`×úÿðêêèYÓn5´RÓn3´õöñ~@Ê–ŸF‰OÊk5´_3™U)…<pôùêìðæ/}ÖØÔÑÑÐåíÜs7¹k£š­¹¸½øüô[)©TˆQÅvm‚^'¨Y<~ÿÿþt=¾o6¹|p‹cÙûûýB „ûÿð~EÁK†t™áãÞ9fy>¼0[i0¸mJšlyqˆŒz¡‰SȈz[­{kg%³‹^ÁÊÐÆZ(©\'¬["³¸‘áp8»j1³¤rÝ’n»m0­[)ªwo…kÿÿÿ!ù[,€[‚ƒ[4„‡‚-G ?ˆ„IR8Ž[,VUWŽ0H!(ˆ+M <=LK‡$D)A:N„>6TSJ3‚& 52 C%‚QPOXØX. @;["*ZäåE/B#[7 Yïð1F'•„9ƒŽû[;TT_v224_html_docs/images/arrows/small/pink/dot.gif000700 000765 000765 00000001033 11222361074 021710 0ustar00abwabw000000 000000 GIF89aæVÿþÿûÿûÈ$ÈÎ.ÎÈ&ÈÏ.Ïóûóa‚a‚ÄÄÜDÜÐ(Ïee5Áü¾nnÖ+Öyw¡r¡ãüã}}““°¤°kkÑ6ÑùúùØjØÏ4Ï§š§±”±¸¸¥”¥ãúãÁÁçúçŶÅccãòãÉ(Éë^ëêWêïÿïÁ!Áªª©©ÝEÝÑ3ÑÒ"ÒµªµÒ+ÒÄ!Äggýüýµ¦µ“n“ŸŸªšª—N—üÿüÐàÐçPçÎ*Î×`×……Ë#ËÓ0Ó¶C¶iã=ãÈÁÈÏÉÏ÷ø÷ ÁÁkÁÐÎÐÁ ÁÕ1Õßj߯Æ£y£¼E¼«‡«øÿøÿÿÿ!ùV,x€V‚ƒ„…†‡…M38H‡URLAS<'†P) /*+„IE?1G.„(D@O 9=ƒT 4-FUƒ%2,NK5Că:Q #0 "J„$B 6&>…U;!7ˆ‚æðô„;TT_v224_html_docs/images/arrows/small/pink/dotminus.gif000700 000765 000765 00000001032 11222361074 022763 0ustar00abwabw000000 000000 GIF89aæV¶¶ÿþÿÄ"Äë·ëë±ëóûóeeƒëWëÐËа¤°ÞnÞÆÆfgnn……µ³ï¹ï°¥²Ä»ÄÐßÐÌÉÌŶÅãû㪚ª  ÅÅÞkÞ”L”ó¾ô}}ð½ð¥”¥øÃø÷Å÷ð¸ð¯ž¯””ïÿïÅlÄÇ ÇüÿüÂ!¹¹ð·ðaº¸wyccûÊûÆÆ¢s¢‚a‚ØØ¡y£¯‘¯ãòãÃÃùúùì`ì×-×ÜGÜçúçÀEÀÛ`ÛÜ ÜŽ8ŽÄÄÅÅùÿùkk§¨§š§ÛFÛ¶B¶¿¿“i“ûÿû¨¨ýüý÷ø÷«‚«ãúãŒdŒøÿøÿÿÿ!ùV,w€V‚ƒ„…†‡… $E‡U6'@?8†3 ;I=F 0…U4- Oˆ‚M:åïó„;TT_v224_html_docs/images/arrows/small/pink/dotplus.gif000700 000765 000765 00000001033 11222361074 022614 0ustar00abwabw000000 000000 GIF89aæUìªìÿþÿøÆøç¡çö½öóûóãúã””~ÐßÐçúç³³öÝöµ³¡¡Å¶Åûÿû¢s¢ÀÀøâøãûã¶B¶Ä½ÄÅÅè¤è“i“ŒdŒÛ\Û\¯™¯ÙÙá9᫜«··llÀFÀ¯¯ƒƒùúùïÿï”L”¸¸ßpߎ8Žddeeº¸§§¥•¥õÛõå¤å‘‘ÆÆÌÉÌûËû«‚«ãòãØ0ØØSØÝ$ݲ¥°ýüý÷Ç÷}}ªª§¨ô¿ôeeÅmÅöàöá/á§š§ÐÌÐüÿü€\€¹¹llì©ì£x¡÷ø÷wyùÿù¯Ÿ¯§¨øÿøÿÿÿ!ùU,x€U‚ƒ„…†‡…5RQ‡TND:#(8†*>F9+'„H;!KS<„$ME6 Iƒ7.B2 1ATƒ4/@?GăP) 3-O„ L"%C, …T J0=ˆ‚&æðô„;TT_v224_html_docs/images/arrows/small/pink/down.gif000700 000765 000765 00000001053 11222361074 022073 0ustar00abwabw000000 000000 GIF89aæ`È&È·¬·Ï.Ï––íÿíøøø÷ÿ÷ôÿôWWŠŠ©©QQÜFÜÐ7к«º§£§æÿæ’}’ÞHÞ¥‹¥__ÿþÿÓêÓà ÃþüþÙ)Ùƒƒç<ç….…“2“ ÂuuÈ%ÈÒ7ÒÓ1Óòúò›>›p pÜ9ܽ±½ØfØûúûÊ ÊáöáÃÃÌdÌ» »ÓcÓ‹‹ÔcÔ¸­¸Î.ÎÌÔÌíðíÔ4ÔÜEÜ¿´¿·¯·ä÷ä¿¿ëÿëË'ËùÿùÒÝÒz7z¥j¥·Ä·åïåûùû¾¾á8á×#×À À””ðýðÏ-Ï‹:‹² ²] ]Æ.ÆãFã“^“XÎ ÐÊ$ʼ¼õûõ×h×qqäÿäyx¤¤¸®¸ÓbÓÑ6ÑÝEÝÿÿÿ!ù`,ˆ€`‚ƒ„…†‡`>892\\5‚A-W1]š]/(O`$ _§_7P+`'[F ^´^!&IJ‚L*"3K6.@Y‚?0GÍ=SZB„Q HTRD„<E;MV† ,UX‡%NȇC 4ˆ`è‘‚P ;TT_v224_html_docs/images/arrows/small/pink/left.gif000700 000765 000765 00000001057 11222361074 022062 0ustar00abwabw000000 000000 GIF89aægÈ&ÈþÿþssÏ.ÏÁ ÁåSåßòßÔïÔÖïÖ‚‚Ó6Óõ`õpp‚‚»»Ï/Ï]_ccÒêÒÌ̲²½½óÿóÿþÿÉ'ɺbºÂªÀÏæÏÐ1Ð×&×ÔÔLLÎ*ΨX¨»³»¤„¤¬r¬Ê¸ËÍÜÍ““{{åBåt/tÝ„ÝäYäÒ7ÒËqÍVVÔ9ÒÕ@ÕíUíÜ3Ü¡`¡Â!Á’“””îýî–%–ÔîÔïþïÕ<Õ½½µ¡µÑèÑÒÖÒðvðÇ#ÇŠм”¼æôæ««ñÿñÙðÙµ³µèùèÝaÝà?àž€ž}}ŽŽöõöÓ/Ó‘ ‘ÏÏ’i’É'ËÈȾÀêpê€O€ÂIJ*²iiÍ&Í“x’´ ³Ì%ÌÀ¹ÀÖîÖ½¼ÓìÓ¢t¤ýÿýÿÿÿ!ùg,Œ€g‚ƒ„f„‡‚>4Dˆ‚"$+ 'Hˆ@e.A,)9Ž‚E#X<1LR?†ga!K -03O†%[2Q` Cd†6]ÌUS :¬M FB5V( g&*Zc=b¬ƒIN_W\G^ 7/ê‡YTp\x4HÉ(g;TT_v224_html_docs/images/arrows/small/pink/minidot.gif000700 000765 000765 00000000445 11222361074 022573 0ustar00abwabw000000 000000 GIF89a Õ2ðÿðüÿüË#ËÏ-Ïê9꺺 ” µµjj€€Å ņ†¦¦  ÇØÇ__Ú=ÚØèØÙ5Ù×4ׯ%Æ¿²¿·e··¬· ‹ Ä­ÄÇ%ÇÓ)ÓÊÕÊÇ ÇÓZÓ ÂÉÅÉÍËÍšŠšÏ&ÏȾȨ’¨•†•ÓÕÓƒƒêûêÕåÕ«4«æöæÒMÒgg²Q²Ô)ÔêLêÿÿÿ!ù2, B@™pH,€ˆuUKS‚W4 2V8Eo!9= $P&ic oRJH]f:0M)ßo7%Z5_O†F-,/ÅH2"K;,½Ó@ K;TT_v224_html_docs/images/arrows/small/pink/up.gif000700 000765 000765 00000001043 11222361074 021547 0ustar00abwabw000000 000000 GIF89aæZÈ&ȉn‰Ï-Ïüÿü‰o‰ÿþÿ¼¼íÿí‚‚êdêˆi†‰m‰mlg gÂÂÆÆÍ.ÍË&ËìdìŸZŸÎ)Îçûç§u§øÿøçR瘖†i†ì…ìçMç¡u¡å>åuuÌ&ÌÆÄÀ ÀŽoŽÃÑÃ×ñ×ÞåÞ¡Ž¡¯™¯”:”–d–Ô/Ô¸ºÅÅîÿîÈ!È„„åHæãòãÔÕÔúÿú’’””ÃÃÝCÞyyöüö¨'¨óü󲩳åêå¾¶¾ß-߯bÆÍÍÐ#ÐÑ8Ñ×C׎6ŽÑ:ÑÔ>ÔÐ3Ðñøñ‹lÎÑÎÐP΂‚ýúýÜ>ܦ@¦ ]¡‡5ˆÈ"Ⱦ¾ŸmŸÁ ÁÃÃÿÿÿ!ùZ,€€Z‚ƒZ„‡‚<&ˆ„F.ŽZ?A 'Ž4RHE5%ˆ(M8IGP-*†ƒ2Q1@6$„VD TÀ!S‚3;+UWËW"C=‚)BX×7X/,ZN9Yãä0 Z>#ï KLJ•„:OƒŽüZ;TT_v224_html_docs/images/arrows/small/orange/dot.gif000700 000765 000765 00000001037 11222361074 022226 0ustar00abwabw000000 000000 GIF89aæWÿŒÿÿþÿnÿyÿŠðøüÿhÿxÿ…ÿþþª¡•鯈£“µ«¢ÿkÿ›ÿ™ÿp÷øúÿ{õýÿÚ6Ù^ùÿÿù¢>ðeÿ„›}]ßóüßéûÿˆíÿÿ¹.ÿ¢!÷÷øØîýÑÌÈÓ(ÿ§hø~ñÿÿ܉"ËÆÁ¹±¨ž`ÿ°Šgÿ†ô9¸­£=ÿ¬-ôÿÿçUÿ¨ÙòþnZ’q[«t:Ï)ÿ©Jʽ®üÿÿûdÙ›UÛ2÷ÿÿÿuƒ>¸š~©çùÿ¶œH©ŸŽÿš¹£ÓÏÍÿiþüüø§M°pÿƒÛ€%‚9õÿÿÿÿÿ!ùW,|€W‚ƒ„…†‡…N,2+V‡RAQ*;†/=47'H„$T!0L ?ƒM(S-Ž‚F@&.6)‚>ËD 5ƒCJ1OBE#"„3I%ªu:õýÿÿ®.°ŠgpZµª¡¬£“û\õÿÿÿÿÿ!ùY,|€Y‚ƒ„…†‡…HU 'X‡QAF>*P!†SR.NM„@ #:4 ƒ2</D1=-+8Ž‚ W; &‚KEË03"ƒ)IBJCO?„57%$,9Æ„LVT6Gˆ(XX ˆ‚è„;TT_v224_html_docs/images/arrows/small/orange/dotplus.gif000700 000765 000765 00000001040 11222361074 023124 0ustar00abwabw000000 000000 GIF89aæ^ÿÿþÿéÕðøüÿĉÿHÿÆ™‚9ÿÄ™ÿà±ÿâ°¬¤”ÿÙ­ÿþþÿ^µ«¤›zY¶§hÿ¬Rþœ(ÿÿ’ÿ‰·/ôÿÿøwû\ô>ÿ˜ÿ0ØîýœH©ŸŽÊ¾¯ÿNž~\ÿ-ÿíØþüüÏ ÿΗÿ䵸—wçM¹ ˆª¡–ªu:Û%ÿIÿá°ÿÏ‹ñÿÿþ£;kU’nWá‹©´¦—ÿí×íÿÿ>ÑÎÉõýÿçùÿÝœVÿÏšüÿÿÙ_ÈØàÇÁ¼ÿSßóüÚ5µ§›÷÷øÛ7ÿZÙòþÿÿÏŒ°Šg¯p÷øúÿÚ¯ÿÚ­ßéû÷ÿÿð]ÿß³ƒ>ÏÊÈùÿÿÓõÿÿÿÿÿ!ù^,}€^‚ƒ„…†‡…ZI9E]‡>Q@47.U†P1 ?„=/"2OFNCBƒ,(%:A)W#Ž‚*SX+3‚!H $L-ƒV0T KYJ„G<\'8DÆ„; 65 M&ˆ[]]R ˆ‚é„;TT_v224_html_docs/images/arrows/small/orange/down.gif000700 000765 000765 00000001054 11222361074 022406 0ustar00abwabw000000 000000 GIF89aædÿšó¢Cÿÿ›ÿ›ÿtÿnÿeÀ·°Þûÿÿ›Þ#ÿ‰÷¥Jùÿÿúýÿª¥¦óùþñúÿÄÑÒó¢Aéÿÿÿ€ö)ÿÿþ|1ø÷÷·~üXÿh¬0˜8ó¢DÿŸ¿Rö÷øïÿÿŒ)ìîõ×Büÿÿ…mKõJ—ˆs¾±¬õ¥I¨7ðjÿ¼³ªÿ^ÿ”À¹°ž^·ŠZòúÿÿmì÷ÿØ"ó¡Bµp#üúù½´¬»²«ÎØâÿ|ÿ_öÿÿÚéÿ®i ¨yLZ#ÿŠäûÿÿvüúø­šò…ó AÞííÇÞì¤c#ÿ•êŸJèõÿÿdÛ÷ÿðöýÿýûÛñÿÀ=Úñ÷×V³¾Çÿ„ÿ{½³­ÿŒÿÿÿ!ùd,‰€d‚ƒ„…†‡d6A@bŽŽ3.'‚8U/=P! OGV)>" 27Fd^Tc´´5#;dS `Á`J1I[‚B\aÍCa0_9„H,:L(+KM„ D&R†N W4-%Z†E <X$ˆQ*ˆÈTè’å¡@;TT_v224_html_docs/images/arrows/small/orange/left.gif000700 000765 000765 00000001064 11222361074 022372 0ustar00abwabw000000 000000 GIF89aækÿ|ÿ{þÿÿüÿÿÿ…ÿùÿÿÿÿnÿeÿqËäóÿløÿÿ°XÕãÿ‰ÊÚôÿ²a|Ýôøæ¢YÿOÿvâÿÿÿšÿZÿ†ÿo¨v”­“|ÿ¤?ÿQÿ³M/ô¶rÿµÌâóȪŒÊÜó½·±Ô3±µ®éöÿŸ(È ­PªGçõÿ´"¼¶¶fÀ‚CÿŠÿ‰ÿzÿsËåóî/ÿ‚¤4Ôìðÿ¡±jýþþÕéóšˆo´ƒSÿgñNÿ©ÿ£&£`×!Ûr¥*öõõ»«ž»fóÿÿ‘gBÿ‘ÿ¼RÐÓ×üþÿÿ”ÅÔÜÈØõËÞôÿ¥!ÿbȶ¢ÿƒÿa°^¨;ŒPÿ§)Õ‘Mâî÷ÿkËàôÐ÷ïùÿýÿÿÿÿÿ!ùk,‘€k‚ƒ„„‡‚iOE(†ˆ*P%&ˆUATH@5YVƒe d#[SW`j‚46!I7)¬hLc8=^0Z¬]+Ì91g¬kMG : a'ÒkXb3"fF \> „Q,$/_.;ë‡DK<Cˆ‚~H¡ D†€‚ThádM ;TT_v224_html_docs/images/arrows/small/orange/minidot.gif000700 000765 000765 00000000434 11222361074 023103 0ustar00abwabw000000 000000 GIF89a ÕçæèþÿÿÚÈ­ÿ’ÿ•ÿŸî›+î¡<àÝÙÿŠÓˆ*ÿ„ÿ†ÐrîÒ”OÓŸc˶Ÿÿ€ÿ‚Ò¹ŸÚÒÊßÚÕÿ}Ó»¥ÿvÿwåhÔŸæÞ×ÿnÓ°–̬“ðbŦÔÈÀßÙÕÛSÿZøUÊG®=º8Ï1Ê0©1¿šŽçäã½™ŽæßÝæååÿÿÿ, AÀ™pH,€çe T ƒBP”=  #bŒÉ"±?¡KF#)‰ˆ”Éã9¥EŠjÅjEŽ$.0G…†DA;TT_v224_html_docs/images/arrows/small/orange/right.gif000700 000765 000765 00000001070 11222361074 022552 0ustar00abwabw000000 000000 GIF89aævÿ„íÿÿïÿÿìýÿÿnÿ{ÿdÿúÿÿüÿÿÿqÿsÿÄ_íýÿÿŽ·Ÿ…ÿlÃeóùÿÿƒòL¶ž„ß÷ùéûÿìÿÿ¿PÿÁp´"¦§¡ªÿ— „M÷÷öùÿÿýÿÿ¿iÿ‹™(ƒ.ÿ³¤›Á}1µ¡‘ÿ“ÒôÞèùÿ¯#°x:·€Gÿ  ™„lÿ¢ÿyÿ`©}U‡Æ¨˜÷Lÿ•ÿjÿföÿÿÿvõÿÿäKíúÿíþÿÿ|êÿ^ÿ«ÿ‘ ñüÿÿu¹-ÔÞî¸ÅÌÿ0¿X÷øüÁv%ÿ‘háúÿÿžÿ¤éüÿÔíù¿`ÿiÿÔxÿ”÷õöÃÂÈñÿÿÿ‹ÄÛÝŠ_:»{/´ˆYàóÿÿŒ¹ÿýüÿwÿýû×Gºlø£/ûÿÿÿ¤úù÷øøùÃBÿÿÿ!ùv,•€v‚"‚…†…-f.‡†?1 oe) vC*HW/F0`‡R2,<4q]7M†h(bVIp‚D$S¾%^m+#vZk5E\@L:AÆPK B&3g_Æ=>[ N!‚u6G;i'UJr…aO98TYæ4rC‡ÌQÔXJ`‹6–;TT_v224_html_docs/images/arrows/small/orange/up.gif000700 000765 000765 00000001050 11222361074 022057 0ustar00abwabw000000 000000 GIF89aæYÿ{ÿ„–{eÿ}ÿÿÿþÿwþÿÿôÿÿÏ*Áºµ³€Iÿÿhåøÿ¶°¢ÿ¿máùÿ”{eÿlÿÿ‰¶K–yeîõùÝàëÿ©  aÿ®>´_¨h×>ÿ”óøþ¿ÈÓ˜~cœBºÞëõ­H©˜þûú­ˆ`Þòþ”yeÿ•”wcÿg”vaÿ‹ýÿÿäšKÒ×j®kêyôùþ—|a´‘fëÿÿÑ+ÿ¦ËÑÐøÿÿÿSø•0ÿœüÿÿÎ*¸£’ÅNÿ–ÿf·e%ÿ¯2ÒâÿÏÔÖÿ–ãêéÿ ¥€S•yeÅw&Š5ûvÏ)ÿiÿnöÿÿÿÿÿ!ùY,…€Y‚ƒ?ƒ‡‡!: ˆˆ6Ž‚ 3J=7(CŽ GBKŽEAM1-TP‡&R ¶F"‡*À ;‚L5OVWËË‚IVHVÖ/Ê@$'4D Uââ<%S+YN#0,Q.9>‚2Xùúú8)ƒ•f ;TT_v224_html_docs/images/arrows/small/green/dot.gif000700 000765 000765 00000001031 11222361074 022045 0ustar00abwabw000000 000000 GIF89aæV5´:ÿûÿþÿþ>½D-«2GÁMkh1µ6¦*ª//«3(¨.:¼>Œ¨Œ=ÄE5´9?ÁHÿùÿ¦³¦.®3ø÷øAÃI*®0WlÉrµÃ¶ÏÑÎwÔ{XÌ^ÂÇÃ@…Cw™yïâï:¼@—­™ßÓÞquUOvÍz¤u¸xN«UA¾G3¹66º=ÿüÿúùú^VÎ^OÑW9´>ªµ«ùëùûõûøä÷_Õc!l%üýül‰n©ž]!–T¯Yùóùÿýÿ{)ª/mÛt¦±¦}ž€UŽXÿñÿ—£–„x=¼CfÛle|dùèùËÎÌHÀNœ¥“c}eÿÿÿ!ùV,v€V‚ƒ„…†‡…5B‡G*(@H!† E2NI„Q+9,R3?F„#4"M)%„ .½ T<ƒC- Sƒ:KD L>8„61&'$A…/=OUJP7;ˆ‚0äîò„;TT_v224_html_docs/images/arrows/small/green/dotminus.gif000700 000765 000765 00000001032 11222361074 023122 0ustar00abwabw000000 000000 GIF89aæXÿûÿþÿþ½éÀkœÿüÿhºä¼žïâïd}eª ¯$¥ ´â·ÊñÌùëùhÜnÃíÅÿùÿR±Xuºy¸Ä¸+©1ÏôÑno+°1»Ä¼|úùú´ä·¢­ ßÓÞWWË]xÕ~ÈñÊwÒ{w™y…¿éÂOûõû”­”œ ZÍ`±# ¡-«2d|dmÍs,«2ùèù¯ÊÍÉÿñÿ>ÅHP«Tg‰i›©ž…¥‡—%Â,qÜvVŽVU¥ø÷ø¡ÌÎ̦¯§^ºå¼~ž€3Æ:]"@…Cy—£–ÂëÂ!l%§±©üýü-¯3ùóùøä÷±#ÿÿÿ!ùX,w€X‚ƒ„…†‡…6F‡I%2@ †&#?"-8M7„E9J5.W >=R„+(PD„2 .NGƒ7KW9ÃLD*JHTR„)  0=%…,/I5Sˆ‚'åïó„;TT_v224_html_docs/images/arrows/small/green/down.gif000700 000765 000765 00000001056 11222361074 022235 0ustar00abwabw000000 000000 GIF89aægHÂMgnÇrnÇt>½Dø÷øHÂNnÆtBÄHC ‘ÿûÿoÆsQÿïÿbœùúù5´<¬µ­>½Fîè¡¦¢\~\ÿçþüþü±»±ùõùÈF´½³>ˆBòãñXÍ^3´9ÿêþ6·<ïìðB€D3²8ŽýóýrÀusËx3Á:%ª)HÃNtÿ÷þ(¦-ÿ÷ÿÿûþsÌw-ª2¦ þïþöçöCÃIÿñÿKÏS9{;®·®LÉR#£'XÑa³(úûúÝÒÝ1¹8R)¦.>·EçÕæ=¼E[Ï_Ä»ÄXbcHÁMo qa5´9ÓÎÔGOÓWúóú§$4´8w°¸°ÿøÿ-¬2þÿþWÍ^¯¸°ÿÿÿ!ùg,‹€g‚ƒ„…†‡g:%faE!,‚W12 ;O&>g#\R"e§e(H$D'g CV5F0‚-IAQ^‚K`3Y)+LS9„U_½DX[4µ:hvíÛì3´93´;óèòy'¦,5´:bÕi‡ ‰/µ4þþþñåðHÀN6·;(¦-’b^b±¹´*­0ðâð;ýðüÿóÿ?ÂE{ž»Ç»—ŒÔ/¹3*ˆ/.‡1%¼,2Š9ãÒâ8¢=õõõëÖê6¹<çÕæopSyTüñû£²¤eÜjyÂ}.­3ƒãˆQÆW6¹>>¿D%¤)E3j7 jC¾IéÖ蘷˜ùíù{œzr||7Ä@-ª2ºÀºþôýìÙë‚›„QÎYQÅWGÊMGÂMræy¬¿¬m°o-­2{Ý2¯7íÚì²´µíØìaŸbiÖn•nÎry¤zJ&°-dÖkåÓä§$LÃR V WÖ^h›hÕÔÖ:¼B$~*ÛÐÙÿýÿÿÿÿ!ùm,‹€m‚ƒ„„‡‚J4gBˆƒ^%Q'ˆhD68[f*+†‚ SUaN9M(bl‚IZ]P@dOj0«#,5 :i;G!A«R )/  &E.«mLVTH7`?Y„k>\ cKˆXe$<"WŽF_=Òˆ213"84ÄC‹6;TT_v224_html_docs/images/arrows/small/green/minidot.gif000700 000765 000765 00000000443 11222361074 022730 0ustar00abwabw000000 000000 GIF89a Õ4³91³4þñÿi?½EXOÊU[¦^=½E0±8×ÍÖEÅK– —ÔÓÕüðûHÈOŠ—‹“¥•«¶«¦ÌÍÍn®q¾Ç¾ŽLÖUóæòh©ˆ”‡hÇmèÛç­ØÊ×ÅÈÄ®À±]Ùc7¹<œ :¾?1²4:ÁBKúîø´¼³j@ FRž[ÄaãÕãÿÿÿ!ù, @À™pH,Š(slT<1«(8ŒFF´$RÂb!ŽL%àtWPÅ)„Š’Wk b? G„…DA;TT_v224_html_docs/images/arrows/small/green/right.gif000700 000765 000765 00000001067 11222361074 022405 0ustar00abwabw000000 000000 GIF89aæqWÿøÿÿôÿÿ÷ÿÿöÿQÎX÷äöZ:ºAÿõÿGÁOKÂP/Š1õö÷\Õb-¬2(¨,aÖføùø%ƒ*.±3ÿóÿ+¶2bÔi0¶2÷ù÷0°5EÃKJÄRÿðÿv‰vúëù02@£GA“DFÁLESšXb›eQÇYÿþÿýþýÿüÿËÀËüýü“ª“;¤ª¦kÞÓß=½DLrLåÚæYÔ_iÊmlœp™«šEÊJ=¼E5µ;U¹Yúùú?½D+ª/Ž5´9 O ª$ž«œy{©‘J–MIÂOR˜ViÛphiPÅVĆ1e5&£) ü÷ü-«2*ª1aÔg;»B]ÿúÿýíü7¹<‰ ïãîTW»Ë¼u5´:9À@&®,^1³8ë–EÕLž"¡&8;|¡~oÞv÷ö÷6¶<ÿûÿÿÿÿ!ùq,”€q‚)‚…†…`9H^‡†p'g8KF q&Lm>_OIN(W"M6†# $J7!.…k;X@4<hP:‚ cfbC=o\2ipqZVU]G qpSdRABQ,n‚+aEjD1†Y0e%±yQcœ*,ÅÙ"€J K;TT_v224_html_docs/images/arrows/small/green/up.gif000700 000765 000765 00000001040 11222361074 021703 0ustar00abwabw000000 000000 GIF89aæXþÿþÿûÿÿðÿ)©.m¼rl‚ma˜e'¬,}7¹=RËYa˜c'ª,SÉY-ª2ftÚyÿþÿ"³)RÓYoˆr%³.QÅWt™u^ÁbKÀQÑÐÐ[×ÔÖ)…/kll`×hùêùüöüíÜ¸CˆC>¼D8¹>­E¿KãÞâOËT5´9k‚lR>½DB†D1³8p‹q\=½Düôûš­œHÀLz¡}@ÊF5´:p6¸;ª´«3´:êèéûýûJšO0­6(©.rÝy,¯1ðæñ‘á–YÓ`ÐÆÎ „cÙiŸ‘>~@3™8öñö=½Bz›|0¸7-«2)ª.o…pkÿÿÿ!ùX,}€X‚ƒX„‡‚58 *ˆ„RHL0ŽX$D BMŽ #ˆ6 )+‡FAI 4/&9KJ„7<1:>,'(N‚OQ TËTS=‚%CU×UEG”;3WáâW.!X?2Víî-P•„"@ƒŽùX;TT_v224_html_docs/images/arrows/small/blue/dot.gif000700 000765 000765 00000001035 11222361074 021700 0ustar00abwabw000000 000000 GIF89aæ¦ï­ñ—ô³ñ`›ªø–ó¬ñgÅÿÿýT|šøOyüõòÿùõÿûõ$¤ÑÎÿoØ“¨«Ž¡¦ÿÿø¤úÀú/ÐÿMÃï–ç«õÿÿöàÔÊp™¬ÁÆÊ|£´¶÷ÿôéY»]†–ÿÿñ“ág–ª®ÁÇûåß¶øU¯Ô:‡¤¯ï¥ï¡²·œï!Éÿ›îÿÿüdÃÁúÿþöÿÿ÷% Ðüýý`‘ÈÎÒþëÜ•¥«¬¸JÈö¦è†É¢­µÿþôüíâø÷÷V·C Zx‹>ÁíýéÚ§ÿÃÿÍÏÓúø÷³÷…Õ~¡üõð›íÿÿûZ¦@•Vƒœî[z²ï¨´¸þÿÿÿÿÿ!ù,z€]‚ƒ„…†‡…M[/7‡+I,)†'?5!Q"„;81-ZLAB ƒ>@O³*&ƒ .¾P$C\‚(KS2X0U=ƒT: 4 JE„DWG#FV RÄ„%YH< 9ˆ36Nçˆöƒ;TT_v224_html_docs/images/arrows/small/blue/dotminus.gif000700 000765 000765 00000001037 11222361074 022756 0ustar00abwabw000000 000000 GIF89aæ¡Þø¿ø‡êŸî°ÿÿÿöÎÿ[zÿÿýeØóüíâgƧáú ð§àøüõ𤭵X»¢¯´ÿùõLÇô¯èÿÉÏÒÈËÏÿûõÿþôp™«üýý·ÿYƒ–·øûåàžîT³Ø¨æú¦Õø÷÷`‘奿úˆª¸ÿÿøNÉ÷;Äó%ŸÐ‡ÉÿþöC ~¡œøZz‹£äúúø÷X·T|üõòþëÜ¡èì–¥«ýéÚ\Š›g–ªŽ¡¦‰ì“¨«:‡¢qÙ/Ïÿ”ý€Óµñÿ˜ô™ôÿôé³êÿÿýõVƒŽßw¡´ÿÿñ¯ÃÇ‘öZ¦ÿÿüOyÿÿûˆë»ÃÈ›«±¢äú²ìÿàÔÊ@•þÿÿÿÿÿ!ù,|€`‚ƒ„…†‡…ZYM‡",$C †?+E1K„-;!.ƒ):\(4[#HO>ƒP' LG_‚R FXAST<ƒW&D2JI 7=%„ N06^V]Æ„QB3@98ˆU*/5éˆøƒ;TT_v224_html_docs/images/arrows/small/blue/dotplus.gif000700 000765 000765 00000001037 11222361074 022606 0ustar00abwabw000000 000000 GIF89aæ‹éw¡´ŠèWwŒúø÷ÿÿöT|Uv‹Oyüõòüõð­éÿ×óýP¶‰Ùù”¨«ÿûõg–ªÿÿøÊÌÏàÔʯéÿÿýõˆª¸\Š›²ÿYƒ–¬²?•Øõý°ïÿÉÏÒ¶ø‹ÞùrÙÓµñÿRÊ÷§Õ¼ÃÈÕïü™×÷`‘Žß¯ÃÇ:‡¢šàúWƒ€ì±íÿgÆgÄpè°íÿÿùõÿÿüS¼~¡Õòü¿ÿ³íÿüýý–«²¸ÿå–ýŽ¡¦ƒó‰×ø9Ãóø÷÷(½òÁÿ¤¯µZ¦™Ø÷üíâÿÿû–¥«næÿþôö%ŸÐp™«ýéÚÿÿñþë܆Éÿþö¡è­çÿV´ØAŸÿôéûåàŒÞù—ßùÿÿýþÿÿÿÿÿ!ù,|€c‚ƒ„…†‡…>'‡6S[EG&-^†%H5; 9]„R?!_WIaƒY1` .$+ƒ@):(K<#Pb‚,2AOD4QJNƒM*"C Z03TF„L/\8  Æ„UBV =ˆ7Xéˆøƒ;TT_v224_html_docs/images/arrows/small/blue/down.gif000700 000765 000765 00000001054 11222361074 022062 0ustar00abwabw000000 000000 GIF89aæ­ñC½èÿÿý¦ïC¼èXæî7p¼þHÁì ÷ÿíÜHÃ몴¹ÿë݃ÇþõóH~´øÿÿúÃÿ¤ò“÷sŽ”œï÷÷øþÿÿ¬·º˜áw´g¯ÄÿÁû³ð¦¤¨#y¯ò«å#lŠ´ö©÷ùûü`×øúû¨ðÿ÷ôLˆ¡u—ýóðÒÎÇÿþóø÷öÞõîì’í¢õÿ÷òT›96YEB†I[CG2O†?*FR 3ˆU:18ˆÐpù#¡@;TT_v224_html_docs/images/arrows/small/blue/left.gif000700 000765 000765 00000001067 11222361074 022051 0ustar00abwabw000000 000000 GIF89aæÿýý¦ïÿÿú¦ðµöôØÍšî›íÿòêþþýž±¹ÿÿûhÁÿÝÕ®ó¨ó«ð©ÿ§ò_šN“&ÊÿJ€!Éÿ„æ´ûðç×j™­¬ï´òrÍðôÕÌ÷êäBtŒ²Åv™¥’õóÜÎÿÿöºý)Îÿ?Ã÷±¸¼}©ÿÿþŸñ×ÒÑ·ÆÍS•°Œõo£øïâ¢ùS¾ÿõñd…“íN¡›î<‚´õôØÎfžµÿþü’ò¹ñÊþ­ñõÔËÿ÷æv¦”ÎÂýÊÿŸõMÒÿÿýþÚÿ±ñÜÐÈo˜M©Ì.m”í|ž©óÚÏ¢»ÄóÝÎN±­òƒìY»àV–|¦™÷ªRÚÿ®¶²õõöªúÿòëºô`Šó×ÌdÓ³öC—¹¶¾Â7zóã×ÛgŸJÿÿýÿÿÿ!ù,”€r‚ƒ„„‡‚6 0"†ˆq*>M+ ˆ.[`BI_D?ƒ TQKAeH]‚kj)uq{34F=@i‡?-h7#8g;†z B^ ]Ns:n&‚aQCZ`1DE)‚pWb9JyP{ LS2H{IY"cV ot(d‚Gx$U_Xj'Rl…\A/e!J°XѨÍ.ìÐÿ±ôu¶—ó›îY·e‚’ÿÿùÿÿÿ!ù,„€]‚ƒ] „‡‚! 1ˆ„?$JCŽ]#MK"ˆGUNSEˆ&;IP7„@5- 2W,„V/>'=‚ % YÍY:3 ‚BFTXÙXD+OR]4Q6Zåæ.8<])0H[ðñ9A*ƒ\øùùL(ƒŽÿº;TT_v224_html_docs/images/arrows/small/blank/dot.gif000700 000765 000765 00000000514 11222361074 022041 0ustar00abwabw000000 000000 GIF89aÕ4ðððéééâââäääíííìììÎÎÎüüüàààÂÂÂïïïÓÓÓøøøñññÛÛÛÑÑÑúúú°°°ÒÒÒãããØØØèè說ªõõõ×××òòò¾¼¾§§§ýýýÞÞÞÍÍÍÅÅÅÆÆÆ»»»êêêççç¿À¿´´´½½½µµµÝÝݳ³³¥¥¥ÈÈÈåååÃÃÃáááþþþûûûæææëëëÌÌÌÿÿÿ!ù4,i@špH,EÁâ8a+GAæH(Œ ¬¡€B âèˆdËCB4 ²¸ Ð!gˆ@l+P4/C(.2&C ,#3ZD)- *1F%'3 H/0H®4A;TT_v224_html_docs/images/arrows/small/blank/dotminus.gif000700 000765 000765 00000000513 11222361074 023114 0ustar00abwabw000000 000000 GIF89aÕ5øøøýýýûûûðððñññÞÞÞïïïæææÍÍÍÌÌÌäääéééççç»»»°°°ÎÎÎÑÑÑËÌË£¥£ñðñÀÀÀ§§§ÅÅÅÓÓÓãããÇÇÇÂÂÂÃÃÃ××תªªàààÒÒÒÖÖÖµµµòòò¼¼¼ôôôÍÎÍüüüîîîÆÆÆóñóüúü³³³¿¿¿úúú´´´ÜÜÜåååùùùöööþþþÝÝÝÿÿÿ!ù5,hÀšpH,Eâñ šÁ@£ Œ(Bl0œ¢‚C‚)0äCD`f€˜|V`´–l/ €F3C4 4† %C 00 D"+*F.!)&ŒH3—H®A;TT_v224_html_docs/images/arrows/small/blank/dotplus.gif000700 000765 000765 00000000515 11222361074 022746 0ustar00abwabw000000 000000 GIF89aÕ7îîîûûûàààõõõöööñññ×××ÍÍÍÖÖÖÎÎλ»»°°°ôôôøøøÍÌͪªªççç§§§ÅÅÅòòòÌÌÌÑÑÑ¿¿¿úúúÍÎÍóñó´´´ËÌËÓÓÓãããÞÞÞæææµµµÒÒÒðððÇÇÇÀÀÀüúüÁÁÁää䯯ÆñðñÂÂÂßßßÜÜܳ³³£¥£¼¼¼éééâââóóóÝÝÝüüüýýýþþþÿÿÿ!ù7,jÀ›pH,EÁ!Áª£0#‰Œ¨Â Vc âÉÀ «B%DÇÇ$Á‚?2;Ó:<„;*Ì„ 90' 1Ž=5 (!Ž‚)=ôƒ,"@;TT_v224_html_docs/images/arrows/small/blank/right.gif000700 000765 000765 00000001061 11222361074 022366 0ustar00abwabw000000 000000 GIF89aæBâââíííõõõûûûæææååå÷÷÷ËËËÄÄÄèèèÿÿÿçççöööìììÉÉÉôôôÍÍÍÈÈÈàààÚÚÚ­­­ÇÇǾ¾¾©©©°°²ÙÙÙººº¼¾¼ÖÕÖùúúîîîÁÁÁÀÀÀïïïßßßÜÜÜ¿¿¿ññïÆÆÆááá²°°···ðððÏÏÏßáßÎÎÎóõõÔÔÔðïïåææ£££ÍÏÏéééÑÑÑ™ššŸŸŸùùù¼¼¼ÃÃÃÖÖÖøøøýýýêêêëëëüüüúúúÿÿÿ!ùB,Ž€B‚=‚…†…3*‡†@ AB<AA: >/4†>?> +…<&.¯?? 5‚<0È >!„8 '?;@BA$ "A•Ý9 ,#)2<@„…7%=-6(b(ègIˆ€@¸5 ;TT_v224_html_docs/images/arrows/small/blank/up.gif000700 000765 000765 00000000523 11222361074 021677 0ustar00abwabw000000 000000 GIF89aÕ:÷÷÷êêêÃÃÃìììèèèééé···ûûûáááÆÆÆ»»»ãã㸸¸¼¼¼ïïïöööåååçççÈÈÈÎÎÎÓÓÓ¿¿¿·µµêéêÂÂÂÀÀÀÜÜÜÄÄÄÅÅÅîîîõõõóóóëëêÝÝÝòòòñññþþþùùù§§§ÐÐÏ®®®ýýýÉÉÉôôôËËËàààÕÕÕöøöúúúîîðüüüøøøâââëëëæææºººÁÁÁäääÿÿÿ!ù:,p@p¨#Â’ŠÓA7€YàÔ¹0€Fâ<$fƒÚ¬2@N¢@m´È¬W¡V x!¢t±ùm6 2B '1-4Š4 B89•–9(: 8 ¡&+: 7«¬ 3UD)²GA;TT_v224_html_docs/images/arrows/large/blank/000700 000765 000765 00000000000 11756705152 020556 5ustar00abwabw000000 000000 TT_v224_html_docs/images/arrows/large/blue/000700 000765 000765 00000000000 11756705152 020416 5ustar00abwabw000000 000000 TT_v224_html_docs/images/arrows/large/green/000700 000765 000765 00000000000 11756705152 020567 5ustar00abwabw000000 000000 TT_v224_html_docs/images/arrows/large/orange/000700 000765 000765 00000000000 11756705152 020742 5ustar00abwabw000000 000000 TT_v224_html_docs/images/arrows/large/pink/000700 000765 000765 00000000000 11756705152 020430 5ustar00abwabw000000 000000 TT_v224_html_docs/images/arrows/large/purple/000700 000765 000765 00000000000 11756705152 020776 5ustar00abwabw000000 000000 TT_v224_html_docs/images/arrows/large/purple/dot.gif000700 000765 000765 00000002114 11222361074 022241 0ustar00abwabw000000 000000 GIF89a÷Äþþþÿÿÿv=»g1°n6¶n6·ƒLÃìëìw=¼ýýýÿÿúåååììía,«‚JÃ~D¿üûü¹µ½ÿÿþððñÿÿùçæçìëêh2­`-«{pa,ª_Kz]Ixûÿñf0°.y^,¨mM–HÇ,Mûûü‹WȨˆÐöööøøøG/hùùùn6µ5X”Œ *s†v™ËÊÍw?¾³«¾¡rØV?w'jSÔüÿó6ˆqX‹ Døÿî–sÀüüý€JÁ‚KÁíìî e |ÉžpÔêïæ€IÃM—ÉÄÉ‘_ΉXÁ^,ª}D¿úùúÍÉÎp6¸¼´Ãúúú-TÀºÇíôåœôúíÿÿýìììtc‹ñõëjW„òòó¯}åõõõV8zsMšÿþÿ¿˜ï …ÆY&¥U³W'¢-KW÷÷÷i2®P%›R$›v@¼Q$ž"júþôY&¦úÿñ±…äv:¸¯æ|D¾„œõ÷õZ(¤F+b0u[(¢ Hxmˆ²Û‰PÆPA4¹X¥#J„*T $àF"@fF¼)²3%R…vB¸CA œ²,¸"+}BL18p`Båc_€;TT_v224_html_docs/images/arrows/large/purple/dotminus.gif000700 000765 000765 00000002116 11222361074 023317 0ustar00abwabw000000 000000 GIF89a÷ÀþþþAóíùX­ìëìb/«ììíÿÿú…OÄüûü¹µ½ôñûôñùòî÷X­ñêøýýýððñÿÿþÿÿùçæçåååûûüb0¬ßÞãE„‚œ[(£.yAžìììùùù°¨¼W% …NÂÍÉÎûÿõËÊÍP%›qX‹_-©Y(¥:‘FŸûÿñíïåœkÏR"¢XBxc/¬W­¬zåS«¸™Ý„MÄüüýsh‚[¯O=iúúúžmÔDÅôöô`+®£zÏQ$žßÞâòúèýÿóúùú»¡à°Õ0u-T'jBœôúí³ˆáíôåñöëüÿó‚MÂj1»ŠWĈWÁ\ljWȆl£F.cõõõêïæ‚w²“Ùƒ[·R˜ýÿðO!™ylŽ |ÉQ!j BR$›c/ªÉÄÊõ÷õY&¥‰RÆ/M eúÿñíìî…OÂ÷÷÷øøøZ(¤s]Š5X0U±†ä`* üýüU ªo/»rfS ©b/¬aN|öööÿÿýh%´ïôèqL™cññòP™ÿÿÿÿÿÿ!ùÀ,ÿ H° Áƒ*\ȰaÁN[pð ‚° 1ðºr$V „ •ø• ¡:‰p…r¡‰Ç *žÚ°‘˜;UÖHªôÉÊ©L£†øXdð–-LS¢Ø@€@D+8›V1ê%Çà¬.=ôÈ0Àƒ}öà)åF—Á?‚Œüj°€ƒ ~ÕXñêËaÐxô뀿ü⢠OxÉ¡ªC€Ç–ø’•Ö%k‘‘²ëŒŸb\à„ÂR¤A J@%ê‡"5¦RÌ ±IDâ”ðkÄ/r1cŒR ´Ð‚`0Ï/4vXµ¡4©P™$ ˜Pø€ÐÂ/(®¥+b£Cƒ“áE˜ Í„&yRÁ¨õ 1d€Y0ç0ø 8`@;TT_v224_html_docs/images/arrows/large/purple/dotplus.gif000700 000765 000765 00000002120 11222361074 023142 0ustar00abwabw000000 000000 GIF89a÷Çþþþìëìöòúðêøüûü¹µ½ýýýöïùåååçæç9•ììíÿÿúÿÿùÿÿþððñ÷÷ùFŸïæõõñúûÿñýÿó!k²“ÙD„ oØíäöíóå÷÷÷{nylŽìåö†PÄX(¡g µ;ƒPÈVÁS «<=™BùùùhOƒúþôÍÉÎS«&eÉÄÊ5X0uʰè]Ixòéø¾¹Å’‡ &ijW„¾˜íʳçñêùXÌ>™ûûüU ª_-©0MI2iœjÕ¨€Ñ†v™úÿñúùúmL–ýÿðòòóÆÅÉßÞãÿþÿ‹ZÈÿÿý`* íìî.yñéøøÿîŠWı†äX®o/»CŸU¥v9·øøø _§šµpK™·˜Ýj1¹ |ÉO:i'j †ËZ)£D1™Qtc‹c2«(‰ïçõßÞâüÿó”dÏc0ªôñúïôèJ„0Uìììdµ)Šûÿõ6ˆôöôqX‹ cËÊÍe³¼¶ÃXBxüýüukƒGÅP#šüüýe¶–Š¡W‘^ÈV8zaN|¸™Ýññò…OÄ<fìëêR˜°¨¼F.c††[(¢‚v3›óïø Hóîøõ÷õf%´`+®d2­-Tµ”ÙP,{êïæôúííïåñõ믂ç[¯¨‰Î„œõõõOð0vÁW% ö™¤ …–K½4XBãc UübAŒ6 ÜHPŠVE‰è<0è ÒPgÚìÌ“Œºp(èÀX 5Sp0k„¡2À ”’dÀà c0ìpÂáÇË‹¢ ˜J ácpn¸-"‹ « §Ì‹€§ 4¨€ Áì@òhA€´ÒœCÇäG ;TT_v224_html_docs/images/arrows/large/purple/down.gif000700 000765 000765 00000002163 11222361074 022426 0ustar00abwabw000000 000000 GIF89a÷ÖˆPƃLÃmÒ¨ƒÒ‚v‘~D¿v=»ýýýùùùn6·þýþþþþÿþÿa,ªw=¼X'¤üüüg1°{D¿öööþþÿ-|HE eg1±„HÊ'zýýþÙÝÖo6¶†OǃL©ƒÒu<»ððòg2°ïðïÿÿürÎ>ƒe1°zkŠŸ’¯‡PÇn6¶ŒTÌžnÒd/¬ƒv‘ðôìC†¢˜¬y@Áúÿï›qÌa}E¾²‡äC,cÍË͆NÄøÿíœlÑh1°whŒV&[)S!¢âäâƒOÂ}F¿BÐÏÏèîãïòèéîà‚n™æèçEpWŽùýðƒu’v‘Q#›>i€uÿÿýbQv„pœ_-§ïóç]B}ìòäìñå;]óóó´®·m6³žpÔ+OÌÒÈ­¢¸p7¹J•Fš›mÒi3°ˆ}—@tææä~F¾|D¾¨„Ò%cn6´{A¹^(®!W–ŸþýüýüþY&¡~F¿^ Lññó“[ÕS š^,ªS$ ‚w,g„MÃÿÿûäçäžcÛ÷ûôêêëV&¥ëîèR$ ª‡Óèçém3²©„ÒíóéU%£h)³iSñùêM™v>¼íòç†MÃw9Ã÷÷øðððèëåLšûûûª„ÔœiÑJ˜ìðè[%¡b-ªu=´ÿÿþõõõTvøøøJ ™@Åïîïc, ðö飛¯eŸFßâÝ„r—„v‘ìììˆ|›I,o%bææåïïðo6´^*­3u,Ze¡•±¯§º? h÷ýò¾¾½åãâèçæX'¥Å¾Êÿÿù¯ÒôôôC‚Nêíãéèéw=»9ÿÿÿÿÿÿ!ùÖ,ÿ­ H° Áƒ*\È¡‚ÄØÜD ¢E1VM‘2,‘‰WÌjæ(Ô€“'CœŒçÆ&Æ„rBǘræT“ó…(Dt¸x#0 ¬?=(]ºôƒ&B‚(é$°VW,hݪD!#§ª”ñäÇÚ•j¹ i(p¤€„=n ¼É癕.Éd2¨&£¥ 8<Í&¥¾t`4b`žj²€mò•`N‚ <@CèŽ%i ¢b¦ëÒ™)€DÈ@bÍŒLФ*ÈÁ]u`4ÔÀ”@ªŽ‘ÂÚ`¥ ¿D>BÓG…G î5lC+ZÈD;äl¡‚jË ! Ô„±„"0ôŸqœ~Áýýþz]šííëëëëàèטeÍr5ºãèàþýþ@iýÿ÷úþòáéÙëêëíñæw6Å„NÂ…z”¤„ÑQœi/±GDïôèDX'¥M šL˜g2°Ww?½D b•cÍ-YS#¡ŽZËX(¦ª}ÛX(£¡›«E•ÄÀÉåíÛˆPÆH$pKÁVÊò÷ël¸ûûûO ›r[Š`,¨j0³„qœ}l‘,Tz?¾GŽqc„!h|A¿5~÷÷÷ˆOÆ)v‰r¦¼—ça*«Šm­š‘¤rE¨…›B+f°€â´“Ùóõ𰪹ûþùa/¬âàãGìììáåÜKšu;ºC‘ Oƒw‘{C½æïÜúúú«§´óùíZ%¤9f¿¼ÄubŒ¯‹Û–°èðÞ÷ø÷¹˜ßêíæÃžì{L¬V@pïïèÑÎÐþÿûK–g1±­áíóãn6¶G–€KÀf0²úùûA&eG‘š^Øn6µþþþúü÷Q# bGòòóêñßþþÿ[+ªf2²XËãëÙçêå’bÍ{C¾ Jüüüÿÿÿ!ùò,ÿå H° ÁƒHhPܬ$œzLCÇp ±NÉb=»2¬TELP1së1 ”å*H•(ÔDñò".•…#“j˜,”­“”FA…‚B­B¦Ä]“H[`<1%å€x±Ø1sÇš¡:#DX°Ð!ƒ7ì® ôÉR‘ÚÞúµ`&>k¡VÞ‘VK&=Ø¥áA|D´F¤¾BxÑÙ¸ ``# `}m}Ù±ÍH Õ¨ AªC!ÔvÀfŒ P jijP wŠ!Ä6(ë;ÅÀF\ yKÇH‡ŸDáéu®¯¼ ËDóÅAÔŸã f@DMËë!P0 Z¹Ù0éDèÖX ¶ãðœâÈ ¤ìq — TÀÁ zÓG7|œ‘BÜÐ2À xòŠ4íàP‘{ïõå¦wÒB o [b,«˜}·õõõH#x‘ˆœbM|óúêR%óóôŠWÄ–iÉÉÈÈèëäôóôääå„KÂþÿû„`©tQœíñè’„¡ïóìg3µÐÔÍe-¤ççæ÷÷÷–bÑ|F¾V&£ââãîîïPzycŽT9v÷ýïm4µq^ŒõõõÿÿýùøùùøúG|úúúQ"žd1š)o^*®N†JÉŒ\ņKÌóóñ3zT7z{E¾ÿÿúþÿö‚KÃèéç’ˆ jPwDÀQ¯ԇj¨ÿÿþC•‘gÂmY…N/zŒ˜n6·ðððïóèZ4…½¢ße0¯;)V?,[W"¨[&¦ i8)VX&¦{k“W&ª{j‘‰SÆ“\Ì? €yk‹óóóg.¤‚OÃo2¼ûúüÖ×Ò§Ÿ±w=»¦{Út\“n>´¾¹Å÷÷õnÑ¿¹Ç}F¼@hiH”úüùÕÕÒs:¼te‰‰XÊÿýÿ’YÓ|A¿êóåŒTÇ‚s“À™ê`+ª‰SÅ-aŒiµ?,\®„×;ƒ#oYÊg+®Ù×Ûe0­½–íM,xùýôg?œþÿø÷÷øýÿø~D¿7^âããW$¤ oÙ‰RÅ€AÉÐÏØüüù¯‰ÜšhÌúùùZ&§U%‘]̦š°ø÷øëë켺ÄÁÃÃññò•¨{C¾†OÆY(¤‹WÇææäúú÷l6°™hÔSÌ`$¬õõö;)Wÿÿ÷ÿÿÿ!ùÇ,ÿ H° Áƒ³s !ÂUnxÊÁ¡ÁM8ÆXãG‚‹å\TÂÑF¿0€<–K'W²ZñEÈ%\ZÊ4Ž0O†(ܱ8…Œ^©ÞHZDg…ŠBMQÙÓ!A” v) r‹„ˆ¶ÄèÁRºhÊÁáÊ‚¶¡rò€]z¨Š“ë -ƒ&’ÔÙaÀa_f6ˆ…„ŠgJŒL…˜\`çÒ#c¯~jb¥OˆHq õNg&áEC` U`B³&€ïßx‘qB1]´´R €Í?‹I© ò9‚ ߈H£H$ÂLpp,3jŠÉŸO¿L%¤ÌYÈ*ƒ#à€˜‚/@0и4ÐÀD(!4P =(¸Ò†;TT_v224_html_docs/images/arrows/large/pink/dot.gif000700 000765 000765 00000002110 11222361074 021667 0ustar00abwabw000000 000000 GIF89a÷»Í-ÍÐ3ÐþþþÉ%ÉýýýÅ$ÅÓ:ÓÿÿÿïÿïÕ;ÕíëííìíåïåÐ2ÐÀÀÓ9ÓÆ"ÆöÿöÁ Á¿¿EüûüþÿþñðñçæçÉ'Éêë꤈¤ðÿðöööììì¡B¡Î,Îq4qçüçu7uÏ'Ï’’¾ ¼j$j®“®Î0ΉO‰ãßãøÿøêTêßñßßPßèøè²²Õ?ÕÌÁÌÆ Äp(p©g©vvêûê¾¾ŒŽ¬¬´´ñÿñË'ËÌ$ÌÑ/Ñósóóòó´ ´Å³ÅººåååÐ|ÐÇ'ÇôöôÓ7Ó‘^‘^ ^ç?çÍÅÍzz q áöáæoæèƒèöøöç{çÃ%ÄÓ>ÓÎ-Εj•‰‡ÑÊÑÿþÿ¾¾òñòÄ"Ä€€¼¼¶¶[[Å"ÅÖ@ÖùùùŠgŠ×A×È%Ⱦ¿Š‰Ö8ÖòÿòÏ5Ͻ½½´½¤C¤‹I‹ädäÅ#Å¢¢£ˆ£÷÷÷__rr‘‘ËhËõnõåçåX•T•íÿí»»Ò!Òç÷çË(ˆ"†ìëìhhÁIÁÁªÁõõõù÷ùÔGÔ‹i‹VVÐGÐüÿü¼¼Ó;Óá_áØ~غºÀ ÀÕOÕ••‚2‚âÜâ¼µ¼²²úÿú¢}¢êÿêúùúõÿöúúÖsÖ²²8úúúùøùüüüb bà]àTT¹–¹È¹ÈÏÈÏžžµµUUîìîTT¯¯aaýüýòyòÔFÔ¦„¤ÿÿÿ!ù»,ÿw H° Áƒ*\ȰaAW¡ù¤ÈÍ®[ 7i±qdŠ>ræp9P!áŠ?•FI¡´ŠNH†œD:…p )\˜ÌÈÀ’¦Q $šD$ébȇ ¹ (y`€é¤&%Pô@eJ¢oغµA›*81H!AҪ͒ÂK ³4õˆš2dÀë£Ð´ƒDe €¦À•L@)0Ø*Ì  $8p áÒˆîº`ГX4‰“C"[l¹ðƒ§ …¯òì±4&V©NµªÈâÄ@ƒÌPEæ‰671‰ƒÃ„©, Ð5‚­v¢0%ÀÐA. TD±ˆ #™O( Ô— ]XtÜá®ùþù;TT_v224_html_docs/images/arrows/large/pink/dotminus.gif000700 000765 000765 00000002111 11222361074 022744 0ustar00abwabw000000 000000 GIF89a÷·úíúÃÃþþþ¶¶ûðûýýýÂÂÔ<Ô··ïÿïíëíÀ"ÀÁ"Áç縸ùêùÏÈÏüûüíìíçæçñðñþÿþuvÌÃÌ__‰‰u7u’f’TTùøùöÿöìì쎎öÿõßYßq+qŸqŸÂ"ÂÕIÕõÿö¢¢aaÕOÕåïå‰O‰ÈµÈúÿúîìîúùú¬g¬êûêòyò¯¯ÀÀåð媪¾§¾´²¼¼‘‘ì™ìðÿð†%†;ÍÄÍÿþÿòñòãŒãóòóíÿí¹–¹åååÜnÜ¡B¡õõõáôá’’è@裈£Ó:ÓÄOÄâ_âç÷çèSè“s“äkäøŒøèøè•T•zzEÈ È» »UU¼¼½½ºº^ ^Á Á[[ßñßUTôkôñÿñÕ?Õ‘i‘Ø}ØãÝãÞ]ÞÔ?Ôb b÷÷÷k'køÿørröøöËËúúúÒ#ÒųÅÎÎÕFÕ³³×5׆c†åçåÖsÖ¾!¾½´½Ò>Ò­ ­ôöô— —‘^‘êÿêãßã‚H‚ýüýVV€€çüçùùù‹‰×@×ööö¿#¿ººôtôs4qÓ=Óüüü¾¾óÿó´´á‡á±²Xì…ì…_…¼µ¼»»êëê¶¶®“®Ô=ÔhhìëìÐFОžë}ëüÿü¿"¿ÖAÖ¤„¦Ç'Çù÷ù‚2‚µµ§B§ˆGˆÆ Æÿÿÿÿÿÿ!ù·,ÿo H° Áƒ*\ȰaÁTø|JƒÓ­D ×lˆ¡É“*$³hA°!á¡Nj¬Ta#"ŠT>€¬ªƒ°Ÿ*ZUBó(Ï”W± bðN’I&Ú<9À´T &LHé`”=5 غÕ=,z1ˆˆ[¨%ÀVƒ#¼Pð‡¶Ø à­!7à‘`‹ - Xì`À.„´R`ÐÈ";‘0àÄVL9‘BÁ  9©j…òòå’ŽL`2¤ ÓçMÁ ¶ `Ø!i”¬›hpêj…¨ غàfLŽ,( HÆ„F-UHàJ‡2”P,&±1]„愈ãáD‚+G>À:ŸP !œ¢ ¹Ã[ôý÷_@;TT_v224_html_docs/images/arrows/large/pink/dotplus.gif000700 000765 000765 00000002120 11222361074 022574 0ustar00abwabw000000 000000 GIF89a÷»þþþ¶¶ýýýïÿïüûüøåøØ}ØÏÈÏùèùíëíÃÃÉɨ¨ùåùüïüüóüÂÂûðûöÿöåïåöãöçæçñðñþÿþíìíúíúöÿõçç°°yyìììôöôßñßøèø¤„¤†f†}}~¾§¾’j’»¼¿#ÀÕ=Õ^ ^EåçåhhÒ>ÒêëêåŒãù÷ùááöøö[[ÍÅÍüüüèøèêûêôtôÖRÖüÿü‘‘ÌÁÌñÿñk'kÿþÿ•T•³³ÙÙ««aaòñòååååbå‚2‚‘^‘ÐFÐõõõýüýç÷ç;ßSßÜIÜÀ#ÀUWªª×5׆#†¹¹“r“ÄOÄq+qu7u‚H‚__úùúãÞãðªð¹–¹Ò#Ò§§‘i‘ùùùËËq4sÈ È’’®“®úúúÕJÕæçUU»»ººï¨ï— —µµ´´b bóòó¾!¾òyòųÅä[ä²²ÖHÖÈ ÈèSèÔ?ÔV¡B¡úèúžž» »áö቉ðÿð½´½ŸqŸùêùVV­ ­ãß êÿꥥˆGˆÈµÈíÿíÀÀ½"¿ÖsÖ…a…ÝsÝÎÎÇ'Çööö¬g¬£ˆ£óÿóì™ìúÿúË ËUUøøùøù··ìëìçüç°°øÿøõlõ‰O‰Â$ÁÆ Ä¢¢è@è§B§{yùëù÷÷÷¼µ¼îìrrÿÿÿÿÿÿ!ù»,ÿw H° Áƒ*\ȰaAJYFd*cÔ.' Áœð4# M²&ÐE á#AJE #G +&Wlð`ƒp &=;FéÒ•Æ NJR}bpÏ mT,pà`A ±Ô¬ùaÊà"-V,)¨ƒ D6 i•Á.gBéÊ@èÁt¹ °eÀ-¡@Ø ‹Vƒ0ÒJ qô'I(08ÀБiLŠ)} PåêRŸžX0(*W¡W(ªìd@'"# ZÔ*xA×/=à!b€ ‡;¤lM€!À ]>ìÔ QbV‡F+å¨`á Dp-yC ¬C*t‹ «$h€‰ìørCT4ÑœC»äG ;TT_v224_html_docs/images/arrows/large/pink/down.gif000700 000765 000765 00000002152 11222361074 022056 0ustar00abwabw000000 000000 GIF89a÷ÊÓ:ÓÐ3Ðá]áÍ-ÍÉ'ÉÕ?Õ“t“ÝzÝÿþÿýýýùùù“r“þþþþÿþÿÿÿTTöööÀÀuuþýþÅ$ÅÜ{ÜÕ=ÕüüüãóãÓ>ÓëÿëçõçÝxÝÝAÝ››’s’‡‡OOêö쵵ŠÅÄ*Äðx🟺«¹Ð2ÐÖ-ÖæóæðîðÁÁGIøøø““••–R–õõõÎ.ÎóðóÂ!ÂïðïÚfÚÎ-ÎØaئ]¦ÜzÜÃ#ÃÇ.Éåçå¾½¾Ã$Ãâï⮓®ÁÁiË'Ëáaá y%yäõä¾¥¾¸¶»Ÿ»óóóðððÏ4Ïã_ãÆÓÆåíå‘d‘“s“³³èðè‡O‡Ü6ܢޢíëí½»Ù;ÙÜ|ÜçHçÛðÛçèçßïßâäâíþí³³yyÆÆÈ%ÈÍÌÍæææÓ?Óy{–t–Ì-Ì•r•ºº¸¸ffòïòïîï±–±°°Ç&ÇÑ3ÑÀ ÀêQéÝ{Ýþüþ¼¼öÿö™{™ÿýÿôýôÛäÛ©©’p’üýü¯¯Ö>Öáäá°°µµggY X³³šnšá^áÕÞÕûûûëêëÓ0ÓÎ'Μœã]ãzzéúé¹¹ÍÍÍÆÆôôô¢¢µµÆ#Æ”u”æçæÔ>Ôøÿøbb°°éèé…7…äçä¹¹Ÿv üÿü¾¾Õ:Ó³³Ó;ÓâZâðÿðø÷ø__¢k¢½½åòåéçél%lÅ!ů®|N|æùæxxff¢g¢Æ$Æ››ssÉ»ÉÜ…ÜÉ%ÉÙ)Ù€€vtÿÿÿ!ùÊ,ÿ• H° Áƒ*\Èá‚LÁ eÅÀ1.(äæ“ V ^áQìK…8H¹’O…'€ÉR PFH.IÀ³§H±öü@…á‰ÀZ‡ÀdÈÀ¦€S OÁê`©Ê(%Qá€×¯_]*‘l WyÒ ­Û¶y¢¤˜ñƒ(š”‰ƉҀ¿€uÔxc†Q$,töQfÄ1A>‚'„-™N…$øGÉJ>‚é¢J¹Â¡Qð¡ hnDСH+S¥‚Üâ²Ù`$luñ£IŽ/^½€Ì:˜7ѯqš¨z%ìÁ¦ , DààÑ™ŽíG¢eD.I 4 5'Æ"BmIÕia Ä ÃäņI0Ô€N<¬ASC†4PÆ+ˆv )s8Ôñ…;TT_v224_html_docs/images/arrows/large/pink/left.gif000700 000765 000765 00000002210 11222361074 022034 0ustar00abwabw000000 000000 GIF89a÷íêêêÉ'ÉÅ$ÅÓ:ÓýýýÍ-ÍÀÀÐ3Ðõÿõþýþëíëüûü³³úÿú¹¹ýüýûÿûÍ.ÍùÿùÉ%ÉÐ2ÐêìêþÿþðððXX[[»»o oÙIÙòñò½½Í+Íùþù’[’½½½»ùøùp~~ÃbÃzxÜFÜ÷ÿ÷ÙGÙ¹·ssðaðdd•p•o$ojjnnÖ@ÖÖ:Ö”t”ØðØßôßÚðÚ¸¸Ë(ËðþðÉ ÉÍÏͬ¬ýûýÛUÛ­­üúüÛWÛ™x™±±Ó7Ó¹¹ŸqŸxxÁ ÁñrññòñÛJÛ®k®À À÷÷÷õôõ__ÀÀ•H•ÿþÿ¶¤¶þþþåöåw9wëúëttù÷ùŽpŽÃÃðvïæñæüÿüÅÅ÷ø÷œaœÍ*Í© ©Î-ÎÛòÛÕDÕãßãÜ&ÛÏ1ÏÈ$Èï÷ïÞSÞÝuÝ‚&‚Ê'ʧ§ô‹ô’U’]_ m __Æ$ÆÅ#ÅóóóÑ4Ñ×ì×UUÚñÚóòóÖ?Ö½°½Æ!ƶ¶–j–ØHØÙñÙ¥¥ØDØÑ<Ñ Â×í×aaÕêÕëêë——¿ ¿Ô;Ôæîæ¢V¢ûûûÁÁÅ!Å—V—ÙTÙ}!}ļÄììì¹6¹Õ5ÕÎ,ÎÜóÜ] ]ìsìÚ†ÚòwòÔ9Ôâˆâº>ºº§ºææõýõ·e·Ð;Ц¦åE犊Î'Ρƒ¡äïär rúúúÎ*Îó‹óËÁËÕ>ÕÈ!Èppøøø•—Ä#ÄllÒ/ÒÆ%Æéùétt»»ÿÿÿßóß[\ÙçÙ` `çççqçŠ^ŠéöéÜÒܵµ°°Èvʶ¶ÜGÜûùûÞèÞ§ §Ð5ÐÝôÝåëåÃò²Ò?Òöþöy7xQQúøú×î×·x·èqèÝUÝö•öZZ¼¼ãã㯙¯×ë×üüüÿÿÿ!ùí,ÿÛ H° ÁƒHh•ªyÒ5°Âp`§CãP¥ª²%JÅg^ž,3Ç–œ|3«L);̈8IÁi'•¯„†‹\+QS©Â‚‚¹šµZf“]ƒh,ªAìv½±‡T¹n§Ž K GW6¹sÂFÚP8pÛ?Áj‰KÛ.É'®BÝ2ó!BÃh"Èšqƒ¯¦Wlv¹™ À„Ê—wŒ–ˆï^¾zÀçW!2í°íE ´@ŒYû&CÑ—%“0ÅÒðbºQ-Î`BR ݦéÅ·Ý2ÂØÈ`‚›C,t8eˆ†![u]ˆI¦å\,#Ð0¸G¬ ‚ÐH¤&O²B˜Ztƒ!ìƒ =e<­s‹.PÁ5pIv±$‹™%tÞœEHA ¦èÄŠ¯j(pCL„P$ÂN åÜÉ3^0áH9<´#{ð±„)"hÒƒ ä!Ä<ÀP’J çÜ1‡*Œ˜ ÔC;Np IÉ bF;TT_v224_html_docs/images/arrows/large/pink/up.gif000700 000765 000765 00000002144 11222361074 021534 0ustar00abwabw000000 000000 GIF89a÷¾½½ëêëµµôÿôÅ#ÅÉ'ÉÍ-ÍõÿõÀÀÀÀùÿùµµÐ3ÐíìíÿþÿýüýøÿøòÿòäôäµµöÿöüüüÖBÖùüùÀÀþþþåôåóÿóÙYÙöÿ÷Ñ:ÑÓ9Ó„%…üûüƒEƒÎ,ÎÛMÛ*ÀÀ–d–ÑØÑ¼¼uu~~Ý6ÝÉ%Éž<žÖFÖöõö¢¢ùùù”X”`%`åé城½ÝGÝöö¼»íníáäáènèŹŃ7ƒ——þÿþÚIÚç˜ç³Ÿ³²–²ÅÄÏ)Ïêcê°°¿\¿Ï3Ï÷ú÷ðóð|É0É1 Âà`àðñð݆ÝüúüÖ;ÖÒ@ÒžTœÆÆ×G×™n™ÄÁÄýÿý††f&fÓ:ÓÐ2ÐŽ^Žðþðùøùe&e‹‹b$`Å$Å´´ø÷øŽQŽù÷ùÞØÞ^‘‘—_—ôóôceØMØ ¨6¨©©ÞèÞßëßØËØõõõSSøˆøíTíŒTŒìëìñpñ˜e—äHäÿýÿ‡.‡æúæÑ$ÑàyàÄÄÓ<Óå[äÿÿÿÕ?ÕÐ4ÐÕ>ÕíþíÆ#ÆíÿíÈ%ÈÅ"ÅüÿüÜ8܈ˆssðÿðÜ0ÝúøúòôòÏ4ÏòñòôöôɸÉÜKÜ«’«©}©Î[ÐÇ(Ç’d’ûúûäçäŠ ˆ……£‡£…J…²b²Ò×Òïïïç|ç¶¶ÕQÕllÜ@ÜñðñÁÀ•I•ÒDÒ×7Ù_Í,Ía%a‡‡ÿÿÿ!ù¾,ÿ} H° Áƒ½ør@!B='f€bôÀ¡A7q† *áCÁ)‹MQÉèÊ L€ôE¤UtüÜqr` È&`I¢%­:®(T±¸JÉŽ,XëM¦ yÜêAÂÃEa¬°HÅÂ&„ºH-r$†Ù%–lA1ôIeA.t±Ë€]»šºˆ‚Ц`²MjQ °á#‰0åQPq`;8JE‰D ²å4‡€l9 c ™B¸ž$@ 4   dBŠ!ŽŠ‘KG ¸s羑å I0‚HbDÍÈ‘/8.`Â8³$pˆeN¯/½²k×~IÕ >¬4LAÉૃ 04x©_Ï™1xjÈñ•áB%"À¿ÿ€l *¯T0Pž4Ð@ 6Ø`€Ô²‡+UhaA;TT_v224_html_docs/images/arrows/large/orange/dot.gif000700 000765 000765 00000002103 11222361074 022203 0ustar00abwabw000000 000000 GIF89a÷µÿ{ÿlÿtÿþþþÿ‚ýüýíìëÿfÿ‡þÿÿÿÿ“ÿuýýýãàÞÿ‰ÿ„ÿŠÿ…îíìãåç¼-ÿ|ÿ}çûÿèúÿæúÿ×êõ‘a6áìóÚ:­—ÿÿn€Hãïû–d5éŠ)ÿƒÿ­4ïÿÿ½u*ÿ†òñññððÿ¨4þv•z\¬—~üdÿºQÿ‘«•x«uDø\íùÿÐÉÅÿœ*ûúúÿ¥áêóÿ¹AùùøÿÿþßiÿÉpÿ¦.õõõ¼¹±ÿaÎÀµÿ¶_¸ ŽºTújÎÍÚ%öõøèæèõ§Xø^mAz4êì뽊TÈ´¥êÿÿó°gùøøê[ò[p1ÿg×ë÷îe‡U$ü`îìëÿk÷÷÷ª’tˆU&¬Šhš^ðúÿ™ú]æûÿ’Dµ+ÿ˜üüûÿçªfóòñÿ’ÑÌËåúÿÿν°ÿ°Kÿ›!ööö¡xS¡€a÷“õÿÿ•])¡XùùöŠ'è Jìëëÿ„ «rÊLäðú…Nükz$ÿ”Ó8ÿyÈ;ûÿÿùÿÿñÿÿødóp¿z&ìÿÿûfèçèãðÿÿºhËɽ<ýûüÿŽÿ¼Wöƒ»º²äóÿp2ýÿÿÖ:ûúùñðï‚6þtñþÿÅ«‹¢sH”{bôôöÁ2Ÿm8ã÷ÿèDÿÿÿ!ùµ,ÿk H° Áƒ*\ÈP ‚†€xã•4¦ ,|Ð§ŠœMHY’U'’F„\a’ÇÅ>üÊñgB>P@é¡Ã ƒ7p è„* KÝÑ‚ê†'qà˜²…a,:•Šðù¡IV†<,Q‰@hEhaF#8Fièd0„TX$P  AVÔ3Æà¦)G&LÀ•«L’vè¨cÐÏBT¨‚°ðpŠrA@Á ò  P o HÉꢖÁKƒR¸"À€1g6aÅÁIrØÌÙ‡ER}ºbPŒ61dXý¥ ¤ (YHcC ?%2‘QójÖ"‰Ö0ªâÀ  {¨XzÃL—GMe)t a’‘^„ Ó h¼¸#±‹pÕ©OLÌq²Å”!ä è#ê.wˆ+>þ;TT_v224_html_docs/images/arrows/large/orange/dotplus.gif000700 000765 000765 00000002116 11222361074 023113 0ustar00abwabw000000 000000 GIF89a÷ÅþþþýüýíìëþÿÿÿïÛÿHÿòÜÿvÿnÿEÿsÿïÝÿUÿcãåçýýýÿ*ÿ9îíìÿöéÿjèæèáêóÿïÕçûÿêÿÿ¼0áìóèúÿùÿÿÿMèçèŽx^ÿ“ÐÉÈÿpíùÿüJ¼-þ¨i‘a6é1–f7˾²ŽvYèDÿbòñññðð¬Šhš^ñÿÿ¬—~ügÁ2ÿÿÿþ¡xQõÿÿò^îìë«uDñVºSôôöÿ}Ñ’Dÿóäõõõûúù«•x÷÷÷žk7ÎÍÂ6ª’tóòñz$ÿ—ãàßöõøš%Š'¡Xÿ¹o¼¹±Áz"Õž†jêìëËɽñðïÿøîùøøüüûÿ¿q¿‹Týûüã÷ÿÿñâäðúùùöõ§Yþ§i‡T$ˆU&ÿñßøfñþÿÑÌÉÿf»º²ÿxæûÿÿ¹>¶0ÿõîÚ:åúÿÿ‘ÿ› …Pülÿ¦1ü®VÈ;ûÿÿïÿÿÿõä¡€_ÿíÕÊOÿtù¸uz4ýÿÿÿ™<¢sHÿðßÿ#ÿÈoų¡õFp3öƒp5ÿ¼W÷”ùùøöööν°ïûÿ×ë÷ãàÞ€J×êõÿöìþdûúúÿ &ÿôìÿäóÿ•_*úlÿª=ÿÃãïûÿ¾zìëëæúÿãðÿÿoìK¸ Žÿ»SßnÿÏ’ûf½u(ÿ¥þOÅ«‹mAÿòâÿ“ê^ó°gìÿÿž~\ÿgÿÒ•ÿÿÿÿÿÿ!ùÅ,ÿ‹ H° Áƒ*\ȰaÁY@°iS¢ ¡ s(U?W’¼„a§F¿ VKKTDè…0ÇK #và .J2^ÁaPÓ­Y½n(˜0AAˆ<¥~È"áÅ`ŒŠàK`À@ ‚ÐÚÅ¡‰ArT#²ÆNG‚ˆñ±Ç•O5`EŒ×P¤!V%–'<< öðEÁA`+T!cÔeâ‚( )4Vq18cH 5"ìŒÀÆÖFŸ 18@É”;.Jœ@#i‡ 'q,hy`0À€-KiÀ"¤ŽDVL}À„PL‡9GÔT+𔆠§ 2áEø%J›@À2`(ã •™õ y!A€E0çP1ø 8`@;TT_v224_html_docs/images/arrows/large/orange/down.gif000700 000765 000765 00000002163 11222361074 022372 0ustar00abwabw000000 000000 GIF89a÷Íÿÿ”ÿ§-ÿ{„jÿ‡ÿŠÿ‚ÿlø°_þþþùùùýýýÿtÿ„„lþÿÿø°]üüüÿþýÿ§.öööÿ|ûÿÿÿÿýÿ’ÿuÿ“ÿeóóðíïðø÷÷ø¯`âäçÿfÿ§1ÊÐÊËÍɼ„JõQÿ`ûûû¾¤ŽäõÿŒ™ÿ‰y ¨1³†Xõõõ—|[ø±`ü‚ÿ}øøøÿ¡‹e@Þëýõ·nª˜…ýˆv2ÿ¨¬qýuíÿÿÓ[ý@³0ÿbÿ_)ÿYÿƒÀ°—ÿ¦$¤LÀ ‚ú¯bòøÿÃeøÿÿãëòþþÿúmšk>ÿjÿýüæåæïïîíìëÇÇ´áðÿ…I¤…lÿmžƒnå÷ÿªw@ÐÙáÀ)¹@ÚÞêýþýÿ¨4†iþ‘ÿUþ|ùÿÿÿWéèçßñûâèîäùÿôôôÂËØÏOÁ`…jý{ÿ©4õWÿ™ðïî»§´‡^ù°dáìôáí÷äiŸ{ZóðïÜäà”)×èñíb¸µ¥Ò(aÂ'´¢ŒñZ¹¼¼ýþÿ¦ˆ^ÝçôíöÿÛ;àHö¦=úd–PÖçôý¦Bÿaø°^þtêéçúÿÿýt…kèæèıŸø_âìößêøø°\ÿoæèçÿºTé6xÿþþÛmÿÿþèðúœ†hFðÿÿûVñ‚’Eãæçóóò£‹rò‡Œ6ûdÜîöÿˆââäÃw#ÿ… 8ëêê»Qy$ððïÿäíøÿÿÿÿÿÿ!ùÍ,ÿ› H° Áƒ*\Èð Kí•g `¼8 ŒŠ(¡|bbG  R%ð” BËP0I‰QiA³ d8±Ú3‚‚€Ÿ| PÓä¯F:t  G†P£FÝÀ¦žB”’ DãÄÀ`Æ%’á.;s:4ƒpÈe ˆ×…ÀމAµÊ&f²h)°Äƒ‡¨A¨H*†faöç 1 2g¶ ÇM1^@‰X¥–&H6D5X­á“†;_6“QðU³0°¨BÀ;ŒEI"â2ºà”+–pà ÂW ääúpp³CˆÚAÄÔ%d$–ùPxðï$a”ØâÓbÆŠ8)Æ‚ ¤W+8'ÌøH¢ÎBë]°Àˆ#/,2ˆ10$ 3L¸2Ì#thaSCi¼1Æ/‚Ry IP[ÜÀ!A;TT_v224_html_docs/images/arrows/large/orange/drop_down.gif000700 000765 000765 00000001126 11222361074 023414 0ustar00abwabw000000 000000 GIF89aæÿÿ–ÿ²²³ÿ‡ÿÿýÿˆÿ€·¸»ÿÿþý‘ÿ‰ÿjéKÿµÓÓÔØÛáÿÀ½±ÿwü‡çñóÿ­5À¾´¦s±¡‘çùÿÿ“ —pDÿ[â{ÿ½Wÿ™ÿxÿ¶WçP…G šmBÿÉhnJÿ¡ÀRéùþ©„[êO¶€Cìóýÿ¥.ã [“ùm­F¶ÔÔÚ¢*¿ŒUÿƒã¯¡•ŽNJ ¶¶ºÍÎΧ‘sÿvçøÿôÿÿÿœ¶Œ`üjþmÿcÔÕÕÿuÿ«9ÌÍÙÛ`ýRøÿÿ‹Hëðõ†n©Y´w8ÿ¨!ÍÎÑ™/¹<Ã:|H’ÿÉ}©gýjÿ¡ ÿÌoù`åðóÿŠíñ÷ÕÙÜíðó{ZÿrÿŽ¿‰J¿j ÿ˜ÿ—ÍÍÎýtîýÿÿ™ œdÿÌs·¹ºã¬l¡9‰ÓÓÜ£Pÿÿÿ!ù,³€z‚ƒ„…†‡ˆ‰Š‹ŒŽ‘f?tnd‘RE8j-gxI+u\s&:]5Qr0`K(_U%.ŒVT"/mD SLŒkiÍ l3>Œ)q cvŒeyG9MPX!JAo2W;Ž< h ^FYZà4J GÂHÂŒ°qÒ4œ°ØrâI$!=bÜ!¡"’ 1@0Tð¨§!“$SªL;TT_v224_html_docs/images/arrows/large/orange/drop_up.gif000700 000765 000765 00000001134 11222361074 023070 0ustar00abwabw000000 000000 GIF89aæÿvþÿÿÿ‡ÿÿiÿ€ÿ²³²µ¶´ñúÿýÿÿÿÿþÿnÿ‰ÿmÁ~;ãéï†ÿ—¦ƒjþŸA+¶¨œ +ðøÿ}+~ÿŠ´®¤ÿÄSÿ~ÿ•°~IÊÎÐðüÿÿ )ì^í~„¨{Jø[¨Žqÿ¯EúbåæèþpÎtËÐÉÿš ¶ªŸÀbÿ‹àI¹WÿÃm¾H°;ñÿÿéð÷2ÿ† ¥~“Y ÿwžX õZÿ ÿ£ýdÊÏÉåèïãëøÎ˜[ƒS#Ä¿¼ÒØÓÿ³Oÿ¥ÌÐÐÿqŽÂÀ%•wZòvLÿc…N××ÛÔ3éõÿÑÙÕµ§¢ÒØÖ­'“d0ÿÓÙÖÿ±I‡îLûdÿÔ‡·¶¶¬:©ÿeØÝàÿ’ÿ–¤r@ÿ¥0È–]¬_¸¸¹ÿzò¥TìøÿÿuȈ<ÿÿÿ!ù,¹€w‚ƒ„…†‡ˆ‰Š‹Œ…ˆ,1F‘…)ov'G—‚ =He.9— J 6*MCpP ‘:Rsa0B%^YLkl5[Wm# _S@jŒ2n< gŒq73?uërfŒ!8O -$NŒt>X¤©B„ÌŠ.I04â²#ÊAh Éæ’+b"˜Ð@eÉ¥wDA€àE‚; ?©\ɲ¥Ë—*;TT_v224_html_docs/images/arrows/large/orange/left.gif000700 000765 000765 00000002203 11222361074 022350 0ustar00abwabw000000 000000 GIF89a÷äÿ{êêìÿlÿuÿtÿˆÿ„ÿ‡ÿÿeÿfÿ`ÿ‚ÿ…ôÿÿÿÿ–ÿýýýýÿÿÿXöÿÿÿšèêêÿ %Òæö÷÷ùüûûìêìÿŸøÿÿüÿÿöX‘GúgÿÿZÛîîþýýþmÿáSÒáöÿ’ÿ´Qñóôÿžýüûáóú€ÿüú×ëöìííÿ·YóùÿÕéõÒàåÿvÿ³NþtÛâêíÿÿÑäöˆ3òNå¤_×ãúw<…)þìÿÿÝîö½¸§‰I Aììëÿƒªr1øûÿÿž%ÿ¢öøÿÿÅnü­Z•uTóòòÿ­; ƒe&¯‰e¬wFððð¤xO™gã–Gž ±¥‘÷üÿûZãàÞÿ¸fûûûéúÿúúúÿ¦ÎNöôöxûüûKÿ™îýÿåâåÜ×Ñÿþýÿyÿxÿ”ÿŸ-ÿaãS“P­†døøø¨“{ÿÄoÄ,9ŒZ&œÃ(ŠY)ýûúÿÍzÝ7ùøøÿ•ýüüÿ¶SþþþÿÿÿìëêùTº~@üúù÷öøùþÿ¤ˆnêììÑãõððòíSÐFÓ5Îǽòññ÷ÿÿÿ¿z¬œ€Ë™eöºw¬€Pà@ÿ“ÎÐÌáñùÒç÷È¿¹Á‘[Ñßô…%þÿÿÿjÿŸ.Ž=ÿâéïÿþü±Šgƒ#Óàöíóø—>þýü‹Óè÷ÿ‹ßíñÿ¶JÒâ÷¤‚]¿³£×…ž(­*ÿ¼>çòÿÿkˆ-âçîúø÷ó¶nÿzÿ™ ‡j¼®¡þTÒàöûÿÿÿŠûnëëí£wFœ~3‰KÓéõ™XÿwþRûùø”Sâ|ü^ú]ñòò|5üüüÿÿÿ!ùä,ÿÉ H° Áƒ'LXu áÁ(¿ôÈ‚#)–C‚§|}¬ 1 ÉÅ邪S¡ah² ±$a->¡’IáÅE‡n´–´,ø¡— }t`pcÁ²<©8°)¨‰J2ŠžŒB´„:mž]7ÐÆ¤GSXØñA„<¡b«ÀpÔ¼Ôh…¢@x£Ù= ¤W®ä²x³¢Ë“W 0 ¸AW•þ Ô’¢Áe2kÖLçÉäÆØÂ”CÛŽ¨&€ZÚ ’e0â('Š ØÍ[„1S  A3Fœ°K¬(HÀ\8"¹@“{©Â.fªüˆ¹ómw³°I`ˆÌƒƒperF‚ 1nPLPÎN= dh›#QkÌ0Mm †fx‚E5‚|‘Ä4Ðw$NTPÂÖ\CÊ1›„DŽ Ü„ñ ¥ÀÒˆ„%rH [TqÆ"ä;TT_v224_html_docs/images/arrows/large/orange/minus.gif000700 000765 000765 00000002102 11222361074 022547 0ustar00abwabw000000 000000 GIF89a÷ÖÞçÿžÿÈvÿ®%¡l6ÿ¢ÄvÄ|ÿ¥1ÿ‡ÿ ô]ùÿÿÿ‚ýÿÿÿŸÿ{ÿzÿÿ“ÿkæñÿ¡m7ÿÊ|ÿ¤ÕPÄQü§7ÿ¨ÿ«¼¯©ÿ¯(ÿ²ÿ‘“Tæòÿ£e)ÒÔϺ°«‰9ÿÉv£„tì‹é†ïþÿµ<ÿ¥°™Žÿ‰¸,ü‹Œb/ÿ™éñ÷«<Är§HÿÿþÕÕÏÙÙØÚÖÓÊÒÚÖßç¨n=ÁT¤Œmêöÿ‚Kÿaëûÿ¬E´V¤e1üÙàçÿЊ¥[áíôþƒÓÚè–e*ÖiÿœŸˆqí÷ÿ¤o@ÿ¾Fÿ}†?–m9³¤ÿþr¢k7éöÿÿ‹øÿÿ®)ý†ýréûÿþ¢ÿÇv²1—0û˜äîü§e$ÿ›ÿÈwüÿÿúhü—ÕÜç¡EØàá›j8ÿ”Cÿ¹á`óÿÿÕÞçžKíýÿÿ€C’Kÿvó`ÿ«ÿs–l9ÿÄUêk—R†>×Þà¦xOýv¡k6ÿ­$üx­†l®¤”Ùâí«™’ÕßíØn¢i3ÿ°$ÿ¤1ñxûÿÿý‡ý¤1Ô>ìóúÑeû¥0Í×ÞÙ–QÖàéÿšÿ¯+ÿÌ{ÿ¡j7“:ßêóÍKd=ÿÿÿ!ù,ÿY H° Áƒ¬¡Ä‡#BŒ#*’ƒ;˜Téb œª„ä‚…ZR …0c hsÁ %TªY³¡©F–:àƒ ;* ˜ç‘'( €êÔªe:IÁ à“=8Kvì .V`™dÐÁ hÀ1@·n6£pHBXA& In<ø“”(C¼ÌÁʃ‘ [ú ˜ŒàÒ&¨L(,BO1 BÃÐôEÃ* Yõ!A L91tTjV ‚¨º!G‹lLqp›Uª? â2&ƒŸ&ÅY¹ÑÒ‚…7Ð@Š. NDœ™Á‡»ÀDvb„A4ÇüÀ„²èpOL&úøóëß0 ;TT_v224_html_docs/images/arrows/large/orange/plus.gif000700 000765 000765 00000002137 11222361074 022407 0ustar00abwabw000000 000000 GIF89a÷Äoÿ”1ÄhÖçôÄq¡ZþÿÿÿˆýÿÿÖâòÖâðøÿÿÿŽÿ—ÿuÿ¢1ÓÑΡXÙÚØîKÔÐÎÕèõ£c#â‡ýqïÿÿ¡Yÿ€ê÷ÿ˜'ÿdÿ«1ÿ¨1Ç.÷jÿ¥3ÿLÿ³5ÿŒÃp¡T ÿ£ ÿ²+ö·jÿžÿ‘i9σ.ÔÚâÄtÿ’ †@Ó×à×WÄyÙîøû~Öäôì÷ÿÿ¨)ÿ~æìõát&½¸©ÿqÄu—h9ÿ“1ÿŽ1§}Sÿ—øo \ˆ\*½c¿±ª¦]ÿwÿŸ#ÄgÿÅnßæîü“ ÔO±aÄqÿq»DÄjùgÂ8­“{¨4ŸqIó›-¢\ýwÿÅTšj9†6ÿ£þQBÿ¡ËÐ×ÿ¶A´¤–§tDÿ¾Dåïúÿjè÷ÿÿÿÿ úrûÿÿúÿÿørÿœÚÚÙ¦N¡X ÿ™ÿrÀHQÿ—¡Z‡?ÿ˜ÿ£ìûÿÿ_ÿ“çˆÄnË:ïýÿßSÿ£-ÿh¤ZÿÌiÖåòÖéõü†ú]±ÙâíÖàì·4êPåoâ_ÖÚß×åèâx¬ ÷YŸ‰mŒ-ÿƒÏtÿ­@£l›2ÿž¡W¡WÿfÄ{ÄXâ†ÿeÄfž&ÿ³2ëûÿÕàïèùÿÿ‚ »$Ù˜T›kBÿoìòúücâ}édÿfâv–`1ÿ©ÿ¶K§Œy¥f"Tëñùÿ‹—b'Äl—[#ÌÖÜü†1ÿ¡Z­¤‹¢Mÿ’ÿ®0÷ÿÿÿŠÿ‘¢Sâ„&õýÿáìóÿÿ°:ÿÿÿ!ù,ÿ¹ H° Áƒ4 «6… àa²f  +rkÅ $”Úd$XÉ”GaH¶„ÖHn–¾ –B/Tº YqV„mƒîÄ!+Í!GâÐQ¨ À‡f‚ö\hŢĈQÊÔ¼IØ”‘‘h†ª¬ÑâŒ4)JpÑ@˜@ƒ à ²ñ€ 9§vd‚Fá`@ x= F8ö§†˜i!¡ªö – \Ó¶‡¨>BxÌጰ$ 0$€$0v®‚pp€žZ¬ðaõІ9"¦˜J² á€TMr5r£É³,‹¸˜ñD(a@|ypµëH¯Kc@e<ƒÉšªB“>aÒÊÅ2Œoä!QfB¢~~dx)‹˜­°ÌðŒ/ $2Å”ÂI)ÂA F(áK;TT_v224_html_docs/images/arrows/large/orange/right.gif000700 000765 000765 00000002222 11222361074 022534 0ustar00abwabw000000 000000 GIF89a÷õóÿÿÿ{ÿ„òÿÿÿÿÿúúúÿÿtþÿÿÿÿþþþýÿlæ÷ÿÿfÿþþýÿÿÿ‚ÿƒêèçÿ‡ÿ‰û\¿°§þeÅ+¡+ù^öÿÿÿŠ} ÿ~ÂDäðþäðüÇÑÕKøfþUEâìóÿ ÇÈÇÿ“ýüüÿŽ£r9¹ÿsÿ¦/ÿkäçíýjïÿÿÿhØVõõõ³•wÿ”Lÿzÿdÿ™ÿþýäåäçç籜Œÿu ¼b¤QÁ-¢”zçí÷Þãìv2ý• ¯n#âñù³ns8ÿˆŸwOÿ‘ ûÿÿðMÌ3ÿ¢,ÿuµ*å"åp·°Ÿÿ†ÿ˜ÿŒÿ¬,ÿÿüéUÿ˜ûmÿX¾Cÿ±9ËŒ<ðïïõôñ÷þÿÜïüûûûôøÿÿþÿø÷øãéðþþþëéèÿÅk™~^Ÿ`Ÿ[ãâä•ôŸ3ÿ ÿw›<ÿ¾Lÿ}ÿmåìòý_ÿeÏyÿdôóóÿ_ÿžg(ÿŒïîîw#üÿÿÿqöõô¥(ÞNÿ©,úWÿ‡ãòþüüýðòòÿv÷iÿ†ÿ¬'úÿÿëýÿ…U'4ÿ¤"ÿœ#1”h6ŸXáòüÿ¢*–qHâæãQÿ—–b-½¨—Ÿb Öàâÿ—Ýíïïîíøöö¤ƒ^ÏÜÜútÿ˜ÑbÑÆÂÿÿ|áîõÿ”õõôÿ™äìòýþý“%ýýýÞñþéèçÂ}&áçìÛäïîíêÿ‘ªžŠþýûô¼q—}bütÿ´G¦g#¤S ýúùìóüøY÷¬ÿÂ\ÿm ÿ®Aÿ­7óòñúdõÿÿÖKõôóÿŸùyøÿÿUÿ·<­‡cÙÙÙ¡n;…U$ÅÒÕÿˆ9ÿ•ÿLžl;öpÿ€ÿ§,ÿ¥÷÷ù?ëOÿÿÿ!ùõ,ÿë XOÁƒJ,A„±p[u/6±ÅÌL lÌX/œ99Öø`+fêÖ†zm&pèY¼ošÆáY"ëØ">`•-O-_† •Á-È42  £Ç:¼r¸òREªjÜ,“Z§Th äbž’!P<6pÀ(P(2q˜ðd ]R}ÊB¤\šˆã²%‚€Ç@H' B2íh4JŒ Ñ»B‹Ö\Ÿ¢hKûÃÙ\ÿ†~Cÿ‡ïÿÿUîÿÿñþÿû^z@—h:çõÿFàáæÿd½q$ùÿÿú]òûÿèÿÿÿ”)ÿ|ùúùÿÇj¨¥wF‹>Ë8ùøöÿ¥5Í×Ùÿµ”rÿròóôÒI¹¥’ÒÔÝ~F­s3üûúÿŠÿ„ÿÿþ™_çöÿÊ5ÿjÿpòòôʽ»ÿkò™?ðÿÿÙäëÿŸª“~õõõ qBóþÿöõõáî÷ÿ¤&ÿª>ÿ|ÉIÿ³Lü]÷úûÿ™îììû_ªŒ~óññø÷öØ>²Ÿ‹åèë©|OÿÿýÐÀ·òýÿÉ¿µz?ûúùÿº=ÿ¦8ÿˆxUýüýŽéÿÿÿfÿÿÿ!ùÀ,ÿ HP £‚K0'Y æðÀgÖ^z‰%fŠ“J ne$(¢ \Mé¡a$°#¤ô„Ò˪!­F’¡%×"‚P¡AäiQÆM$J€CŒ»&œŠG‘•'²xaZ 2¹è‹® f6y ÅD- Ö’#Š.ä¥ð¢Å+L .¢Ã‡+Áã .ºrg !˜3ce¨Jš<'ÌÈ‚G’¥¨S£žTaG :‘ ÓHHœ_¸së৤O a©`j€ñãè Pµæƒ«>H( Œ²ç†سc?a!RŠ^m@±?ÈL‹2¶ØXÏ~}‡0‰jd‚µX† Ψ°ã«¿ÿÿ¾¸A Ä+ ¤À‚ 2¨6pR KVXP@;TT_v224_html_docs/images/arrows/large/green/dot.gif000700 000765 000765 00000002114 11222361074 022032 0ustar00abwabw000000 000000 GIF89a÷¿þþþD¿JLÃRÿÿÿ6µ<=¼C=»Cûüûëìë,«1ÿùÿÿúÿHýýý1±6æçæ,ª1ìíìÿñÿÿþÿ1°6ðñðÿóÿ6·<åååQPÆWïåïKzMf úíü;ºA/h0bùùùKÂQ÷ù÷&¤-µ½¶œM–Qþÿþ—?¾E4´:Š¡ÿðÿ4¸;MšRKúúúX‹Z>¼Dõëõüýü%›&ýüý!™&v3­:…%ž&jX7º”ܺ‘C’¨40ˆcÀ%L øè€bU$2ˆ@x`€Bbä)Q“Ä̆CêrÇ¢`Áj`pCB}BG D@€ ‚£åýb_€;TT_v224_html_docs/images/arrows/large/green/dotminus.gif000700 000765 000765 00000002116 11222361074 023110 0ustar00abwabw000000 000000 GIF89a÷¾þþþOÄUíùîžëìë/¬4åååæçæÿùÿÿúÿûüû­ìíìÿñÿýýýñùðÿþÿñùò™HÿóÿMÄSðñðbñòñî÷íïåï:k?ÿðÿnnL–Qs­ÿõÿ&£+%¢*„øøø‡ ŸìîìX‹Zýüýôèôöëõ|É$ž&/ª4X‡ÏŽìììuVÁZ‡ ˆ0ª4‘lŽlv™vƒç†vwŠ¡QˆßŒ$ž(ùúùjÏrïæîSÆX“Ù˜òóòEÅLlÔsÉÎÇþÿþMÃUÊÍÊWÈ^ðàðš"h‚iQÅU.©3õõõ+­1n£pôåó÷ù÷Dœîøð]‰^[´aêøìöôöúèù™Ý(¥-¶½¶=i=£j&¦-”¬–+¢.j&¤-OƒQµ½µ®e˜Ýœz×}úúúþôþT,{18z;zÎ!™&.c2/«4Õ“ªy(¤- «IxM9¸@ÿîÿ|å­c‹gf W„Y%¶-†ä‹kÐoMŸà¥›â”-½3%›&+ /WvÞáßWúíüÞâßL™PBxDöööÅÉÅüýüK´Ã·[Çb¨¼©®#WÄ\êøë‚œ…÷õõ—í›N{PUÔ[ ªff0¬5$›(ûüü$¡)¸Åº›­cÚj1»6ëêëšµœPÆWùùùNÄTÿýÿ…/©4÷÷÷2i3ÄÉÅÿÿÿÿÿÿ!ù¾,ÿ} H° Áƒ*\ȰaÁV;ž Âá)„/M %u ’‡‘:–Ô,éµ*a%-1H½ ‚èH s2Ý‚ƒpP‹C† … ¬?t¼tIb“ *TÀ–’¦p™‰SÂ`Ž-FN±±`Á+A}=*Ô ˆÁR†õÊ!ƒYz}9±‹ /éqÓ‹‹€¿Bõ"rãNS8ù$aÀ¢®`‘0†„@ ÎBËÆ‹x H•+ $+,„@ÈÄiÊ€á3âÌ M è*¡’{X¹ø¡Ê‘2‘åÀ Š^¼&MhéÃ…+rÖP:P ¡‚^jl+Ø”HŒ¨*`Âë}‚ P`a@†ö ÁÀ€ R4ç/ø 8`@;TT_v224_html_docs/images/arrows/large/green/dotplus.gif000700 000765 000765 00000002116 11222361074 022740 0ustar00abwabw000000 000000 GIF89a÷Åþþþëìëÿùÿïùñ™›ûüû•ìíìÿñÿÿúÿýýýæçæ†åååÿóÿðñðÿþÿWXÌ_„ïæîQšµœÿðÿl£rïúðHµ&¶'˜Ýœëøìøøøúíüþôþh‚iåöç™íž «äöæh‘ÉÎÇ£ªD³çµN{O+­1u* /*£-òúóìîìñúðüýü]Š_®dÏj/»4 N _ïøî%¶- ´'æöç.c2v™xôèô^Èe”¬–éøéùúùúúú€Ñ„ûüü&¢*†ä‹êøìOÄUÿîÿþÿþÿõÿðàðFÅKcÚj[¶`ôúóçõè1»6 |ÉõõõBxDÞãßëêë"š'c‹gÿýÿ„œ…kƒkŠX0ª4W­æõè†ÊŠììì:i=lŽl2«7L–QÞâßnnµ%ööö™ÝšIxMMåöæGúèù°èµoØvïøðŸOƒQóåóëøëŠ¡‡¢ˆ‡Î‹U×[„f ñòñ‚ç†RÄX÷ù÷¹Å·öôö8z;e)£.,{1WÁZ‡ ùùùT™"”Ù˜‰ïå屮©cÊÍÊPÃV-©3 ªõëõ÷÷÷¡à¥/§49·@éøëW„Yòóò†Ë‰“Ù˜2i3÷õõ(¢.i¯#ýüý2­7jÅÉÅjÕn{æ‚ÄÉÅWÄ\êøéL™Pµ½¶X‹Zµ½µ{´Ã¶ZÈ`vwŸÿÿÿÿÿÿ!ùÅ,ÿ‹ H° Áƒ*\ȰaAGÂÈŒpÃIJ± ½Èɉ-%»þx"¶$a…Jèp±gÂ-J“j‰I‚0Ì–&E€#Ö!XSô<ŠbœE¹>Í0€£'†(Âà+TB¥)pJP&vÈ@• •Á?Hó¡‹Æ•#}ˆÕñà C »°ð@ì ‚8!¶*… ö‹À°'ð4ˆE`Å!;P¼€"Ë™7°¨90«( ƒˆ@0Q%’4í,3ÃU 3SŒ*˜ ¿˜RµF ZxUø²À ,b¸ÐäyÕ©G¤—|…`` ¡b)+ºÃ£Í˜@›ÐÁ뽕 <å€M#ö  I„ @\4çP1ø 8`@;TT_v224_html_docs/images/arrows/large/green/down.gif000700 000765 000765 00000002153 11222361074 022216 0ustar00abwabw000000 000000 GIF89a÷Óv‘xPÆVLÃRmÒrƒÒ‡=»CýþýþÿþýýýùùùD¿J,ª1D¿Lþþþ=¼Ce6·:üüü6·<Eööö„Ò‡E¾J=´C§º¨óçóK’¯“ƒÒˆPÇVæåæHÊN@ÁFcÜh1°5õõõÿùÿQvUæäæLÄR1®6a6´<g3°:ôôôýòýMÃRýðÿïðïMÃSt˜"kŠn1°8øøø, 1äâä6µ:ùêø9Ã@(®+>¼Dôìô š"óóórÎyF¿J¾½¿èéèîàíqÌsðïðíãîu2°4LÁRiÑpFÀJâÝâ„ÔŠ/¬2óéòÒÈÑmÒq$¡&)0mÒtA¹GWŽ[Zòäñîãîñóñ,c.ñåñÿïÿÝÕÞ h$&Ž*ÿþÿi|›}ûôúc˜¬—%¡*ÏÏÏ÷ø÷B}DTƒÒ‰¢¸¦˜#6¶=%£'WOÇWG*­1D½J1°6NÄVÿûÿÿíþ•#ðòð‚%¤,&¥.^üþüww‡äŠ3²;u’x#›'¾Ê¿ŽÒ’ìììhŒièçè\#ëåëðèð7¹ŽONÂUûûûÝ‚EÀKè×çC½IC¿Hš#IÀP^_n­q[Š]5´9XË^}Û€â†~D½JéÙèK– -¬2?½Es™w~ÀƒbŒeàãàêåêh•i•§´§&¡*ìÚë„äˆFÂN÷÷÷ôõôíëí0²42°7s—vdÊiÎÐÏíÛì)¦.+f,ëëë@pB6´<þþþ˜Ýììì\Í`V!åÜæÑÙÓ›«1w4r¦u÷ëõ]œ_>q?YËb€ (£.RŽTDÀJùíø=»CpàuLÂRùûú+ª.ññò# '#¡'l·oòóòD¾Jw‘yhðÞïœ$TÈ[UÉZbÌgîÜî;ºAøøøÿùÿ—ç›óóóNÄTrŒrl‘o7¸;úüú” °»³QÆW•ט^ØcëÙê,«2?¾EqœqêÙé…›†,¨0âãä Y íæíWc6Å=–žê¡&e+dÍh2²7²þòýz”{þÿþñßð š"÷ì÷‰ÛJÁQ‘¤’fõðöu’x‚Ñ„ ^ñòñ1¯6H/¬31®8'¥,i!sSÆYNèàçKÂPïèð;»Báƒ4·:6µ<'¤,c„eþùþÀÈÁ‘ L¬Q*«1ôèóøúøPÆV#m%ÿ÷ÿ$p+JÁPïÝî,«1ø÷øU ŽÏ‘ª¹©/±4óãó[Ïbêëê+p0¼Ä¼:»Bb2³8ìÜë ›&\ÉbC¾KveÎl‘VÊ\E¨Iüüüÿÿÿ!ùê,ÿÕ H° ÁƒHhP„µ)”0A0Åp ·D£!cãÆIE1ˆÊtù4pteÉHµ,Ê}ɶ‡•‘ RqçÒÜxæb‚ƈÑP•fŽtýùЬ€tC”: X(½ Iˆ#áP\‘® ¤Sã2ÆÁx‘‡ÃŽ6-&µZ¢V]tpVýÔíM€Ã‡œðf¥ïŒc¾Ù`ÌÀÂPt-V ¾D8©‰BBʬ*°u@T²LÑÔÀ Í&’j]’& ·€¨ñé»(¡1 "˜›³Á­a®ôIqª¯ºÓøÒ³k*%u0`f°ãCÁë'4ÈF ­\žÂÅ(‘ÄÂ… X j˜B#0 s#:8€M+ DÀ ÂJDà(Ê@‘Br3€ ¯$€EEÈR‘:,C3©˜¡‰6V´À †<€\¨;TT_v224_html_docs/images/arrows/large/green/right.gif000700 000765 000765 00000002221 11222361074 022360 0ustar00abwabw000000 000000 GIF89a÷ïÿûÿÿþÿþþþþÿþÿÿÿÿúÿúúú6µ<=¼CD¿J[=»CYÊ_ôõôüýüïçï1±8LÃRóôó1¯8èéèSÅY,«1ýþýñòñKÂQÿöþÿõÿ6·:‘C½I[ËbJÃP÷é÷÷ë÷0°4`øëø—!2±61°6)u-+ª0“£•’"6¶<îïî;j=gYÐ^eÏj$KÂO1®6'¥,"Ÿ&§´¨!•#ôêó3±:qÚw„¡…ýîýïïïøö÷c,§/üüü R=¿CeÖk6µ:íæí4´9ÿüÿTÌY6´9’¦”E IUËYbÍgRÅY÷ñöéáèm’oGn×tkÔq6·<pC½J-¤1/ª3*h/—èœÝ‚`‰b;»B»C9|<7¸<çèçIÆO5y76¶;òòòbÑgÈÈÉ_Ëdæææ+©0BiÉnÿøÿ%¤-êåêîîîRÆXéêé}·0®5E¿KI<¸Aˆæ‹Tæ“F¾N o#VÉ]PœQŸ±¢äåä[*¡-hS‚Wn‹o©¶ªs™s`©cB‚EfÎkùëøoŠr˜ Q2¬7ߨÞCÎJ‡| aØf&£+ZÉ`wÞ|õõõûûûéàèlÚqB€GQˆU÷÷÷>{AB¾H_Ìeÿÿÿ!ùï,ÿß øNÁƒ 0!Ô˜IjØð°;ÕÔMÓðîEäx9V Ò2;k¼ À0at_®A±R&×)*çðˆ°;•‡Ü kM¤hI°«+ FùªPá:N=Ré€ X³¢0ŠA ŒŒÑf O•ˆŠ¢]‚T ´Û„ìI¸-hàèú®@Š%Â,@°ŸUlŠxëMW.½"–„Ã,GhkG+pœ*a™,“`j €0áÄn\P9£¥JÈP ,©HcÁŸ[¦ú¸1öâˆ_B›#Dœ]ž&=û¦ÀÌŠBH\EnHjÄ27:abAbX6<‰J¹0wPÍ™&rÐKLœPPNB ¢ "Yð± ™<`ˆC4¤H AèQE””ÐL/ã)ôŽ-]!M7>ðâ Q4@`£Ã"4PÇG °Ž,?DÒ!E;TT_v224_html_docs/images/arrows/large/green/up.gif000700 000765 000765 00000002140 11222361074 021667 0ustar00abwabw000000 000000 GIF89a÷Â&¦-)W,êëê,ª1q1°6=¼Cÿöÿÿøÿqìíìþþþüùü=»Cüýüÿüÿüüüÿùÿïïïþÿþ÷ø÷LÃRÿÿÿr&§+ûüû&ª,,[,ÏØÐSÅYõéô6·<ÿðÿJÉPÃÃÃýïýSÇ[DÀK5´:4¶;OÄUSÆY–íšæäæSÌZ™ë÷õ÷4…9õõõõöõoØt/z2øúù"¨&ùùúéçéYÓ_ˆ Š6¶<êáéóèóC¿GúúúP€S\ÌbgÂpÿýÿa F¾Lúüúóåð(¤-6¶:\“_LÄRŠÜŽ6¶;h { :»?/¯4ýÿýÿúÿ,x/?œF'+ñòñóñòú÷úhÞm+©0AÊHš°œ €•WÇ]s“uk‹k1±6+ª0D½J{Üo+®0YÊ`(V)ýôþÒ’MÄTj‘mçÞç,\.òòò$¤+6·:˜‚^PS$­+MzMºÄ¹v]Ìd¹Å»/š5óóóøùø0­3>z?¹Ç¹ÿþÿ€â…1®6÷çöiµl?H’Ih¨mKÁQ'V*2º9\ÅbDÀIXÊ]oÕÒÔ^Œ^*®0DÀJRÅXKÍQY…[k“liC½ID¾J7z:{Ü€ƒ¢ƒýðýa‹de‰ebˆc×ÒØ"ž&N6°;|ðððƒ .¤5nÑs6´<Ÿ±¢ëìëYÊ_cf:»@•¨—>´AhÓl×ÛÖY†Y)W*QÂU9v<&‘+„ׇ¢ß£ZÉahÌmããä$(ÿ÷ÿÿÿÿ!ùÂ,ÿ… H° Áƒ [!Bm$²àÀ¡ÁZ°xíz±ç‹ìi1ˆ #X&€Ö*‘ _z²ð™s€È+—–¬Bó ‹)‘"±˜ÃP§/•RtÀ¡ Õ)Ó«‚"%PX:%" „¡‚Ð"ÒcJšBœÉUÈ…Ê‚xÉ(«»lé"KŠÍ‚w±arB9¬>˜xb§ÉŽr¡òÈ”˜3‹!Ä(˜`6ªá„k––1R«Ný§ÆQ2ô¤Ë†8rëÖ}dR[#bœáE)`È“+VÅ p&)e&ë¬['pR¦C?xH=X ¦ i¨_¿þÖ¢7¢ÜÜè³!ÛÏŸ¿þO+HÁ@~X¡€$¨ ‚ ¸‚ ®$á„;TT_v224_html_docs/images/arrows/large/blue/dot.gif000700 000765 000765 00000002106 11222361074 021662 0ustar00abwabw000000 000000 GIF89a÷À¦ï®ðþþþ î°òµóýýýëìíóæáèçèýüýºò™ìÿýðšíìíî¬ðÞàä’ì$c‚Åÿ‘ÞZª±»½çåãöööÿõêÿôë\ƒ’·ù—éÿ÷ð®ñíŸíÿïæ^­ëììd´>pëííA~˜ ¯óŸ«ðññgÆëD}‡×¸óüüý§øxŸ¨fœå¯ïuÑ‘æWÚÿïðñÿÿþÃÏÏþÿÿ8|—Žâ6Ìÿ¹ò&e„¥ïD‡¢JœöÿÿúÿòèKo*ªÝRœ·õõõöôôTªúúûpäÿq™ÿÿüKÐÿÿÿýæÿôç¸ðëêêÏÿ¶é§ó[z`t›¦ŠåHƒšúìä²»¾´ó¶õ¯òñòòÿùô˜í˜è±ó#‘·˜ê½ÌÊf¿à‹²Àtº÷÷÷¦ðL¶ÞøùùOwÿýö~Ÿª§ñ¸ó¦ÿÿëäQvµñ¶õõâÚšì4Èùûüüûëä7†ùúú_Òú6r‹b…‘.Ç÷AÜÿ¥½ÄöùùR£ËÍÒ”ëv­YÃêñò󓿝óŠähÔûFhfÄÿôêh–¨çåå`»”í÷çÚÿûí¶ÅÍ\‡ÿÿôaŠœ3tާ´øõõrš¨Ÿî‡á¶ó¯ñÿîå¡ï4|ÿõð¬è)Œ´(Âþr’ÑøøùDhÅÉÏ¡î†ß°ÄÌQ‡›QÚÿ'qŽ!ºó ìÿÿÿ!ùÀ,ÿ H° Áƒ*\ȰaAP+q8µè #ŒZâÆ’¡9k|8’¢ a0- L ”ˆ"-QnÙy‚pW¤¾`,ȳàJX³ö4éaPW,^AT)À´@ J½ªeP“Y6Ô”!À•¥´Rld”2 X»vˆ]¬<P°×CèÝ‹GN.HP$òBÆ\·B%âœC#|cA4€0pàÀCš"wé0(*Ô #8$t’ðèÇ$|þ`ˆSp0.0…¨RéKª\$NˆA€cÁ’mêrBƒS#WI.°J@aŒ#f±ui‚Od# ‹P©3 |ÊfS Fä (dæÁ,˜wß¡`;TT_v224_html_docs/images/arrows/large/blue/dotminus.gif000700 000765 000765 00000002111 11222361074 022732 0ustar00abwabw000000 000000 GIF89a÷›îþþþ¶ô‰êèùþëìíýýý›íýüýóæá—îæøý™ëÿýðìíîèçè’ì`»$e‚ÿîåßàä^­±»½÷÷÷YÃêºò˜é_‰œçååˆéâõý^{ÿõêëíí·ê·ó*rŽ4|Nw>pFh)Å÷·ò¸ôðññ…êûëäd³SÙÿ‹²À†ßÿÿþ"“·ÈÉÐÿÿü9†Žâ ºó\‡½ÌÊäøýëììõâÚ®ÄÌùúújŒÿòèÿÿôâ÷ýöôôÃÏÏõõõ‰ØSŸ¹mäÿTªnÎñjÙÿ]Õÿíq—ÿïæoÑúüüý¦ò¦ÿU}ŒQvñòó²ÃÍ&e„ÿûíæùýøõõÿôçÍÿÿëä¹óŠäõœöDh]€‹“æñòò¡¹Äøùù²»¾ÿõðfÂïðñöööÿôê”íÿôëÿýö7z•”ëªö.Æ÷v­6q‹S£~ŸªA}˜ ¸ð¶ûäøþr’úìäv»<Úÿºòûüü1¬ÞŠêWÜÿÿùôtš¦šìOÆñD}Zª€ØFÍûÚûçåã†èþÿÿÿöñ/Éûøøùµóæ¸ò7uD‡¢f–¨xŸ¨úúû)´™î™í”ÒyÔûöùùuÑëêê‡á‹âfÄŠå‘æÉÍÑÞàä÷çÚHƒšqØù¬èÆÿaæöý]ˆ™Ž§´JŒÿÿúgÆëKošîQ‡›•èÿÿÿ!ù,ÿ H° Áƒ*\ȰaÁ,AÌX±•¦Ò/ )lH¤‰F4è´² ¡+Xº”@º“ÂÒ PjÌù„°D9Vh “¡ÏY€À¡dð(„F`ÀT€ŠYxn±¹d°“!?¢xغUQ|ä`1¸‰J¤_¨%ÀãW¬T´¼8P„R¿p\ˆ™ªög–¨^­ƒÚû&ÆûWÜÿ4|D}“æ\{ÈÉйð&e„ާ´~ŸªxŸ¨qØùâ÷ý€Øÿûí!’·õâÚQ¼+rŽfÄëíí\‡ÿÿþùúúYÃêZªyÝøõõuчßV£ìûýÿòè7|•ÿöñßöþÕôüt›¦·òQvÃÏÏ“âûÆÿ²»¾Hƒš’çßøþI·ëêêv­jŒñòóÝòýa‹Q‡›i¾òûëäD‡¢’ÒuÏñ¤ðoÑúûüüßàäråœî—íœö‰ê±»½OwXªõäøýñòòTŸ¹$c‚ÿôë_‰œÉÍцèþÿÿSÛÿ‹ê¦ï„êaáü(Œ´iÁôÿõêçåå¸ò÷çÚŒâ€éÝõýyÔûúúûq—øùù#»ó ÀøðññJŒY~Œ~äœíA~˜oäÿ1¬Þoå½ÌÊúì䡹Ä>ÛÿÿÿüÿïægÆëøøù°ÄÌÍÿÿÿô8u¸óµêâ‰Ø;Ìÿÿôçïðñ‹²À0Èÿèÿëä¦ÿr’säÿùôÞàä·ôöôôÿÿú•èõõõHhŽív»YÇñ¬èöùùKo÷÷÷ìøýüüý¸ûÕõüÿýöEhd³¦òÿÿÿ!ù,ÿ H° Áƒ*\ȰaA W´8úp鈱 É̦Tª\4ŒÐÉt !¬(›$‘pÂg&QˆT;„pKŠÂ̳“®V«dÙ1Ø©Ï@¡ 0`P Ö’'VZPàd0Ä$`g $ @@ ¾D’ƒÅ ¨b#ŒE@2`À7Æ` Úcꀂ72¦! _…b##E‘½j“¥$Á&¤©C ×M ¢òÁÊU ‚dÁ@#]Nü¤#)®–…‚“zÜa¬É ·ùáòCˆPTÁX°d¥5ØØ 2Ä/5$BøkÖŸ,†Ù*Š£Dî"äÕ‚38XÔa—ú„x¼y @£ZÌ9tŸC;TT_v224_html_docs/images/arrows/large/blue/down.gif000700 000765 000765 00000002161 11222361074 022044 0ustar00abwabw000000 000000 GIF89a÷Õ¹ò°òµó¦ï-Èû®ðÿÿþ_Éïþþþýýýýÿÿùùùj›l›ööö^Éï.Èûüüü·ò’ê î™ì‘­¹ïððµ÷µôÿÿýðóó%Æùh›G~@mT™v–±òÊÎÌlŸçéé›îŒë¤íæåæîåå£îZ†™çäåòóóöèâT«ÿúñ÷ëã°ó­ïŒ¨³ØÉÃ=ÂíuɆ·ŠìôôôôäÞ>|”ñäÚ]ÊðeÏýæà`ËïkŽ›q—©@s†øçॷ·r” w¿ƒßY”™ín‹šºÿj™·ñ]~­ñûûû‘ùôà×îïïþÿÿ^˜¬iÄX•­^’¢ÿñæçäâÿëâV¢òèãTxá×ÓêÜÛiœïòóV¹žìŽ®¾šöèçè´Èɇé¦ðB¤=8pØ•?`ÝÈ¡EÒ‚jŠ)ÚsH@á•¡A\Äò*P£FÕ#Ù1<.ó.`ẦGB&S6Tl¨ÊbNÈ`†j 51âꦂj¢ì ÀT °a)4n= #L™¨ªYµh€åËmåYâÈ ­‘ Ä8UhÖ™7(Dâµ"I”*¹ø4V-ˆM&*T`ÂjÎ4±^Ô]ÐW,i&L e)З"½Zp:øwÙ6ªNLz„ãÈdà RN¯¶EB~”44ªÄ”„W ¬úD‡ Â|tÙ±0Xµ5•˜Q‡3GÈ@I ÑQÍ/n R)ÜÔ#¥\bËj8 ^C8à‰lHP@;TT_v224_html_docs/images/arrows/large/blue/left.gif000700 000765 000765 00000002212 11222361074 022024 0ustar00abwabw000000 000000 GIF89a÷ôìêê¦ï®ð î¡ïÿÿþµó°òûüüíëëõãÖýþþšìêêêýýýŸí§ð™ì™í¬ðÿþ÷­ïœðÄôšð¯ózäÿZ†¯ò)k…ÌÐÎößÔùíãÿùð%À÷¿ôöÞÕ-Âù.Àúë³õêYÙÿ}Û´ñIre•¬W­êëëüüý3ˆƒåfÕü‡æ°óÿøõo“¤íûüýúüýìµÿúîãNÒÿ°ðF„¡JÐþïæåŒæ¿ønÊüýþšï½óÚ„ãwÒó¼óúÞÖñë㡲¹öÚÓ>Úÿ`ŠN¥È¡ÎúúúºÄÇ=såÜÕ½ÇÍG¯Öÿü÷’ç»óåäå\€ƒáòñïøùúºój›ÿüïnÊíT€“Ñ×Ûñòò]Ž eŽœ’êRÿ÷óêàÛ]„òóóÿõìEy@sd’§oàÿüÿÿúüÿÿÿýh‹¥í¸ô:ˆ’ë¦ð÷áÕ“êCvKtììêO‡Ÿ”怢©Ã÷÷ÜÔ%Áõ®òöÝÕ8ŠŽé÷ùú8o‘é{˜§g–®³óã [~þþþ¹ô8|Þãâˆç€Ï¶ón’ QÕÿ;Óÿ@’³£í÷àÕšêËÿ¢î‰êÿüúõÝÔ¹óQœ“ì¯ðòðððððPqM£·¾îçßzÖõÿîèøøø­òÿÿ÷ø÷÷øùø§¼¼eŠù÷÷·ñ«ï´òS×ÿQ«e­ÅöåÙeÅY¡ºîæâ€Ñ—êŸÓY‹µôôóóÿûùFŠ¥ëì쑪°SƒöêâZÈõµò?vÿÿûÿÿúnáÿÁ÷ûûûg‡–K}»õöõõÿüù£ôq¼_¼hŠƒä_¹Ü1†¦ÿù÷öÛÔ…æÿÿõôÛÓ&j†øðïùûûÿøñPލüüüÿÿÿ!ùô,ÿé H° Áƒ (<‚ðàYv(}y†§!Á+kˆ1©‚Ζ/‹ôÒt;VKƒS8œ¼r€ðÝ$yg´ ¹°-Q¹FÑXÔÅй;?5I2¢ÈžvÔ‚† a"~y!“iÕ·^QÌøæ“¨j Jx f l³>Ö¦¨Ó*PL-*LTâ$û6P0Š£ÀVz.–…bQa‚ûÂlƒ*¿¡uê1Š„˜3‚c Èô61'ŽÀƒ XMàT)7 ç¡Ǭd(c !B y#z¶ÒZ°R‚¡‹¤Vmþ²D'hz:tåzRfЋ'ˆ¤gàñ(Ì5×BJÅ.KMäÌ¡ZÇi…þ\°+œ^±øaÌ KI1 pƒàP0"u82Œ —P“€~Á“N6´°A £Hô,0ñøÂ0`hQ ·8‹V`BO@;TT_v224_html_docs/images/arrows/large/blue/minus.gif000700 000765 000765 00000002102 11222361074 022223 0ustar00abwabw000000 000000 GIF89a÷çÚ×6~›ÂõÀôvßÿ%Íø€¥DÈ÷$‡¦«ðÂôÿÿþ°ñ$Íøÿîé$ˆ¦¥ÿôê±òY¡DÉ÷çÜÚ^‹íÛ×b—(Îø¼ò¿óÄþÇÿÿþú¯íÂö­ñ¬àþÿÿqŽœwßÿaŸtŽŸ¼ÿçÚÖâ½ÿÕÿWyÙÿÚÍÊl“§—æW¦ˆà¯ñ‘íŸá—î8z•+Ë÷£õ÷ïéžê«ïÊ= c§7€›ÓØÙºïÿÿüÆú‰ÓèØÔ7Ãòw´ºð=s‹OŠ¢•ÚüìåZ€ÏÕÔPŠªÞÞÒÎ*v[Œ£íÝÚ3~›ôèãÁõQ®Ðª±úðíU¾õ¾ö/q‡$‡§´öÿõë“Îÿðéµô@«³º°õf“ÏÓÓ¶ï’©Êüj Uáÿÿÿú|áÿ7~›hŠg›©óÁô¸ñ~¥”ª¯Œß‰ÄéÝØçÙÖ¡í^zvàÿv¾¿øŽ¡¬)yšiŽFÜÿvÞÿ{ÄúµôÿíèU~{àÿ±ñÊøYˆÍüÿòì¬ñ7›9z‘¦ïv¨óæÞk¾cˆDÈôÿùðÿùïÿýöçÜØŠåÿ®ü®ðî¤í¤ï©´»${Ÿ{µáÝÚ¦ðÿóïCÈñŸîPœØÙÙ1zœ9{‘m“¢àÜ×ÿÿûÿÿÿ!ù,ÿm H° ÁƒÜQ”#BLÑÇʤƒ°ªœ R)€Çç\‰õCHA.L´„r—0 ”sˆL!V B'Gƒ‚ -’ †üƒ YH*„I˜Nx(xD 7ˆ+öN)O.$”ªƒ—!âÆ… D×:m: cƒ›<?Ój@eްuêÍ 3‹H>@Ó‡HhŽÁaŨG H !&É’N m½À`'M‚”z„hÒeJj[qf ui•©RLXpÛV¦M*trÅ#Q ,Åm-ØDÑ{¢è‰.0M5fL㉻@Zd¼j¤ÊüÀ5²,AqO°úøóëß0 ;TT_v224_html_docs/images/arrows/large/blue/plus.gif000700 000765 000765 00000002127 11222361074 022062 0ustar00abwabw000000 000000 GIF89a÷$€¤w¤ôá×´ô$‚¥ÿÿûòß×D¼óD½ó$|¤r™’êòÞ×ÿòêÿñéÀóºó-Èÿí¤î$„§¤±~¥úñí$y£õá×9w’{¦œépÞÿyûó»õ ÄõÂÿ~ÅØÙÛÎÐÓ…á ¸ö ¹ð€å²û"šæiš‹©­q™‚ï2Òÿ qš©»¾¡ï—½5¢Îÿõì¸ñW€DËö•ìD±íóèâV¯Ðy—£+Ðÿ*m„D… ÿÿøÀõÄõ–öI‚š¹óžù³óùïëB}–Æö5–Ê\££ù‰äÿùòÃÿðÝ×m’›~Í3Çû¼þ©ñà×Ö—äðß×¾ô ªú-¸ç;ÐÿXwœÊA×ÿÄü½ó°ñ”Ä‹ºt™²ò¦­l˜¢ÿóìk™#Ãÿpš"{œi‰qš#yœÿúñH“å–ìÿÿúb{²ô9{•ÿÿý—Ìršv×Äö”Ê"¸ô|ÔTŒ“Ëm˜1s p™l­ÜÔÎŒï@Êösœsš)ÎÿP§¯õ\¦úíça¹Kz¦€Æ[²ªîD¾ôs™IÖÿ"¯ï¦Ú×ÍË ´ôŸÌõåÙ²ží“êiâÿŸìKŠ`±DÈ÷øèÛDÜÿŽæÎÓÒQ|ßÙ×ÿûõX}q™6ÔÿºüjÑñ#o{™ªâÙÔD¸ôîãÞõêåZšè$‡¦¨ëÿ÷î¯ðÙÛÙTßÿk¡Âö.œÆR‰£–¨²èáÚ"ÚïÜ×1ËÿìÝØp²—Ö0ÎÿíàÚ9u‹'w‘šîÿ÷íÿÿÿ!ù,ÿ± H° Áƒ¼ÐK–B…Ğɥ«ÏCƒK’ù¸…ŒSJ N£ÓáT±FhÕhÛ³Gš„Òêˆ#  \l¦L .ŠÀóÉÑ^©ÐrF¤ÌQbŽÕºr—2 ¹(ˆ  Àtà # )&Z2Hóæ„’—(¬ &”HÑÜ”8h`? @™a{¦`â3Ä 8¶ ˜LÙÆ MÁ$AÓ ³ €?*² @ Á¦n5Q¢[‘O†i®þþþäããüçÜŸ²¶LÚÿ‹äb°ÌGÒÿÈ žønš®ÿû÷#…¥¿óïæÞHmõõõw °âÜ×R}ÿñç^¶-sÿüô3½êÄöÂó!w–&•ºêíî ºóŒê k™ò鿍ûò›çŸê‘ê˜ìþíå­ðÿüöÕÎÈ"¬Ú‘ëM‘~Õb’U®ÿÿü9ƒŸ ¿ôûýþYŽ”ëù÷÷šî ´ô—êüýý7ÏÿW®”ç…å\ÞÿìâÝH}“„áIs£ð?q¬ºÂÿÿø;}—ÿÿþœîïïðÿûð>Ÿþþÿ½ò—°ºAÈôÂÊÐ4•øðçã¿ÿìåã§µ¾íèæ¼ûÙØÛóéâÇÇÈm›ÿþúkÝÿ¸óÿýöºòÕÏÈKj’ë&y™ÿüõzÓ=Ôÿ±óòòð"Êÿ6s˜Ö¶ñ6w‘·þ,ÃûýþÿyÙb‡–äåä^†•¼ô°ÜÚФë©ñ<¡Ãžéôõõe”r•ãèæ¥ïñôõ‰áüÿÿ”åø÷øŠ¢©ÿøôÿþÿ—Ä%Îþºóçèé½ö¡ï ¸õp˜©ñòéåèêêqÑñ#|œs•ÿÿÿ!ù÷,ÿï xÁƒ2hd@„DÖØ`ÅCงÉ€¡§­­s1 Ô1‚×&/­ìtr%á:‡ 3‡Ž:crÌ4á´„ ê\r´ªÚ™5 ÕKâäL‚qìy0ÑKȺ_íÎÿ»ÂÉŒä–íPs”íü÷÷ëçåÿñè÷êâ¦îU„˜:x“­ït¿¶óÿÿýW¸òõõööôôõõõƒÙöœ÷Z‰™`Ñþ‘ìt’ÿÿþçääöøù~•¤Qq?¹ç©ýÅÿóóôžìÀøTŽ¢ÿþñÿý÷ÿüîôñòBšTw¯ï8Êùÿÿ÷æâàüùù3}øùúùøùÿòêA¬£îºóŸëøúúºíÿõì­öýÿÿÂr­œñŸãq£’ë‚ær¡±·ÆÍÆI¢Äÿøõÿòìµö#½ø:“»ÿ»þ‹çôòòŠçÿÿû“ì`¹¯ïþæàëììÿûòÿøíÉ×Ýÿÿüjáÿ–ïÿùô°ññïð°òûýýR„œÿúìX‹ŸµÃÉûùù~œ¨ÿü÷˜ÑOÐÿ„Èpãÿ)½ÿÿþÿçÿêâN‹¢ÙÒÍLÔÿøêà }£¹óýýý$‰²mÊëÆÃÂY‘=ÚÿÀöW®¥ó`¸‹æöøø]µ'²øÀñ‹¤¯UÎõÿùìûüüúüü’¬¶íâÜF…žëáÛt›ŸîïðñÿýôE€˜ñòóp¡cº¯ÿºñ1¹òVxÑÿ3…§m•ÿúõc¡ÿûô_‡kÀîïï&Äó°¸5ÇÿÖÛÝÿúñ7v½ÿ¡ïÝÑÓD¬ÒM„˜—ø¸øn‘ìííÿÿÿ!ùÑ,ÿ£ HP`‚‚ |cƒQ… ïZ%O%ˆ‹=‚QjÒ†!0”qI‘&+5æ€8(r™<ÂFåÒ’Ã(‘EbÍH‚áÂ& »”ñB…±Ð²H¶¦PbÑãP 3„ .Ñ…M X!ó‚iO…€vãS€‚ rÖtyæÈK‚ƒ,i@R ®Ýj¶‚…£ Šc·Îˆ€ páX¨üReèÁTcIqe ²åd?x èUçÉÀ+­DuÊ ´iÓ\ôd‚Tæ”À0‰ju A 68¶?|‰AË”giö‰Ã °pœ›FÀVHj#0Jš 4Ð~À÷8¡85F11¢Ï„h¾‚ñ0@AûðÝЋ«>¢M`¢DS( €Ø! ÁH0²<Fát¼ò‚‚"e¨¡B;TT_v224_html_docs/images/arrows/large/blank/dot.gif000700 000765 000765 00000001235 11222361074 022024 0ustar00abwabw000000 000000 GIF89aæNçççéééàààõõõãããèèèüüüòòò÷÷÷êêêåååøøøûûûöööóó󬬬ýýýïïïßßß¹¹¹ÝÝÝðððÉÉÉ»»»···–––áááÚÚÚÅÅÅúúúîîîÞÞÞÊÊÊÜÜÜËËËžžž±±±¨¨¨ÈÈÈ×××ÍÍͯ¯¯íííàà⺺ºÏÏÏÔÔÔÊÊË¿¿¿ÌÌÌÑÑÑ¡¡¡ÀÀÀÂÂÂÞÞÜâââÛÛÛôôô£££¤¤¤¶¶¶ÇÇÇñññ¸¸¸ÕÕÕ¢¢¢½½½œœœ¤¤¦æææ³³²ÄÄÄìììùùùëëëäääþþþÿÿÿÿÿÿ!ùN,ú€N‚ƒ„…†‡ˆ‰Š‹Œ…&? ‚LŠB( KN˜ˆJM M<L¥†HJ»HIK$ ´ƒ=MJH »» 42I†GÊHØÙ@I †$H*äåäJ %I†) ñòD †0.Kÿ—((ÂH’†N`ˆ @ÜàAŒI•haOÀІ!pÐQÁGFCKFXXòÁF j ÙàCLš²ƒÅ fŒÀ±à€%œš$ñ C† *88 -f5é0 ÕÍEL ,@à)ÉIGhÓ ;TT_v224_html_docs/images/arrows/large/blank/dotminus.gif000700 000765 000765 00000001241 11222361074 023075 0ustar00abwabw000000 000000 GIF89aæMÞÞÞäääøøøüüüòòòõõõðððããã»»»öööàààìììóóó÷÷÷¬¬¬³³³ûûûÜÜÜáááËËËßßßèèèÝÝÝÚÚÚ¶¶¶–––ÌÌÌžžžïïïôôô¹¹¹ÊËËñññâââîîîúúúÜÚÚêêêçççÀÀÀ××ײ²²éééÊÊÊ···¤¥¥¯¯¯ÇÇÇÖÖÖßààÑÑÑ£££¡¡¡ÅÅŽ½½¨¨¨œœœÉÉÉÄÄÄøøúÛÛÛàÞÞ¢¢¢ÂÂÂÔÔÔ£¤¤»ººÏÏÏ©©©±±±¿¿¿åååùùùëëëþþþýýýÿÿÿÿÿÿ!ùM,þ€M‚ƒ„…†‡ˆ‰Š‹Œ…6H‚JŠGM˜ˆ"IL  J*J¥†" I» HE ´ƒ/LIº»»%;'2H†:GGØØI0H†)LKæçLDH †.GåçæL$-# †F@GR°àÃ$ ¡`a@‚„ ¡À„ ,º1¤‚‚%D8Rc† Ø#@,PøãƒK )arÀG!&x ±‡)ÀÉ28Xa€h‰”@X2‹Éˆä\´T@ƒ¤tĶí @;TT_v224_html_docs/images/arrows/large/blank/dotplus.gif000700 000765 000765 00000001252 11222361074 022727 0ustar00abwabw000000 000000 GIF89aæTüüüûûûõõõäääðððøøøßßßååå»»»òòòëëëèèè³³³ìììÝÝݬ¬¬÷÷÷ÞÞÞöööæææáááÚÚÚÖÖÖ×××ËËËîîîãããñññ¼¼¼ØØØÊÊÊ£££úúúžžžÌÌÌôôôçççÄÄÄÛÛÛóóó¶¶¶———êêêÙØÙÑÑѱ±±ÇÇÇÂÂÂÝÜÝ¢¢¢ÔÔÔþüü©©©ààཽ½¡¢¡œœœ¨¨¨¤¤¤ÉÉɹ¹¹ÅÅŲ²²ÙÙÛÜÜÜÀÀÀïïﯯ¯öôô¿¿¿–––ÂÁÂéééäååàáàÏÏÏ···ùøøììíâââþþþùùùýýýÿÿÿÿÿÿ!ùT,ÿ€T‚ƒ„…†‡ˆ‰Š‹Œ…6 Q‚PŠ"(T˜ˆ S#QPH(P¥† $SS Q-´ƒ.S RR *A,Q†%BÌÚ  MSÌ3ÌS4Q†CIDéÌùS @:  ‘q ‚t0à`€QºÀ„ &pð¤‰"FX2”cÉ v]€q ÇFbÇ€N¬PrG…¤‚2ECŒJ¼àp#„‰ ‚`J Œ¤xàÀ‰ÕAÉ7k  $]DµOQd:šKwP ;TT_v224_html_docs/images/arrows/large/blank/down.gif000700 000765 000765 00000001257 11222361074 022211 0ustar00abwabw000000 000000 GIF89aæPéééçççíííòòò÷÷÷üüüõõõâââáááêêêèèèôôôäääûûûÝÝÝÙÙÙãããæææÿÿÿúúúøøø¥¥¥¿¿¿ýýýßßßîîîÉÉÉñññÌÌÌÅÅÅïïïšššùùùÞÞÞ¼¼¼ööö§§§ààà···ÜÜܽ½½ÁÁÁÊÊÊÀÀÀÓÓÓ———ÈÈÈÍÍÍÆÆÆ±³³®®®ØØØÒÒÒ”””×××ÄÄĪªªÃÃ󳳨¨¨ÛÛÛ›››ÔÔÔúúù¯¯¯ðððÑÑÑ´´´¹¹¹¹¹·ÑÑÓÚÚÚ­­­²²²¾¾¾þþþóóóìììëëëÿÿÿ!ùP,ÿ€P‚ƒ„…†‡ˆ‰Š‹Œ3)"(K“””(?L‚C*N¢£¤O.‚+M±²³M& ‚, OÀÁÁN ‚ODÂÐNIMƒ0 O¤¤7)±«LP#8 ìí ê æƒ4Eûû Ob¨ ÐÄPœ@`À/Hx2¡ ‚€€ ãHœ0`à9„@pÀÁ#Jš XeÈ܆ =08pp‚Ňôì!Ê¡C’!xˆ 0@(¢4”p°Ä‡‡ º•رÂB $"ºøàC‹#@4h´I…X *6T Áš;TT_v224_html_docs/images/arrows/large/blank/left.gif000700 000765 000765 00000001304 11222361074 022165 0ustar00abwabw000000 000000 GIF89aæTôôôüüüäääíííîîîõõõöööóóóúúúûûûùùùñññïïïÜÜÜÝÝÝÿÿÿÁÁÁÛÛÛªªª÷÷÷èèèøøø½½½ÖÖÖòòòÈÈÈðððêêê¡¡¡¬¬¬ŸŸŸ¥¥¥àààÞÞÞãã㜜œÅÅÅååå   ÎÎÎßßßÄÄÄÚÚÚ¤¤¤¼¼¼°°°£££±±±³³³™šš§§§ººº®®®­­­žžž¾¾¾ÇÇÇØØØÞÝݯ¯¯¦¦¦ÒÒÒ´´²âââÐÐÐéêêËË˯¯°¬ªª×××ÛÝÝØÖØÔÔÔìêêµµµÏÏÏëëëéééáááýýýçççìììþþþÿÿÿ!ùT,ÿ€T‚ƒ„…†‡ˆ‰Š*$ SŠƒH “N4(? ’‡*RP DMˆ>"®R0RP…)KI¼MRR 5Á¨T &  MÜË6Ñ‚ - SÜNÌêM¨9:PJBN÷øøMï¨&(¢8‚Áà ÒÐ!C“(%Hœ(1ʆ àBÂ…("€<IòÉ Œ§L ÀÄC #%@€(™âƒŒƒV>8ÁƒO"4p¢Á 8 %€ò`$„paÅ”…$EJààD ;Ž‘Á €FCPLA0ä !Ѝ¥héN$D9 `’ (€™_AkT¨€*;TT_v224_html_docs/images/arrows/large/blank/right.gif000700 000765 000765 00000001322 11222361074 022350 0ustar00abwabw000000 000000 GIF89aæ`óóóìììüüü÷÷÷ïïïäääçççãããñññúúúåååêêêùùùàààõõõßßßáááöööîîîøøøºººÝÝݶ¶¶ØØØ¬¬¬èèèôôô©©©ÿÿÿµµµ¥¥¥ÏÏÏÚÚÚÁÁÁððð±±±´´´ËËË···ûûûæææœœœÕÕÕÞÞÞÛÛÛêììžžž­­­¡¡¡ÁÂÂâââÊÊÊÆÅÆ˜˜˜ÉÉÉèææÒÒÒÙÛÙïîîÐÐÐÖÖÖÂÂÂòòóñóóÇÇǹ¹¹²±±ÙÙÙÔÔÔÆÆÆªªªÃÃúº¼¼¼¼×××ÜÜÜ››™šššöõõõõ÷ÀÀÀ°°°«««ÍÍͽ½½óóòòòò²²²»»»ííí¿¿¿¢¢¢éééëëëþþþýýýÿÿÿ!ù`,ÿ€`‚ƒ„…†‡‚^ˆ†'3=D‹‡@ V8I*Š`šˆ__^%_‰&PZ’$ Y +S ¨„È] ;W_§ƒ_$ ]ÚÙ]Gœ_N:]ÈÉ] ¡‚_B?-\ùúú X‚ù2ÁÈ …ˆ"&LH…@†2P ã`èE ¨”ñBŒp aÚ)\4x°³Â#R”@tÚ@ \T¨ÀâÁ )HXÁ¨  –\¡$D“ (p  Vä ±…‰Š'U/Fr*dC5lø b Template::FAQ

Template Toolkit Language

Top

Why doesn't [% a = b IF c %] work as expected?

Top

There's a limitation in the TT2 parser which means that the following code doesn't work as you might expect:

[% a = b IF c %]

The parser interprets it as an attempt to set a to the result of b IF c, like this:

[% a = (b IF c) %]

If you want to set a = b only if c is true, then do this instead:

[% SET a = b IF c %]

The explicit SET keyword gives the parser the clue it needs to do the right thing.

NOTE: this will be fixed in TT3

If I'm using TT to write out a TT template, is there a good way to escape [% and %]?

Top

You can do something like this:

[% stag = "[\%"
   etag = "%\]"
%]

and then:

[% stag; 'hello'; etag %]

Or you can use the TAGS directive, like so:

[% TAGS [- -] %]
[- INCLUDE foo -]   # is a directive
[% INCLUDE foo %]   # not a directive

How do I iterate over a hash?

Top

This is covered in the Template::Manual::VMethods section of the manual. A list of all the keys that are in the hash can be obtained with the keys virtual method. You can then iterate over that list and by looking up each key in turn get the value.

[% FOREACH key = product.keys %]
   [% key %] => [% product.$key %]
[% END %]

Plugins

Top

How do I get the Table plugin to order data across rather than down?

Top

Order the data into rows:

Steve     Karen     Jeff
Brooklyn  Nantucket Fairfax
NY        MA        VA

[% USE table(data, rows=3) %]

Then ask for each column

[% FOREACH column = table.cols %]

And then print each item in the column going across the output rows

[% FOREACH item = column %]
    <td>[% item %]</td>
[% END %]

Accessing Cookies

Top

Jeff Boes <jboes@nexcerpt.com> asks:

Does anyone have a quick-n-dirty approach to accessing 
cookies from templates?

Jonas Liljegren answers:

[% USE CGI %]

<p>The value is [% CGI.cookie('cookie_name') | html %]

Extending the Template Toolkit

Top

Can I serve templates from a database?

Top

Short answer: yes, Chris Nandor has done this for Slash. You need to subclass Template::Provider. See the mailing list archives for further info.

Can I fetch templates via http?

Top

To do the job properly, you should subclass Template::Provider to Template::Provider::HTTP and use a PREFIX_MAP option to bind the http template prefix to that particular provider (you may want to go digging around in the Changes file around version 2.01 for more info on PREFIX_MAP - it may not be properly documented anywhere else...yet!). e.g.

use Template::Provider::HTTP;

my $file = Template::Provider( INCLUDE_PATH => [...] );
my $http = Template::Provider::HTTP->new(...);
my $tt2  = Template->new({
    LOAD_TEMPLATES => [ $file, $http ],
    PREFIX_MAP => {
        file    => '0',     # file:foo.html
        http    => '1',     # http:foo.html
        default => '0',     # foo.html => file:foo.html
    }
});

Now a template specified as:

[% INCLUDE foo %]

will be served by the 'file' provider (the default). Otherwise you can explicitly add a prefix:

[% INCLUDE file:foo.html %]
[% INCLUDE http:foo.html %]
[% INCLUDE http://www.xyz.com/tt2/header.tt2 %]

This same principal can be used to create a DBI template provider. e.g.

[% INCLUDE dbi:foo.html %]

Alas, we don't yet have a DBI provider as part of the Template Toolkit. There has been some talk on the mailing list about efforts to develop DBI and/or HTTP providers but as yet no-one has stepped forward to take up the challenge...

In the mean time, Craig Barrat's post from the mailing list has some useful pointers on how to achieve this using existing modules. See http://tt2.org/pipermail/templates/2001-May/000954.html

Miscellaneous

Top

How can I find out the name of the main template being processed?

Top

The template variable contains a reference to the Template::Document object for the main template you're processing (i.e. the one provided as the first argument to the Template process() method). The name method returns its name.

[% template.name %]     # e.g. index.html

How can I find out the name of the current template being processed?

Top

The template variable always references the main template being processed. So even if you call [% INCLUDE header %], and that calls [% INCLUDE menu %], the template variable will be unchanged.

index.html:

[% template.name  %]     # index.html
[% INCLUDE header %]

header:

[% template.name  %]     # index.html
[% INCLUDE menu   %]

menu:

[% template.name  %]     # index.html

In constrast, the component variable always references the current template being processed.

index.html

[% component.name %]     # index.html
[% INCLUDE header %]

header:

[% component.name %]     # header
[% INCLUDE menu   %]

menu:

[% component.name  %]     # menu

How do I print the modification time of the template or component?

Top

The template and component variables reference the main template and the current template being processed (see previous questions). The modtime method returns the modification time of the corresponding template file as a number of seconds since the Unix epoch (00:00:00 GMT 1st January 1970).

This number doesn't mean much to anyone (except perhaps serious Unix geeks) so you'll probably want to use the Date plugin to format it for human consumption.

[% USE Date %]
[% template.name %] last modified [% Date.format(template.modtime) %]

How can I configure variables on a per-request basis?

Top

One easy way to achieve this is to define a single PRE_PROCESS template which loads in other configuration files based on variables defined or other conditions.

For example, my setup usually looks something like this:

PRE_PROCESS => 'config/main'

config/main:

[%  DEFAULT  style   = 'text'
             section =  template.section or 'home';

    PROCESS  config/site
          +  config/urls
          +  config/macros
          + "config/style/$style"
          + "config/section/$section"
          + ...
%]

This allows me to set a single 'style' variable to control which config file gets pre-processed to set my various style options (colours, img paths, etc). For example:

config/style/basic:

[%  style = {
        name = style    # save existing 'style' var as 'style.name'

        # define various other style variables....
        col = {
            back => '#ffffff'
            text => '#000000'
                # ...etc...
        }

        logo = {
                # ...etc...
        }

        # ...etc...
    }
%]

Each source template can declare which section it's in via a META directive:

[% META
 title   = 'General Information'
 section = 'info'
%]
...

This controls which section configuration file gets loaded to set various other variables for defining the section title, menu, etc.

config/section/info:

[%  section = {
        name   = section  # save 'section' var as 'section.name'
        title  = 'Information'
        menu   = [ ... ]
        # ...etc...
    }
%]

This illustrates the basic principal but you can extend it to perform pretty much any kind of per-document initialisation that you require.

Why do I get rubbish for my utf-8 templates?

Top

First of all, make sure that your template files define a Byte Order Mark http://en.wikipedia.org/wiki/Byte_Order_Mark

If you for some reason don't want to add BOM to your templates, you can force Template to use a particular encoding (e.g. utf8) for your templates with the ENCODING option.

my $template = Template->new({ 
    ENCODING => 'utf8' 
});

Questions About This FAQ

Top

Why is this FAQ so short?

Top

Because we don't have anyone maintaining it.

Can I help?

Top

Yes please :-)


TT_v224_html_docs/css/blue.css000700 000765 000765 00000050556 11756705101 016054 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* default styles */ /*------------------------------------------------------------------------*/ h1, h2, h3, h4, h5, h6 { color: #444444; } h1,h2,h3 { margin: 0px 0 5px 0; } p { color: #333; padding: 0 0 8px 0; } p.tight { padding: 4px 0; margin: 0; } pre { line-height: 120%; } code { color: #224; font-weight: bold; } a { text-decoration: none; color: #00AAF0; } a:visited { color: #0059a5; } a:hover { color: #FF7F00; } a:focus { -moz-outline: none; } .alt { display: none; } .sample { display: block; width: 100px; height: 30px; } br.clear { clear: both; } /*------------------------------------------------------------------------*/ /* main body style */ /*------------------------------------------------------------------------*/ body { font: 14px Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #333; margin: 0px; padding: 10px 10px 20px 10px; background: #00AAF0 url('../images/glass/blue/top_grad.gif') repeat-x top left; } #layout { background: white url('../images/glass/blue/left.gif') repeat-y top left; min-width: 600px; } /*------------------------------------------------------------------------*/ /* header */ /*------------------------------------------------------------------------*/ #header { position: relative; height: 130px; margin: 0px; padding: 0 25px 0 220px; background: url('../images/glass/blue/header.gif') no-repeat top right; } #header #logo { display: block; position: absolute; top: 0; left: 0; width: 220px; height: 130px; background: url('../images/glass/blue/logo_blue.gif') no-repeat top right; } #header #logo:hover { background-image: url('../images/glass/blue/logo_orange.gif'); } #header #trail { height: 40px; margin: 0; padding: 0 0 0 10px; background: url('../images/glass/blue/tab_pre.gif') no-repeat top left; } #header #trail.blank { background-image: none; } #header #trail li { display: block; float: left; background: url('../images/glass/blue/tab_cold.gif') no-repeat top left; padding: 0 0 0 10px; } #header #trail li a { display: block; float: left; font-size: 11px; text-decoration: none; color: #888888; line-height: 14px; height: 30px; min-width: 60px; padding: 10px 15px 0 0; background: url('../images/glass/blue/tab_cold.gif') no-repeat top right; } #header #trail li a:hover { color: #FF7F00; } #header #trail li:hover, #header #trail li:hover a { background-image: url('../images/glass/blue/tab_roll.gif'); } #header #trail li.last { background-image: url('../images/glass/blue/tab_warm.gif'); color: #444444; } #header #trail li.last a { background-image: url('../images/glass/blue/tab_warm.gif'); color: #444444; padding-right: 45px; } #header .headline { font-size: 24px; margin: 8px 0 8px 0; padding: 0 100px 0 0; color: #444444; } #header .subhead { font-size: 16px; line-height: 18px; padding: 0 110px 0 0; margin: 0; color: #444; } #header .controls { position: absolute; display: block; top: 40px; right: 20px; width: 130px; height: 70px; overflow: visible; } /*------------------------------------------------------------------------*/ /* main page content and sidebar */ /*------------------------------------------------------------------------*/ #page { margin-bottom: 0; padding: 0; padding-left: 220px; background: url('../images/glass/blue/right.gif') repeat-y top right; } #sidebar { position: relative; float: left; padding: 0; width: 220px; margin: 0; margin-left: -220px; } #content { position: relative; margin: 0; padding: 0 40px 10px 15px; } #sidebar #menu { width: 220px; margin: 0; padding: 0; background: url('../images/glass/blue/menu_body.gif') repeat-y top left; } #sidebar #menu div.foot { height: 20px; background: url('../images/glass/blue/menu_foot.gif') no-repeat bottom left; } #page div.pageinfo { text-align: center; font-size: 10px; color: #ccc; } /*------------------------------------------------------------------------*/ /* footer */ /*------------------------------------------------------------------------*/ #footer { clear: both; position: relative; padding: 0 145px 0px 270px; height: 100px; background: url('../images/glass/blue/footer.gif') no-repeat bottom left; } #footer a.osi { position: absolute; display: block; left: 200px; bottom: 30px; width: 70px; height: 50px; cursor: pointer; background: url('../images/glass/blue/osi.gif') no-repeat top left; } #footer .copyright { text-align: center; color: #666; font-size: 12px; padding: 14px 0 0 0; } #footer .licence { text-align: center; padding-top: 5px; color: #888; font-size: 11px; line-height: 15px; padding: 0 20px; } #footer .copyright a, #footer .copyright a:visited, #footer .licence a, #footer .licence a:visited { color: #40698c; } #footer .copyright a:hover, #footer .licence a:hover { color: #FF7F00; } #footer .controls { position: absolute; display: block; bottom: 0; right: 0; width: 125px; height: 100px; padding: 0 25px 0 0; background: url('../images/glass/blue/footer.gif') no-repeat bottom right; } /*------------------------------------------------------------------------*/ /* widescreen mode */ /*------------------------------------------------------------------------*/ #body.wide { padding: 10px 0 0 0; } #body.wide #palette { display: none; } #body.wide #header { padding: 0 20px 0 20px; margin: -50px -20px 0 0; } #body.wide #header #logo { display: none; } #body.wide #page { padding: 10px; margin: 0 0 0 0; background-image: none; background-color: white; min-width: 560px; } #body.wide #sidebar { display: none; } #body.wide #content { padding: 0 10px; background: white none; } #body.wide #footer { padding: 0 150px 0px 90px; margin-right: -20px; background-position: bottom right; } #body.wide #footer a.osi { left: 20px; } /*------------------------------------------------------------------------*/ /* controls for showing/hiding the menu */ /*------------------------------------------------------------------------*/ div.controls a.menu { display: block; float: right; margin-right: 5px; width: 40px; height: 30px; background: url('../images/glass/blue/hide_menu.gif') no-repeat 0 5px; } div.controls a.hide:hover { background-image: url('../images/glass/blue/hide_menu_roll.gif'); } div.controls a.show { background-image: url('../images/glass/blue/show_menu.gif'); } div.controls a.show:hover { background-image: url('../images/glass/blue/show_menu_roll.gif'); } body div.controls a.hide { display: block; } body div.controls a.show { display: none; } body.wide div.controls a.hide { display: none; } body.wide div.controls a.show { display: block; } /*------------------------------------------------------------------------*/ /* rollover tooltip box for our talking badger */ /*------------------------------------------------------------------------*/ div.controls a span.about, div.controls span span.about { display: none; position: absolute; right: 175px; top: 5px; height: 40px; width: 200px; padding: 10px 37px 13px 10px; font-size: 10px; line-height: 13px; text-align: left; color: #888888; background: url('../images/glass/common/talkbox.gif') no-repeat top right; } div.controls a:hover span.about, div.controls span:hover span.about { display: block; } div.controls span.about h4 { display: block; font-size: 11px; margin: 0; padding: 0 0 1px 0; color: #444444; } /*------------------------------------------------------------------------*/ /* pager for going to the previous/index/next page */ /*------------------------------------------------------------------------*/ div.pager { clear: right; float: right; padding-top: 5px; width: 98px; } div.pager .go { display: block; float: left; height: 18px; padding-top: 18px; width: 32px; font-size: 10px; text-align: center; background: url('../images/arrows/large/blank/dot.gif') no-repeat top center; } div.pager span.go { color: #aaa; } div.pager a.go { color: #00AAF0; } div.pager a.go:hover { color: #FF7F00; } div.pager a.back { background-image: url('../images/arrows/large/blue/left.gif'); } div.pager a.back:hover { background-image: url('../images/arrows/large/orange/left.gif'); } div.pager span.back { background-image: url('../images/arrows/large/blank/left.gif'); } div.pager a.next { background-image: url('../images/arrows/large/blue/right.gif'); } div.pager a.next:hover { background-image: url('../images/arrows/large/orange/right.gif'); } div.pager span.next { background-image: url('../images/arrows/large/blank/right.gif'); } div.pager a.up { background-image: url('../images/arrows/large/blue/up.gif'); } div.pager a.up:hover { background-image: url('../images/arrows/large/orange/up.gif'); } div.pager span.up { background-image: url('../images/arrows/large/blank/up.gif'); } /*------------------------------------------------------------------------*/ /* pager is repeated in footer, but with text above arrows not below */ /*------------------------------------------------------------------------*/ #footer .pager { padding-top: 0; } #footer .pager .go { height: 42px; padding-top: 0; background-position: bottom center; } #footer a span.about { display: none; position: absolute; right: 28px; width: 200px; top: 58px; height: 25px; padding: 0; font-size: 11px; line-height: 13px; text-align: right; color: #444444; background-image: none; } #footer span span.about { display: none; } #footer a:hover span.about { display: block; } /*------------------------------------------------------------------------*/ /* colour selection palette */ /*------------------------------------------------------------------------*/ #palette { position: absolute; top: 0; right: 60px; height: 20px; margin-top: 0px; width: 144px; background: url('../images/glass/blue/palette.gif') no-repeat top right; } #palette ul { display: block; height: 20px; margin: 0 12px 0 0; padding: 0 0 0 12px; background: url('../images/glass/blue/palette.gif') no-repeat top left; } #palette li { display: inline; padding: 0; margin: 0; } #palette li a { display: block; float: left; height: 20px; width: 24px; padding: 0; margin: 0; background: url('../images/glass/blue/col_grey_in.gif') no-repeat top right; } #palette li a.blue { background-image: url('../images/glass/blue/col_blue_out.gif'); } #palette li a.blue:hover { background-image: url('../images/glass/blue/col_blue_out.gif'); } #palette li a.orange { background-image: url('../images/glass/blue/col_orange_in.gif'); } #palette li a.orange:hover { background-image: url('../images/glass/blue/col_orange_out.gif'); } #palette li a.green { background-image: url('../images/glass/blue/col_green_in.gif'); } #palette li a.green:hover { background-image: url('../images/glass/blue/col_green_out.gif'); } #palette li a.purple { background-image: url('../images/glass/blue/col_purple_in.gif'); } #palette li a.purple:hover { background-image: url('../images/glass/blue/col_purple_out.gif'); } #palette li a.grey { background-image: url('../images/glass/blue/col_grey_in.gif'); } #palette li a.grey:hover { background-image: url('../images/glass/blue/col_grey_out.gif'); } /*------------------------------------------------------------------------*/ /* menu styles */ /*------------------------------------------------------------------------*/ ul.menu { list-style: none; margin: 0 20px; padding: 0; } ul.menu li { list-style: none; display: block; margin: 0; padding: 0; } ul.menu li.last { background: url('../images/glass/blue/menu_item_foot.gif') no-repeat top left; padding-top: 1px; } ul.menu li a { display: block; margin: 0; padding: 4px 8px; font-size: 13px; line-height: 16px; min-height: 16px; color: #0059a5; text-decoration: none; background: url('../images/glass/blue/menu_item_body.gif') no-repeat top left; } ul.menu li.first a { background-image: url('../images/glass/blue/menu_item_head.gif'); } ul.menu li.last a { background: url('../images/glass/blue/menu_item_foot.gif') no-repeat bottom left; } ul.menu li a:hover { color: #FF7F00; background-image: url('../images/glass/blue/menu_warm_body.gif'); */ } ul.menu li a.warm { font-weight: bold; background-image: url('../images/glass/blue/menu_warm_body.gif'); */ } ul.menu li.first a.warm, ul.menu li.first a:hover { background-image: url('../images/glass/blue/menu_warm_head.gif'); } ul.menu li.last a.warm, ul.menu li.last a:hover { background: url('../images/glass/blue/menu_warm_foot.gif') no-repeat bottom left; } ul.menu li.l1 a { padding: 3px 8px 3px 22px; font-size: 11px; } ul.menu li.l2 a { padding: 3px 8px 3px 36px; font-size: 11px; } ul.menu li.l3 a { padding: 3px 8px 3px 50px; font-size: 11px; } ul.menu li.l4 a { padding: 3px 8px 3px 64px; font-size: 11px; } ul.menu li.l5 a { padding: 3px 8px 3px 78px; font-size: 11px; } ul.menu li.l6 a { padding: 3px 8px 3px 92px; font-size: 11px; } ul.menu li.l7 a { padding: 3px 8px 3px 106px; font-size: 11px; } /*------------------------------------------------------------------------*/ /* Styles for table of contents */ /*------------------------------------------------------------------------*/ ul.toc { margin: 0 0 20px 0; padding: 0; } ul.toc li { list-style: none; margin: 0; font-size: 14px; line-height: 18px; } ul.toc li a { font-size: 14px; line-height: 16px; min-height: 14px; text-decoration: none; margin: 0; padding: 4px 0 1px 18px; background: url('../images/arrows/small/blue/dot.gif') 0px 4px no-repeat; color: #00AAF0; } * html ul.toc li a { height: 16px; } ul.toc li.sub { margin: 0; line-height: 14px; } ul.toc li.sub a { display: block; margin: 0; padding: 2px 0 1px 34px; font-size: 13px; line-height: 15px; background: url('../images/arrows/small/blue/minidot.gif') 20px 3px no-repeat; } ul.toc li.subsub a { display: block; margin: 0; padding: 0 0 0 60px; font-size: 12px; line-height: 14px; background: url('../images/arrows/small/blue/minidot.gif') 40px 2px no-repeat; } ul.toc li a:hover { background-image: url('../images/arrows/small/orange/dot.gif'); color: #FF7F00; } ul.toc li.sub a:hover, ul.toc li.subsub a:hover { background-image: url('../images/arrows/small/orange/minidot.gif'); color: #FF7F00; } /*------------------------------------------------------------------------*/ /* sections */ /*------------------------------------------------------------------------*/ div.section, div.subsection { padding: 0 0 0 20px; clear: right; } div.section div.head, div.subsection div.head { margin: 0 0 4px 0px; min-height: 20px; position: relative; } div.section div.head { border-bottom: 1px dashed #b0d2e9; } div.subsection div.head { border-bottom: 1px dashed #b0d2e9; margin-bottom: 2px; } div.section div.head h1 { padding: 0 80px 4px 28px; margin: 0 0 0 -28px; font-size: 18px; line-height: 22px; font-weight: bold; background: url('../images/arrows/large/blue/dot.gif') no-repeat top left; } div.section div.head h2 { padding: 0 80px 2px 20px; margin: 0 0 0 -20px; font-size: 16px; line-height: 20px; font-weight: bold; background: url('../images/arrows/small/blue/dot.gif') no-repeat 0 3px; } div.section h3 { margin: 0; padding: 5px 0 5px 0; font-size: 14px; line-height: 18px; } div.section.open div.head h1 { background-image: url('../images/arrows/large/blue/dotminus.gif'); } div.section.open div.head:hover h1 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/large/orange/dotminus.gif'); } div.section.shut div.head h1 { background-image: url('../images/arrows/large/blue/dotplus.gif'); } div.section.shut div.head:hover h1 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/large/orange/dotplus.gif'); } div.subsection.open div.head h2 { background-image: url('../images/arrows/small/blue/dotminus.gif'); } div.subsection.open div.head:hover h2 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/small/orange/dotminus.gif'); } div.subsection.shut div.head h2 { background-image: url('../images/arrows/small/blue/dotplus.gif'); } div.subsection.shut div.head:hover h2 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/small/orange/dotplus.gif'); } div.section div.head a.top { position: absolute; bottom: 4px; right: 0px; padding: 0px 20px 0px 0; margin: 0px; width: 25px; text-align: right; font-size: 10px; height: 16px; color: #00AAF0; background: url('../images/arrows/small/blue/up.gif') no-repeat 28px 3px; } div.section div.head a.top:hover { color: #FF7F00; background-image: url('../images/arrows/small/orange/up.gif'); } div.section div.head a.open, div.section div.head a.shut, div.subsection div.head a.open, div.subsection div.head a.shut { position: absolute; bottom: 4px; right: 45px; margin: 0px; padding: 0px 5px; font-size: 11px; height: 16px; width: 3em; text-align: right; border-right: 1px solid #ddd; display: none; } div.section.shut div.head a.open, div.subsection.shut div.head a.open { display: block; } div.section.shut div.head a.shut, div.subsection.shut div.head a.shut { display: none; } div.section.open div.head a.open, div.subsection.open div.head a.open { display: none; } div.section.open div.head a.shut, div.subsection.open div.head a.shut { display: block; } div.section div.body { display: block; padding: 10px 0 20px 0; } div.subsection div.body { display: block; padding: 5px 0 10px 0; } div.section.shut div.body, div.subsection.shut div.body { display: none; } /*------------------------------------------------------------------------*/ /* POD markup */ /*------------------------------------------------------------------------*/ div.pod { } div.pod p { margin: 0px 0px 10px 0px; } div.pod pre { margin: 0 0 15px 20px; padding: 10px; border: 1px solid #ddd; background-color: #f6f6f6; font-size: 13px; color: #444444; } div.pod pre span.tt { font-weight: bold; color: #0059a5; } /*------------------------------------------------------------------------*/ /* Index page list */ /*------------------------------------------------------------------------*/ ul.index { margin: 10px 10px 10px 0; padding: 0px; } ul.index li { list-style: none; margin: 0 0 5px 0; padding: 0; } ul.index li a { text-decoration: none; font-weight: bold; padding: 0 0 0 20px; margin: 0; color: ; background: url('../images/arrows/ff16_blue/right.gif') no-repeat top left; } ul.index li a:hover { color: ; background-image: url('../images/arrows/ff16_orange/right.gif'); } ul.index li p { margin: 0 0 10px 0; padding: 0 0 0 20px; } TT_v224_html_docs/css/green.css000700 000765 000765 00000050646 11756705101 016225 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* default styles */ /*------------------------------------------------------------------------*/ h1, h2, h3, h4, h5, h6 { color: #444444; } h1,h2,h3 { margin: 0px 0 5px 0; } p { color: #333; padding: 0 0 8px 0; } p.tight { padding: 4px 0; margin: 0; } pre { line-height: 120%; } code { color: #224; font-weight: bold; } a { text-decoration: none; color: #39b93f; } a:visited { color: #216b25; } a:hover { color: #7239b9; } a:focus { -moz-outline: none; } .alt { display: none; } .sample { display: block; width: 100px; height: 30px; } br.clear { clear: both; } /*------------------------------------------------------------------------*/ /* main body style */ /*------------------------------------------------------------------------*/ body { font: 14px Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #333; margin: 0px; padding: 10px 10px 20px 10px; background: #39b93f url('../images/glass/green/top_grad.gif') repeat-x top left; } #layout { background: white url('../images/glass/green/left.gif') repeat-y top left; min-width: 600px; } /*------------------------------------------------------------------------*/ /* header */ /*------------------------------------------------------------------------*/ #header { position: relative; height: 130px; margin: 0px; padding: 0 25px 0 220px; background: url('../images/glass/green/header.gif') no-repeat top right; } #header #logo { display: block; position: absolute; top: 0; left: 0; width: 220px; height: 130px; background: url('../images/glass/green/logo_green.gif') no-repeat top right; } #header #logo:hover { background-image: url('../images/glass/green/logo_purple.gif'); } #header #trail { height: 40px; margin: 0; padding: 0 0 0 10px; background: url('../images/glass/green/tab_pre.gif') no-repeat top left; } #header #trail.blank { background-image: none; } #header #trail li { display: block; float: left; background: url('../images/glass/green/tab_cold.gif') no-repeat top left; padding: 0 0 0 10px; } #header #trail li a { display: block; float: left; font-size: 11px; text-decoration: none; color: #888888; line-height: 14px; height: 30px; min-width: 60px; padding: 10px 15px 0 0; background: url('../images/glass/green/tab_cold.gif') no-repeat top right; } #header #trail li a:hover { color: #7239b9; } #header #trail li:hover, #header #trail li:hover a { background-image: url('../images/glass/green/tab_roll.gif'); } #header #trail li.last { background-image: url('../images/glass/green/tab_warm.gif'); color: #444444; } #header #trail li.last a { background-image: url('../images/glass/green/tab_warm.gif'); color: #444444; padding-right: 45px; } #header .headline { font-size: 24px; margin: 8px 0 8px 0; padding: 0 100px 0 0; color: #444444; } #header .subhead { font-size: 16px; line-height: 18px; padding: 0 110px 0 0; margin: 0; color: #444; } #header .controls { position: absolute; display: block; top: 40px; right: 20px; width: 130px; height: 70px; overflow: visible; } /*------------------------------------------------------------------------*/ /* main page content and sidebar */ /*------------------------------------------------------------------------*/ #page { margin-bottom: 0; padding: 0; padding-left: 220px; background: url('../images/glass/green/right.gif') repeat-y top right; } #sidebar { position: relative; float: left; padding: 0; width: 220px; margin: 0; margin-left: -220px; } #content { position: relative; margin: 0; padding: 0 40px 10px 15px; } #sidebar #menu { width: 220px; margin: 0; padding: 0; background: url('../images/glass/green/menu_body.gif') repeat-y top left; } #sidebar #menu div.foot { height: 20px; background: url('../images/glass/green/menu_foot.gif') no-repeat bottom left; } #page div.pageinfo { text-align: center; font-size: 10px; color: #ccc; } /*------------------------------------------------------------------------*/ /* footer */ /*------------------------------------------------------------------------*/ #footer { clear: both; position: relative; padding: 0 145px 0px 270px; height: 100px; background: url('../images/glass/green/footer.gif') no-repeat bottom left; } #footer a.osi { position: absolute; display: block; left: 200px; bottom: 30px; width: 70px; height: 50px; cursor: pointer; background: url('../images/glass/green/osi.gif') no-repeat top left; } #footer .copyright { text-align: center; color: #666; font-size: 12px; padding: 14px 0 0 0; } #footer .licence { text-align: center; padding-top: 5px; color: #888; font-size: 11px; line-height: 15px; padding: 0 20px; } #footer .copyright a, #footer .copyright a:visited, #footer .licence a, #footer .licence a:visited { color: #418c44; } #footer .copyright a:hover, #footer .licence a:hover { color: #7239b9; } #footer .controls { position: absolute; display: block; bottom: 0; right: 0; width: 125px; height: 100px; padding: 0 25px 0 0; background: url('../images/glass/green/footer.gif') no-repeat bottom right; } /*------------------------------------------------------------------------*/ /* widescreen mode */ /*------------------------------------------------------------------------*/ #body.wide { padding: 10px 0 0 0; } #body.wide #palette { display: none; } #body.wide #header { padding: 0 20px 0 20px; margin: -50px -20px 0 0; } #body.wide #header #logo { display: none; } #body.wide #page { padding: 10px; margin: 0 0 0 0; background-image: none; background-color: white; min-width: 560px; } #body.wide #sidebar { display: none; } #body.wide #content { padding: 0 10px; background: white none; } #body.wide #footer { padding: 0 150px 0px 90px; margin-right: -20px; background-position: bottom right; } #body.wide #footer a.osi { left: 20px; } /*------------------------------------------------------------------------*/ /* controls for showing/hiding the menu */ /*------------------------------------------------------------------------*/ div.controls a.menu { display: block; float: right; margin-right: 5px; width: 40px; height: 30px; background: url('../images/glass/green/hide_menu.gif') no-repeat 0 5px; } div.controls a.hide:hover { background-image: url('../images/glass/green/hide_menu_roll.gif'); } div.controls a.show { background-image: url('../images/glass/green/show_menu.gif'); } div.controls a.show:hover { background-image: url('../images/glass/green/show_menu_roll.gif'); } body div.controls a.hide { display: block; } body div.controls a.show { display: none; } body.wide div.controls a.hide { display: none; } body.wide div.controls a.show { display: block; } /*------------------------------------------------------------------------*/ /* rollover tooltip box for our talking badger */ /*------------------------------------------------------------------------*/ div.controls a span.about, div.controls span span.about { display: none; position: absolute; right: 175px; top: 5px; height: 40px; width: 200px; padding: 10px 37px 13px 10px; font-size: 10px; line-height: 13px; text-align: left; color: #888888; background: url('../images/glass/common/talkbox.gif') no-repeat top right; } div.controls a:hover span.about, div.controls span:hover span.about { display: block; } div.controls span.about h4 { display: block; font-size: 11px; margin: 0; padding: 0 0 1px 0; color: #444444; } /*------------------------------------------------------------------------*/ /* pager for going to the previous/index/next page */ /*------------------------------------------------------------------------*/ div.pager { clear: right; float: right; padding-top: 5px; width: 98px; } div.pager .go { display: block; float: left; height: 18px; padding-top: 18px; width: 32px; font-size: 10px; text-align: center; background: url('../images/arrows/large/blank/dot.gif') no-repeat top center; } div.pager span.go { color: #aaa; } div.pager a.go { color: #39b93f; } div.pager a.go:hover { color: #7239b9; } div.pager a.back { background-image: url('../images/arrows/large/green/left.gif'); } div.pager a.back:hover { background-image: url('../images/arrows/large/purple/left.gif'); } div.pager span.back { background-image: url('../images/arrows/large/blank/left.gif'); } div.pager a.next { background-image: url('../images/arrows/large/green/right.gif'); } div.pager a.next:hover { background-image: url('../images/arrows/large/purple/right.gif'); } div.pager span.next { background-image: url('../images/arrows/large/blank/right.gif'); } div.pager a.up { background-image: url('../images/arrows/large/green/up.gif'); } div.pager a.up:hover { background-image: url('../images/arrows/large/purple/up.gif'); } div.pager span.up { background-image: url('../images/arrows/large/blank/up.gif'); } /*------------------------------------------------------------------------*/ /* pager is repeated in footer, but with text above arrows not below */ /*------------------------------------------------------------------------*/ #footer .pager { padding-top: 0; } #footer .pager .go { height: 42px; padding-top: 0; background-position: bottom center; } #footer a span.about { display: none; position: absolute; right: 28px; width: 200px; top: 58px; height: 25px; padding: 0; font-size: 11px; line-height: 13px; text-align: right; color: #444444; background-image: none; } #footer span span.about { display: none; } #footer a:hover span.about { display: block; } /*------------------------------------------------------------------------*/ /* colour selection palette */ /*------------------------------------------------------------------------*/ #palette { position: absolute; top: 0; right: 60px; height: 20px; margin-top: 0px; width: 144px; background: url('../images/glass/green/palette.gif') no-repeat top right; } #palette ul { display: block; height: 20px; margin: 0 12px 0 0; padding: 0 0 0 12px; background: url('../images/glass/green/palette.gif') no-repeat top left; } #palette li { display: inline; padding: 0; margin: 0; } #palette li a { display: block; float: left; height: 20px; width: 24px; padding: 0; margin: 0; background: url('../images/glass/green/col_grey_in.gif') no-repeat top right; } #palette li a.blue { background-image: url('../images/glass/green/col_blue_in.gif'); } #palette li a.blue:hover { background-image: url('../images/glass/green/col_blue_out.gif'); } #palette li a.orange { background-image: url('../images/glass/green/col_orange_in.gif'); } #palette li a.orange:hover { background-image: url('../images/glass/green/col_orange_out.gif'); } #palette li a.green { background-image: url('../images/glass/green/col_green_out.gif'); } #palette li a.green:hover { background-image: url('../images/glass/green/col_green_out.gif'); } #palette li a.purple { background-image: url('../images/glass/green/col_purple_in.gif'); } #palette li a.purple:hover { background-image: url('../images/glass/green/col_purple_out.gif'); } #palette li a.grey { background-image: url('../images/glass/green/col_grey_in.gif'); } #palette li a.grey:hover { background-image: url('../images/glass/green/col_grey_out.gif'); } /*------------------------------------------------------------------------*/ /* menu styles */ /*------------------------------------------------------------------------*/ ul.menu { list-style: none; margin: 0 20px; padding: 0; } ul.menu li { list-style: none; display: block; margin: 0; padding: 0; } ul.menu li.last { background: url('../images/glass/green/menu_item_foot.gif') no-repeat top left; padding-top: 1px; } ul.menu li a { display: block; margin: 0; padding: 4px 8px; font-size: 13px; line-height: 16px; min-height: 16px; color: #216b25; text-decoration: none; background: url('../images/glass/green/menu_item_body.gif') no-repeat top left; } ul.menu li.first a { background-image: url('../images/glass/green/menu_item_head.gif'); } ul.menu li.last a { background: url('../images/glass/green/menu_item_foot.gif') no-repeat bottom left; } ul.menu li a:hover { color: #7239b9; background-image: url('../images/glass/green/menu_warm_body.gif'); */ } ul.menu li a.warm { font-weight: bold; background-image: url('../images/glass/green/menu_warm_body.gif'); */ } ul.menu li.first a.warm, ul.menu li.first a:hover { background-image: url('../images/glass/green/menu_warm_head.gif'); } ul.menu li.last a.warm, ul.menu li.last a:hover { background: url('../images/glass/green/menu_warm_foot.gif') no-repeat bottom left; } ul.menu li.l1 a { padding: 3px 8px 3px 22px; font-size: 11px; } ul.menu li.l2 a { padding: 3px 8px 3px 36px; font-size: 11px; } ul.menu li.l3 a { padding: 3px 8px 3px 50px; font-size: 11px; } ul.menu li.l4 a { padding: 3px 8px 3px 64px; font-size: 11px; } ul.menu li.l5 a { padding: 3px 8px 3px 78px; font-size: 11px; } ul.menu li.l6 a { padding: 3px 8px 3px 92px; font-size: 11px; } ul.menu li.l7 a { padding: 3px 8px 3px 106px; font-size: 11px; } /*------------------------------------------------------------------------*/ /* Styles for table of contents */ /*------------------------------------------------------------------------*/ ul.toc { margin: 0 0 20px 0; padding: 0; } ul.toc li { list-style: none; margin: 0; font-size: 14px; line-height: 18px; } ul.toc li a { font-size: 14px; line-height: 16px; min-height: 14px; text-decoration: none; margin: 0; padding: 4px 0 1px 18px; background: url('../images/arrows/small/green/dot.gif') 0px 4px no-repeat; color: #39b93f; } * html ul.toc li a { height: 16px; } ul.toc li.sub { margin: 0; line-height: 14px; } ul.toc li.sub a { display: block; margin: 0; padding: 2px 0 1px 34px; font-size: 13px; line-height: 15px; background: url('../images/arrows/small/green/minidot.gif') 20px 3px no-repeat; } ul.toc li.subsub a { display: block; margin: 0; padding: 0 0 0 60px; font-size: 12px; line-height: 14px; background: url('../images/arrows/small/green/minidot.gif') 40px 2px no-repeat; } ul.toc li a:hover { background-image: url('../images/arrows/small/purple/dot.gif'); color: #7239b9; } ul.toc li.sub a:hover, ul.toc li.subsub a:hover { background-image: url('../images/arrows/small/purple/minidot.gif'); color: #7239b9; } /*------------------------------------------------------------------------*/ /* sections */ /*------------------------------------------------------------------------*/ div.section, div.subsection { padding: 0 0 0 20px; clear: right; } div.section div.head, div.subsection div.head { margin: 0 0 4px 0px; min-height: 20px; position: relative; } div.section div.head { border-bottom: 1px dashed #97E29B; } div.subsection div.head { border-bottom: 1px dashed #97E29B; margin-bottom: 2px; } div.section div.head h1 { padding: 0 80px 4px 28px; margin: 0 0 0 -28px; font-size: 18px; line-height: 22px; font-weight: bold; background: url('../images/arrows/large/green/dot.gif') no-repeat top left; } div.section div.head h2 { padding: 0 80px 2px 20px; margin: 0 0 0 -20px; font-size: 16px; line-height: 20px; font-weight: bold; background: url('../images/arrows/small/green/dot.gif') no-repeat 0 3px; } div.section h3 { margin: 0; padding: 5px 0 5px 0; font-size: 14px; line-height: 18px; } div.section.open div.head h1 { background-image: url('../images/arrows/large/green/dotminus.gif'); } div.section.open div.head:hover h1 { color: #7239b9; cursor: pointer; background-image: url('../images/arrows/large/purple/dotminus.gif'); } div.section.shut div.head h1 { background-image: url('../images/arrows/large/green/dotplus.gif'); } div.section.shut div.head:hover h1 { color: #7239b9; cursor: pointer; background-image: url('../images/arrows/large/purple/dotplus.gif'); } div.subsection.open div.head h2 { background-image: url('../images/arrows/small/green/dotminus.gif'); } div.subsection.open div.head:hover h2 { color: #7239b9; cursor: pointer; background-image: url('../images/arrows/small/purple/dotminus.gif'); } div.subsection.shut div.head h2 { background-image: url('../images/arrows/small/green/dotplus.gif'); } div.subsection.shut div.head:hover h2 { color: #7239b9; cursor: pointer; background-image: url('../images/arrows/small/purple/dotplus.gif'); } div.section div.head a.top { position: absolute; bottom: 4px; right: 0px; padding: 0px 20px 0px 0; margin: 0px; width: 25px; text-align: right; font-size: 10px; height: 16px; color: #39b93f; background: url('../images/arrows/small/green/up.gif') no-repeat 28px 3px; } div.section div.head a.top:hover { color: #7239b9; background-image: url('../images/arrows/small/purple/up.gif'); } div.section div.head a.open, div.section div.head a.shut, div.subsection div.head a.open, div.subsection div.head a.shut { position: absolute; bottom: 4px; right: 45px; margin: 0px; padding: 0px 5px; font-size: 11px; height: 16px; width: 3em; text-align: right; border-right: 1px solid #ddd; display: none; } div.section.shut div.head a.open, div.subsection.shut div.head a.open { display: block; } div.section.shut div.head a.shut, div.subsection.shut div.head a.shut { display: none; } div.section.open div.head a.open, div.subsection.open div.head a.open { display: none; } div.section.open div.head a.shut, div.subsection.open div.head a.shut { display: block; } div.section div.body { display: block; padding: 10px 0 20px 0; } div.subsection div.body { display: block; padding: 5px 0 10px 0; } div.section.shut div.body, div.subsection.shut div.body { display: none; } /*------------------------------------------------------------------------*/ /* POD markup */ /*------------------------------------------------------------------------*/ div.pod { } div.pod p { margin: 0px 0px 10px 0px; } div.pod pre { margin: 0 0 15px 20px; padding: 10px; border: 1px solid #ddd; background-color: #f6f6f6; font-size: 13px; color: #444444; } div.pod pre span.tt { font-weight: bold; color: #216b25; } /*------------------------------------------------------------------------*/ /* Index page list */ /*------------------------------------------------------------------------*/ ul.index { margin: 10px 10px 10px 0; padding: 0px; } ul.index li { list-style: none; margin: 0 0 5px 0; padding: 0; } ul.index li a { text-decoration: none; font-weight: bold; padding: 0 0 0 20px; margin: 0; color: ; background: url('../images/arrows/ff16_blue/right.gif') no-repeat top left; } ul.index li a:hover { color: ; background-image: url('../images/arrows/ff16_orange/right.gif'); } ul.index li p { margin: 0 0 10px 0; padding: 0 0 0 20px; } TT_v224_html_docs/css/grey.css000700 000765 000765 00000050556 11756705102 016074 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* default styles */ /*------------------------------------------------------------------------*/ h1, h2, h3, h4, h5, h6 { color: #444444; } h1,h2,h3 { margin: 0px 0 5px 0; } p { color: #333; padding: 0 0 8px 0; } p.tight { padding: 4px 0; margin: 0; } pre { line-height: 120%; } code { color: #224; font-weight: bold; } a { text-decoration: none; color: #00AAF0; } a:visited { color: #0059a5; } a:hover { color: #FF7F00; } a:focus { -moz-outline: none; } .alt { display: none; } .sample { display: block; width: 100px; height: 30px; } br.clear { clear: both; } /*------------------------------------------------------------------------*/ /* main body style */ /*------------------------------------------------------------------------*/ body { font: 14px Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #333; margin: 0px; padding: 10px 10px 20px 10px; background: #cccccc url('../images/glass/grey/top_grad.gif') repeat-x top left; } #layout { background: white url('../images/glass/grey/left.gif') repeat-y top left; min-width: 600px; } /*------------------------------------------------------------------------*/ /* header */ /*------------------------------------------------------------------------*/ #header { position: relative; height: 130px; margin: 0px; padding: 0 25px 0 220px; background: url('../images/glass/grey/header.gif') no-repeat top right; } #header #logo { display: block; position: absolute; top: 0; left: 0; width: 220px; height: 130px; background: url('../images/glass/grey/logo_blue.gif') no-repeat top right; } #header #logo:hover { background-image: url('../images/glass/grey/logo_orange.gif'); } #header #trail { height: 40px; margin: 0; padding: 0 0 0 10px; background: url('../images/glass/grey/tab_pre.gif') no-repeat top left; } #header #trail.blank { background-image: none; } #header #trail li { display: block; float: left; background: url('../images/glass/grey/tab_cold.gif') no-repeat top left; padding: 0 0 0 10px; } #header #trail li a { display: block; float: left; font-size: 11px; text-decoration: none; color: #888888; line-height: 14px; height: 30px; min-width: 60px; padding: 10px 15px 0 0; background: url('../images/glass/grey/tab_cold.gif') no-repeat top right; } #header #trail li a:hover { color: #FF7F00; } #header #trail li:hover, #header #trail li:hover a { background-image: url('../images/glass/grey/tab_roll.gif'); } #header #trail li.last { background-image: url('../images/glass/grey/tab_warm.gif'); color: #444444; } #header #trail li.last a { background-image: url('../images/glass/grey/tab_warm.gif'); color: #444444; padding-right: 45px; } #header .headline { font-size: 24px; margin: 8px 0 8px 0; padding: 0 100px 0 0; color: #444444; } #header .subhead { font-size: 16px; line-height: 18px; padding: 0 110px 0 0; margin: 0; color: #444; } #header .controls { position: absolute; display: block; top: 40px; right: 20px; width: 130px; height: 70px; overflow: visible; } /*------------------------------------------------------------------------*/ /* main page content and sidebar */ /*------------------------------------------------------------------------*/ #page { margin-bottom: 0; padding: 0; padding-left: 220px; background: url('../images/glass/grey/right.gif') repeat-y top right; } #sidebar { position: relative; float: left; padding: 0; width: 220px; margin: 0; margin-left: -220px; } #content { position: relative; margin: 0; padding: 0 40px 10px 15px; } #sidebar #menu { width: 220px; margin: 0; padding: 0; background: url('../images/glass/grey/menu_body.gif') repeat-y top left; } #sidebar #menu div.foot { height: 20px; background: url('../images/glass/grey/menu_foot.gif') no-repeat bottom left; } #page div.pageinfo { text-align: center; font-size: 10px; color: #ccc; } /*------------------------------------------------------------------------*/ /* footer */ /*------------------------------------------------------------------------*/ #footer { clear: both; position: relative; padding: 0 145px 0px 270px; height: 100px; background: url('../images/glass/grey/footer.gif') no-repeat bottom left; } #footer a.osi { position: absolute; display: block; left: 200px; bottom: 30px; width: 70px; height: 50px; cursor: pointer; background: url('../images/glass/grey/osi.gif') no-repeat top left; } #footer .copyright { text-align: center; color: #666; font-size: 12px; padding: 14px 0 0 0; } #footer .licence { text-align: center; padding-top: 5px; color: #888; font-size: 11px; line-height: 15px; padding: 0 20px; } #footer .copyright a, #footer .copyright a:visited, #footer .licence a, #footer .licence a:visited { color: #40698c; } #footer .copyright a:hover, #footer .licence a:hover { color: #FF7F00; } #footer .controls { position: absolute; display: block; bottom: 0; right: 0; width: 125px; height: 100px; padding: 0 25px 0 0; background: url('../images/glass/grey/footer.gif') no-repeat bottom right; } /*------------------------------------------------------------------------*/ /* widescreen mode */ /*------------------------------------------------------------------------*/ #body.wide { padding: 10px 0 0 0; } #body.wide #palette { display: none; } #body.wide #header { padding: 0 20px 0 20px; margin: -50px -20px 0 0; } #body.wide #header #logo { display: none; } #body.wide #page { padding: 10px; margin: 0 0 0 0; background-image: none; background-color: white; min-width: 560px; } #body.wide #sidebar { display: none; } #body.wide #content { padding: 0 10px; background: white none; } #body.wide #footer { padding: 0 150px 0px 90px; margin-right: -20px; background-position: bottom right; } #body.wide #footer a.osi { left: 20px; } /*------------------------------------------------------------------------*/ /* controls for showing/hiding the menu */ /*------------------------------------------------------------------------*/ div.controls a.menu { display: block; float: right; margin-right: 5px; width: 40px; height: 30px; background: url('../images/glass/grey/hide_menu.gif') no-repeat 0 5px; } div.controls a.hide:hover { background-image: url('../images/glass/grey/hide_menu_roll.gif'); } div.controls a.show { background-image: url('../images/glass/grey/show_menu.gif'); } div.controls a.show:hover { background-image: url('../images/glass/grey/show_menu_roll.gif'); } body div.controls a.hide { display: block; } body div.controls a.show { display: none; } body.wide div.controls a.hide { display: none; } body.wide div.controls a.show { display: block; } /*------------------------------------------------------------------------*/ /* rollover tooltip box for our talking badger */ /*------------------------------------------------------------------------*/ div.controls a span.about, div.controls span span.about { display: none; position: absolute; right: 175px; top: 5px; height: 40px; width: 200px; padding: 10px 37px 13px 10px; font-size: 10px; line-height: 13px; text-align: left; color: #888888; background: url('../images/glass/common/talkbox.gif') no-repeat top right; } div.controls a:hover span.about, div.controls span:hover span.about { display: block; } div.controls span.about h4 { display: block; font-size: 11px; margin: 0; padding: 0 0 1px 0; color: #444444; } /*------------------------------------------------------------------------*/ /* pager for going to the previous/index/next page */ /*------------------------------------------------------------------------*/ div.pager { clear: right; float: right; padding-top: 5px; width: 98px; } div.pager .go { display: block; float: left; height: 18px; padding-top: 18px; width: 32px; font-size: 10px; text-align: center; background: url('../images/arrows/large/blank/dot.gif') no-repeat top center; } div.pager span.go { color: #aaa; } div.pager a.go { color: #00AAF0; } div.pager a.go:hover { color: #FF7F00; } div.pager a.back { background-image: url('../images/arrows/large/blue/left.gif'); } div.pager a.back:hover { background-image: url('../images/arrows/large/orange/left.gif'); } div.pager span.back { background-image: url('../images/arrows/large/blank/left.gif'); } div.pager a.next { background-image: url('../images/arrows/large/blue/right.gif'); } div.pager a.next:hover { background-image: url('../images/arrows/large/orange/right.gif'); } div.pager span.next { background-image: url('../images/arrows/large/blank/right.gif'); } div.pager a.up { background-image: url('../images/arrows/large/blue/up.gif'); } div.pager a.up:hover { background-image: url('../images/arrows/large/orange/up.gif'); } div.pager span.up { background-image: url('../images/arrows/large/blank/up.gif'); } /*------------------------------------------------------------------------*/ /* pager is repeated in footer, but with text above arrows not below */ /*------------------------------------------------------------------------*/ #footer .pager { padding-top: 0; } #footer .pager .go { height: 42px; padding-top: 0; background-position: bottom center; } #footer a span.about { display: none; position: absolute; right: 28px; width: 200px; top: 58px; height: 25px; padding: 0; font-size: 11px; line-height: 13px; text-align: right; color: #444444; background-image: none; } #footer span span.about { display: none; } #footer a:hover span.about { display: block; } /*------------------------------------------------------------------------*/ /* colour selection palette */ /*------------------------------------------------------------------------*/ #palette { position: absolute; top: 0; right: 60px; height: 20px; margin-top: 0px; width: 144px; background: url('../images/glass/grey/palette.gif') no-repeat top right; } #palette ul { display: block; height: 20px; margin: 0 12px 0 0; padding: 0 0 0 12px; background: url('../images/glass/grey/palette.gif') no-repeat top left; } #palette li { display: inline; padding: 0; margin: 0; } #palette li a { display: block; float: left; height: 20px; width: 24px; padding: 0; margin: 0; background: url('../images/glass/grey/col_grey_in.gif') no-repeat top right; } #palette li a.blue { background-image: url('../images/glass/grey/col_blue_in.gif'); } #palette li a.blue:hover { background-image: url('../images/glass/grey/col_blue_out.gif'); } #palette li a.orange { background-image: url('../images/glass/grey/col_orange_in.gif'); } #palette li a.orange:hover { background-image: url('../images/glass/grey/col_orange_out.gif'); } #palette li a.green { background-image: url('../images/glass/grey/col_green_in.gif'); } #palette li a.green:hover { background-image: url('../images/glass/grey/col_green_out.gif'); } #palette li a.purple { background-image: url('../images/glass/grey/col_purple_in.gif'); } #palette li a.purple:hover { background-image: url('../images/glass/grey/col_purple_out.gif'); } #palette li a.grey { background-image: url('../images/glass/grey/col_grey_out.gif'); } #palette li a.grey:hover { background-image: url('../images/glass/grey/col_grey_out.gif'); } /*------------------------------------------------------------------------*/ /* menu styles */ /*------------------------------------------------------------------------*/ ul.menu { list-style: none; margin: 0 20px; padding: 0; } ul.menu li { list-style: none; display: block; margin: 0; padding: 0; } ul.menu li.last { background: url('../images/glass/grey/menu_item_foot.gif') no-repeat top left; padding-top: 1px; } ul.menu li a { display: block; margin: 0; padding: 4px 8px; font-size: 13px; line-height: 16px; min-height: 16px; color: #0059a5; text-decoration: none; background: url('../images/glass/grey/menu_item_body.gif') no-repeat top left; } ul.menu li.first a { background-image: url('../images/glass/grey/menu_item_head.gif'); } ul.menu li.last a { background: url('../images/glass/grey/menu_item_foot.gif') no-repeat bottom left; } ul.menu li a:hover { color: #FF7F00; background-image: url('../images/glass/grey/menu_warm_body.gif'); */ } ul.menu li a.warm { font-weight: bold; background-image: url('../images/glass/grey/menu_warm_body.gif'); */ } ul.menu li.first a.warm, ul.menu li.first a:hover { background-image: url('../images/glass/grey/menu_warm_head.gif'); } ul.menu li.last a.warm, ul.menu li.last a:hover { background: url('../images/glass/grey/menu_warm_foot.gif') no-repeat bottom left; } ul.menu li.l1 a { padding: 3px 8px 3px 22px; font-size: 11px; } ul.menu li.l2 a { padding: 3px 8px 3px 36px; font-size: 11px; } ul.menu li.l3 a { padding: 3px 8px 3px 50px; font-size: 11px; } ul.menu li.l4 a { padding: 3px 8px 3px 64px; font-size: 11px; } ul.menu li.l5 a { padding: 3px 8px 3px 78px; font-size: 11px; } ul.menu li.l6 a { padding: 3px 8px 3px 92px; font-size: 11px; } ul.menu li.l7 a { padding: 3px 8px 3px 106px; font-size: 11px; } /*------------------------------------------------------------------------*/ /* Styles for table of contents */ /*------------------------------------------------------------------------*/ ul.toc { margin: 0 0 20px 0; padding: 0; } ul.toc li { list-style: none; margin: 0; font-size: 14px; line-height: 18px; } ul.toc li a { font-size: 14px; line-height: 16px; min-height: 14px; text-decoration: none; margin: 0; padding: 4px 0 1px 18px; background: url('../images/arrows/small/blue/dot.gif') 0px 4px no-repeat; color: #00AAF0; } * html ul.toc li a { height: 16px; } ul.toc li.sub { margin: 0; line-height: 14px; } ul.toc li.sub a { display: block; margin: 0; padding: 2px 0 1px 34px; font-size: 13px; line-height: 15px; background: url('../images/arrows/small/blue/minidot.gif') 20px 3px no-repeat; } ul.toc li.subsub a { display: block; margin: 0; padding: 0 0 0 60px; font-size: 12px; line-height: 14px; background: url('../images/arrows/small/blue/minidot.gif') 40px 2px no-repeat; } ul.toc li a:hover { background-image: url('../images/arrows/small/orange/dot.gif'); color: #FF7F00; } ul.toc li.sub a:hover, ul.toc li.subsub a:hover { background-image: url('../images/arrows/small/orange/minidot.gif'); color: #FF7F00; } /*------------------------------------------------------------------------*/ /* sections */ /*------------------------------------------------------------------------*/ div.section, div.subsection { padding: 0 0 0 20px; clear: right; } div.section div.head, div.subsection div.head { margin: 0 0 4px 0px; min-height: 20px; position: relative; } div.section div.head { border-bottom: 1px dashed #b0d2e9; } div.subsection div.head { border-bottom: 1px dashed #b0d2e9; margin-bottom: 2px; } div.section div.head h1 { padding: 0 80px 4px 28px; margin: 0 0 0 -28px; font-size: 18px; line-height: 22px; font-weight: bold; background: url('../images/arrows/large/blue/dot.gif') no-repeat top left; } div.section div.head h2 { padding: 0 80px 2px 20px; margin: 0 0 0 -20px; font-size: 16px; line-height: 20px; font-weight: bold; background: url('../images/arrows/small/blue/dot.gif') no-repeat 0 3px; } div.section h3 { margin: 0; padding: 5px 0 5px 0; font-size: 14px; line-height: 18px; } div.section.open div.head h1 { background-image: url('../images/arrows/large/blue/dotminus.gif'); } div.section.open div.head:hover h1 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/large/orange/dotminus.gif'); } div.section.shut div.head h1 { background-image: url('../images/arrows/large/blue/dotplus.gif'); } div.section.shut div.head:hover h1 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/large/orange/dotplus.gif'); } div.subsection.open div.head h2 { background-image: url('../images/arrows/small/blue/dotminus.gif'); } div.subsection.open div.head:hover h2 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/small/orange/dotminus.gif'); } div.subsection.shut div.head h2 { background-image: url('../images/arrows/small/blue/dotplus.gif'); } div.subsection.shut div.head:hover h2 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/small/orange/dotplus.gif'); } div.section div.head a.top { position: absolute; bottom: 4px; right: 0px; padding: 0px 20px 0px 0; margin: 0px; width: 25px; text-align: right; font-size: 10px; height: 16px; color: #00AAF0; background: url('../images/arrows/small/blue/up.gif') no-repeat 28px 3px; } div.section div.head a.top:hover { color: #FF7F00; background-image: url('../images/arrows/small/orange/up.gif'); } div.section div.head a.open, div.section div.head a.shut, div.subsection div.head a.open, div.subsection div.head a.shut { position: absolute; bottom: 4px; right: 45px; margin: 0px; padding: 0px 5px; font-size: 11px; height: 16px; width: 3em; text-align: right; border-right: 1px solid #ddd; display: none; } div.section.shut div.head a.open, div.subsection.shut div.head a.open { display: block; } div.section.shut div.head a.shut, div.subsection.shut div.head a.shut { display: none; } div.section.open div.head a.open, div.subsection.open div.head a.open { display: none; } div.section.open div.head a.shut, div.subsection.open div.head a.shut { display: block; } div.section div.body { display: block; padding: 10px 0 20px 0; } div.subsection div.body { display: block; padding: 5px 0 10px 0; } div.section.shut div.body, div.subsection.shut div.body { display: none; } /*------------------------------------------------------------------------*/ /* POD markup */ /*------------------------------------------------------------------------*/ div.pod { } div.pod p { margin: 0px 0px 10px 0px; } div.pod pre { margin: 0 0 15px 20px; padding: 10px; border: 1px solid #ddd; background-color: #f6f6f6; font-size: 13px; color: #444444; } div.pod pre span.tt { font-weight: bold; color: #0059a5; } /*------------------------------------------------------------------------*/ /* Index page list */ /*------------------------------------------------------------------------*/ ul.index { margin: 10px 10px 10px 0; padding: 0px; } ul.index li { list-style: none; margin: 0 0 5px 0; padding: 0; } ul.index li a { text-decoration: none; font-weight: bold; padding: 0 0 0 20px; margin: 0; color: ; background: url('../images/arrows/ff16_blue/right.gif') no-repeat top left; } ul.index li a:hover { color: ; background-image: url('../images/arrows/ff16_orange/right.gif'); } ul.index li p { margin: 0 0 10px 0; padding: 0 0 0 20px; } TT_v224_html_docs/css/ie6.css000700 000765 000765 00000003274 11756705102 015604 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* How is IE broken? Let me count the ways... */ /*------------------------------------------------------------------------*/ #sidebar { left: 220px; } ul.menu li a { height: 20px; margin: 0; } div.controls a.menu { margin-right: 3px; } div.ieblowsgoats { display: block; } /*------------------------------------------------------------------------*/ /* IE's negative margins are broken. As soon as you declare a height on */ /* an element (div.head in this case), it no longer displays any content */ /* pushed out via negative margins. And without the height, IE won't */ /* correctly position any absolutely positioned elements inside it (e.g */ /* the 'Top' link. So yet again, we have to jump through some hoops to */ /* make up for Microsoft's downright shoddy approach to writing software. */ /* In this case, we shift the header left again and remove the negative */ /* margin. But that also shifts the right hand side over, so we need to */ /* shift the 'Top' link rightwards to put it back into place. The only */ /* downside is that the lines under the titles are also shifted left, */ /* but we can live with that. Or rather, IE6 users will have to live */ /* with it. Or download Firefox. /*------------------------------------------------------------------------*/ div.section div.head, div.subsection div.head { height: 20px; left: -28px; padding-left: 28px; } div.subsection div.head { left: -20px; padding-left: 20px; } div.section div.head a.top { right: -28px; } div.subsection div.head a.top { right: -20px; } TT_v224_html_docs/css/ie7.css000700 000765 000765 00000003274 11756705102 015605 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* How is IE broken? Let me count the ways... */ /*------------------------------------------------------------------------*/ #sidebar { left: 220px; } ul.menu li a { height: 20px; margin: 0; } div.controls a.menu { margin-right: 3px; } div.ieblowsgoats { display: block; } /*------------------------------------------------------------------------*/ /* IE's negative margins are broken. As soon as you declare a height on */ /* an element (div.head in this case), it no longer displays any content */ /* pushed out via negative margins. And without the height, IE won't */ /* correctly position any absolutely positioned elements inside it (e.g */ /* the 'Top' link. So yet again, we have to jump through some hoops to */ /* make up for Microsoft's downright shoddy approach to writing software. */ /* In this case, we shift the header left again and remove the negative */ /* margin. But that also shifts the right hand side over, so we need to */ /* shift the 'Top' link rightwards to put it back into place. The only */ /* downside is that the lines under the titles are also shifted left, */ /* but we can live with that. Or rather, IE6 users will have to live */ /* with it. Or download Firefox. /*------------------------------------------------------------------------*/ div.section div.head, div.subsection div.head { height: 20px; left: -28px; padding-left: 28px; } div.subsection div.head { left: -20px; padding-left: 20px; } div.section div.head a.top { right: -28px; } div.subsection div.head a.top { right: -20px; } TT_v224_html_docs/css/orange.css000700 000765 000765 00000050706 11756705102 016376 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* default styles */ /*------------------------------------------------------------------------*/ h1, h2, h3, h4, h5, h6 { color: #444444; } h1,h2,h3 { margin: 0px 0 5px 0; } p { color: #333; padding: 0 0 8px 0; } p.tight { padding: 4px 0; margin: 0; } pre { line-height: 120%; } code { color: #224; font-weight: bold; } a { text-decoration: none; color: #FF7F00; } a:visited { color: #da3700; } a:hover { color: #00AAF0; } a:focus { -moz-outline: none; } .alt { display: none; } .sample { display: block; width: 100px; height: 30px; } br.clear { clear: both; } /*------------------------------------------------------------------------*/ /* main body style */ /*------------------------------------------------------------------------*/ body { font: 14px Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #333; margin: 0px; padding: 10px 10px 20px 10px; background: #FF7F00 url('../images/glass/orange/top_grad.gif') repeat-x top left; } #layout { background: white url('../images/glass/orange/left.gif') repeat-y top left; min-width: 600px; } /*------------------------------------------------------------------------*/ /* header */ /*------------------------------------------------------------------------*/ #header { position: relative; height: 130px; margin: 0px; padding: 0 25px 0 220px; background: url('../images/glass/orange/header.gif') no-repeat top right; } #header #logo { display: block; position: absolute; top: 0; left: 0; width: 220px; height: 130px; background: url('../images/glass/orange/logo_grey.gif') no-repeat top right; } #header #logo:hover { background-image: url('../images/glass/orange/logo_blue.gif'); } #header #trail { height: 40px; margin: 0; padding: 0 0 0 10px; background: url('../images/glass/orange/tab_pre.gif') no-repeat top left; } #header #trail.blank { background-image: none; } #header #trail li { display: block; float: left; background: url('../images/glass/orange/tab_cold.gif') no-repeat top left; padding: 0 0 0 10px; } #header #trail li a { display: block; float: left; font-size: 11px; text-decoration: none; color: #888888; line-height: 14px; height: 30px; min-width: 60px; padding: 10px 15px 0 0; background: url('../images/glass/orange/tab_cold.gif') no-repeat top right; } #header #trail li a:hover { color: #00AAF0; } #header #trail li:hover, #header #trail li:hover a { background-image: url('../images/glass/orange/tab_roll.gif'); } #header #trail li.last { background-image: url('../images/glass/orange/tab_warm.gif'); color: #444444; } #header #trail li.last a { background-image: url('../images/glass/orange/tab_warm.gif'); color: #444444; padding-right: 45px; } #header .headline { font-size: 24px; margin: 8px 0 8px 0; padding: 0 100px 0 0; color: #444444; } #header .subhead { font-size: 16px; line-height: 18px; padding: 0 110px 0 0; margin: 0; color: #444; } #header .controls { position: absolute; display: block; top: 40px; right: 20px; width: 130px; height: 70px; overflow: visible; } /*------------------------------------------------------------------------*/ /* main page content and sidebar */ /*------------------------------------------------------------------------*/ #page { margin-bottom: 0; padding: 0; padding-left: 220px; background: url('../images/glass/orange/right.gif') repeat-y top right; } #sidebar { position: relative; float: left; padding: 0; width: 220px; margin: 0; margin-left: -220px; } #content { position: relative; margin: 0; padding: 0 40px 10px 15px; } #sidebar #menu { width: 220px; margin: 0; padding: 0; background: url('../images/glass/orange/menu_body.gif') repeat-y top left; } #sidebar #menu div.foot { height: 20px; background: url('../images/glass/orange/menu_foot.gif') no-repeat bottom left; } #page div.pageinfo { text-align: center; font-size: 10px; color: #ccc; } /*------------------------------------------------------------------------*/ /* footer */ /*------------------------------------------------------------------------*/ #footer { clear: both; position: relative; padding: 0 145px 0px 270px; height: 100px; background: url('../images/glass/orange/footer.gif') no-repeat bottom left; } #footer a.osi { position: absolute; display: block; left: 200px; bottom: 30px; width: 70px; height: 50px; cursor: pointer; background: url('../images/glass/orange/osi.gif') no-repeat top left; } #footer .copyright { text-align: center; color: #666; font-size: 12px; padding: 14px 0 0 0; } #footer .licence { text-align: center; padding-top: 5px; color: #888; font-size: 11px; line-height: 15px; padding: 0 20px; } #footer .copyright a, #footer .copyright a:visited, #footer .licence a, #footer .licence a:visited { color: #da3700; } #footer .copyright a:hover, #footer .licence a:hover { color: #00AAF0; } #footer .controls { position: absolute; display: block; bottom: 0; right: 0; width: 125px; height: 100px; padding: 0 25px 0 0; background: url('../images/glass/orange/footer.gif') no-repeat bottom right; } /*------------------------------------------------------------------------*/ /* widescreen mode */ /*------------------------------------------------------------------------*/ #body.wide { padding: 10px 0 0 0; } #body.wide #palette { display: none; } #body.wide #header { padding: 0 20px 0 20px; margin: -50px -20px 0 0; } #body.wide #header #logo { display: none; } #body.wide #page { padding: 10px; margin: 0 0 0 0; background-image: none; background-color: white; min-width: 560px; } #body.wide #sidebar { display: none; } #body.wide #content { padding: 0 10px; background: white none; } #body.wide #footer { padding: 0 150px 0px 90px; margin-right: -20px; background-position: bottom right; } #body.wide #footer a.osi { left: 20px; } /*------------------------------------------------------------------------*/ /* controls for showing/hiding the menu */ /*------------------------------------------------------------------------*/ div.controls a.menu { display: block; float: right; margin-right: 5px; width: 40px; height: 30px; background: url('../images/glass/orange/hide_menu.gif') no-repeat 0 5px; } div.controls a.hide:hover { background-image: url('../images/glass/orange/hide_menu_roll.gif'); } div.controls a.show { background-image: url('../images/glass/orange/show_menu.gif'); } div.controls a.show:hover { background-image: url('../images/glass/orange/show_menu_roll.gif'); } body div.controls a.hide { display: block; } body div.controls a.show { display: none; } body.wide div.controls a.hide { display: none; } body.wide div.controls a.show { display: block; } /*------------------------------------------------------------------------*/ /* rollover tooltip box for our talking badger */ /*------------------------------------------------------------------------*/ div.controls a span.about, div.controls span span.about { display: none; position: absolute; right: 175px; top: 5px; height: 40px; width: 200px; padding: 10px 37px 13px 10px; font-size: 10px; line-height: 13px; text-align: left; color: #888888; background: url('../images/glass/common/talkbox.gif') no-repeat top right; } div.controls a:hover span.about, div.controls span:hover span.about { display: block; } div.controls span.about h4 { display: block; font-size: 11px; margin: 0; padding: 0 0 1px 0; color: #444444; } /*------------------------------------------------------------------------*/ /* pager for going to the previous/index/next page */ /*------------------------------------------------------------------------*/ div.pager { clear: right; float: right; padding-top: 5px; width: 98px; } div.pager .go { display: block; float: left; height: 18px; padding-top: 18px; width: 32px; font-size: 10px; text-align: center; background: url('../images/arrows/large/blank/dot.gif') no-repeat top center; } div.pager span.go { color: #aaa; } div.pager a.go { color: #FF7F00; } div.pager a.go:hover { color: #00AAF0; } div.pager a.back { background-image: url('../images/arrows/large/orange/left.gif'); } div.pager a.back:hover { background-image: url('../images/arrows/large/blue/left.gif'); } div.pager span.back { background-image: url('../images/arrows/large/blank/left.gif'); } div.pager a.next { background-image: url('../images/arrows/large/orange/right.gif'); } div.pager a.next:hover { background-image: url('../images/arrows/large/blue/right.gif'); } div.pager span.next { background-image: url('../images/arrows/large/blank/right.gif'); } div.pager a.up { background-image: url('../images/arrows/large/orange/up.gif'); } div.pager a.up:hover { background-image: url('../images/arrows/large/blue/up.gif'); } div.pager span.up { background-image: url('../images/arrows/large/blank/up.gif'); } /*------------------------------------------------------------------------*/ /* pager is repeated in footer, but with text above arrows not below */ /*------------------------------------------------------------------------*/ #footer .pager { padding-top: 0; } #footer .pager .go { height: 42px; padding-top: 0; background-position: bottom center; } #footer a span.about { display: none; position: absolute; right: 28px; width: 200px; top: 58px; height: 25px; padding: 0; font-size: 11px; line-height: 13px; text-align: right; color: #444444; background-image: none; } #footer span span.about { display: none; } #footer a:hover span.about { display: block; } /*------------------------------------------------------------------------*/ /* colour selection palette */ /*------------------------------------------------------------------------*/ #palette { position: absolute; top: 0; right: 60px; height: 20px; margin-top: 0px; width: 144px; background: url('../images/glass/orange/palette.gif') no-repeat top right; } #palette ul { display: block; height: 20px; margin: 0 12px 0 0; padding: 0 0 0 12px; background: url('../images/glass/orange/palette.gif') no-repeat top left; } #palette li { display: inline; padding: 0; margin: 0; } #palette li a { display: block; float: left; height: 20px; width: 24px; padding: 0; margin: 0; background: url('../images/glass/orange/col_grey_in.gif') no-repeat top right; } #palette li a.blue { background-image: url('../images/glass/orange/col_blue_in.gif'); } #palette li a.blue:hover { background-image: url('../images/glass/orange/col_blue_out.gif'); } #palette li a.orange { background-image: url('../images/glass/orange/col_orange_out.gif'); } #palette li a.orange:hover { background-image: url('../images/glass/orange/col_orange_out.gif'); } #palette li a.green { background-image: url('../images/glass/orange/col_green_in.gif'); } #palette li a.green:hover { background-image: url('../images/glass/orange/col_green_out.gif'); } #palette li a.purple { background-image: url('../images/glass/orange/col_purple_in.gif'); } #palette li a.purple:hover { background-image: url('../images/glass/orange/col_purple_out.gif'); } #palette li a.grey { background-image: url('../images/glass/orange/col_grey_in.gif'); } #palette li a.grey:hover { background-image: url('../images/glass/orange/col_grey_out.gif'); } /*------------------------------------------------------------------------*/ /* menu styles */ /*------------------------------------------------------------------------*/ ul.menu { list-style: none; margin: 0 20px; padding: 0; } ul.menu li { list-style: none; display: block; margin: 0; padding: 0; } ul.menu li.last { background: url('../images/glass/orange/menu_item_foot.gif') no-repeat top left; padding-top: 1px; } ul.menu li a { display: block; margin: 0; padding: 4px 8px; font-size: 13px; line-height: 16px; min-height: 16px; color: #da3700; text-decoration: none; background: url('../images/glass/orange/menu_item_body.gif') no-repeat top left; } ul.menu li.first a { background-image: url('../images/glass/orange/menu_item_head.gif'); } ul.menu li.last a { background: url('../images/glass/orange/menu_item_foot.gif') no-repeat bottom left; } ul.menu li a:hover { color: #00AAF0; background-image: url('../images/glass/orange/menu_warm_body.gif'); */ } ul.menu li a.warm { font-weight: bold; background-image: url('../images/glass/orange/menu_warm_body.gif'); */ } ul.menu li.first a.warm, ul.menu li.first a:hover { background-image: url('../images/glass/orange/menu_warm_head.gif'); } ul.menu li.last a.warm, ul.menu li.last a:hover { background: url('../images/glass/orange/menu_warm_foot.gif') no-repeat bottom left; } ul.menu li.l1 a { padding: 3px 8px 3px 22px; font-size: 11px; } ul.menu li.l2 a { padding: 3px 8px 3px 36px; font-size: 11px; } ul.menu li.l3 a { padding: 3px 8px 3px 50px; font-size: 11px; } ul.menu li.l4 a { padding: 3px 8px 3px 64px; font-size: 11px; } ul.menu li.l5 a { padding: 3px 8px 3px 78px; font-size: 11px; } ul.menu li.l6 a { padding: 3px 8px 3px 92px; font-size: 11px; } ul.menu li.l7 a { padding: 3px 8px 3px 106px; font-size: 11px; } /*------------------------------------------------------------------------*/ /* Styles for table of contents */ /*------------------------------------------------------------------------*/ ul.toc { margin: 0 0 20px 0; padding: 0; } ul.toc li { list-style: none; margin: 0; font-size: 14px; line-height: 18px; } ul.toc li a { font-size: 14px; line-height: 16px; min-height: 14px; text-decoration: none; margin: 0; padding: 4px 0 1px 18px; background: url('../images/arrows/small/orange/dot.gif') 0px 4px no-repeat; color: #FF7F00; } * html ul.toc li a { height: 16px; } ul.toc li.sub { margin: 0; line-height: 14px; } ul.toc li.sub a { display: block; margin: 0; padding: 2px 0 1px 34px; font-size: 13px; line-height: 15px; background: url('../images/arrows/small/orange/minidot.gif') 20px 3px no-repeat; } ul.toc li.subsub a { display: block; margin: 0; padding: 0 0 0 60px; font-size: 12px; line-height: 14px; background: url('../images/arrows/small/orange/minidot.gif') 40px 2px no-repeat; } ul.toc li a:hover { background-image: url('../images/arrows/small/blue/dot.gif'); color: #00AAF0; } ul.toc li.sub a:hover, ul.toc li.subsub a:hover { background-image: url('../images/arrows/small/blue/minidot.gif'); color: #00AAF0; } /*------------------------------------------------------------------------*/ /* sections */ /*------------------------------------------------------------------------*/ div.section, div.subsection { padding: 0 0 0 20px; clear: right; } div.section div.head, div.subsection div.head { margin: 0 0 4px 0px; min-height: 20px; position: relative; } div.section div.head { border-bottom: 1px dashed #E7C8A8; } div.subsection div.head { border-bottom: 1px dashed #E7C8A8; margin-bottom: 2px; } div.section div.head h1 { padding: 0 80px 4px 28px; margin: 0 0 0 -28px; font-size: 18px; line-height: 22px; font-weight: bold; background: url('../images/arrows/large/orange/dot.gif') no-repeat top left; } div.section div.head h2 { padding: 0 80px 2px 20px; margin: 0 0 0 -20px; font-size: 16px; line-height: 20px; font-weight: bold; background: url('../images/arrows/small/orange/dot.gif') no-repeat 0 3px; } div.section h3 { margin: 0; padding: 5px 0 5px 0; font-size: 14px; line-height: 18px; } div.section.open div.head h1 { background-image: url('../images/arrows/large/orange/dotminus.gif'); } div.section.open div.head:hover h1 { color: #00AAF0; cursor: pointer; background-image: url('../images/arrows/large/blue/dotminus.gif'); } div.section.shut div.head h1 { background-image: url('../images/arrows/large/orange/dotplus.gif'); } div.section.shut div.head:hover h1 { color: #00AAF0; cursor: pointer; background-image: url('../images/arrows/large/blue/dotplus.gif'); } div.subsection.open div.head h2 { background-image: url('../images/arrows/small/orange/dotminus.gif'); } div.subsection.open div.head:hover h2 { color: #00AAF0; cursor: pointer; background-image: url('../images/arrows/small/blue/dotminus.gif'); } div.subsection.shut div.head h2 { background-image: url('../images/arrows/small/orange/dotplus.gif'); } div.subsection.shut div.head:hover h2 { color: #00AAF0; cursor: pointer; background-image: url('../images/arrows/small/blue/dotplus.gif'); } div.section div.head a.top { position: absolute; bottom: 4px; right: 0px; padding: 0px 20px 0px 0; margin: 0px; width: 25px; text-align: right; font-size: 10px; height: 16px; color: #FF7F00; background: url('../images/arrows/small/orange/up.gif') no-repeat 28px 3px; } div.section div.head a.top:hover { color: #00AAF0; background-image: url('../images/arrows/small/blue/up.gif'); } div.section div.head a.open, div.section div.head a.shut, div.subsection div.head a.open, div.subsection div.head a.shut { position: absolute; bottom: 4px; right: 45px; margin: 0px; padding: 0px 5px; font-size: 11px; height: 16px; width: 3em; text-align: right; border-right: 1px solid #ddd; display: none; } div.section.shut div.head a.open, div.subsection.shut div.head a.open { display: block; } div.section.shut div.head a.shut, div.subsection.shut div.head a.shut { display: none; } div.section.open div.head a.open, div.subsection.open div.head a.open { display: none; } div.section.open div.head a.shut, div.subsection.open div.head a.shut { display: block; } div.section div.body { display: block; padding: 10px 0 20px 0; } div.subsection div.body { display: block; padding: 5px 0 10px 0; } div.section.shut div.body, div.subsection.shut div.body { display: none; } /*------------------------------------------------------------------------*/ /* POD markup */ /*------------------------------------------------------------------------*/ div.pod { } div.pod p { margin: 0px 0px 10px 0px; } div.pod pre { margin: 0 0 15px 20px; padding: 10px; border: 1px solid #ddd; background-color: #f6f6f6; font-size: 13px; color: #444444; } div.pod pre span.tt { font-weight: bold; color: #da3700; } /*------------------------------------------------------------------------*/ /* Index page list */ /*------------------------------------------------------------------------*/ ul.index { margin: 10px 10px 10px 0; padding: 0px; } ul.index li { list-style: none; margin: 0 0 5px 0; padding: 0; } ul.index li a { text-decoration: none; font-weight: bold; padding: 0 0 0 20px; margin: 0; color: ; background: url('../images/arrows/ff16_blue/right.gif') no-repeat top left; } ul.index li a:hover { color: ; background-image: url('../images/arrows/ff16_orange/right.gif'); } ul.index li p { margin: 0 0 10px 0; padding: 0 0 0 20px; } TT_v224_html_docs/css/print.css000700 000765 000765 00000054622 11756705102 016260 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* default styles */ /*------------------------------------------------------------------------*/ h1, h2, h3, h4, h5, h6 { color: #444444; } h1,h2,h3 { margin: 0px 0 5px 0; } p { color: #333; padding: 0 0 8px 0; } p.tight { padding: 4px 0; margin: 0; } pre { line-height: 120%; } code { color: #224; font-weight: bold; } a { text-decoration: none; color: #00AAF0; } a:visited { color: #0059a5; } a:hover { color: #FF7F00; } a:focus { -moz-outline: none; } .alt { display: none; } .sample { display: block; width: 100px; height: 30px; } br.clear { clear: both; } /*------------------------------------------------------------------------*/ /* main body style */ /*------------------------------------------------------------------------*/ body { font: 14px Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #333; margin: 0px; padding: 10px 10px 20px 10px; background: #cccccc url('../images/glass/grey/top_grad.gif') repeat-x top left; } #layout { background: white url('../images/glass/grey/left.gif') repeat-y top left; min-width: 600px; } /*------------------------------------------------------------------------*/ /* header */ /*------------------------------------------------------------------------*/ #header { position: relative; height: 130px; margin: 0px; padding: 0 25px 0 220px; background: url('../images/glass/grey/header.gif') no-repeat top right; } #header #logo { display: block; position: absolute; top: 0; left: 0; width: 220px; height: 130px; background: url('../images/glass/grey/logo_blue.gif') no-repeat top right; } #header #logo:hover { background-image: url('../images/glass/grey/logo_orange.gif'); } #header #trail { height: 40px; margin: 0; padding: 0 0 0 10px; background: url('../images/glass/grey/tab_pre.gif') no-repeat top left; } #header #trail.blank { background-image: none; } #header #trail li { display: block; float: left; background: url('../images/glass/grey/tab_cold.gif') no-repeat top left; padding: 0 0 0 10px; } #header #trail li a { display: block; float: left; font-size: 11px; text-decoration: none; color: #888888; line-height: 14px; height: 30px; min-width: 60px; padding: 10px 15px 0 0; background: url('../images/glass/grey/tab_cold.gif') no-repeat top right; } #header #trail li a:hover { color: #FF7F00; } #header #trail li:hover, #header #trail li:hover a { background-image: url('../images/glass/grey/tab_roll.gif'); } #header #trail li.last { background-image: url('../images/glass/grey/tab_warm.gif'); color: #444444; } #header #trail li.last a { background-image: url('../images/glass/grey/tab_warm.gif'); color: #444444; padding-right: 45px; } #header .headline { font-size: 24px; margin: 8px 0 8px 0; padding: 0 100px 0 0; color: #444444; } #header .subhead { font-size: 16px; line-height: 18px; padding: 0 110px 0 0; margin: 0; color: #444; } #header .controls { position: absolute; display: block; top: 40px; right: 20px; width: 130px; height: 70px; overflow: visible; } /*------------------------------------------------------------------------*/ /* main page content and sidebar */ /*------------------------------------------------------------------------*/ #page { margin-bottom: 0; padding: 0; padding-left: 220px; background: url('../images/glass/grey/right.gif') repeat-y top right; } #sidebar { position: relative; float: left; padding: 0; width: 220px; margin: 0; margin-left: -220px; } #content { position: relative; margin: 0; padding: 0 40px 10px 15px; } #sidebar #menu { width: 220px; margin: 0; padding: 0; background: url('../images/glass/grey/menu_body.gif') repeat-y top left; } #sidebar #menu div.foot { height: 20px; background: url('../images/glass/grey/menu_foot.gif') no-repeat bottom left; } #page div.pageinfo { text-align: center; font-size: 10px; color: #ccc; } /*------------------------------------------------------------------------*/ /* footer */ /*------------------------------------------------------------------------*/ #footer { clear: both; position: relative; padding: 0 145px 0px 270px; height: 100px; background: url('../images/glass/grey/footer.gif') no-repeat bottom left; } #footer a.osi { position: absolute; display: block; left: 200px; bottom: 30px; width: 70px; height: 50px; cursor: pointer; background: url('../images/glass/grey/osi.gif') no-repeat top left; } #footer .copyright { text-align: center; color: #666; font-size: 12px; padding: 14px 0 0 0; } #footer .licence { text-align: center; padding-top: 5px; color: #888; font-size: 11px; line-height: 15px; padding: 0 20px; } #footer .copyright a, #footer .copyright a:visited, #footer .licence a, #footer .licence a:visited { color: #40698c; } #footer .copyright a:hover, #footer .licence a:hover { color: #FF7F00; } #footer .controls { position: absolute; display: block; bottom: 0; right: 0; width: 125px; height: 100px; padding: 0 25px 0 0; background: url('../images/glass/grey/footer.gif') no-repeat bottom right; } /*------------------------------------------------------------------------*/ /* widescreen mode */ /*------------------------------------------------------------------------*/ #body.wide { padding: 10px 0 0 0; } #body.wide #palette { display: none; } #body.wide #header { padding: 0 20px 0 20px; margin: -50px -20px 0 0; } #body.wide #header #logo { display: none; } #body.wide #page { padding: 10px; margin: 0 0 0 0; background-image: none; background-color: white; min-width: 560px; } #body.wide #sidebar { display: none; } #body.wide #content { padding: 0 10px; background: white none; } #body.wide #footer { padding: 0 150px 0px 90px; margin-right: -20px; background-position: bottom right; } #body.wide #footer a.osi { left: 20px; } /*------------------------------------------------------------------------*/ /* controls for showing/hiding the menu */ /*------------------------------------------------------------------------*/ div.controls a.menu { display: block; float: right; margin-right: 5px; width: 40px; height: 30px; background: url('../images/glass/grey/hide_menu.gif') no-repeat 0 5px; } div.controls a.hide:hover { background-image: url('../images/glass/grey/hide_menu_roll.gif'); } div.controls a.show { background-image: url('../images/glass/grey/show_menu.gif'); } div.controls a.show:hover { background-image: url('../images/glass/grey/show_menu_roll.gif'); } body div.controls a.hide { display: block; } body div.controls a.show { display: none; } body.wide div.controls a.hide { display: none; } body.wide div.controls a.show { display: block; } /*------------------------------------------------------------------------*/ /* rollover tooltip box for our talking badger */ /*------------------------------------------------------------------------*/ div.controls a span.about, div.controls span span.about { display: none; position: absolute; right: 175px; top: 5px; height: 40px; width: 200px; padding: 10px 37px 13px 10px; font-size: 10px; line-height: 13px; text-align: left; color: #888888; background: url('../images/glass/common/talkbox.gif') no-repeat top right; } div.controls a:hover span.about, div.controls span:hover span.about { display: block; } div.controls span.about h4 { display: block; font-size: 11px; margin: 0; padding: 0 0 1px 0; color: #444444; } /*------------------------------------------------------------------------*/ /* pager for going to the previous/index/next page */ /*------------------------------------------------------------------------*/ div.pager { clear: right; float: right; padding-top: 5px; width: 98px; } div.pager .go { display: block; float: left; height: 18px; padding-top: 18px; width: 32px; font-size: 10px; text-align: center; background: url('../images/arrows/large/blank/dot.gif') no-repeat top center; } div.pager span.go { color: #aaa; } div.pager a.go { color: #00AAF0; } div.pager a.go:hover { color: #FF7F00; } div.pager a.back { background-image: url('../images/arrows/large/blue/left.gif'); } div.pager a.back:hover { background-image: url('../images/arrows/large/orange/left.gif'); } div.pager span.back { background-image: url('../images/arrows/large/blank/left.gif'); } div.pager a.next { background-image: url('../images/arrows/large/blue/right.gif'); } div.pager a.next:hover { background-image: url('../images/arrows/large/orange/right.gif'); } div.pager span.next { background-image: url('../images/arrows/large/blank/right.gif'); } div.pager a.up { background-image: url('../images/arrows/large/blue/up.gif'); } div.pager a.up:hover { background-image: url('../images/arrows/large/orange/up.gif'); } div.pager span.up { background-image: url('../images/arrows/large/blank/up.gif'); } /*------------------------------------------------------------------------*/ /* pager is repeated in footer, but with text above arrows not below */ /*------------------------------------------------------------------------*/ #footer .pager { padding-top: 0; } #footer .pager .go { height: 42px; padding-top: 0; background-position: bottom center; } #footer a span.about { display: none; position: absolute; right: 28px; width: 200px; top: 58px; height: 25px; padding: 0; font-size: 11px; line-height: 13px; text-align: right; color: #444444; background-image: none; } #footer span span.about { display: none; } #footer a:hover span.about { display: block; } /*------------------------------------------------------------------------*/ /* colour selection palette */ /*------------------------------------------------------------------------*/ #palette { position: absolute; top: 0; right: 60px; height: 20px; margin-top: 0px; width: 144px; background: url('../images/glass/grey/palette.gif') no-repeat top right; } #palette ul { display: block; height: 20px; margin: 0 12px 0 0; padding: 0 0 0 12px; background: url('../images/glass/grey/palette.gif') no-repeat top left; } #palette li { display: inline; padding: 0; margin: 0; } #palette li a { display: block; float: left; height: 20px; width: 24px; padding: 0; margin: 0; background: url('../images/glass/grey/col_grey_in.gif') no-repeat top right; } #palette li a.blue { background-image: url('../images/glass/grey/col_blue_in.gif'); } #palette li a.blue:hover { background-image: url('../images/glass/grey/col_blue_out.gif'); } #palette li a.orange { background-image: url('../images/glass/grey/col_orange_in.gif'); } #palette li a.orange:hover { background-image: url('../images/glass/grey/col_orange_out.gif'); } #palette li a.green { background-image: url('../images/glass/grey/col_green_in.gif'); } #palette li a.green:hover { background-image: url('../images/glass/grey/col_green_out.gif'); } #palette li a.purple { background-image: url('../images/glass/grey/col_purple_in.gif'); } #palette li a.purple:hover { background-image: url('../images/glass/grey/col_purple_out.gif'); } #palette li a.grey { background-image: url('../images/glass/grey/col_grey_out.gif'); } #palette li a.grey:hover { background-image: url('../images/glass/grey/col_grey_out.gif'); } /*------------------------------------------------------------------------*/ /* menu styles */ /*------------------------------------------------------------------------*/ ul.menu { list-style: none; margin: 0 20px; padding: 0; } ul.menu li { list-style: none; display: block; margin: 0; padding: 0; } ul.menu li.last { background: url('../images/glass/grey/menu_item_foot.gif') no-repeat top left; padding-top: 1px; } ul.menu li a { display: block; margin: 0; padding: 4px 8px; font-size: 13px; line-height: 16px; min-height: 16px; color: #0059a5; text-decoration: none; background: url('../images/glass/grey/menu_item_body.gif') no-repeat top left; } ul.menu li.first a { background-image: url('../images/glass/grey/menu_item_head.gif'); } ul.menu li.last a { background: url('../images/glass/grey/menu_item_foot.gif') no-repeat bottom left; } ul.menu li a:hover { color: #FF7F00; background-image: url('../images/glass/grey/menu_warm_body.gif'); */ } ul.menu li a.warm { font-weight: bold; background-image: url('../images/glass/grey/menu_warm_body.gif'); */ } ul.menu li.first a.warm, ul.menu li.first a:hover { background-image: url('../images/glass/grey/menu_warm_head.gif'); } ul.menu li.last a.warm, ul.menu li.last a:hover { background: url('../images/glass/grey/menu_warm_foot.gif') no-repeat bottom left; } ul.menu li.l1 a { padding: 3px 8px 3px 22px; font-size: 11px; } ul.menu li.l2 a { padding: 3px 8px 3px 36px; font-size: 11px; } ul.menu li.l3 a { padding: 3px 8px 3px 50px; font-size: 11px; } ul.menu li.l4 a { padding: 3px 8px 3px 64px; font-size: 11px; } ul.menu li.l5 a { padding: 3px 8px 3px 78px; font-size: 11px; } ul.menu li.l6 a { padding: 3px 8px 3px 92px; font-size: 11px; } ul.menu li.l7 a { padding: 3px 8px 3px 106px; font-size: 11px; } /*------------------------------------------------------------------------*/ /* Styles for table of contents */ /*------------------------------------------------------------------------*/ ul.toc { margin: 0 0 20px 0; padding: 0; } ul.toc li { list-style: none; margin: 0; font-size: 14px; line-height: 18px; } ul.toc li a { font-size: 14px; line-height: 16px; min-height: 14px; text-decoration: none; margin: 0; padding: 4px 0 1px 18px; background: url('../images/arrows/small/blue/dot.gif') 0px 4px no-repeat; color: #00AAF0; } * html ul.toc li a { height: 16px; } ul.toc li.sub { margin: 0; line-height: 14px; } ul.toc li.sub a { display: block; margin: 0; padding: 2px 0 1px 34px; font-size: 13px; line-height: 15px; background: url('../images/arrows/small/blue/minidot.gif') 20px 3px no-repeat; } ul.toc li.subsub a { display: block; margin: 0; padding: 0 0 0 60px; font-size: 12px; line-height: 14px; background: url('../images/arrows/small/blue/minidot.gif') 40px 2px no-repeat; } ul.toc li a:hover { background-image: url('../images/arrows/small/orange/dot.gif'); color: #FF7F00; } ul.toc li.sub a:hover, ul.toc li.subsub a:hover { background-image: url('../images/arrows/small/orange/minidot.gif'); color: #FF7F00; } /*------------------------------------------------------------------------*/ /* sections */ /*------------------------------------------------------------------------*/ div.section, div.subsection { padding: 0 0 0 20px; clear: right; } div.section div.head, div.subsection div.head { margin: 0 0 4px 0px; min-height: 20px; position: relative; } div.section div.head { border-bottom: 1px dashed #b0d2e9; } div.subsection div.head { border-bottom: 1px dashed #b0d2e9; margin-bottom: 2px; } div.section div.head h1 { padding: 0 80px 4px 28px; margin: 0 0 0 -28px; font-size: 18px; line-height: 22px; font-weight: bold; background: url('../images/arrows/large/blue/dot.gif') no-repeat top left; } div.section div.head h2 { padding: 0 80px 2px 20px; margin: 0 0 0 -20px; font-size: 16px; line-height: 20px; font-weight: bold; background: url('../images/arrows/small/blue/dot.gif') no-repeat 0 3px; } div.section h3 { margin: 0; padding: 5px 0 5px 0; font-size: 14px; line-height: 18px; } div.section.open div.head h1 { background-image: url('../images/arrows/large/blue/dotminus.gif'); } div.section.open div.head:hover h1 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/large/orange/dotminus.gif'); } div.section.shut div.head h1 { background-image: url('../images/arrows/large/blue/dotplus.gif'); } div.section.shut div.head:hover h1 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/large/orange/dotplus.gif'); } div.subsection.open div.head h2 { background-image: url('../images/arrows/small/blue/dotminus.gif'); } div.subsection.open div.head:hover h2 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/small/orange/dotminus.gif'); } div.subsection.shut div.head h2 { background-image: url('../images/arrows/small/blue/dotplus.gif'); } div.subsection.shut div.head:hover h2 { color: #FF7F00; cursor: pointer; background-image: url('../images/arrows/small/orange/dotplus.gif'); } div.section div.head a.top { position: absolute; bottom: 4px; right: 0px; padding: 0px 20px 0px 0; margin: 0px; width: 25px; text-align: right; font-size: 10px; height: 16px; color: #00AAF0; background: url('../images/arrows/small/blue/up.gif') no-repeat 28px 3px; } div.section div.head a.top:hover { color: #FF7F00; background-image: url('../images/arrows/small/orange/up.gif'); } div.section div.head a.open, div.section div.head a.shut, div.subsection div.head a.open, div.subsection div.head a.shut { position: absolute; bottom: 4px; right: 45px; margin: 0px; padding: 0px 5px; font-size: 11px; height: 16px; width: 3em; text-align: right; border-right: 1px solid #ddd; display: none; } div.section.shut div.head a.open, div.subsection.shut div.head a.open { display: block; } div.section.shut div.head a.shut, div.subsection.shut div.head a.shut { display: none; } div.section.open div.head a.open, div.subsection.open div.head a.open { display: none; } div.section.open div.head a.shut, div.subsection.open div.head a.shut { display: block; } div.section div.body { display: block; padding: 10px 0 20px 0; } div.subsection div.body { display: block; padding: 5px 0 10px 0; } div.section.shut div.body, div.subsection.shut div.body { display: none; } /*------------------------------------------------------------------------*/ /* POD markup */ /*------------------------------------------------------------------------*/ div.pod { } div.pod p { margin: 0px 0px 10px 0px; } div.pod pre { margin: 0 0 15px 20px; padding: 10px; border: 1px solid #ddd; background-color: #f6f6f6; font-size: 13px; color: #444444; } div.pod pre span.tt { font-weight: bold; color: #0059a5; } /*------------------------------------------------------------------------*/ /* Index page list */ /*------------------------------------------------------------------------*/ ul.index { margin: 10px 10px 10px 0; padding: 0px; } ul.index li { list-style: none; margin: 0 0 5px 0; padding: 0; } ul.index li a { text-decoration: none; font-weight: bold; padding: 0 0 0 20px; margin: 0; color: ; background: url('../images/arrows/ff16_blue/right.gif') no-repeat top left; } ul.index li a:hover { color: ; background-image: url('../images/arrows/ff16_orange/right.gif'); } ul.index li p { margin: 0 0 10px 0; padding: 0 0 0 20px; } #palette, #header #logo, #header #trail, #header div.controls, #footer div.controls, #sidebar, a.top { display: none; } #body { padding: 10px; background-color: white; background-image: none; } #layout, #page { background-image: none; } #header { height: 80px; background-image: none; padding: 10px; } #header h1.headline { padding: 0; } #header h2.subhead { padding: 0; } #header a.permalink { display: block; margin: 5px 0; font-size: 12px; color: black; } #page { padding: 0px; margin: 0 0 0 0; background-image: none; background-color: white; } #content { padding: 0 10px; background: white none; } #footer { margin: 0; padding: 0; height: 80px; background-image: none; } #footer a.osi { display: none; left: 20px; } #footer .copyright { padding: 0; } div.section, div.subsection { padding-left: 0px; } div.section div.head h1, div.section.open div.head h1, div.section.shut div.head h1, div.section div.head h2, div.section.open div.head h2, div.section.shut div.head h2, div.subsection div.head h1, div.subsection.open div.head h1, div.subsection.shut div.head h1, div.subsection div.head h2, div.subsection.open div.head h2, div.subsection.shut div.head h2 { margin-left: 0; padding-left: 0; background-image: none; } ul { padding-left: 20px; } ul li { list-style: disc; padding: 0; background-image: none; } ul.toc { padding-left: 0px; } ul.toc li { list-style: none; padding: 0; background-image: none; } ul.toc li a { padding: 4px 0 1px 0px; background-image: none; color: black; } ul.toc li.sub a { margin-left: 15px; padding: 4px 0 1px 0px; background-image: none; color: black; } ul.toc li.subsub a { margin-left: 30px; padding: 4px 0 1px 0px; background-image: none; color: black; } #content a.ext, a.ext:visited { padding: 0; background-image: none; } #content a.ext:after { content: " [" attr(href) "] "; font-size: 90%; } TT_v224_html_docs/css/purple.css000700 000765 000765 00000050706 11756705102 016432 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* default styles */ /*------------------------------------------------------------------------*/ h1, h2, h3, h4, h5, h6 { color: #444444; } h1,h2,h3 { margin: 0px 0 5px 0; } p { color: #333; padding: 0 0 8px 0; } p.tight { padding: 4px 0; margin: 0; } pre { line-height: 120%; } code { color: #224; font-weight: bold; } a { text-decoration: none; color: #7239b9; } a:visited { color: #582a86; } a:hover { color: #d921d9; } a:focus { -moz-outline: none; } .alt { display: none; } .sample { display: block; width: 100px; height: 30px; } br.clear { clear: both; } /*------------------------------------------------------------------------*/ /* main body style */ /*------------------------------------------------------------------------*/ body { font: 14px Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #333; margin: 0px; padding: 10px 10px 20px 10px; background: #7239b9 url('../images/glass/purple/top_grad.gif') repeat-x top left; } #layout { background: white url('../images/glass/purple/left.gif') repeat-y top left; min-width: 600px; } /*------------------------------------------------------------------------*/ /* header */ /*------------------------------------------------------------------------*/ #header { position: relative; height: 130px; margin: 0px; padding: 0 25px 0 220px; background: url('../images/glass/purple/header.gif') no-repeat top right; } #header #logo { display: block; position: absolute; top: 0; left: 0; width: 220px; height: 130px; background: url('../images/glass/purple/logo_grey.gif') no-repeat top right; } #header #logo:hover { background-image: url('../images/glass/purple/logo_pink.gif'); } #header #trail { height: 40px; margin: 0; padding: 0 0 0 10px; background: url('../images/glass/purple/tab_pre.gif') no-repeat top left; } #header #trail.blank { background-image: none; } #header #trail li { display: block; float: left; background: url('../images/glass/purple/tab_cold.gif') no-repeat top left; padding: 0 0 0 10px; } #header #trail li a { display: block; float: left; font-size: 11px; text-decoration: none; color: #888888; line-height: 14px; height: 30px; min-width: 60px; padding: 10px 15px 0 0; background: url('../images/glass/purple/tab_cold.gif') no-repeat top right; } #header #trail li a:hover { color: #d921d9; } #header #trail li:hover, #header #trail li:hover a { background-image: url('../images/glass/purple/tab_roll.gif'); } #header #trail li.last { background-image: url('../images/glass/purple/tab_warm.gif'); color: #444444; } #header #trail li.last a { background-image: url('../images/glass/purple/tab_warm.gif'); color: #444444; padding-right: 45px; } #header .headline { font-size: 24px; margin: 8px 0 8px 0; padding: 0 100px 0 0; color: #444444; } #header .subhead { font-size: 16px; line-height: 18px; padding: 0 110px 0 0; margin: 0; color: #444; } #header .controls { position: absolute; display: block; top: 40px; right: 20px; width: 130px; height: 70px; overflow: visible; } /*------------------------------------------------------------------------*/ /* main page content and sidebar */ /*------------------------------------------------------------------------*/ #page { margin-bottom: 0; padding: 0; padding-left: 220px; background: url('../images/glass/purple/right.gif') repeat-y top right; } #sidebar { position: relative; float: left; padding: 0; width: 220px; margin: 0; margin-left: -220px; } #content { position: relative; margin: 0; padding: 0 40px 10px 15px; } #sidebar #menu { width: 220px; margin: 0; padding: 0; background: url('../images/glass/purple/menu_body.gif') repeat-y top left; } #sidebar #menu div.foot { height: 20px; background: url('../images/glass/purple/menu_foot.gif') no-repeat bottom left; } #page div.pageinfo { text-align: center; font-size: 10px; color: #ccc; } /*------------------------------------------------------------------------*/ /* footer */ /*------------------------------------------------------------------------*/ #footer { clear: both; position: relative; padding: 0 145px 0px 270px; height: 100px; background: url('../images/glass/purple/footer.gif') no-repeat bottom left; } #footer a.osi { position: absolute; display: block; left: 200px; bottom: 30px; width: 70px; height: 50px; cursor: pointer; background: url('../images/glass/purple/osi.gif') no-repeat top left; } #footer .copyright { text-align: center; color: #666; font-size: 12px; padding: 14px 0 0 0; } #footer .licence { text-align: center; padding-top: 5px; color: #888; font-size: 11px; line-height: 15px; padding: 0 20px; } #footer .copyright a, #footer .copyright a:visited, #footer .licence a, #footer .licence a:visited { color: #66418c; } #footer .copyright a:hover, #footer .licence a:hover { color: #d921d9; } #footer .controls { position: absolute; display: block; bottom: 0; right: 0; width: 125px; height: 100px; padding: 0 25px 0 0; background: url('../images/glass/purple/footer.gif') no-repeat bottom right; } /*------------------------------------------------------------------------*/ /* widescreen mode */ /*------------------------------------------------------------------------*/ #body.wide { padding: 10px 0 0 0; } #body.wide #palette { display: none; } #body.wide #header { padding: 0 20px 0 20px; margin: -50px -20px 0 0; } #body.wide #header #logo { display: none; } #body.wide #page { padding: 10px; margin: 0 0 0 0; background-image: none; background-color: white; min-width: 560px; } #body.wide #sidebar { display: none; } #body.wide #content { padding: 0 10px; background: white none; } #body.wide #footer { padding: 0 150px 0px 90px; margin-right: -20px; background-position: bottom right; } #body.wide #footer a.osi { left: 20px; } /*------------------------------------------------------------------------*/ /* controls for showing/hiding the menu */ /*------------------------------------------------------------------------*/ div.controls a.menu { display: block; float: right; margin-right: 5px; width: 40px; height: 30px; background: url('../images/glass/purple/hide_menu.gif') no-repeat 0 5px; } div.controls a.hide:hover { background-image: url('../images/glass/purple/hide_menu_roll.gif'); } div.controls a.show { background-image: url('../images/glass/purple/show_menu.gif'); } div.controls a.show:hover { background-image: url('../images/glass/purple/show_menu_roll.gif'); } body div.controls a.hide { display: block; } body div.controls a.show { display: none; } body.wide div.controls a.hide { display: none; } body.wide div.controls a.show { display: block; } /*------------------------------------------------------------------------*/ /* rollover tooltip box for our talking badger */ /*------------------------------------------------------------------------*/ div.controls a span.about, div.controls span span.about { display: none; position: absolute; right: 175px; top: 5px; height: 40px; width: 200px; padding: 10px 37px 13px 10px; font-size: 10px; line-height: 13px; text-align: left; color: #888888; background: url('../images/glass/common/talkbox.gif') no-repeat top right; } div.controls a:hover span.about, div.controls span:hover span.about { display: block; } div.controls span.about h4 { display: block; font-size: 11px; margin: 0; padding: 0 0 1px 0; color: #444444; } /*------------------------------------------------------------------------*/ /* pager for going to the previous/index/next page */ /*------------------------------------------------------------------------*/ div.pager { clear: right; float: right; padding-top: 5px; width: 98px; } div.pager .go { display: block; float: left; height: 18px; padding-top: 18px; width: 32px; font-size: 10px; text-align: center; background: url('../images/arrows/large/blank/dot.gif') no-repeat top center; } div.pager span.go { color: #aaa; } div.pager a.go { color: #7239b9; } div.pager a.go:hover { color: #d921d9; } div.pager a.back { background-image: url('../images/arrows/large/purple/left.gif'); } div.pager a.back:hover { background-image: url('../images/arrows/large/pink/left.gif'); } div.pager span.back { background-image: url('../images/arrows/large/blank/left.gif'); } div.pager a.next { background-image: url('../images/arrows/large/purple/right.gif'); } div.pager a.next:hover { background-image: url('../images/arrows/large/pink/right.gif'); } div.pager span.next { background-image: url('../images/arrows/large/blank/right.gif'); } div.pager a.up { background-image: url('../images/arrows/large/purple/up.gif'); } div.pager a.up:hover { background-image: url('../images/arrows/large/pink/up.gif'); } div.pager span.up { background-image: url('../images/arrows/large/blank/up.gif'); } /*------------------------------------------------------------------------*/ /* pager is repeated in footer, but with text above arrows not below */ /*------------------------------------------------------------------------*/ #footer .pager { padding-top: 0; } #footer .pager .go { height: 42px; padding-top: 0; background-position: bottom center; } #footer a span.about { display: none; position: absolute; right: 28px; width: 200px; top: 58px; height: 25px; padding: 0; font-size: 11px; line-height: 13px; text-align: right; color: #444444; background-image: none; } #footer span span.about { display: none; } #footer a:hover span.about { display: block; } /*------------------------------------------------------------------------*/ /* colour selection palette */ /*------------------------------------------------------------------------*/ #palette { position: absolute; top: 0; right: 60px; height: 20px; margin-top: 0px; width: 144px; background: url('../images/glass/purple/palette.gif') no-repeat top right; } #palette ul { display: block; height: 20px; margin: 0 12px 0 0; padding: 0 0 0 12px; background: url('../images/glass/purple/palette.gif') no-repeat top left; } #palette li { display: inline; padding: 0; margin: 0; } #palette li a { display: block; float: left; height: 20px; width: 24px; padding: 0; margin: 0; background: url('../images/glass/purple/col_grey_in.gif') no-repeat top right; } #palette li a.blue { background-image: url('../images/glass/purple/col_blue_in.gif'); } #palette li a.blue:hover { background-image: url('../images/glass/purple/col_blue_out.gif'); } #palette li a.orange { background-image: url('../images/glass/purple/col_orange_in.gif'); } #palette li a.orange:hover { background-image: url('../images/glass/purple/col_orange_out.gif'); } #palette li a.green { background-image: url('../images/glass/purple/col_green_in.gif'); } #palette li a.green:hover { background-image: url('../images/glass/purple/col_green_out.gif'); } #palette li a.purple { background-image: url('../images/glass/purple/col_purple_out.gif'); } #palette li a.purple:hover { background-image: url('../images/glass/purple/col_purple_out.gif'); } #palette li a.grey { background-image: url('../images/glass/purple/col_grey_in.gif'); } #palette li a.grey:hover { background-image: url('../images/glass/purple/col_grey_out.gif'); } /*------------------------------------------------------------------------*/ /* menu styles */ /*------------------------------------------------------------------------*/ ul.menu { list-style: none; margin: 0 20px; padding: 0; } ul.menu li { list-style: none; display: block; margin: 0; padding: 0; } ul.menu li.last { background: url('../images/glass/purple/menu_item_foot.gif') no-repeat top left; padding-top: 1px; } ul.menu li a { display: block; margin: 0; padding: 4px 8px; font-size: 13px; line-height: 16px; min-height: 16px; color: #46216b; text-decoration: none; background: url('../images/glass/purple/menu_item_body.gif') no-repeat top left; } ul.menu li.first a { background-image: url('../images/glass/purple/menu_item_head.gif'); } ul.menu li.last a { background: url('../images/glass/purple/menu_item_foot.gif') no-repeat bottom left; } ul.menu li a:hover { color: #d921d9; background-image: url('../images/glass/purple/menu_warm_body.gif'); */ } ul.menu li a.warm { font-weight: bold; background-image: url('../images/glass/purple/menu_warm_body.gif'); */ } ul.menu li.first a.warm, ul.menu li.first a:hover { background-image: url('../images/glass/purple/menu_warm_head.gif'); } ul.menu li.last a.warm, ul.menu li.last a:hover { background: url('../images/glass/purple/menu_warm_foot.gif') no-repeat bottom left; } ul.menu li.l1 a { padding: 3px 8px 3px 22px; font-size: 11px; } ul.menu li.l2 a { padding: 3px 8px 3px 36px; font-size: 11px; } ul.menu li.l3 a { padding: 3px 8px 3px 50px; font-size: 11px; } ul.menu li.l4 a { padding: 3px 8px 3px 64px; font-size: 11px; } ul.menu li.l5 a { padding: 3px 8px 3px 78px; font-size: 11px; } ul.menu li.l6 a { padding: 3px 8px 3px 92px; font-size: 11px; } ul.menu li.l7 a { padding: 3px 8px 3px 106px; font-size: 11px; } /*------------------------------------------------------------------------*/ /* Styles for table of contents */ /*------------------------------------------------------------------------*/ ul.toc { margin: 0 0 20px 0; padding: 0; } ul.toc li { list-style: none; margin: 0; font-size: 14px; line-height: 18px; } ul.toc li a { font-size: 14px; line-height: 16px; min-height: 14px; text-decoration: none; margin: 0; padding: 4px 0 1px 18px; background: url('../images/arrows/small/purple/dot.gif') 0px 4px no-repeat; color: #7239b9; } * html ul.toc li a { height: 16px; } ul.toc li.sub { margin: 0; line-height: 14px; } ul.toc li.sub a { display: block; margin: 0; padding: 2px 0 1px 34px; font-size: 13px; line-height: 15px; background: url('../images/arrows/small/purple/minidot.gif') 20px 3px no-repeat; } ul.toc li.subsub a { display: block; margin: 0; padding: 0 0 0 60px; font-size: 12px; line-height: 14px; background: url('../images/arrows/small/purple/minidot.gif') 40px 2px no-repeat; } ul.toc li a:hover { background-image: url('../images/arrows/small/pink/dot.gif'); color: #d921d9; } ul.toc li.sub a:hover, ul.toc li.subsub a:hover { background-image: url('../images/arrows/small/pink/minidot.gif'); color: #d921d9; } /*------------------------------------------------------------------------*/ /* sections */ /*------------------------------------------------------------------------*/ div.section, div.subsection { padding: 0 0 0 20px; clear: right; } div.section div.head, div.subsection div.head { margin: 0 0 4px 0px; min-height: 20px; position: relative; } div.section div.head { border-bottom: 1px dashed #7239b9; } div.subsection div.head { border-bottom: 1px dashed #7239b9; margin-bottom: 2px; } div.section div.head h1 { padding: 0 80px 4px 28px; margin: 0 0 0 -28px; font-size: 18px; line-height: 22px; font-weight: bold; background: url('../images/arrows/large/purple/dot.gif') no-repeat top left; } div.section div.head h2 { padding: 0 80px 2px 20px; margin: 0 0 0 -20px; font-size: 16px; line-height: 20px; font-weight: bold; background: url('../images/arrows/small/purple/dot.gif') no-repeat 0 3px; } div.section h3 { margin: 0; padding: 5px 0 5px 0; font-size: 14px; line-height: 18px; } div.section.open div.head h1 { background-image: url('../images/arrows/large/purple/dotminus.gif'); } div.section.open div.head:hover h1 { color: #d921d9; cursor: pointer; background-image: url('../images/arrows/large/pink/dotminus.gif'); } div.section.shut div.head h1 { background-image: url('../images/arrows/large/purple/dotplus.gif'); } div.section.shut div.head:hover h1 { color: #d921d9; cursor: pointer; background-image: url('../images/arrows/large/pink/dotplus.gif'); } div.subsection.open div.head h2 { background-image: url('../images/arrows/small/purple/dotminus.gif'); } div.subsection.open div.head:hover h2 { color: #d921d9; cursor: pointer; background-image: url('../images/arrows/small/pink/dotminus.gif'); } div.subsection.shut div.head h2 { background-image: url('../images/arrows/small/purple/dotplus.gif'); } div.subsection.shut div.head:hover h2 { color: #d921d9; cursor: pointer; background-image: url('../images/arrows/small/pink/dotplus.gif'); } div.section div.head a.top { position: absolute; bottom: 4px; right: 0px; padding: 0px 20px 0px 0; margin: 0px; width: 25px; text-align: right; font-size: 10px; height: 16px; color: #7239b9; background: url('../images/arrows/small/purple/up.gif') no-repeat 28px 3px; } div.section div.head a.top:hover { color: #d921d9; background-image: url('../images/arrows/small/pink/up.gif'); } div.section div.head a.open, div.section div.head a.shut, div.subsection div.head a.open, div.subsection div.head a.shut { position: absolute; bottom: 4px; right: 45px; margin: 0px; padding: 0px 5px; font-size: 11px; height: 16px; width: 3em; text-align: right; border-right: 1px solid #ddd; display: none; } div.section.shut div.head a.open, div.subsection.shut div.head a.open { display: block; } div.section.shut div.head a.shut, div.subsection.shut div.head a.shut { display: none; } div.section.open div.head a.open, div.subsection.open div.head a.open { display: none; } div.section.open div.head a.shut, div.subsection.open div.head a.shut { display: block; } div.section div.body { display: block; padding: 10px 0 20px 0; } div.subsection div.body { display: block; padding: 5px 0 10px 0; } div.section.shut div.body, div.subsection.shut div.body { display: none; } /*------------------------------------------------------------------------*/ /* POD markup */ /*------------------------------------------------------------------------*/ div.pod { } div.pod p { margin: 0px 0px 10px 0px; } div.pod pre { margin: 0 0 15px 20px; padding: 10px; border: 1px solid #ddd; background-color: #f6f6f6; font-size: 13px; color: #444444; } div.pod pre span.tt { font-weight: bold; color: #46216b; } /*------------------------------------------------------------------------*/ /* Index page list */ /*------------------------------------------------------------------------*/ ul.index { margin: 10px 10px 10px 0; padding: 0px; } ul.index li { list-style: none; margin: 0 0 5px 0; padding: 0; } ul.index li a { text-decoration: none; font-weight: bold; padding: 0 0 0 20px; margin: 0; color: ; background: url('../images/arrows/ff16_blue/right.gif') no-repeat top left; } ul.index li a:hover { color: ; background-image: url('../images/arrows/ff16_orange/right.gif'); } ul.index li p { margin: 0 0 10px 0; padding: 0 0 0 20px; } TT_v224_html_docs/css/tt2.css000700 000765 000765 00000045270 11756705102 015634 0ustar00abwabw000000 000000 /*------------------------------------------------------------------------*/ /* default styles */ /*------------------------------------------------------------------------*/ h1, h2, h3, h4, h5, h6 { color: ; } h1,h2,h3 { margin: 0px 0 5px 0; } p { color: #333; padding: 0 0 8px 0; } p.tight { padding: 4px 0; margin: 0; } pre { line-height: 120%; } code { color: #224; font-weight: bold; } a { text-decoration: none; color: ; } a:visited { color: ; } a:hover { color: ; } a:focus { -moz-outline: none; } .alt { display: none; } .sample { display: block; width: 100px; height: 30px; } br.clear { clear: both; } /*------------------------------------------------------------------------*/ /* main body style */ /*------------------------------------------------------------------------*/ body { font: px ; line-height: 150%; color: #333; margin: 0px; padding: 10px 10px 20px 10px; background: url('/top_grad.gif') repeat-x top left; } #layout { background: white url('/left.gif') repeat-y top left; min-width: 600px; } /*------------------------------------------------------------------------*/ /* header */ /*------------------------------------------------------------------------*/ #header { position: relative; height: 130px; margin: 0px; padding: 0 25px 0 220px; background: url('/header.gif') no-repeat top right; } #header #logo { display: block; position: absolute; top: 0; left: 0; width: 220px; height: 130px; background: url('/logo_.gif') no-repeat top right; } #header #logo:hover { background-image: url('/logo_.gif'); } #header #trail { height: 40px; margin: 0; padding: 0 0 0 10px; background: url('/tab_pre.gif') no-repeat top left; } #header #trail.blank { background-image: none; } #header #trail li { display: block; float: left; background: url('/tab_cold.gif') no-repeat top left; padding: 0 0 0 10px; } #header #trail li a { display: block; float: left; font-size: 11px; text-decoration: none; color: ; line-height: 14px; height: 30px; min-width: 60px; padding: 10px 15px 0 0; background: url('/tab_cold.gif') no-repeat top right; } #header #trail li a:hover { color: ; } #header #trail li:hover, #header #trail li:hover a { background-image: url('/tab_roll.gif'); } #header #trail li.last { background-image: url('/tab_warm.gif'); color: ; } #header #trail li.last a { background-image: url('/tab_warm.gif'); color: ; padding-right: 45px; } #header .headline { font-size: 24px; margin: 8px 0 8px 0; padding: 0 100px 0 0; color: ; } #header .subhead { font-size: 16px; line-height: 18px; padding: 0 110px 0 0; margin: 0; color: #444; } #header .controls { position: absolute; display: block; top: 40px; right: 20px; width: 130px; height: 70px; overflow: visible; } /*------------------------------------------------------------------------*/ /* main page content and sidebar */ /*------------------------------------------------------------------------*/ #page { margin-bottom: 0; padding: 0; padding-left: 220px; background: url('/right.gif') repeat-y top right; } #sidebar { position: relative; float: left; padding: 0; width: 220px; margin: 0; margin-left: -220px; } #content { position: relative; margin: 0; padding: 0 40px 10px 15px; } #sidebar #menu { width: 220px; margin: 0; padding: 0; background: url('/menu_body.gif') repeat-y top left; } #sidebar #menu div.foot { height: 20px; background: url('/menu_foot.gif') no-repeat bottom left; } #page div.pageinfo { text-align: center; font-size: 10px; color: #ccc; } /*------------------------------------------------------------------------*/ /* footer */ /*------------------------------------------------------------------------*/ #footer { clear: both; position: relative; padding: 0 145px 0px 270px; height: 100px; background: url('/footer.gif') no-repeat bottom left; } #footer a.osi { position: absolute; display: block; left: 200px; bottom: 30px; width: 70px; height: 50px; cursor: pointer; background: url('/osi.gif') no-repeat top left; } #footer .copyright { text-align: center; color: #666; font-size: 12px; padding: 14px 0 0 0; } #footer .licence { text-align: center; padding-top: 5px; color: #888; font-size: 11px; line-height: 15px; padding: 0 20px; } #footer .copyright a, #footer .copyright a:visited, #footer .licence a, #footer .licence a:visited { color: ; } #footer .copyright a:hover, #footer .licence a:hover { color: ; } #footer .controls { position: absolute; display: block; bottom: 0; right: 0; width: 125px; height: 100px; padding: 0 25px 0 0; background: url('/footer.gif') no-repeat bottom right; } /*------------------------------------------------------------------------*/ /* widescreen mode */ /*------------------------------------------------------------------------*/ #body.wide { padding: 10px 0 0 0; } #body.wide #palette { display: none; } #body.wide #header { padding: 0 20px 0 20px; margin: -50px -20px 0 0; } #body.wide #header #logo { display: none; } #body.wide #page { padding: 10px; margin: 0 0 0 0; background-image: none; background-color: white; min-width: 560px; } #body.wide #sidebar { display: none; } #body.wide #content { padding: 0 10px; background: white none; } #body.wide #footer { padding: 0 150px 0px 90px; margin-right: -20px; background-position: bottom right; } #body.wide #footer a.osi { left: 20px; } /*------------------------------------------------------------------------*/ /* controls for showing/hiding the menu */ /*------------------------------------------------------------------------*/ div.controls a.menu { display: block; float: right; margin-right: 5px; width: 40px; height: 30px; background: url('/hide_menu.gif') no-repeat 0 5px; } div.controls a.hide:hover { background-image: url('/hide_menu_roll.gif'); } div.controls a.show { background-image: url('/show_menu.gif'); } div.controls a.show:hover { background-image: url('/show_menu_roll.gif'); } body div.controls a.hide { display: block; } body div.controls a.show { display: none; } body.wide div.controls a.hide { display: none; } body.wide div.controls a.show { display: block; } /*------------------------------------------------------------------------*/ /* rollover tooltip box for our talking badger */ /*------------------------------------------------------------------------*/ div.controls a span.about, div.controls span span.about { display: none; position: absolute; right: 175px; top: 5px; height: 40px; width: 200px; padding: 10px 37px 13px 10px; font-size: 10px; line-height: 13px; text-align: left; color: ; background: url('/talkbox.gif') no-repeat top right; } div.controls a:hover span.about, div.controls span:hover span.about { display: block; } div.controls span.about h4 { display: block; font-size: 11px; margin: 0; padding: 0 0 1px 0; color: ; } /*------------------------------------------------------------------------*/ /* pager for going to the previous/index/next page */ /*------------------------------------------------------------------------*/ div.pager { clear: right; float: right; padding-top: 5px; width: 98px; } div.pager .go { display: block; float: left; height: 18px; padding-top: 18px; width: 32px; font-size: 10px; text-align: center; background: url('/large//dot.gif') no-repeat top center; } div.pager span.go { color: #aaa; } div.pager a.go { color: ; } div.pager a.go:hover { color: ; } div.pager a.back { background-image: url('/large//left.gif'); } div.pager a.back:hover { background-image: url('/large//left.gif'); } div.pager span.back { background-image: url('/large//left.gif'); } div.pager a.next { background-image: url('/large//right.gif'); } div.pager a.next:hover { background-image: url('/large//right.gif'); } div.pager span.next { background-image: url('/large//right.gif'); } div.pager a.up { background-image: url('/large//up.gif'); } div.pager a.up:hover { background-image: url('/large//up.gif'); } div.pager span.up { background-image: url('/large//up.gif'); } /*------------------------------------------------------------------------*/ /* pager is repeated in footer, but with text above arrows not below */ /*------------------------------------------------------------------------*/ #footer .pager { padding-top: 0; } #footer .pager .go { height: 42px; padding-top: 0; background-position: bottom center; } #footer a span.about { display: none; position: absolute; right: 28px; width: 200px; top: 58px; height: 25px; padding: 0; font-size: 11px; line-height: 13px; text-align: right; color: ; background-image: none; } #footer span span.about { display: none; } #footer a:hover span.about { display: block; } /*------------------------------------------------------------------------*/ /* colour selection palette */ /*------------------------------------------------------------------------*/ #palette { position: absolute; top: 0; right: 60px; height: 20px; margin-top: 0px; width: 144px; background: url('/palette.gif') no-repeat top right; } #palette ul { display: block; height: 20px; margin: 0 12px 0 0; padding: 0 0 0 12px; background: url('/palette.gif') no-repeat top left; } #palette li { display: inline; padding: 0; margin: 0; } #palette li a { display: block; float: left; height: 20px; width: 24px; padding: 0; margin: 0; background: url('/col_grey_in.gif') no-repeat top right; } #palette li a.blue { background-image: url('/col_blue_in.gif'); } #palette li a.blue:hover { background-image: url('/col_blue_out.gif'); } #palette li a.orange { background-image: url('/col_orange_in.gif'); } #palette li a.orange:hover { background-image: url('/col_orange_out.gif'); } #palette li a.green { background-image: url('/col_green_in.gif'); } #palette li a.green:hover { background-image: url('/col_green_out.gif'); } #palette li a.purple { background-image: url('/col_purple_in.gif'); } #palette li a.purple:hover { background-image: url('/col_purple_out.gif'); } #palette li a.grey { background-image: url('/col_grey_in.gif'); } #palette li a.grey:hover { background-image: url('/col_grey_out.gif'); } /*------------------------------------------------------------------------*/ /* menu styles */ /*------------------------------------------------------------------------*/ ul.menu { list-style: none; margin: 0 20px; padding: 0; } ul.menu li { list-style: none; display: block; margin: 0; padding: 0; } ul.menu li.last { background: url('/menu_item_foot.gif') no-repeat top left; padding-top: 1px; } ul.menu li a { display: block; margin: 0; padding: 4px 8px; font-size: 13px; line-height: 16px; min-height: 16px; color: ; text-decoration: none; background: url('/menu_item_body.gif') no-repeat top left; } ul.menu li.first a { background-image: url('/menu_item_head.gif'); } ul.menu li.last a { background: url('/menu_item_foot.gif') no-repeat bottom left; } ul.menu li a:hover { color: ; background-image: url('/menu_warm_body.gif'); */ } ul.menu li a.warm { font-weight: bold; background-image: url('/menu_warm_body.gif'); */ } ul.menu li.first a.warm, ul.menu li.first a:hover { background-image: url('/menu_warm_head.gif'); } ul.menu li.last a.warm, ul.menu li.last a:hover { background: url('/menu_warm_foot.gif') no-repeat bottom left; } ul.menu li.l1 a { padding: 3px 8px 3px 22px; font-size: 11px; } ul.menu li.l2 a { padding: 3px 8px 3px 36px; font-size: 11px; } ul.menu li.l3 a { padding: 3px 8px 3px 50px; font-size: 11px; } ul.menu li.l4 a { padding: 3px 8px 3px 64px; font-size: 11px; } ul.menu li.l5 a { padding: 3px 8px 3px 78px; font-size: 11px; } ul.menu li.l6 a { padding: 3px 8px 3px 92px; font-size: 11px; } ul.menu li.l7 a { padding: 3px 8px 3px 106px; font-size: 11px; } /*------------------------------------------------------------------------*/ /* Styles for table of contents */ /*------------------------------------------------------------------------*/ ul.toc { margin: 0 0 20px 0; padding: 0; } ul.toc li { list-style: none; margin: 0; font-size: 14px; line-height: 18px; } ul.toc li a { font-size: 14px; line-height: 16px; min-height: 14px; text-decoration: none; margin: 0; padding: 4px 0 1px 18px; background: url('/small//dot.gif') 0px 4px no-repeat; color: ; } * html ul.toc li a { height: 16px; } ul.toc li.sub { margin: 0; line-height: 14px; } ul.toc li.sub a { display: block; margin: 0; padding: 2px 0 1px 34px; font-size: 13px; line-height: 15px; background: url('/small//minidot.gif') 20px 3px no-repeat; } ul.toc li.subsub a { display: block; margin: 0; padding: 0 0 0 60px; font-size: 12px; line-height: 14px; background: url('/small//minidot.gif') 40px 2px no-repeat; } ul.toc li a:hover { background-image: url('/small//dot.gif'); color: ; } ul.toc li.sub a:hover, ul.toc li.subsub a:hover { background-image: url('/small//minidot.gif'); color: ; } /*------------------------------------------------------------------------*/ /* sections */ /*------------------------------------------------------------------------*/ div.section, div.subsection { padding: 0 0 0 20px; clear: right; } div.section div.head, div.subsection div.head { margin: 0 0 4px 0px; min-height: 20px; position: relative; } div.section div.head { border-bottom: 1px dashed ; } div.subsection div.head { border-bottom: 1px dashed ; margin-bottom: 2px; } div.section div.head h1 { padding: 0 80px 4px 28px; margin: 0 0 0 -28px; font-size: 18px; line-height: 22px; font-weight: bold; background: url('/large//dot.gif') no-repeat top left; } div.section div.head h2 { padding: 0 80px 2px 20px; margin: 0 0 0 -20px; font-size: 16px; line-height: 20px; font-weight: bold; background: url('/small//dot.gif') no-repeat 0 3px; } div.section h3 { margin: 0; padding: 5px 0 5px 0; font-size: 14px; line-height: 18px; } div.section.open div.head h1 { background-image: url('/large//dotminus.gif'); } div.section.open div.head:hover h1 { color: ; cursor: pointer; background-image: url('/large//dotminus.gif'); } div.section.shut div.head h1 { background-image: url('/large//dotplus.gif'); } div.section.shut div.head:hover h1 { color: ; cursor: pointer; background-image: url('/large//dotplus.gif'); } div.subsection.open div.head h2 { background-image: url('/small//dotminus.gif'); } div.subsection.open div.head:hover h2 { color: ; cursor: pointer; background-image: url('/small//dotminus.gif'); } div.subsection.shut div.head h2 { background-image: url('/small//dotplus.gif'); } div.subsection.shut div.head:hover h2 { color: ; cursor: pointer; background-image: url('/small//dotplus.gif'); } div.section div.head a.top { position: absolute; bottom: 4px; right: 0px; padding: 0px 20px 0px 0; margin: 0px; width: 25px; text-align: right; font-size: 10px; height: 16px; color: ; background: url('/small//up.gif') no-repeat 28px 3px; } div.section div.head a.top:hover { color: ; background-image: url('/small//up.gif'); } div.section div.head a.open, div.section div.head a.shut, div.subsection div.head a.open, div.subsection div.head a.shut { position: absolute; bottom: 4px; right: 45px; margin: 0px; padding: 0px 5px; font-size: 11px; height: 16px; width: 3em; text-align: right; border-right: 1px solid #ddd; display: none; } div.section.shut div.head a.open, div.subsection.shut div.head a.open { display: block; } div.section.shut div.head a.shut, div.subsection.shut div.head a.shut { display: none; } div.section.open div.head a.open, div.subsection.open div.head a.open { display: none; } div.section.open div.head a.shut, div.subsection.open div.head a.shut { display: block; } div.section div.body { display: block; padding: 10px 0 20px 0; } div.subsection div.body { display: block; padding: 5px 0 10px 0; } div.section.shut div.body, div.subsection.shut div.body { display: none; } /*------------------------------------------------------------------------*/ /* POD markup */ /*------------------------------------------------------------------------*/ div.pod { } div.pod p { margin: 0px 0px 10px 0px; } div.pod pre { margin: 0 0 15px 20px; padding: 10px; border: 1px solid #ddd; background-color: #f6f6f6; font-size: 13px; color: ; } div.pod pre span.tt { font-weight: bold; color: ; } /*------------------------------------------------------------------------*/ /* Index page list */ /*------------------------------------------------------------------------*/ ul.index { margin: 10px 10px 10px 0; padding: 0px; } ul.index li { list-style: none; margin: 0 0 5px 0; padding: 0; } ul.index li a { text-decoration: none; font-weight: bold; padding: 0 0 0 20px; margin: 0; color: ; background: url('/arrows/ff16_blue/right.gif') no-repeat top left; } ul.index li a:hover { color: ; background-image: url('/arrows/ff16_orange/right.gif'); } ul.index li p { margin: 0 0 10px 0; padding: 0 0 0 20px; }