css2xslfo/0000755000175000017500000000000012266721006013526 5ustar mithrandimithrandicss2xslfo/doc/0000755000175000017500000000000011434532530014271 5ustar mithrandimithrandicss2xslfo/doc/manual.xhtml0000644000175000017500000060716611434532530016644 0ustar mithrandimithrandi CSS"> CSS2"> CSS3"> CSSToXSLFO"> FOP"> HTML"> ID"> JAR"> NAMES"> PDF"> SAX"> SVG"> XEP"> XEP4"> XHTML"> XINC"> XML"> XSL-FO"> XSLT"> URI"> URL"> ]> The CSSToXSLFO User Guide
The
CSSToXSLFO
User Guide
Version 1.6.2
Werner Donné
Pincette bvba
23 August 2010
The CSSToXSLFO User Guide

© 2004-2010 Pincette bvba. All rights granted.

This software is free and will remain free.

To use at your own responsibility.

Introduction

&csstoxslfo; is a tool which converts an &xml; document, combined with a &css2; style sheet, into an &xslfo; file. It has some special provisions for &xhtml;, which is also an &xml; vocabulary. The tool implements a reasonable subset of &css2;. It also adds a few extensions for handling page-related issues properly. Note that the tool is not a general-purpose printing tool for any kind of &html; pages you can find on the Internet.

The goal of &csstoxslfo; is to provide a rather easy interface to fine printing environments that use &xslfo; as their input. It is a compromise between the simplicity of style sheet expression and the quality of the result. &xslfo; is quite difficult. Writing style sheets that produce it are mostly written in &xslt;, which is not straightforward to everyone either. &css; on the other hand is rather simple and yet it is powerful. In fact it combines element selection and formatting specification in one easy-to-learn syntax. The cost is that a lot of interesting &xslfo; features are not available.

An area where the tool can be a plus is the programmatic generation of reports within applications. The variety in style for reports is not that great. The offered feature set of &csstoxslfo; can be sufficient. Having report programmers learn &xslfo; and &xslt; is not always an option, while many know &css; and &xhtml; well enough to be productive with it.

Another use-case for &csstoxslfo; is writing documents in &xml;. One can put work in a style sheet once and reuse that through the mark-up paradigm, in which content and formatting are separated. The formatting features should be sufficient to produce day-to-day documents in a typical business environment. Such documents don't tend to be very complicated, with respect to layout that is.

In Practice

Specifying Style Sheets

The most general way of specifying a style sheet for a document with &csstoxslfo; is the proposal in section 2.2 of [&css2;]. It consists of a processing instruction, which precedes the document, looking like this:

  <?xml-stylesheet type="text/css" href="style.css"?>

For &xhtml; there are a few additional options. You can use the link element to link a style sheet (only persistent style sheets) to the document or you can embed it with the style element. The style attribute is also available as specified in [&xhtml;].

Running It

There are six packages you can run from the command-line: one that produces plain &xslfo;, one that returns the output of &xep;, a product from RenderX (http://​www.​renderx.​com), another that returns the output of XSLFormatter, a product from Antenna House (http://​www.antennahouse.com), yet another that returns the output of Xinc, a product from Lunasil LTD (http://​www.​lunasil.​com) and finally, two that run &fop; (http://​xml.​apache.​org/​fop/). One is for version 0.20.5 and the other for version 1.0. The 0.20.5 one comes with a filter that removes a few properties, which are not supported by &fop;. This makes &fop; complain less.

You need JDK1.3 or higher to run the packages. For 1.3 you should create a classpath with a namespace-aware &xml; parser and an &xslt; processor. The command-lines look as follows for plain &csstoxslfo;:

  > java -jar css2xslfo.jar url_or_filename <options>

For XEP3:

  > java -Dcom.renderx.xep.ROOT=<XEP location> -jar css2xep.jar
      url_or_filename <options>

For &xep4;:

  > java -Dcom.renderx.xep.CONFIG=<XEP location>/xep.xml
      -jar <XEP location>/lib/css2xep.jar url_or_filename
      <options>

For XSLFormatter:

  > set dynamic library path to <XSLFormatter location>/lib
  > set environment variable AH_FONT_CONFIGFILE to
      <XSLFormatter location>/etc/font-config.xml
  > java -jar <XSLFormatter location>/lib/css2xsl.jar
      url_or_filename <options>

For Xinc:

  > java -jar css2xinc.jar url_or_filename <options>

For &fop; 0.20.5:

  > java -jar css2fop.jar url_or_filename <options>

For &fop; 0.95:

  > java -jar css2fopnew.jar url_or_filename <options>

Additional system properties and/or enviroment variables can be set. Please consult the product-specific documentation for this.

In order for css2xep.jar to work, you should place it in the <XEP location>/lib directory and create a link to or a copy of your &xep; &jar; file with the name xep.jar. Since &xep4; the link or copy are no longer needed, because the &xep; &jar; file has the expected name. For css2xsl.jar to work, you should place it in <XSLFormatter location>/lib. The css2fop.jar file needs to be next to fop.jar, which should be next to the packages is uses. Therefore you should copy fop.jar from the &fop; build directory to its lib directory. The same procedure is required for css2fopnew.jar. The css2xinc.jar should be in the &xinc; lib directory.

&csstoxslfo; uses the &xslt;-processor that comes with the JDK1.4, which is Xalan from Apache. For better performance you can prepend Xalan 2.6.0+ or Saxon 8.3+ to your boot classpath as follows (assuming /usr/local as the installation directory of Xalan):

  > java -Xbootclasspath/p:/usr/local/xalan-j_2_6_0/bin/xalan.jar
      -jar css2xslfo.jar url_or_filename <options>

You can also use JDK1.5, which comes with a faster &xslt; processor.

For &xep; there is a special note. You have to specify another &xslt; processor, because &xep; uses Saxon 6.5.x, with which it doesn't work. You can either prepend another &xslt; processor to the boot classpath or you can simply copy saxon8.jar in the &xep; lib directory.

Common Options

The following options are common to all six variants. The document to be processed can be specified with a &url; or filename. If it is omitted, stdin will be read.

-baseurl <URL>
Change the base &url; of the input document. By default it is the &url; of the document itself.
-c <URL or filename>
Specify a catalog in the format defined by SGML Open Technical Resolution TR9401:1997. Only the PUBLIC and SYSTEM keywords are supported.
-h
Display the command-line syntax.
-p <comma-separated list of &url;s or filenames>
A list of pre-processing &xslt; style sheets that are executed on the input document, in the specified order, before anything else.
-uacss <URL or filename>
Use another User Agent style sheet than the one built-in.
-v
Turn on &xml; validation of the input document.
parameter=value
Specify User Agent parameters. Equivalent &css; constructs precede these.

Options Specific To css2xslfo.jar

-debug
Produces a number of intermediary files representing the different processing steps.
-fo <filename>
The &xslfo; output file. If it is omitted stdout will be written instead.

Options Specific To css2xep.jar

One the following options should be specified.

-pdf <filename>
The &pdf; output file. Either this option or the -ps options should be present.
-ps <filename>
The PostScript output file. Either this option or the -pdf options should be present.
-config <URL or filename>
The &xep; configuration file.
-q
Makes &xep; silent.

Options Specific To css2xsl.jar

-pdf <filename>
The &pdf; output file. This option is mandatory.
-config <URL or filename>
The XSLFormatter configuration file.

Options Specific To css2fop.jar

-fc <filename>
A user configuration file.
-pdf <filename>
The &pdf; output file. Either this option or one of the -ps and -svg options should be present.
-ps <filename>
The PostScript output file. Either this option or one of the -pdf and -svg options should be present.
-q
Makes &fop; silent.
-svg <filename>
The SVG output file. Either this option or one of the -pdf and -ps options should be present.

Options Specific To css2fopnew.jar

-fop <options>
The rest of the command-line will be parsed by FOP. Specifying an input file here doesn't work. The -q option will only work if you configure the Apache logger environment. The &fop; command-line logger can be set by assigning the value org.​apache.​fop.​util.​CommandLineLogger to the system property org.​apache.​commons.​logging.​Log. This option is mandatory.

Options Specific To css2xinc.jar

One the following options should be specified.

-pdf <filename>
The &pdf; output file. This option is mandatory.
-config <URL or filename>
The &xinc; configuration file.

User Agent Parameters

The User Agent parameters are common to all three packages. They have no effect if there are @page rules in the style sheet, except for the rule-thickness parameter. Furthermore, equivalent &css; constructs, when present in the style sheet, always precede.

column-count
The number of columns on a page. The default is 1.
country
The country code. The default is GB.
font-size
The point size of the font. The default for paper sizes a5 and b5 is 10pt. For all other paper sizes the default is 11pt. See also the paper-size parameter.
html-header-mark
An &html; element can be passed here. Its contents will be used as the running header. By default there is no mark.
language
The language code. The default is en.
odd-even-hift
The amount by which the page contents is shifted in the inline progression direction when the paper mode is twosided. The default is 10mm. See also the paper-mode parameter.
orientation
The allowed values are portrait, which is the default, and landscape.
paper-margin-bottom
The bottom margin of a page. The default is 0mm.
paper-margin-left
The left margin of a page. The default is 25mm.
paper-margin-right
The right margin of a page. The default is 25mm.
paper-margin-top
The top margin of a page. The default is 10mm.
paper-mode
The allowed values are onesided, which is the default, and twosided.
paper-size
The allowed values are a4, which is the default, a0, a1, a2, a3, a5, b5, executive, letter and legal.
rule-thickness
The default thickness for rules when there was no &css; specification for it. The default is 0.2pt.
writing-mode
The &xslfo; writing mode. The default is lr-tb. Other possible values are rl-tb, tb-rl, lr, rl and tb. See also [&xslfo;].

Building CSSToXSLFO

The tool comes with an ANT file. The default target only builds the css2xslfo.jar file. Then there are also the xep, xsl, xinc, fop and fopnew targets, which produce css2xep.jar, css2xsl.jar, css2xinc.jar, css2fop.jar and css2fopnew.jar respectively.

Ant Tasks

In each package there is a corresponding Ant task. The following table gives the respective class names.

Package Ant task class name
css2xslfo.jar be.re.css.ant.CSSToXSLFO
css2xep.jar be.re.css.ant.CSSToXEP
css2xsl.jar be.re.css.ant.CSSToXSLFormatter
css2fop.jar be.re.css.ant.CSSToFOP
css2fopnew.jar be.re.css.ant.CSSToFOPNew
css2xinc.jar be.re.css.ant.CSSToXinc

Common Options

All tasks support the nested elements parameter and preprocessor. With the former the parameters described in User Agent Parameter can be specified through its name and value attributes. With the latter a sequence of pre-processing &xslt; style sheets can be provided. Its stylesheet attribute should be set to a filename or &url;. The following attributes are common to all tasks.

Attribute Description Required
baseurl Change the base &url; of the input document. By default it is the &url; of the document itself. No
catalog Specify a catalog in the format defined by SGML Open Technical Resolution TR9401:1997. Only the PUBLIC and SYSTEM keywords are supported. No
input The input document as a &url; or filename. Yes
output The output document as a filename. The format is derived from its extension. Yes
useragentstylesheet Use another User Agent style sheet than the one built-in. No
validate Turn on &xml; validation of the input document. Defaults to false. No

Options Specific To css2xep.jar

Attribute Description Required
config The &xep; configuration file. It may be a filename or a &url;. No
quiet Makes &xep; silent. No

Options Specific To css2fop.jar

Attribute Description Required
config A user configuration file. No
quiet Makes &fop; silent. No

Options Specific To css2fopnew.jar

Attribute Description Required
config A user configuration file. No

Compliance With CSS2

Specifications

Section Implemented Remarks and restrictions
4.1 Syntax yes Thanks to Flute.
4.2 Rules for handling parsing errors partial Unknown properties will end up in the &xslfo; file and cause errors in a &xslfo; processor.
4.3 Values yes Thanks to Flute.
4.4 &css; document representation yes Thanks to Flute.
5 Selectors partial All sections but 5.11.2 and 5.11.3. The :first-letter pseudo element is implemented with the restriction that letter combinations, which are considered as one letter, are not examined. As a workaround you can use the ligature Unicode characters instead. The vertical-align is also valid when float is none. In that case it applies to the inline material which is affected by the pseudo element.
6 Assigning property values, Cascading and Inheritance yes
7 Media types yes By design, only types all and print are supported.
8 Box model yes
9.1.1 The viewport no
9.1.2 Containing blocks yes
9.2.1 Block-level elements and block boxes partial Compact and run-in boxes are not supported.
9.2.2 Inline-level elements and inline boxes partial Compact and run-in boxes and inline tables are not supported.
9.2.3 Compact boxes no
9.2.4 Run-in boxes no
9.2.5 The 'display' property partial See property table.
9.3 Positioning schemes yes
9.4 Normal flow yes
9.5 Floats yes
9.6 Absolute positioning yes
9.7 Relationships between 'display', 'position', and 'float' yes
9.9 Layered presentation yes
9.10 Text direction: the 'direction' and 'unicode-bibi' properties yes
10 Visual formatting model details partial See the property table for the height property.
11 Visual effects yes
12.1 The :before and :after pseudo-elements yes
12.2 The 'content' property yes
12.3 Interaction of :before and :after with 'compact' and 'run-in' elements no
12.4 Quotation marks yes
12.5 Automatic counters and numbering yes
12.6.1 Markers: the 'marker-offset' property yes
12.6.2 Lists: the 'list-style-type', 'list-style-image', 'list-style-position', and 'list-style' properties yes
13.2.1 Page margins yes
13.2.2 Page size: the 'size' property yes
13.2.3 Crop marks: the 'marks' property no
13.2.4 Left, right, and first pages yes
13.2.5 Content outside the page box yes
13.3 Page breaks partial Named pages are only supported for block-level and table elements, which are not inside of a table and have an ancestor with the region property set to body.
13.4 Cascading in the page context yes
14 Colors and Backgrounds yes
15 Fonts partial @font-face and descriptors are not supported.
16 Text yes
17 Tables partial Inline tables are not supported. Anonymous table objects are only supported for missing table groups and missing table cells in a row, on the condition that there are table column elements. Audio rendering is not supported.
18 User interface no
19 Aural style sheets no

Properties

Property Implemented Remarks and restrictions
azimuth no
background yes
background-attachment yes
background-color yes
background-image yes
background-position yes
background-repeat yes
border yes
border-bottom yes
border-bottom-color yes
border-bottom-style yes
border-bottom-width yes
border-collapse partial Not for inline-table.
border-color yes
border-left yes
border-left-color yes
border-left-style yes
border-left-width yes
border-right yes
border-right-color yes
border-right-style yes
border-right-width yes
border-spacing partial Not for inline-table.
border-style yes
border-top yes
border-top-color yes
border-top-style yes
border-top-width yes
borded-width yes
bottom yes
caption-side yes
clear yes
clip yes
color yes
content yes
counter-increment yes
counter-reset yes
cue no
cue-after no
cue-before no
cursor no
direction yes
display partial The values run-in, compact and inline-table are not supported. The marker value is supported with the limiation that the value auto for the width property is not. Markers also don't work with floats.
elevation no
empty-cells yes
float yes
fonts yes
font-family yes
font-size yes
font-size-adjust yes
font-stretch yes
font-style yes
font-variant yes
font-weight yes
height partial A percentage value for the height of a block, which is in another block with an explicit height, will be treated as auto. This stems from the fact that in this case a block has to be split in a fo:block-container and a nested fo:block, because there are properties that don't apply to both of them. The inner original block will therefore have a parent without an explicit height specification. The latter has moved to the surrounding fo:block-container.
left yes
letter-spacing yes
line-height yes
list-style partial See individual properties.
list-style-image no
list-style-position partial A list should be uniform. Specifying different values for different list items will produce undesired results.
list-style-type partial

Only the values disc, circle, square, decimal, lower-roman, upper-roman, lower-alpha, lower-latin, upper-alpha, upper-latin and none are supported. The additional glyphs defined in [CSS3L] are also supported. Those are box, check, diamond and hyphen.

A list should be uniform. Specifying different values for different list items will produce undesired results.

margin yes
margin-bottom yes
margin-left yes
margin-right yes
margin-top yes
marker-offset yes
marks no
max-height yes
max-width yes
min-height yes
min-width yes
orphans yes
outline no
outline-color no
outline-style no
outline-width no
overflow yes
padding yes
padding-bottom yes
padding-left yes
padding-right yes
padding-top yes
page partial Only for block-level and table elements, which are not inside of a table and have an ancestor with the region property set to body.
page-break-after yes
page-break-before yes
page-break-inside yes
pause no
pause-after no
pause-before no
pitch no
play-during no
play-range no
position yes
quotes yes
richness no
right yes
size yes
speak no
speak-header no
speak-numeral no
speak-punctuation no
speech-rate no
stress no
table-layout yes
text-align yes
text-decoration yes
text-indent yes
text-transform yes
top yes
unicode-bibi yes
vertical-align yes
visibility yes
voice-family no
volume no
white-space yes
widows yes
width yes
word-spacing yes
z-index yes

Extensions

The extension features of the tool mostly pertain to page-oriented aspects. Care has been taken to not introduce new syntax. There are, however, a number of new properties. Those are normally safely ignored by browsers. In the case where there would be an impact on the layout produced by browsers, the properties can be confined to the print medium through @media rules.

Page Regions

This extension introduces &xslfo;-compatible page regions. Regions can be defined by placing a region property on an element. The allowed values are bottom, left, right, top and body. At least one element with the region property set to body should be present in the document.The &xhtml; User Agent style sheet sets this property to the body element. Page sequences are only generated for the content of such an element. The regions other than the body region must be the first direct children of the body region. Otherwise they are ignored. In the case of &xhtml;, for example, this means that they should come at the beginning of the body element.

On top of that, either the width property, for left and right regions, or the height property, for top and bottom regions, should be defined. They will determine the dimensions of the page regions. The default value for width is 20mm. For height it is 10mm.

The extension property precedence is also available for the top and bottom regions. Its value can be true or false, the latter being the initial value. The property says whether the width of the top or bottom region is equal to that of the page reference area or if they give way to the left and right regions.

The regions work together with the @page rules, of which there should be at least one. It is possible to specify different regions, which correspond to the different page types in the style sheet. This can be achieved by also specifying the page property, which is a standard &css2; property. Consider the following example:

  div.bottom-left, div.bottom-right { display: none; }

  @media print
  {
    div.bottom-left
    {
      height: 15mm;
      page: left;
      region: bottom;
      text-align: left;
    }

    div.bottom-right
    {
      height: 15mm;
      page: right;
      region: bottom;
      text-align: right;
    }

    span.page:before { content: counter(page); }
  }

This says that on left pages the bottom region is left-aligned, while on right pages it is right-aligned. The span element is used in the following region definitions:

  <div class="bottom-left">
    <p>&nbsp;</p>
    <div><span class="page"/></div>
  </div>

  <div class="bottom-right">
    <p>&nbsp;</p>
    <div><span class="page"/></div>
  </div>

The page property bears a kind of inheritance mechanism. For any page the regions with the most specific page property will be selected. A region without a page property is the least specific. A named page is more specific and the values left and right are yet more specific. After this comes the new pseudo page blank, which is for blank pages that are generated because of page positioning constraints such as left and right. The first page of a chapter, for example, is sometimes forced to be a right page. This can produce an extra blank page for the previous chapter. In fact, this maps directly to the &xslfo; blank pages. There are special values, which are even more specific, such as first-right, blank-left, left-<page-name>, etc. If, for example, there is no bottom region for first-right, but there is one for first, the latter will be selected if the first page happens to on the right. See section page for the precise precedence rules.

In order for the top, bottom, left and right region elements not to interfere with the normal flow it is best to set their display type to none.

Page Numbering

The two special counters page and pages in this tool are taken over from the &css3; Paged Media Module (see also [CSS3P]). The page can be used just like any other counter, except that it is confined to the regions. The following example shows a document with a preface and a body. Each reset the page count. The preface has a lower Roman numbering style, while the body uses the decimal style. If the body page didn't reset the counter, numbering would continue from the preface, but with a change of style.

  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <title></title>
      <style type="text/css">
  @page preface
  {
    counter-reset: page;
    margin: 10%;
  }

  @page body
  {
    counter-reset: page;
    margin: 10%;
  }
  
  div.bottom-preface
  {
    page: preface;
    region: bottom;
  }
  
  div.bottom-body
  {
    page: body;
    region: bottom;
  }
  
  div.bottom-preface > span.page:before
  {
    content: counter(page, lower-roman);
  }
  
  div.bottom-body > span.page:before
  {
    content: counter(page, decimal);
  }
  
  div.preface { page: preface; }
  div.body { page: body; }
      </style>
    </head>
    <body>
      <div class="bottom-preface"><span class="page"/></div>
      <div class="bottom-body"><span class="page"/></div>
      <div class="preface">
        <p>Text.</p>
      </div>
      <div class="body">
        <p>Text.</p>
      </div>
    </body>
  </html>

When switching between named pages you can control how the ending named page sequence should be terminated with the extension property force-page-count. For example, it some page sequence produces five pages, you can force the sequence to produce six pages by setting the property to even. An extra blank page will then be generated before starting the new page sequence. If you don't want such behaviour, you should set the property to no-force, since the initial value is auto.

Page References

You sometimes want to write phrases like The diagram on page 19 .... The &csstoxslfo; tool provides this functionality through the page-ref function, which can be used in the content property. Its only parameter is the name of an attribute that contains the &id; of another element. The function call will be replaced with the number of the page that element is on.

In &xhtml; it is a bit more complicated to achieve the desired result, because there aren't many extension attributes available for it. The following fragment shows how it can be done:

  <img id="img1" src="file:///t.png"/>
  ...
  <span class="page-ref"><span class="img1"/></span>

The accompanying style sheet rule would then be:

  span.page-ref > span:before { content: page-ref(class); }

Leaders

It is possible to use &xslfo; leaders through the display type leader. The properties defined in section 7.21 of [&xslfo;] (Leader and Rule Properties) can be used in a &css; style sheet, with the exception that the leader-length property cannot have a length range as a value. If you want to create table of contents lines or something similar, you also need the &xslfo; property text-align-last, described in section 7.15.10 of [&xslfo;]. The following example shows how a table of contents line could be made in &xhtml;.

  <div class="toc">
    <a href="#chapter1">Title of Chapter 1</a>
    <span class="leader"/>
    <span class="page-ref"><span class="chapter1"/></span>
  </div>

The piece of style sheet that goes with it is:

  div.toc
  {
    text-align-last: justify;
  }

  span.leader
  {
    display: leader;
    leader-pattern: dots;
    leader-pattern-width: 5pt;
  }

  span.page-ref > span:before
  {
    content: page-ref(class);
  }

Named Strings

Named strings, as described in [CSS3G], are supported in &csstoxslfo;. This consists of the string-set property, with which contents can be captured, and the string() function. The latter can occur in the value of the content property. The string-set property accepts values which are similar to those of the content property. There is an additional keyword contents, which is replaced with the string value of the element carrying the string-set property.

The following is a simple &xhtml; example of how you can create a running header that refers to the current chapter.

  <body>
    <div class="top">
      <span class="mark"/>
    </div>
    ...
    <h1>Chapter Title</h1>
    ...
  </body>

Here is the bit of style sheet that does it:

  div.top
  {
    region: top;
    display: none;
  }

  div.top > span.mark:before { content: string(mark); }

  h1 { string-set: mark contents; }

Hyphenation

Text can be hyphenated through the hyphenate property, which is inherited. The possible values are true and false. Hyphenation is turned off by default.

Footnotes

It is possible to produce footnotes using the footnote-reference and footnote-body display types. The former is displayed in the flow, while the latter goes to the footnote area at the bottom of the page. When a footnote body occurs it must be either immediately preceded by a footnote reference or have a :before pseudo element with the display type footnote-reference. Otherwise it is treated as if the display were none. Whitespace between a footnote reference and body is gobbled. A footnote reference can also occur on its own.

The contents of both the footnote reference and body is free. Both display types exist to give you complete control over the contents and style. Usually some footnote counter is used, as shown in the example below. There is an extra counter style footnote, which produces symbols, such as an asterix, dagger, etc.

  h1 { counter-reset: footnote; }

  span.footnote-body
  {
    display: footnote-body;
    font-size: 0.83em;
  }

  span.footnote-body:before
  {
    content: counter(footnote);
    padding-right: 1em;
  }

  span.footnote-reference
  {
    display: footnote-reference;
  }

  span.footnote-reference:before
  {
    counter-increment: footnote;
    content: counter(footnote);
    font-size: 0.83em;
    vertical-align: super;
  }

In the document a footnote would then look like this:

  <p>Paragraph text.<span class="footnote-reference"/><span
  class="footnote-body">Footnote text.</span></p>

You might find it cumbersome to have to place a footnote reference in front of every footnote body. It can be avoided, at the expense of formatting control however. You can define a :before pseudo element for the footnote body and give it the display type footnote-reference. Whatever contents it generates will then be used for the reference in the flow, as well as in the footnote body at the bottom of the page. As a consequence, the style is constrained by the fact that it must be decent for both contexts. The style sheet becomes a bit simpler:

  h1 { counter-reset: footnote; }

  span.footnote-body
  {
    display: footnote-body;
    font-size: 0.83em;
  }

  span.footnote-body:before
  {
    counter-increment: footnote;
    content: counter(footnote);
    display: footnote-reference;
    font-size: 0.83em;
    vertical-align: super;
  }

If you want full control over the formatting in both contexts and at the same time want to omit the footnote reference elements in the document, the solution is to pre-process the document. The transformation is rather trivial.

Orientation

You can rotate text with the orientation property. This works only for block, table and table cell elements. The possible values are 0, 90, 180, 270, -90, -180, -270. They represent the degrees in the counter-clockwise direction. The initial value is 0.

List Style Types

The glyphs for the list-style-type property, as defined in [CSS3L], are implemented.

Multicolumn

With the properties column-count, which must be strictly positive, and column-gap, which is a length, a multi-column layout can be specified for a page. Both properties are allowed in an @page rule. As a consequence, if you want to switch between column modes, you have to switch pages as well.

With the column-span property a blocks and tables, that are not themselves inside of another table, can be made to span all the columns of a multi-column page. The allowed values for the property are all and none.

Change Bars

The change bar properties introduced in [XSL-FO11] are available for :before and :after pseudo elements. For the latter, only the change-bar-class property is relevant. The following is a simple example:

  p.changed:before
  {
    change-bar-class: changed;
    change-bar-style: solid; /* initial value is none */
    change-bar-width: 0.2pt;
  }

  p.changed:after { change-bar-class: changed; }

Note that this feature only works for &xep4; at the moment.

Links

The link property can have the name of an attribute as its value. The value of that attribute will be used for the generated link, as the target &url; or the internal target &id;, if it is an IDREF attribute, which distinguishes it from a relative &url;. Likewise, the value of the anchor property can be the name of an attribute, the value of which will become the target &id;. This way an internal link destination can be created. For example:

  a[href] { link: href; }
  a[name] { anchor: name; }

Graphics

An external graphic can be included in a document through the display type graphic, which is an inline level display type. The elements marked with it are replaced elements. As a consequence, the properties height and width apply. The &xslfo; properties content-height, content-width, content-type, scaling and scaling-method are also supported. Their definition is in [&xslfo;]. The property src is interpreted differently. Its value should be the name of an attribute that has a &uri; for a value. For the &xhtml; element img, for example, the User Agent style sheet contains the following:

  img
  {
    content-height: scale-to-fit;
    content-width: scale-to-fit;
    display: graphic;
    scaling: uniform;
    src: src;
  }

Column And Row Spanning

In &xhtml; one can specify column and row spanning with the colspan and rowspan attributes on the td and th elements. It is, however, also possible to apply &css; to other &xml; vocabularies. Hence, there should be an equivalent feature in &css; to express this. The extension properties colspan and rowspan serve that purpose. They can be used for elements with the display type table-cell.

Proportional Column Widths

Again in &xhtml; it is possible to say that a column should occupy a relative portion of the total table width. It is done by setting the width attribute to a number, followed by an asterix. If we have, for example, three columns with the widths 1*, 2* and 3*, they occupy 1, 2 and 3 sixth of the table width respectively. This is not part of the &html; specification, but it is a widely supported feature.

In order to provide it for other &xml; vocabularies then &xhtml;, the unit pcw, which stands for proportional column width, is available for the width property of an element with the display type table-column.

Repeating Table Headers And Footers

By default table headers and footers are repeated when a table spans several pages. You can suppress this by setting the table-omit-header-at-break and table-omit-footer-at-break properties to true respectively.

CSS3 Namespaces

Namespaces for selectors, as defined in [CSS3S], are implemented. This means you can use namespace prefixes in element selectors and attribute conditions. The prefixes are separated from the local name with a pipe sign (|).

The namespaces are declared with the @namespace rule, which should always come right after the @import rules if there are any. In the following example the &xhtml; namespace has been declared as the default namespace. Next to that, the DeltaXML namespace is declared with the prefix dx. You also see the use of the attr function with an attribute that has a prefix.

  @namespace url(http://www.w3.org/1999/xhtml);
  @namespace dx
    url(http://www.deltaxml.com/ns/well-formed-delta-v1);

  *[dx|delta=add], dx|new
  {
    text-decoration: underline;
  }

  *[dx|delta=delete], dx|old
  {
    text-decoration: line-through;
  }

  p[dx|delta]:before
  {
    content: attr(dx|delta);
    display: marker;
    marker-offset: 0.5em;
    text-align: right;
  }

Wrappers

When processing &xml; in general you might encounter elements which represent pure structure, i.e. they are not directly related to layout. For such elements there shouldn't be any formatting objects in the output. Normally you would have to pre-process the document in order to get rid of them in the proper way.

The display type wrapper is introduced to cope with common cases. When an element has this display type, it will not contribute any formatting objects. However, its inherited properties will be passed on to its child elements, according to the property inheritance rules.

With respect to &xml; processing, a wrapper seems to be transparant. Note however that, while a wrapper can occur anywhere, it influences &css; selector matching. For instance, it will interfere with direct sibling and direct child selectors.

Foreign Elements

With the display type foreign it is possible to transfer part of a document unmodified to an fo:instream-foreign-object element. This may be useful for elements that are in another namespace than that of the document itself and which are supported by the &xslfo; processor. Typical examples are &svg; and MathML.

Property Specifications

anchor

Value: <identifier> | attr(X)
Initial: none
Applies to: block-level and inline-level elements
Inherited: no
Percentages: N/A
Media: print
<identifier>
The qualified name of an attribute, the value of which is the target &id;. This type of value is deprecated, because it doesn't support namespace prefixes.
attr(X)
This returns the value of the attribute of the subject with the qualified name X. The &css3; namespace prefixes are supported. The value is the target &id;.

change-bar-class

Value: <name>
Initial: none, value required
Applies to: before and after pseudo elements
Inherited: no
Percentages: N/A
Media: print
<name>
An NCName, as defined in [&names;], to allow pairing of before and after elements, which don't have to belong to the same element. This way a change bar context is created.

change-bar-color

Value: <color>
Initial: the value of the color property
Applies to: before pseudo elements
Inherited: no
Percentages: N/A
Media: print
<color>
Specifies the color of the change bar.

change-bar-offset

Value: <length>
Initial: 6pt
Applies to: before pseudo elements
Inherited: no
Percentages: N/A
Media: print
<length>
Gives the distance from the edge of the column area containing the text that is marked as changed to the center of the generated change bar. A positive distance is directed away from the column region and into the margin regardless of the change-bar-placement property. Relative lengths (i.e., percentage values and lengths with units of em) are not permitted for the value of this property.

change-bar-placement

Value: left | right | inside | outside | alternate
Initial: start
Applies to: before pseudo elements
Inherited: no
Percentages: N/A
Media: print
alternate
When there are exactly two columns, the change bar will be offset from the left edge of all column one areas and the right edge of all column two areas; when there are any other number of columns, this value is equivalent to outside.
inside
If the page binding edge is on the left-edge, the change bar will be offset from the left edge of all column areas. If the binding is the right-edge, the change bar will be offset from the right edge of all column areas. If the page binding edge is on neither the left-edge nor right-edge, the change bar will be offset from the left edge of all column areas.
left
The change bar will be offset from the left edge of all column areas.
outside
If the page binding edge is on the left-edge, the change bar will be offset from the right edge of all column areas. If the binding is the right-edge, the change bar will be offset from the left edge of all column areas. If the page binding edge is on neither the left-edge nor right-edge, the change bar will be offset from the right edge of all column areas.
right
The change bar will be offset from the right edge of all column areas.

change-bar-style

Value: <border-style>
Initial: none
Applies to: before pseudo elements
Inherited: no
Percentages: N/A
Media: print

change-bar-width

Value: <border-width>
Initial: medium
Applies to: before pseudo elements
Inherited: no
Percentages: N/A
Media: print
<border-width>
Relative lengths (i.e., percentage values and lengths with units of em) are not permitted for the value of this property.

colspan

Value: <integer>
Initial: 1
Applies to: table cells
Inherited: no
Percentages: N/A
Media: print
<integer>
Expresses the number of columns the table cell will span. The value must be larger than or equal to 1.

column-count

Value: <integer> | inherit
Initial: 1
Applies to: the page context
Inherited: no
Percentages: N/A
Media: print
<integer>
The value must be larger than or equal to 1.

column-gap

Value: <length> | <percentage> | inherit
Initial: 12.0pt
Applies to: the page context
Inherited: no
Percentages: refer to the width of the body region
Media: print
<length>
This is an unsigned length, If a negative value has been specified a value of 0pt will be used.
<percentage>
The value is a percentage of the width of the body region.

column-span

Value: none | all | inherit
Initial: none
Applies to: block elements which are not in table elements
Inherited: no
Percentages: N/A
Media: print
all
This element spans all columns of a multi-column region.
none
This element does not span multiple columns of a multi-column region.

content-height

Value: auto | scale-to-fit | <length> | <percentage> | inherit
Initial: auto
Applies to: graphic elements
Inherited: no
Percentages: intrinsic height
Media: print
auto
The content-height should be the intrinsic content-height.
scale-to-fit
A size of the content-height equal to the height of the viewport. This implies a certain scaling factor to be applied onto the content.
<length>
An absolute size for the content-height. This implies a certain scaling factor to be applied onto the content.
<percentage>
A percentage representing a scaling factor applied to the intrinsic height.

content-type

Value: auto | <string>
Initial: auto
Applies to: graphic elements
Inherited: no
Percentages: intrinsic height
Media: print
auto
No identification of the content-type. The User Agent may determine it by sniffing or by other means.
<string>
A specification of the content-type in terms of a mime-type, which has the form content-type: followed by a mime content-type, e.g., content-type="content-type:image/svg+xml".

content-width

Value: auto | scale-to-fit | <length> | <percentage> | inherit
Initial: auto
Applies to: graphic elements
Inherited: no
Percentages: intrinsic width
Media: print
auto
The content-width should be the intrinsic content-width.
scale-to-fit
A size of the content-width equal to the width of the viewport. This implies a certain scaling factor to be applied onto the content.
<length>
An absolute size for the content-width. This implies a certain scaling factor to be applied onto the content.
<percentage>
A percentage representing a scaling factor applied to the intrinsic width.

display

This section specifies additional values for the property.

Value: footnote-body | footnote-reference | foreign | graphic | leader | wrapper
Initial: inline
Applies to: all elements
Inherited: no
Percentages: N/A
Media: print
footnote-body
The contents of the element goes to the footnote area. The element must be either immediately preceded by an element of type footnote-reference or have a :before pseudo element of that type. Otherwise it is treated as if its display type were none. Whitespace between a footnote reference and body is removed. In case a pseudo element is used, the contents it generates is displayed in the flow, as well as in the footnote body.
footnote-reference
This is an inline variant. Its contents is displayed in the flow. It can occur without a following footnote-body element.
foreign
If an element has this display type, it is placed unmodified in an fo:instream-foreign-object element.
graphic
This display type is used to include external graphics. It is an inline level display type. Elements marked with it are replaced elements.
leader
This display type is used to produce &xslfo; leaders. It is an inline level display type.
wrapper
An element with this display type doesn't contribute any formatting objects. Its inherited properties are nevertheless inherited by its subtree.

force-page-count

Value: auto | even | odd | end-on-even | end-on-odd | no-force | inherit
Initial: auto
Applies to: the page context
Inherited: no
Percentages: N/A
Media: print

The property is used to impose a constraint on the number of pages in a page sequence. In the event that this constraint is not satisfied, an additional page will be added to the end of the sequence. This page becomes the last page of that sequence.

auto
Force the last page in this page sequence to be an odd page if the initial page number of the next page sequence is even. Force it to be an even page if the initial page number of the next page sequence is odd. If there is no next page sequence or if the value of its initial page number is auto do not force any page.
even
Force an even number of pages in this page sequence.
odd
Force an odd number of pages in this page sequence.
end-on-even
Force the last page in this page sequence to be an even page.
end-on-odd
Force the last page in this page sequence to be an odd page.
no-force
Do not force either an even or an odd number of pages in this page sequence.

hyphenate

Value: false | true | inherit
Initial: false
Applies to: block-level and inline-level elements
Inherited: yes
Percentages: N/A
Media: print
false
Hyphenation is not active for the text in this element.
true
Hyphenation is active for the text in this element.

initial-page-number

Value: auto | auto-odd | auto-even | <integer> | inherit
Initial: auto
Applies to: the page context
Inherited: no
Percentages: N/A
Media: print
auto
The initial number shall be set to 1 if no previous page-sequence exists in the document. If a preceding page-sequence exists, the initial number will be one greater than the last number for that sequence.
auto-odd
A value is determined in the same manner as for auto. If that value is an even number 1 is added.
auto-even
A value is determined in the same manner as for auto. If that value is an odd number 1 is added.
<integer>
A positive integer. If a negative or non-integer value is provided, the value will be rounded to the nearest integer value greater than or equal to 1.

leader-alignment

Value: none | reference-area | page | inherit
Initial: none
Applies to: leader elements
Inherited: yes
Percentages: N/A
Media: print

Specifies whether leader elements having identical content and property values shall have their patterns aligned with each other, with respect to their common reference-area or page. For leader elements where the leader-pattern property is specified as dots or as use-content, this property will be honored. If the leader elements is aligned, the left-edge of each cycle of the repeated pattern will be placed on the left-edge of the next cycle in the appropriate pattern-alignment grid.

none
Leader-pattern has no special alignment.
page
Leader-pattern is aligned as if it began on the current page's left-edge.
reference-area
Leader-pattern is aligned as if it began on the current reference-area's content-rectangle left-edge.

leader-length

Value: <length> | <percentage> | inherit
Initial: 12.0pt
Applies to: leader elements
Inherited: yes
Percentages: refer to the width of the content-rectangle of the parent area.
Media: print
<length>
Sets the length of a leader element.
<percentage>
Sets the length of a leader element to a percentage of the width of the content-rectangle of the parent area.

leader-pattern

Value: space | rule | dots | use-content | inherit
Initial: space
Applies to: leader elements
Inherited: yes
Percentages: N/A
Media: print
dots
Leader is to be filled with a repeating sequence of dots. The choice of dot character is dependent on the user agent.
rule
Leader is to be filled with a rule. If this choice is selected, the rule-thickness and rule-style properties are used to set the leader's style.
space
Leader is to be filled with blank space.
use-content
Leader is to be filled with a repeating pattern as specified by the children of the leader element.

leader-pattern-width

Value: use-font-metrics | <length> | <percentage> | inherit
Initial: use-font-metrics
Applies to: leader elements
Inherited: yes
Percentages: refer to the width of the content-rectangle of the parent area.
Media: print
use-font-metrics
Use the width of the leader-pattern as determined from its font metrics.
<length>
Sets the length for leader-pattern-repeating. The leader will have an inline-space inserted after each pattern cycle to account for any difference between the width of the pattern as determined by the font metrics and the width specified in this property. If the length specified is less than the value that would be determined via the use-font-metrics choice, the value of this property is computed as if use-font-metrics choice had been specified.
<percentage>
Sets the length for leader-pattern-repeating to a percentage of the width of the content-rectangle of the parent area.

For leader elements where the leader-pattern property is specified as dots or as use-content, this property will be honored.

Value: <identifier> | attr(X)
Initial: none
Applies to: block-level and inline-level elements
Inherited: no
Percentages: N/A
Media: print
<identifier>
The qualified name of an attribute, the value of which is either a target &id; or a &uri;. It is considered as an &id; if the attribute is of type IDREF. This way a distinction is made with a relative &url;. Note that the attribute type information should be available. This requires a document type definition. This type of value is deprecated, because it doesn't support namespace prefixes.
attr(X)
This returns the value of the attribute of the subject with the qualified name X. The &css3; namespace prefixes are supported. The value is considered as an &id; if the attribute is of type IDREF. This way a distinction is made with a relative &url;. Note that the attribute type information should be available. This requires a document type definition.

list-style-type

This section specifies additional glyph values for the property.

Value: box | check | diamond | hyphen
Initial: disc
Applies to: elements with display: list-item
Inherited: yes
Percentages: N/A
Media: print
box
A hollow square.
check
A check mark.
diamond
A filled diamond.
hyphen
A hyphen bullet.

orientation

Value: 0 | 90 | 180 | 270 | -90 | -180 | -270 | inherit
Initial: 0
Applies to: block, table and table cell elements
Inherited: yes
Percentages: N/A
Media: print
0
The material in this element is not rotated.
90
The material in this element is rotated 90 degrees counter-clockwise with respect to the containing block element.
180
The material in this element is rotated 180 degrees counter-clockwise with respect to the containing block element.
270
The material in this element is rotated 270 degrees counter-clockwise with respect to the containing block element.
-90
The material in this element is rotated 90 degrees clockwise with respect to the containing block element.
-180
The material in this element is rotated 180 degrees clockwise with respect to the containing block element.
-270
The material in this element is rotated 270 degrees clockwise with respect to the containing block element.

page

This section specifies the property in the context of static regions. It defines the pages to which the static region applies. If more than one static region of the same kind (left, right, top or bottom) applies to a page, the most specific is selected, i.e. the one for which the most conditions are fulfilled. Each property value expresses a number of conditions.

Value: auto | first | last | left | right | blank | first-left | first-right | last-left | last-right | blank-left | blank-right | first-<identifier> | last-<identifier> | left-<identifier> | right-<identifier> | blank-<identifier> | first-left-<identifier> | first-right-<identifier> | last-left-<identifier> | last-right-<identifier> | blank-left-<identifier> | blank-right-<identifier> | <identifier>
Initial: auto
Applies to: static regions
Inherited: no
Percentages: N/A
Media: print
auto
Applies to any page.
blank
Applies if the page is a blank page. Blank pages can be generated, for example, when page breaks are forced to left or right pages.
blank-left
Applies if the page is a blank and a left page.
blank-right
Applies if the page is a blank and a right page.
blank-<identifier>
Applies if the page is a blank and a named page, with the name set to the specified identifier.
blank-left-<identifier>
Applies if the page is a blank, left and named page, with the name set to the specified identifier.
blank-right-<identifier>
Applies if the page is a blank, right and named page, with the name set to the specified identifier.
first
Applies if the page is a first page.
first-left
Applies if the page is a first and a left page.
first-right
Applies if the page is a first and a right page.
first-<identifier>
Applies if the page is a first and a named page, with the name set to the specified identifier. When the document switches to a named page sequence, using the page property in the regular way, the first page of that sequence is a first page.
first-left-<identifier>
Applies if the page is a first, left and named page, with the name set to the specified identifier.
first-right-<identifier>
Applies if the page is a first, right and named page, with the name set to the specified identifier.
last
Applies if the page is a last page.
last-left
Applies if the page is a last and a left page.
last-right
Applies if the page is a last and a right page.
last-<identifier>
Applies if the page is a last and a named page, with the name set to the specified identifier. When the document switches to a named page sequence, using the page property in the regular way, the last page of that sequence is a last page.
last-left-<identifier>
Applies if the page is a last, left and named page, with the name set to the specified identifier.
last-right-<identifier>
Applies if the page is a last, right and named page, with the name set to the specified identifier.
left
Applies if the page is a left page.
left-<identifier>
Applies if the page is a left and a named page, with the name set to the specified identifier.
right
Applies if the page is a right page.
right-<identifier>
Applies if the page is a right and a named page, with the name set to the specified identifier.
<identifier>
Applies if the page is a named page, with the name set to the specified identifier.

precedence

Value: false | true | inherit
Initial: false
Applies to: static top and bottom regions
Inherited: no
Percentages: N/A
Media: print
false
The width of the region is reduced by the incursions of the left and right regions.
true
The height of the left and right regions is reduced by the incursions of this region.

region

Value: body | left | right | top | bottom | none
Initial: none
Applies to: all elements, but see prose
Inherited: no
Percentages: N/A
Media: print
body
There should be one element with this value for the property. For the contents of this element the page sequences will be generated.
bottom
This element becomes the bottom static region. The pages for which this is the case can be limited through the page property.
left
This element becomes the left static region.
none
The element is not a region.
right
This element becomes the right static region.
top
This element becomes the top static region.

The static region elements should be the first child elements of the body region. In other words, they should precede all elements which are not static regions, otherwise their region property is ignored. The property is also ignored if there are no @page rules. In that case the default page set-up is generated.

rowspan

Value: <integer>
Initial: 1
Applies to: table cells
Inherited: no
Percentages: N/A
Media: print
<integer>
Expresses the number of rows the table cell will span. The value must be larger than or equal to 1.

rule-style

This property applies only if the leader-pattern property is specified as rule.

Value: none | dotted | dashed | solid | double | groove | ridge | inherit
Initial: solid
Applies to: leader elements
Inherited: yes
Percentages: N/A
Media: print
dashed
The rule is a series of short line segments.
dotted
The rule is a series of dots.
double
The rule is two solid lines. The sum of the two lines and the space between them equals the value of the rule-thickness property.
groove
The rule looks as though it were carved into the canvas. (Top/left half of the rule's thickness is the color specified; the other half is white.)
none
No rule, forces rule-thickness to 0.
ridge
The opposite of groove, the rule looks as though it were coming out of the canvas. (Bottom/right half of the rule's thickness is the color specified; the other half is white.)
solid
The rule is a single line segment.

rule-thickness

This property applies only if the leader-pattern property is specified as rule.

Value: <length>
Initial: 1.0pt
Applies to: leader elements
Inherited: yes
Percentages: N/A
Media: print
<length>
The rule-thickness is always perpendicular to its length-axis. The rule is thickened equally above and below the line's alignment position.

scaling

Value: uniform | non-uniform | inherit
Initial: uniform
Applies to: graphic elements
Inherited: no
Percentages: intrinsic width
Media: print
non-uniform
Scaling need not preserve the intrinsic aspect ratio.
uniform
Scaling should preserve the intrinsic aspect ratio.

scaling-method

Value: auto | integer-pixels | resample-any-method | inherit
Initial: auto
Applies to: graphic elements
Inherited: no
Percentages: intrinsic width
Media: print
auto
The User Agent is free to choose either resampling, integer scaling, or any other scaling method.
integer-pixels
The User Agent should scale the image such that each pixel in the original image is scaled to the nearest integer number of device-pixels that yields an image less-then-or-equal-to the image size derived from the content-height, content-width, and scaling properties.
resample-any-method
The User Agent should resample the supplied image to provide an image that fills the size derived from the content-height, content-width, and scaling properties. The user agent may use any sampling method.

src

Value: <identifier> | attr(X)
Initial: none, value required
Applies to: graphic elements
Inherited: no
Percentages: N/A
Media: print
<identifier>
The qualified name of an attribute, the value of which is a &uri;. This type of value is deprecated, because it doesn't support namespace prefixes.
attr(X)
This returns the value of the attribute of the subject with the qualified name X. The &css3; namespace prefixes are supported. The value is a &uri;.

string-set

Value: none | <identifier> contents | <identifier> <content>
Initial: none
Applies to: all elements
Inherited: no
Percentages: N/A
Media: print
none
No named string is set.
<identifier> contents
The string named by the identifier is set to the textual contents of the element.
<identifier> <content>
The string named by the identifier is set to the result of the evaluation of the expression in <content>. The syntax for the expression is the same as that for the content property.

text-align-last

Value: center | inside | justify | left | outside | relative | right | inherit
Initial: relative
Applies to: block elements
Inherited: no
Percentages: N/A
Media: print
center
Specifies that the contents is to be centered horizontally.
inside
If the page binding edge is on the left-edge, the alignment will be left. If the binding is on the right-edge, the alignment will be right. If neither, use left alignment.
justify
Specifies that the contents is to be expanded to fill the available width.
left
Specifies that the contents is to be aligned on the left-edge.
outside
If the page binding edge is on the left-edge, the alignment will be right. If the binding is on the right-edge, the alignment will be left. If neither, use right alignment.
relative
If text-align is justify, then the alignment of the last line, and of any line ending in U+000A, will be left. If text-align is not justify, text-align-last will use the value of text-align.
right
Specifies that the contents is to be aligned on the right-edge.
Value: false | true
Initial: false
Applies to: tables
Inherited: no
Percentages: N/A
Media: print
false
This property specifies that the footer should not be ommitted.
true
This property specifies that the footer should be ommitted.

table-omit-header-at-break

Value: false | true
Initial: false
Applies to: tables
Inherited: no
Percentages: N/A
Media: print
false
This property specifies that the header should not be ommitted.
true
This property specifies that the header should be ommitted.

Miscellaneous Specifications

The :blank Pseudo-class

The :blank pseudo-class is available to specify properties in the page context for blank pages. Those can be generated, for example, when pages are forced to start at the left or right.

The :last Pseudo-class

The :last pseudo-class is available to specify properties in the page context for last pages. This is analogous to the :first pseudo-class.

The background, border and padding page properties

The background, border and padding properties, as defined in [CSS3P], are implemented. They are, however, not entirely compatible with that specification. The implementation applies the properties to the region-body, because in &xslfo; they are not defined at the page master level.

The page And pages Counters

The page counter represents the current page number, while the pages counter represents the total number of pages in the document. Both can be used in static regions only. The page counter may be reset in the page context.

The page-ref Function

The page-ref function can be used in the content property. Its only parameter is either the qualified name of an attribute that contains the &id; of another element, or the attr(X) function, where X is the qualified name of such an attribute. The former is deprecated, because it doesn't support &css3; namespace prefixes, while the latter does. The function call will be replaced with the number of the page the target element is on.

The string Function

The string function produces the string that was saved with a string-set property. Its argument is the name used in a string-set property. If a named string is set more than once on a page, the first occurrence will be returned by the string function.

The footnote Counter Style

This counter style produces symbols in the following order: *, †, ‡, §, ||, ¶, #, **, ††, ‡‡, §§. If the counter value if larger than the number of symbols in the preceding list, the * symbol is generated.

The pcw Unit

This unit is available for the width property of an element with display type table-column. It expresses the proportional width for a table column. The value should be divided by the sum of all the present proportional widths, which itself is equal to the width of the table minus all fixed column widths.

The @namespace Rule

With the @namespace rule a namespace can be declared, with or without a prefix. In the latter case it is the default namespace. The scope of a declared namespace is limited to the style sheet entity in which it is declared. The @namespace rule should come right after the @import rules if there are any and before all other rules. An @namespace rule has an optional prefix argument, which is an identifier, followed by a mandatory &uri; specification. Consult [CSS3S] to learn how namespaces work with selectors.

Embedding In An Application

API Specification

be.re.css.CSSToXSLFOFilter

This class extends org.​xml.​sax.​helpers.​XMLFilterImpl. The source of the &sax; events that are sent through the filter must be namespace aware. If it is an &xml; parser this option must be turned on.

Constructors

public CSSToXSLFOFilter
(
java.net.URL baseUrl,
java.net.URL userAgentStyleSheet,
java.util.Map userAgentParameters,
boolean debug
baseUrl

The baseUrl is used to resolve relative &url;s. This includes references to style sheets as well as other resources. Because of the latter the resulting &xslfo; document is not relocatable. The relative &url;s in the input document are transformed into absolute ones using the baseUrl. This copes with the case where the input document is an anonymous stream that refers to style sheets in a relative way. The set of style sheets is then relocatable through the baseUrl.

If baseUrl is null no resolution of relative &url;s will be done.

userAgentStyleSheet
The default style sheet for the filter. It is used in the way described in section 6.4 of [&css2;]. If the parameter is null, a default style sheet for &xhtml; is used.
userAgentParameters
These are defined in section User Agent Parameters.
parent
The parent filter. It must not be null.
debug
If debug is true a number of debug files are dumped. They show the results of the internal processing steps.
public CSSToXSLFOFilter
(
java.net.URL baseUrl,
java.net.URL userAgentStyleSheet,
java.util.Map userAgentParameters,

Constructs the filter with debug set to false.

public CSSToXSLFOFilter
(
java.net.URL baseUrl,
java.net.URL userAgentStyleSheet,

Constructs the filter with an empty userAgentParameters map and debug set to false.

public CSSToXSLFOFilter
(
java.net.URL baseUrl,

Constructs the filter with userAgentStyleSheet set to null, an empty userAgentParameters map and debug set to false.

public CSSToXSLFOFilter
(

Constructs the filter with baseUrl and userAgentStyleSheet set to null, an empty userAgentParameters map and debug set to false.

public CSSToXSLFOFilter
(
java.net.URL baseUrl,
java.net.URL userAgentStyleSheet,
java.util.Map userAgentParameters,
boolean debug

Constructs the filter without a parent.

public CSSToXSLFOFilter
(
java.net.URL baseUrl,
java.net.URL userAgentStyleSheet,
java.util.Map userAgentParameters

Constructs the filter without a parent and debug set to false.

public CSSToXSLFOFilter
(
java.net.URL baseUrl,
java.net.URL userAgentStyleSheet

Constructs the filter without a parent, an empty userAgentParameters map and debug set to false.

public CSSToXSLFOFilter(java.net.URL baseUrl) throws CSSToXSLFOException

Constructs the filter without a parent, userAgentStyleSheet set to null, an empty userAgentParameters map and debug set to false.

public CSSToXSLFOFilter() throws CSSToXSLFOException

Constructs the filter without a parent, baseUrl and userAgentStyleSheet set to null, an empty userAgentParameters map and debug set to false.

Methods

public java.net.URL getBaseUrl()

Returns the base &url; of the filter. It is either set in a constructor or with the setBaseUrl method.

public java.util.Map getParameters()

Returns the User Agent parameters of the filter. They are either set in a constructor or with the setUserAgentStyleSheet method.

public java.net.URL getUserAgentStyleSheet()

Returns the User Agent style sheet of the filter. It is either set in a constructor or with the setUserAgentStyleSheet method.

public void setBaseUrl(java.net.URL baseUrl)

Sets the base &url; of the filter. The base &url; is used to resolve relative &url;s in the input document. See also baseUrl.

public void setParameters(java.util.Map parameters)

Sets the User Agent parameters of the filter. See also userAgentParameters.

public void setUserAgentStyleSheet(java.net.URL userAgentStyleSheet)

Sets the User Agent style sheet of the filter. See also userAgentStyleSheet.

be.re.css.CSSToXSLFOException

This class extends java.lang.Exception.

Constructors

public CSSToXSLFOException(java.lang.Exception e)

This is just a wrapper around e.

public CSSToXSLFOException(java.lang.String message)

The parameter will be returned by the method getMessage.

be.re.css.CSSToXSLFO

This class contains a few convenience methods with which an &xml; filter set-up can be avoided, because they do it for you.

Methods

public static void convert
(
java.net.URL baseUrl,
java.net.URL userAgentStyleSheet,
java.net.URL catalog,
java.util.Map userAgentParameters,
java.net.URL[] preprocessors,
boolean validate,
boolean debug
in
The input document. It must not be null.
out
The output document. It must not be null.
baseUrl
See baseUrl.
userAgentStyleSheet
See userAgentStyleSheet.
catalog
The catalog used to resolve entities during &xml; parsing. It must have the format defined by SGML Open Technical Resolution TR9401:1997. Only the PUBLIC and SYSTEM keywords are supported. It may be null.
userAgentParameters
See userAgentParameters.
preprocessors
An array of &xslt; style sheets. The input goes through them in the specified order and before the CSSToXSLFOFilter.
validate
Turns on validation during &xml; parsing of the input document.
debug
See debug.
public static void convert
(
java.net.URL userAgentStyleSheet

Calls the first variant of convert with baseUrl, catalog and preprocessors set to null, validate and debug set to false and an empty userAgentParameters map.

public static void convert
(

Calls the first variant of convert with baseUrl, userAgentStyleSheet, catalog and preprocessors set to null, validate and debug set to false and an empty userAgentParameters map.

Examples

Since CSSToXSLFOFilter is derived from org.​xml.​sax.​helpers.​XMLFilterImpl., it implements all &sax; event interfaces, as well as org.​xml.​sax.​XMLFilter. As a consequence, the filter can occur in input and output filter chains.

Example 1

The most straight-forward scenario is an application that reads the input document from a file and that writes an &xslfo; document into another file. For this we need an &xml; parser that can produce &sax; events. The parser implements the org.​xml.​sax.​XMLReader interface, so we can make it the parent of CSSToXSLFOFilter.

In order to create a parser, we first have to set up the parser factory and make it namespace-aware. This happens at the lines 6 through 8. The filter can now be created with the input document as the base &url; (in case any relative &url;s need to be resolved) and an &xml; parser as its parent. This is done at the lines 9 through 14.

We now have to prepare the output part. We use an &xslt; transformer without a style sheet to copy the &sax; events to the output. The transformer must be in a form that accepts &sax; events. This is why a javax.​xml.​transform.​sax.​TransformerHandler is created at lines 15 through 19. It implements the org.​xml.​sax.​ContentHandler interface. By giving it the output file as a result (lines 20 through 26), the &sax; events are transformed in the &xml; syntax.

The input and output parts can now be connected by setting the content handler of the filter to the transformer handler (line 27). The whole chain is then activated by calling the parse method, passing it the input document in the form of a file. The filter will pass this call onto the parser, which is its parent. The parser starts producing &sax; events that go through the filter and into the transformer handler.

 1 public class Example1
 2 {
 3   public static void
 4   main(String[] args) throws Exception
 5   {
 6     javax.xml.parsers.SAXParserFactory	factory =
 7       javax.xml.parsers.SAXParserFactory.newInstance();

 8     factory.setNamespaceAware(true);

 9     be.re.css.CSSToXSLFOFilter	filter =
10       new be.re.css.CSSToXSLFOFilter
11       (
12         new java.io.File(args[0]).toURL(), // base URL.
13         factory.newSAXParser().getXMLReader()
14       );

15     javax.xml.transform.sax.TransformerHandler	handler =
16       (
17         (javax.xml.transform.sax.SAXTransformerFactory)
18           javax.xml.transform.TransformerFactory.newInstance()
19       ).newTransformerHandler();

20     handler.setResult
21     (
22       new javax.xml.transform.stream.StreamResult
23       (
24         new java.io.File(args[1])
25       )
26     );

27     filter.setContentHandler(handler);

28     filter.parse
29     (
30       new org.xml.sax.InputSource
31       (
32         new java.io.FileInputStream(args[0])
33       )
34     );
35   }
36 }

Example 2

A variation of the previous example is to perform the transformation of the &sax; events coming out of the filter to &xml; syntax in another way. In the previous example the parser had the control flow and the transformer acted as a handler of &sax; events. We can also give the control flow to a transformer that reads the input and copies it to the output, because we don't give it any style sheet. We need to create a javax.​xml.​transform.​Transformer. It is done at lines 15 through 17. The actual transformation is launched at lines 18 through 32. For this to work, we have to wrap our filter in a javax.​xml.​transform.​sax.​SAXSource. For the transformer it is as if it is going to call an &xml; parser.

 1 public class Example2
 2 {
 3   public static void
 4   main(String[] args) throws Exception
 5   {
 6     javax.xml.parsers.SAXParserFactory	factory =
 7       javax.xml.parsers.SAXParserFactory.newInstance();

 8     factory.setNamespaceAware(true);

 9     be.re.css.CSSToXSLFOFilter	filter =
10       new be.re.css.CSSToXSLFOFilter
11       (
12         new java.io.File(args[0]).toURL(), // base URL.
13         factory.newSAXParser().getXMLReader()
14       );

15     javax.xml.transform.Transformer	transformer =
16       javax.xml.transform.TransformerFactory.newInstance().
17         newTransformer();

18     transformer.transform
19     (
20       new javax.xml.transform.sax.SAXSource
21       (
22         filter, // Acts as the XMLReader.
23         new org.xml.sax.InputSource
24         (
25           new java.io.FileInputStream(args[0])
26         )
27       ),
28       new javax.xml.transform.stream.StreamResult
29       (
30         new java.io.File(args[1])
31       )
32     );
33   }
34 }

Example 3

This example shows how a pre-processing step can be added to the filter chain. The input document is transformed by the pre-processor and the resulting &sax; events go through the conversion filter. The pre-processor is created at lines 9 through 13. This one does nothing, i.e. it lets the events go through unmodified. In reality you would replace it with a class of your own.

The pre-processor instead of the filter is now initialised with the &xml; parser as its parent. The pre-processor will become the parent of the filter, as shown at line 18. When the parse method is called, the filter passes the call onto the pre-processor, which in turn passes it onto the parser. The &sax; events produced by the parser will then flow through the pre-processor, which in turn forwards them, possibly modified, to the filter.

 1 public class Example3
 2 {
 3   public static void
 4   main(String[] args) throws Exception
 5   {
 6     javax.xml.parsers.SAXParserFactory	factory =
 7       javax.xml.parsers.SAXParserFactory.newInstance();

 8     factory.setNamespaceAware(true);

 9     org.xml.sax.helpers.XMLFilterImpl	myPreprocessor =
10       new org.xml.sax.helpers.XMLFilterImpl
11       (
12         factory.newSAXParser().getXMLReader()
13       );

14     be.re.css.CSSToXSLFOFilter	filter =
15       new be.re.css.CSSToXSLFOFilter
16       (
17         new java.io.File(args[0]).toURL(), // base URL.
18         myPreprocessor
19       );

20     javax.xml.transform.sax.TransformerHandler	handler =
21       (
22         (javax.xml.transform.sax.SAXTransformerFactory)
23           javax.xml.transform.TransformerFactory.newInstance()
24       ).newTransformerHandler();

25     handler.setResult
26     (
27       new javax.xml.transform.stream.StreamResult
28       (
29         new java.io.File(args[1])
30       )
31     );

32     filter.setContentHandler(handler);

33     filter.parse
34     (
35       new org.xml.sax.InputSource
36       (
37         new java.io.FileInputStream(args[0])
38       )
39     );
40   }
41 }

Example 4

The previous example can be modified in such a way that the pre-processor is an &xslt; style sheet. From this style sheet a org.​xml.​sax.​XMLFilter must be made, because it will sit between the &xml; parser and the filter. This is shown at lines 9 through 19. The transformer factory is re-used afterwards to create also the output handler.

 1 public class Example4
 2 {
 3   public static void
 4   main(String[] args) throws Exception
 5   {
 6     javax.xml.parsers.SAXParserFactory	factory =
 7       javax.xml.parsers.SAXParserFactory.newInstance();

 8     factory.setNamespaceAware(true);

 9     javax.xml.transform.sax.SAXTransformerFactory	trFactory =
10       (javax.xml.transform.sax.SAXTransformerFactory)
11         javax.xml.transform.TransformerFactory.newInstance();

12     org.xml.sax.XMLFilter	myPreprocessor =
13       trFactory.newXMLFilter
14       (
15         new javax.xml.transform.stream.StreamSource
16         (
17           new java.io.File(args[2])
18         )
19       );

20     myPreprocessor.setParent
21     (
22       factory.newSAXParser().getXMLReader()
23     );

24     be.re.css.CSSToXSLFOFilter	filter =
25       new be.re.css.CSSToXSLFOFilter
26       (
27         new java.io.File(args[0]).toURL(), // base URL.
28         myPreprocessor
29       );

30     javax.xml.transform.sax.TransformerHandler	handler =
31       trFactory.newTransformerHandler();

32     handler.setResult
33     (
34       new javax.xml.transform.stream.StreamResult
35       (
36         new java.io.File(args[1])
37       )
38     );

39     filter.setContentHandler(handler);

40     filter.parse
41     (
42       new org.xml.sax.InputSource
43       (
44         new java.io.FileInputStream(args[0])
45       )
46     );
47   }
48 }

Example 5

In all previous examples we have been parsing an input document. In some applications, however, the data might come from somewhere else. It is possible, for example, to synthesize the &xml; from data that resides in the database. In such a scenario our filter no longer has a parent but becomes the &sax; event handler of some system method, generateReport in this example.Note that a real system method would probably need more than just the filter to do its work. It would therefore have more parameters. This system method has the control flow. It fetches the data and generates the &sax; events. In the case the generated &xml; stream is not suitable for &css; conversion, a pre-processor may be specified as the parent of the filter.

 1 public class Example5
 2 {
 3   public static void
 4   main(String[] args) throws Exception
 5   {
 6     be.re.css.CSSToXSLFOFilter	filter =
 7       new be.re.css.CSSToXSLFOFilter();

 8     javax.xml.transform.sax.TransformerHandler	handler =
 9       (
10         (javax.xml.transform.sax.SAXTransformerFactory)
11           javax.xml.transform.TransformerFactory.newInstance()
12       ).newTransformerHandler();

13     handler.setResult
14     (
15       new javax.xml.transform.stream.StreamResult
16       (
17         new java.io.File(args[0])
18       )
19     );

20     filter.setContentHandler(handler);
21     generateReport(filter);
22   }

23   private static void
24   generateReport(org.xml.sax.ContentHandler handler)
25   {
26   }
27 }

Example 6

It may be the case that you want to synthesize the &xml; stream in a system method, which needs the control flow, but that the interface of your &xslfo; formatter is such that it also needs the control flow. In other words, the formatter is not available in the form of a &sax; event handler, but has some method that must be called to perform the actual formatting. At lines 21 through 31 there a hypothetical example of such a formatter.

To solve this control flow conflict you can create an adapter that implements the org.​xml.​sax.​XMLReader interface. Instead of actually parsing some &xml; you let both parse methods call your system method. The parameters the latter needs are passed through the constructor of the adapter. When the formatter now calls the parse method it really ends up calling the system method, which synthesizes the &sax; events.

 1 public class Example6
 2 {
 3   public static void
 4   main(String[] args) throws Exception
 5   {
 6     be.re.css.CSSToXSLFOFilter	filter =
 7       new be.re.css.CSSToXSLFOFilter
 8       (
 9         new MyReportGenerator(new Object())
10       );
11     MyXSLFOFormatter		myFormatter = new MyXSLFOFormatter();

12     myFormatter.format
13     (
14       new javax.xml.transform.sax.SAXSource(filter, null),
15       new java.io.FileOutputStream(args[0]));
16   }

17   private static void
18   generateReport(Object context)
19   {
20   }

21   public static class MyXSLFOFormatter
22   {
23     public void
24     format
25     (
26       javax.xml.transform.Source source,
27       java.io.OutputStream out
28     )
29     {
30     }
31   }

32   public static class MyReportGenerator
33     extends org.xml.sax.helpers.XMLFilterImpl
34   {
35     private Object	context;

36     public
37     MyReportGenerator(Object context)
38     {
39       this.context = context;
40     }

41     public void
42     parse(org.xml.sax.InputSource input)
43       throws org.xml.sax.SAXException, java.io.IOException
44     {
45       generateReport(context);
46     }

47     public void
48     parse(String systemId)
49       throws org.xml.sax.SAXException, java.io.IOException
50     {
51       generateReport(context);
52     }
53   }
54 }

Some Techniques

A few practical cases of formatting contructs, which are either more advanced or not yet very common, are described in this chapter. Gradually, new cases will be added. The chapter is some sort of how to section in the user guide. The examples use &xhtml; as the input document language.

Customising List Labels With Markers

The genaration of the labels of an itemised list is somewhat fixed. It depends on the value of the list-style-type property.The list-style-image and list-style-position properties are not supported by this tool. Sometimes, however, more control is required over how the labels look like. This can be achieved through markers.

Basically, you have to specify a :before pseudo element with the display type marker in your style sheet for those elements you have given the display type list-item. Strictly speaking that display type is not needed, but if you are about to convert your existing lists, those elements would have that display type.

In the pseudo element you have control over the formatting of the label. The only exception is that the width property must be fixed. The tool doesn't support the automatic calculation of the required width. If your style sheet doesn't specify a width, a default value will be used. In order to not depend on this value, it is best to specify one.

The following example is an ordered list with a nested ordered list in the second item. We are going to change the numbering as well as the alignment of the labels.

  <ol>
    <li>Item 1</li>
    <li>Item 2
      <ol>
        <li>Subitem 1</li>
        <li>Subitem 2</li>
        <li>Subitem 3</li>
      </ol>
    </li>
    <li>Item 3</li>
  </ol>

In the style sheet we say that the :before pseudo element of any li under a ol, no matter the level, is a marker. In there, we increment the counter that is reset for each level of ol. We also display it with the lower-roman counter style instead of the default style (decimal). This style will show the effect of the right alignment of the text inside the label. The marker-offset property provides for a bit of space between the label and the list item body.

The width property deserves special attention. First of all it defines the width of the labels. Since markers shouldn't influence the positioning of the element they are attached to, the labels would stick out to the left by the amount of the value of the width property. In order to compensate this, we have to add a margin-left with the same value to the list item itself.

  ol { counter-reset: list-counter; }
  
  ol li { margin-left: 2em; }
  
  ol li:before
  {
    content: counter(list-counter, lower-roman) ".";
    counter-increment: list-counter;
    display: marker;
    marker-offset: 0.5em;
    text-align: right;
    width: 2em;
  }

The rendered result would like this:

  1. Item 1
  2. Item 2
    1. Subitem 1
    2. Subitem 2
    3. Subitem 3
  3. Item 3

Making Section Numbers Stick Out

Sometimes the text of the section titles must be aligned with the rest of the material, at the left side for example. As consequence, if the titles also have section numbers, those will stick out at the left side of the title, into the margin, just like the title of the current section. This can be obtained by specifying a :before pseudo element for the section titles with the display type marker. Because markers shouldn't influence the positioning of their associated element, the marker content is prepended. This is the piece of style sheet you would need:

  h2:before
  {
    display: marker;
    marker-offset: 0.5em;
    padding-right: 0pt;
    text-align: right;
    width: 3em;
  }

This Guide's Page Set-up

The page set-up of this guide is rather advanced and is therefore an interesting practical case. The difficulty lies in specifying the static regions if there are many kinds of pages and if for each of those the static regions are different. i.e. very specific.

In order to avoid an explosion of &css; property specifications for all those regions, we can work in a sort of multidimensional way. This is possible through the combination of two things. First, we have the &css; cascading mechanism, which allows us to centralise common property specifications. Second, the can make use of the fact that the class attribute is a space-separated list of names. Because of this, an element can belong to several classes. These are the static regions of this guide:

  <div class="first top"/>
  <div class="title first bottom"/>
  <div class="title first top"/>
  <div class="copy-right first bottom"/>
  <div class="copy-right first top"/>
  <div class="left bottom"><span/></div>
  <div class="right bottom"><span/></div>
  <div class="left top"><span/></div>
  <div class="right top"><span/></div>
  <div class="front left bottom"><span/></div>
  <div class="front right bottom"><span/></div>
  <div class="blank bottom"/>
  <div class="blank top"/>

Neither of them has a lot of content. It is all generated using the span element as a hook. For the empty div elements no content will be generated. You can see that all regions belong to more than one class. The more classes they belong to, the more specific is the set of pages they apply to. This is one dimension. The other is whether the static region is a top or bottom region.

The first region, for example, is a bottom region that applies only to the first page of the named page sequence called title. This is expressed in the style sheet as follows:

  div.title.first
  {
    page: first-title;
  }

The rule applies if class is title and first. This is more specific then the following page assignment which also occurs in the style sheet:

  div.first
  {
    page: first;
  }

Another example is the pair of bottom regions for left and right pages. They apply for left and right pages, no matter the page sequence. For the front page sequence, however, there is a more specific version. Making it more specific is done by the two page assignments in the following style sheet part. The style of the bottom region of the front part is a bit different. It display the page numbers in lower Roman. The complete style is obtained by cascading all the rules for the class bottom. The first two rules define the style for all bottom regions and the last one overrides the counter style.

  div.bottom
  {
    height: 3em;
    padding-top: 2em;
    region: bottom;
  }

  div.bottom > span:before
  {
    content: counter(page);
  }

  div.front.left
  {
    page: left-front;
  }

  div.front.right
  {
    page: right-front;
  }

  div.front.bottom > span:before
  {
    content: counter(page, lower-roman);
  }

For blank pages we want no static regions at all, at least not visually. The presence of the top and bottom regions is defined generally through the div.top and div.bottom rules. As a consequence, no matter the page sequence, those static regions are always generated. All we have to do now is making sure they don't contain anything. This is done by the two empty regions with the class attribute set to blank top and blank bottom respectively. Those regions are assigned to blank pages with the following style sheet part:

  div.blank
  {
    page: blank;
  }

There is one more special construct left to discuss: the absence of static top regions on the first page of a chapter. As with blank pages they are not really absent. They are merely made empty. It is in fact the first region with the classes first and top. This region is assigned to the first pseudo page. All chapters are however in the named page sequence main. If we do nothing only the first page of the first chapter will have an empty top region. We therefore should toggle the page property without adding extra pages. This can be achieved by inserting an empty div element between the chapters with the class separator. The page assignment for that class is separator. This named page is not used for anything else. Since the element is empty no page sequence is generated. The next main element, however, will start a new page sequence.

After the front matter not only the page number style changes to decimal, but the page numbering is also reset. We can't just reset the page counter in the main page context, because then the numbering would be reset for each chapter. Instead, the style sheet defines a main-first @page rule, which contains the same definitions as main and a page counter reset on top of it. This page is assigned to the first chapter only, using the first-child pseudo-class on the h1 element.

A Two-column Article

Many articles and papers are formatted in two column mode. The title, abstract, authors, etc. are usually displayed across the two columns. With two extension properties it is possible to do this. The column-count should be set to 2 in the page context. The title material can be wrapped in a block element for which the column-span property is set to all.

Initial Capitals

A typographical effect that is often used are initial capitals. It consists of making the first letter of an article or chapter stand out by rendering it bigger and perhaps in another font and/or colour. In &css; this is supported through the :first-letter pseudo element, which is described in section 5.12.2 of [&css2;]. In &csstoxslfo; it is implemented with the restriction that letter combinations, which are considered as one letter, are not examined. In case you need that, you can always use the Unicode ligature characters instead.

The technique was applied to the previous paragraph using the piece of style sheet below. Note the second deviation from the specification being the usage of the property vertical-align while the float property has the value none. It is allowed in &csstoxslfo; because otherwise we have no control over the alignment of the first letter with the lines next to it. This depends on the font and will always require some trial and error in order to get it right. The values for the other properties are obtained in the same way. In fact, for this special case, we work around the normal way a glyph is layed out in a line.

  p:first-letter
  {
    font-family: serif-swash;
    font-size: 46pt;
    font-style: italic;
    float: left;
    line-height: 46pt;
    padding-right: 6pt;
    margin-bottom: -12pt;
    vertical-align: 9pt;
  }

Special Provisions for XHTML

While the tool works for any &xml; vocabulary it does a number of things for &xhtml; specifically. Other vocabularies may be supported in the same way at some later stage. The items are the following:

  • Non-&css; presentational hints are translated to the corresponding &css; rules, as prescribed in section 6.4.4 of [&css2;];
  • The lang attribute is honored;
  • Hyperlinks are recognized and translated in &xslfo; links;
  • The link element can be used to specify external style sheets;
  • Style sheets can be embedded with the style element;
  • The style attribute is honored;
  • The img element is interpreted and processed;
  • The html-header-mark user agent parameter is available;
  • There is a user agent style sheet for &xhtml; that cascades against the one in appendix A of [&css2;].

The User Agent Style Sheet

XHTML

@import "xhtml.css";
@namespace url(http://www.w3.org/1999/xhtml);

@media print
{
  a[href]
  {
    color: blue;
    link: attr(href);
    text-decoration: none;
  }

  a[name]
  {
    anchor: name;
  }

  blockquote, dl, ol, p, ul
  {
    margin: 0.83em 0pt;
  }

  blockquote
  {
    margin-left: 3em;
    margin-right: 3em;
  }

  body
  {
    font-family: serif;
    padding: 0pt;
    region: body;
  }

  body:lang(da)
  {
    quotes: "\00BB" "\00AB";
  }

  body:lang(de-DE), body:lang(de-AT)
  {
    quotes: "\201E" "\201C" "\201A" "\2018"
  }

  body, body:lang(en), body:lang(es)
  {
    quotes: "\201C" "\201D" "\2018" "\2019";
  }

  body:lang(fr)
  {
    quotes: "\00AB " " \00BB" "\2039 " " \203A";
  }

  body:lang(it)
  {
    quotes: "\00AB " " \00BB";
  }

  body:lang(nl)
  {
    quotes: "\201D" "\201D" "\2019" "\2019";
  }

  body:lang(no), bodylang:(pt), body:lang(de-CH)
  {
    quotes: "\00AB" "\00BB" "\2039" "\203A"
  }

  body:lang(sv)
  {
    quotes: "\00BB" "\00BB";
  }

  caption
  {
    margin: 0.5em 0pt;
  }

  dt
  {
    page-break-after: avoid;
  }

  h1
  {
    font-size: 1.6em;
    margin-bottom: 0.7em;
    margin-top: 1.4em;
  }

  h2
  {
    font-size: 1.3em;
    margin-bottom: 0.6em;
    margin-top: 1.2em;
  }

  h3
  {
    font-size: 1.1em;
  }

  h3, h4
  {
    margin-bottom: 0.5em;
    margin-top: 1em;
  }

  h1, h2, h3, h4, h5, h6
  {
    hyphenate: false;
  }

  hr
  {
    border: 0.1pt solid;
  }

  img
  {
    content-height: scale-to-fit;
    content-width: scale-to-fit;
    display: graphic;
    scaling: uniform;
    src: attr(src);
  }

  li
  {
    margin-bottom: 0.8em;
    margin-top: 0.8em;
  }

  li p, li blockquote, li dl, li ol, li ul
  {
    margin-bottom: 0.5em;
    margin-top: 0.5em;
  }

  li li
  {
    margin-bottom: 0.5em;
    margin-top: 0.5em;
  }

  li li p, li li blockquote, li li dl, li li ol, li li ul
  {
    margin-bottom: 0.3em;
    margin-top: 0.3em;
  }

  li li li
  {
    margin-bottom: 0.4em;
    margin-top: 0.4em;
  }

  li li li p, li li li blockquote, li li li dl, li li li ol,
    li li li ul
  {
    margin-bottom: 0.3em;
    margin-top: 0.3em;
  }

  li, p
  {
    text-align: justify;
  }

  pre
  {
    font-size: 0.85em;
  }

  ul
  {
    list-style-type: disc;
  }

  ol li ul, ul li ul
  {
    list-style-type: circle;
  }

  ol li ol li ul, ol li ul li ul, ul li ol li ul, ul li ul li ul
  {
    list-style-type: square;
  }

  q:after
  {
    content: close-quote;
  }

  q:before
  {
    content: open-quote;
  }

  script
  {
    display: none;
  }

  span.section-number
  {
    padding-right: 1em;
  }
}

DeltaXML

@namespace deltaxml
  url(http://www.deltaxml.com/ns/well-formed-delta-v1);

@media print
{
  deltaxml|PCDATAnew, deltaxml|PCDATAold
  {
    display: inline;
  }

  deltaxml|exchange, deltaxml|new, deltaxml|old
  {
    display: wrapper;
  }

  *[deltaxml|delta="add"], deltaxml|PCDATAnew, deltaxml|new
  {
    text-decoration: underline;
  }

  *[deltaxml|delta="delete"], deltaxml|PCDATAold, deltaxml|old
  {
    text-decoration: line-through;
  }

  *[deltaxml|delta="add"]:before, deltaxml|PCDATAnew:before,
    deltaxml|new, *[deltaxml|delta="delete"]:before,
    deltaxml|PCDATAold:before, deltaxml|old
  {
    change-bar-class: changed;
    change-bar-placement: alternate;
    change-bar-style: solid;
    change-bar-width: 0.2pt;
  }

  *[deltaxml|delta="add"]:after, deltaxml|PCDATAnew:after,
    *[deltaxml|delta="delete"]:after, deltaxml|PCDATAold:after
  {
    change-bar-class: changed;
  }
}

XLink

@namespace xlink url(http://www.w3.org/1999/xlink);

@media print
{
  *[xlink|href]
  {
    link: attr(xlink|href);
  }
}

References

[&css2;]
Cascading Style Sheets, level 2, CSS2 Specification, W3C Recommendation 12 May 1998, Bert Bos, Håkon Wium Lie, Chris Lilley, Ian Jacobs, http://www.w3.org/​TR/​1998/​REC-CSS2-19980512.
[CSS3G]
CSS3 Generated and Replaced Content Module, W3C Working Draft 14 May 2003, Ian Hickson, http://www.w3.org/​TR/​2003/​WD-css3-content-20030514.
[CSS3L]
CSS3 module: Lists, W3C Working Draft 7 November 2002, Ian Hickson, Tantek Çelik, http://www.w3.org/​TR/​2004/​WD-css3-lists-20021107.
[CSS3P]
CSS3 Module: Paged Media, W3C Working Draft 10 October 2006, Håkon Wium Lie, Melinda Grant, http://www.w3.org/​TR/​2006/​WD-css3-page-20061010.
[CSS3S]
CSS3 Selectors, W3C Working Draft 15 December 2005, Daniel Glazman, Tantek Çelik, Ian Hickson, Peter Linss, John Williams, http://www.w3.org/​TR/​2005/​WD-css3-selectors-20051215.
[DELTA]
How DeltaXML Represents Changes to XML Files, DeltaXML Ltd., http://www.deltaxml.com/​library/​how-deltaxml-represents-changes.html.
[NAMES]
Namespaces in XML, W3C Recommendation 14 January 1999, Tim Bray, Dave Hollander, Andrew Layman, http://www.w3.org/​TR/​REC-xml-names/.
[&xhtml;]
XHTML™ 1.0 The Extensible HyperText Markup Language (Second Edition), W3C Recommendation 26 January 2000, revised 1 August 2002, http://www.w3.org/​TR/​2002/​REC-xhtml1-20020801.
XML Linking Language (XLink) Version 1.0, W3C Recommendation 27 June 2001, Steve DeRose, Eve Maler, David Orchard, http://www.w3.org/​TR/​2001/​REC-xlink-20010627.
[&xslfo;]
Extensible Stylesheet Language (XSL), Version 1.0, W3C Recommendation 15 October 2001, Sharon Adler, Anders Berglund, Jeff Caruso, Stephen Deach, Tony Graham, Paul Grosso, Eduardo Gutentag, Alex Milowski, Scott Parnell, Jeremy Richman, Steve Zilles, http://www.w3.org/​TR/​2001/​REC-xsl-20011015/.
[XSL-FO11]
Extensible Stylesheet Language (XSL), Version 1.1, W3C Recommendation 05 December 2006, Anders Berglund, http://www.w3.org/​TR/​2006/​REC-xsl11-20061205/.
css2xslfo/doc/preprocess_xhtml.xsl0000644000175000017500000000714211434532530020426 0ustar mithrandimithrandi

# css2xslfo/doc/xhtml_report.css0000644000175000017500000000616011434532530017535 0ustar mithrandimithrandi@page { margin-bottom: 25mm; margin-top: 25mm; } /* A page for the back matter. */ @page back { force-page-count: even; } /* A page for the back of the title page with copy right notice. */ @page copy-right { margin-top: 35mm; } /* A page for the front matter. */ @page front { force-page-count: even; counter-reset: page 1; } /* A page for the main matter. */ @page main { force-page-count: even; } /* A main page to reset the page number. */ @page main-first { counter-reset: page 1; force-page-count: even; } /* A page to force page switches without generating content. */ @page separator { margin-top: 35mm; } /* The title page. */ @page title { margin-left: 25mm; margin-right: 25mm; margin-top: 50mm; } @page :left { margin-left: 40mm; margin-right: 40mm; } @page :right { margin-left: 40mm; margin-right: 40mm; } @media print { a { color: black; } acronym { font-family: serif-small-caps; text-transform: lowercase; } body { font-family: serif; font-size: 11pt; hyphenate: true; line-height: 1.2; } dd { text-align: justify; } div.page-reset { page: page-reset; } div.separator { page: separator; } dl, pre, table { margin-bottom: 1.2em; margin-top: 1.2em; } table table { margin-bottom: 0pt; margin-top: 0pt; } h1, h2, h3, h4, h5, h6 { font-weight: normal; } h1 { font-size: 1.6em; margin-bottom: 2.88em; margin-top: 0pt; page-break-before: right; string-set: chapter contents; } h1, h2 { font-family: serif-small-caps; letter-spacing: 0.1em; text-transform: lowercase; } h2 { font-size: 1.2em; margin-bottom: 1.08em; margin-top: 1.08em; } h3, h4, h5, h6 { font-family: serif-title; } h3 { font-style: italic; } h3, h4, h5, h6 { font-size: 1em; margin-bottom: 1.2em; margin-top: 1.2em; } p { margin-bottom: 0pt; margin-top: 0pt; } p + p { text-indent: 1.5em; } pre { page-break-inside: auto; } span.footnote-body { display: footnote-body; font-size: 0.83em; } span.footnote-body:before { content: counter(footnote); padding-right: 1em; } span.footnote-reference { display: footnote-reference; } span.footnote-reference:before { counter-increment: footnote; content: counter(footnote); font-size: 0.83em; vertical-align: super; } span.leader { display: leader; } span.page-ref > span:before { content: page-ref(attr(class)); } span.title { font-family: serif-title; } sub { font-size: 0.72em; vertical-align: -25%; } sup { font-size: 0.72em; vertical-align: 25%; } div.toc > h1 { string-set: chapter "Table Of Contents"; text-align-last: left; } div.toc > h1:before { content: "Table Of Contents"; } div.toc-h1, div.toc-h2, div.toc-h3 { text-align: left; } div.toc-h1 { margin-bottom: 2em; margin-top: 2em; } div.toc-h2 { margin-bottom: 1em; margin-top: 1em; } } css2xslfo/dtd/0000755000175000017500000000000011434532534014303 5ustar mithrandimithrandicss2xslfo/dtd/xhtml1/0000755000175000017500000000000011434532534015520 5ustar mithrandimithrandicss2xslfo/dtd/xhtml1/xhtml-lat1.ent0000644000175000017500000002677711434532534020246 0ustar mithrandimithrandi css2xslfo/dtd/xhtml1/xhtml-special.ent0000644000175000017500000001004311434532534021000 0ustar mithrandimithrandi css2xslfo/dtd/xhtml1/xhtml-symbol.ent0000644000175000017500000003303011434532534020666 0ustar mithrandimithrandi css2xslfo/dtd/xhtml1/xhtml1-frameset.dtd0000644000175000017500000010026511434532534021242 0ustar mithrandimithrandi %HTMLlat1; %HTMLsymbol; %HTMLspecial; css2xslfo/dtd/xhtml1/xhtml1-strict.dtd0000644000175000017500000006160011434532534020743 0ustar mithrandimithrandi %HTMLlat1; %HTMLsymbol; %HTMLspecial; css2xslfo/dtd/xhtml1/xhtml1-transitional.dtd0000644000175000017500000007655711434532534022163 0ustar mithrandimithrandi %HTMLlat1; %HTMLsymbol; %HTMLspecial; css2xslfo/dtd/catalog0000644000175000017500000000635311434532534015647 0ustar mithrandimithrandiPUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "xhtml1/xhtml1-strict.dtd" SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" "xhtml1/xhtml1-strict.dtd" PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "xhtml1/xhtml1-transitional.dtd" SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" "xhtml1/xhtml1-transitional.dtd" PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "xhtml1/xhtml1-frameset.dtd" SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd" "xhtml1/xhtml1-frameset.dtd" PUBLIC "-//W3C//DTD XHTML 1.1//EN" "xhtml11/xhtml11.dtd" SYSTEM "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" "xhtml11/xhtml11.dtd" PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "html4/loose.dtd" SYSTEM "http://www.w3.org/TR/html4/loose.dtd" "html4/loose.dtd" PUBLIC "-//W3C//DTD HTML 4.01//EN" "html4/strict.dtd" SYSTEM "http://www.w3.org/TR/html4/strict.dtd" "html4/strict.dtd" PUBLIC "-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN" "j2ee/weblogic810-ejb.jar.dtd" SYSTEM "http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd" "j2ee/weblogic810-ejb.jar.dtd" PUBLIC "-//BEA Systems, Inc.//DTD WebLogic 6.0.0 EJB//EN" "j2ee/weblogic-ejb-jar.dtd" SYSTEM "http://www.bea.com/servers/wls600/dtd/weblogic-ejb-jar.dtd" "j2ee/weblogic-ejb-jar.dtd" PUBLIC "-//BEA Systems, Inc.//DTD Web Application 6.1//EN" "j2ee/weblogic-ejb-jar.dtd" SYSTEM "http://www.bea.com/servers/wls600/dtd/weblogic-ejb-jar.dtd" "j2ee/weblogic-ejb-jar.dtd" PUBLIC "-//BEA Systems, Inc.//DTD WebLogic 6.0.0 Connector//EN" "j2ee/weblogic600-ra.dtd" SYSTEM "http://www.bea.com/servers/wls600/dtd/weblogic600-ra.dtd" "j2ee/weblogic600-ra.dtd" PUBLIC "-//BEA Systems, Inc.//DTD WebLogic Application 8.1.0//EN" "j2ee/weblogic-application_2_0.dtd" SYSTEM "http://www.bea.com/servers/wls810/dtd/weblogic-application_2_0.dtd" "j2ee/weblogic-application_2_0.dtd" PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "j2ee/web-app_2_2.dtd" SYSTEM "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd" "j2ee/web-app_2_2.dtd" PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "j2ee/web-app_2_3.dtd" SYSTEM "http://java.sun.com/dtd/web-app_2_3.dtd" "j2ee/web-app_2_3.dtd" PUBLIC "-//Sun Microsystems, Inc.//DTD Connector 1.0//EN" "j2ee/connector_1_0.dtd" SYSTEM "http://java.sun.com/dtd/connector_1_0.dtd" "j2ee/connector_1_0.dtd" PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "j2ee/web-jsptaglibrary_1_2.dtd" SYSTEM "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd" "j2ee/web-jsptaglibrary_1_2.dtd" PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application Client 1.3//EN" "j2ee/application-client_1_3.dtd" SYSTEM "http://java.sun.com/dtd/application-client_1_3.dtd" "j2ee/application-client_1_3.dtd" PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" "j2ee/application_1_3.dtd" SYSTEM "http://java.sun.com/dtd/application_1_3.dtd" "j2ee/application_1_3.dtd" PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "j2ee/ejb-jar_2_0.dtd" SYSTEM "http://java.sun.com/dtd/ejb-jar_2_0.dtd" "j2ee/ejb-jar_2_0.dtd" css2xslfo/lib_src/0000755000175000017500000000000011171100404015126 5ustar mithrandimithrandicss2xslfo/lib_src/flute_src.zip0000644000175000017500000061320711434532532017666 0ustar mithrandimithrandiPKÕV 7COPYRIGHT.html­WÛrÛF}ÇWtð©Š$${·bËS Y(óŒ¢G’f0ÍJå_òš¿Ìé/’,%Nv]eÀLŸ¾ÌéÓÃö÷ŸW9=]JU\ºç­3—D‘ªL‹KW–ªùîÝß7ÏÝï;Nû›Þ¨ßZ§Wý°KnÓónßv=¯÷è§›xÐ' P¬“¢”¨IîyÁÐuÜ¥1ë ÏÛl6­ÍÛ–Ò /Ž¼ÏŒwλǦydÝÊLæÂ»uŠh‹òò˜ó÷ïß×Öv¯H²<¶4¹è > ÇMF×ñ­4Åa7h{õ2o\ “Ã6Å/•|¸t»ª0¢0Íx».¥õÛ¥kÄgã±›”.] sù¨JäY°ÒlsA–—ßZƒ´,¿íØ ÐLe[ú€¹Ò4Ë“ôþÍðïB«ªÈ.h³”F| ßȳHHÈ«3rÚlÎ ž¿žÖ°qù¶ÓUë­–‹¥¡?èÍÙÙºU:ÏèVf‚nÅŒb©´‘ÕªA'ƒ¤,“tY!#SRX”¨Me©¹‹tY ÞŶqX aR,¡ñÜÁ޹Ò+¬þRáÝð'¿2j÷¥á|RÑ´–tf{Ú"?Ï)â8K •B?ˆ¬…4ÞrëN{Ö*#.ÚÞ¬C1|(ä$Ùó޶‘ ¾sA&jn6‰tÌÆ2”™ÓÇCQ ¿Bf‚æ\rJ µg©Åü%f«äõÅlN÷ÐÍrç­ ö½;ûîÍ™ÛùßìÛ^Òi{ëÎ;þÓÄ!ž!Tz-T·óô„£oFÆ)¿dœ§ek%MKd¾Š5ÚK`²Ð2iÍ5þš*ÎßRåu'÷ P+I[?¯á†ùäùÄV¯pоâp޼‹—²´œÚ(}O'²HóŠe‘ö§Ö L¥Õ ²P6@JR ¡&-òĈŒÐÄ«ò”déÌ[­µzÀ±€v[ËÖ h©ò ±¨{^›«1ã r;eȰ£ 5P(æ±iáàˆióWEÁíG\û|zZó ¾ô‚øZŒ-ÀôL€_è«EŠkAþBÌh_ˆñ‹j\×âïÙ}ÌÏá.|Џ nLý´µ¸ö7‚¹Ì™›Ç&Ü÷E™> lЫhà J{rËÂýC[gVvjAÓ(<@ï{ÏB͵Zñ½-]ÁLË)dzZgÐö¸¹íh¹ 'Ç{›?ìnÖÓA0Œý8 «ãhôcØ zäú¼7\»­;ßEáÇ›˜nFý^Mœÿ‰o~ã(˜ì&4Šà‘?ŒÃ`Ò à'^¶ŸÃÁ¸=\å†Ýþ´?ÒÕ4faqúá Œá35YÓèšAÔ½Á«öÃøŽq®ÃxÈ×xö‡w4ö#HÓ´ïGÎxG“€wÅ7~Œšòûµ}£n»ƒæšJÃ-W’ B†·8Bî…sk‹KBʲl—çm¥dþ™­–Åð!ƒÂSe´l’ÌØ=š„¦ó n8VÝ›^õéìÀµ'À8sc©ïýaï$ÜÝŸ¼™`…g9õ_Asby¢ƒ>ª¬OUt ë–Ksdßÿ}Úæ¿!ÏÕ/*ݳx@"»èFÓaj`ÅÔI›ÿK”ÿð?m ‘Ódõxä‡=Ô ÃM«fêi8Qo²ÐC­ÕÁ¹²Üщ?Џ³ ±þìCªƒ ©Ž3þŸ…ª£‘SN¢èPKÏ®vƤPKÕV 7doc/help-doc.htmlíYmoÛ8þ®_1«âÖ-KIƒ½C³¶4/Wï6iú6»À-ÑYÔ’”߯¿™¡$˱ûví‡Ã¡’H5/gžRƒÎßœMþ¸¹€Ì-r¸ù×Ë×ã3ûq|w|Çç“søýÕäê5E‡01¢°Ê)]ˆ<Ž/®Ãð'Ìœ+OâxµZE«ãH›y<¹HÞ ¨/û®óv”º4ƒúýk¹ºsÙïã-Û‹b> eÂÃ"?Ùº+ìp¶£/^x%$2“"õ’៲F8™Ât ïÅR¤:]ÀþþRpô8:<ùéï'Ç?ÁÅùž>6Ä)—ËB—yå$,¥±h8¢p }øEÁéÍø„þÀ+™—ƒØ¿ rU܃‘ù0´nK›IéBpëRC'\œXBfä¬;#âQ–1 ·4BŒââÚ©N×0':×f®2åd Ûx;9½À›K¸>ýíåém÷»%@¥Ã°Ë©0ïœ.C(ÄBnŒX&ÎÄbB!¦¹„©6©D͇!¬Tê²axtxø·™ç¥HSE«täïm)¾?$¡?) éø †ÏÃ#O.ðçòßË…ÅŽ˗œ¡#´„Í :Ö½›)cÑ«]Ã7>íÁ–чŒ>öFƒÈÕ­MdᤠaYß3FìÐg;Á‹„ªHåCäÃt@PÔóƒú…K]8za:zƒá¶Tr5ˆ§èMe_~,¦¶üC-ý">¬êF$÷˜zµŠo.þŒ¿Nx ž®!A‘ò³@œàÄoàö öEž–cšýÙ\òÏ> nå2l^üBžƒ:=µ*·ÔÅœ‰1g_Ô6ÔmÔg1)r±¢·Ë½Ñ@-æMšõ{`M²wæ8Ñ…WÇÉ»L/d pÃqm®çº‡´GH bÔ]Ó7Tòˆw1{Þvs{ñ›¿ ü¿ë‹ß'{àÿˆ ½è=fÞ!\\Ÿï%Þšy3ÃtîÙ„îF¯ô &™²\DÎuR-ð!Œ-¼1sQ¨ËÙÿˆ”6oíô§§e™«DP5…£çF,H_0¦™3‘Èg6"3a¡Ä<·A¢‘¶ÔQ8 .“€ž/,¨‚oPÕÜ‹Eb=€TÚĨ)–Paƒ™ÎsŒˆˆH5;îÐÞàÐ4×Éý_•v^åh‚⚀Ù"¿Í{ÈÏd W¤|f0–ýˆž®q¶uD)”F/ZreNÄøÉñ%¦2‹ÕÉe [-¬a¦ H‘d‘‡še'˜C"·KRá:Ž÷Ä/$Çû[Š&«¬d-†h—´(]oŽ–M÷¢qF42xE„7ÆeÂ5†tRÎúp$W‹4PÍÂÚƒÚGø”{3]™cEεQÒž°Á Ê¹]µ!cá©r˜þɳAŒã?=ó6tF.Ém £M=0ˆYô.B,+nõ} )výZ¯é›9?ÎàïÛ Œ)‚èUKV jü‹X¢_MëÇ,Ow›´¾ {-!ú”U^W¼ÑЉƒ|&´”Ö(•ˆw޹²‹)×yauÆÍϤAÐ ¯¥qÔseÐ6x[M“U8Å`ýµ gññ&8öÎ/Ê\R‘k» z¶ã'ª3LÕ:×™5æUñνõuž^*™§{ÆÏ gªÄa$ï>½’.Óû^óâÎõHÛyX ëŽûx 8JšeE°ðo›—ÌNÔ`b´ ´\HV oV=è Â9É©MìJ‰)·D+Êj#‘†ÊLL¥C*ϬB¹Ü’¹BüFÍÓ\eéj ¢,¥0õƒÀb²£u‰NeÃHùH¸Ò{5–”ÁÜèªÄx° -ŰÂ}퓚TÖEšhOSgOý¿RÈ›&ÉÖÏöd3zm˜ÜŦìkäXTЊÚÔB±ËîPæ‰Ëš¹-ùõœ:Û7<îl‡\ëQ"üM&ùEkg¼®Ë´ìf®¶Ê úNÎ2¦è­Âˆ6žmc£7Ó÷˜ÏXÏiØËßèÃ2…vA-ØÇ×'$tøä.“°\ÙQrSe€tD%÷Lm„´‚!Ž-s±æ¸¶í‚u²gK U0ô6©-šÙ5Cë.5³AkÁõTùÚ§O³ªŸ¨,u¯½/õ ö½~ ƒmE°IÉ­£„NIÂëdÃ4x·`j±…ÔŒ¸ÉîKŸ#—ñµ|pµ½®Jtn€Pˆ{ k]5½YÓKÌá¥Ò•Ý­‹A ò™ñüN9æ e-‘™¨è㨕þëʵó½Þ·ÅØLPº\j³¨Õz’­ñ¾œò÷½)ÚA¾GêrªïŠ‚ömO´Œ3[_ã_Óž*0’~Þ6¹l ¸FöUSyñ0õôT.e®Ki,T¶I%lB#¸kÈ™)-(4ƒ÷¡¾™Öz°¹t~-Y„D;×u.Šu ¢µiq6ó̰a{| ¹— ›6¦îsj)øx]JÞÆ1>n=ôIÐ^‚ʃÞj·½¡óö ñàò€,W¤Â¤45—.â½Ú`ê·8¾Í©÷;_s>5ÕÎéÅ£“žzð÷”Êø¡ƒªÇO·ü¾ŸU}?«ú~Võ-ΪþÏŽ¶í×’Ö—¾-ôÎt¹fz>£mÆþ¬Zįå\ä±*MËœJäŸO6Fí%sÐ Þþì?…4Ñ´ÿ´OL‘ñëO½;mp+vGýÜÂFw¾¢ dœìÏõlUŽ~4rŽKM—ðt ‚-yb£…r‘L«UW6v••ÎYc¦}£ÁÂ7‘IVàÒÌ×½ÑÕxÒQ{{Ï.Uu5š™V nêÍL¯óñifÚO3½F\ ÿ% K,Ü¢Z‰Í«Ä½TWù¿*¼wpZ!ãûÛÞh|};>íšìÃø^*‰$z_¢]¿â M}vÀØ-­”E•¼§K£€N?v.ûÑ0à‘wçÊb+ÜîõF¹S•+·Þ6ï‹%£Yï&F¤÷¼÷¶7rÍu+÷¿ä¤y©ßô*¨ ¹ 00¸+ ê©±zæVØüöFÍU€­™,¨#b]¦Ê©=ÆFjÁ¸÷ͦð'K~7È= E¨÷ñH¬ó¼ƒô­4¾öEx—F-E²îc?渓ýóÉM…[ù¤7*ù?gtÃW‰½â-DÙ_°Üz´Óh·SÓT}DªÓ5ÃÄ „ä÷PKr”®l¢ lPKÕV 7doc/index-all.htmlí}msÛ8’ðwý œ\·öTÅ–“ÜîS;»E–c%–ì•äÌÌím©(²8¡H IÙÖýúk¼APo$%R»®JD6@ÝÝ  ûÓÜ<´†¿=¶ÑÔŸYèñéó}§…êçÆ/[ÆÍðýz7ìÞ£÷—hèj¶gú¦ckV£ÑîÕkþêSߟÿÜh¼¾¾^¼~¼pÜçÆ°ßx#å½'ðÇs_øúÂðúuíÓœŸ÷ðë£öŒÏÏá•¶ÁÒìç«:¶ëèmfý{³½+Emïÿú׿²JH‘S¬¬dôÛØÕ|l ñý®½h†£#ÇF]ø÷ua£÷ÿ½¿üùÏùùãGÔ¾¢——mˆoú¾ [kácô‚]TøˆÎÑW( 5;?£Žmà·O –½öÉ2íÈÅÖUÝó—ö¦ûuä/çøªîã7¿¡{^M]<s\P(-ãªVx5 ¸ÇeìK4~ÖËq¯ê¯SÓÇœxè*üCƒa³?D·¨×üþ¹Ù“(N2«º­½Œ5wä;ó:²µŽA®i™ûSC»F5 ƒ6¶0;®¡æË:z5 zUyùŸu¤cËšk†a’.zÏÞ½¹¦Ó÷KÒDß%ÿš öUýC=Bä¤ ··ð¥yг=í峿¶ ÷ÐÚܚкÑÄt=ßu^“ ’Öckô¥Ôè¬ÑH³Ìgh­Žm»uôÂß)(B#A;»V7É@¹`cô!Ï_ãÜ:¶O>_?ÀX{1ñë§Æ Y).²ÇÞüo0ÔŒ­^Õ£¦ÿ€yǫȽøf+<$žÃI,ãˆ8„Œð–þ©ÑÇ/õàôúh¨’³‚°Î¬HO±5?†µ¾wy¾ :t2ÐÞ(>®]óyêLJ9‚ÙĦ,̉Oxµì4ÉO¯?™³ç`–^ž"ÏÕ•9;ºc{×úhêÌð)4À¿:%|ÖržSàz¤éŸP›q‰ &‰ø!è±Ç~û;{ª±Ÿ^ûס¢?V¤¤žÌx¯P»w£ä»!ãeÿdÔÕ¯›”3 ÀÏü,[lq`-ÞðFÎÙ`[ÞðVþü ¿È9ïx';ìÈŸàW9ç7~“÷¼—?ï°+çì°'ø þÀG9g€}8à@þ|À¡œó €O2pÀQ°zL]º³¥“t_zhOÊKÍô™ŠM6á@†_¾ÈË`ÀðoLˆ\јk®‡ÝÆ#ùi¿éxNÄ#:ãO`‰aO׿ØÙå‚HBß……jDV¡ñµåŒ%üÄ*‡öœ£.ö§ŽLÎ5jP3ÌBý‚Ö|Áj¾Ø¾adålÂŽ]ãúÉqËw`Å·kûÈÕ^‘>Õ\M‡•Ô#)þ›.bí6BÉêuŠí$y˜~€uͶ1Z‚5AË|äLpÃæ Õé b^³`» YB[ Ú–µT:?°Ý}vÛ®ë¸!ÑÛkiÞN%ùÀ×|SG³(Ÿl `&ѽ疦c-ì94‹‰=áAÂòÌq!¯©;®ñÎø á?&¬ öx¤ùðz6_°Í‰¼9m©èmꣴ脵Y@àßžÿ?›ö½iã–c-föÚ;¢ÿ4Vd:ƒôwÐ(?ï1žÒTà•‰‰æ¼vÓ¬Åä “Ê»Ðdd/fcBü КÐÒóƒÁ[óI_^|3³1]JŒ–èÙÎlî¸þ üAÕ)Cø¡¡2ñ,$^-A<´3ƒpEÆ Ì@ÙC[X÷×k4m£åØU+„€ÇJ)R+P K^‡ÔÚ&$ë×®/ŠÃùD†Žü@s¼ð4ý"L­Hb“K.ë,|{‡ÂGqŽfÿ‚´ äÚÁ(,¸³Ñf§!¿¢dæí¦ÅPžÇ©Ýû²Þojœ·¿h®Iy+L“h‡à¦¦N¼î`…ÐŒ“Ißð[û·_ú7 ËàM˜DÆ•³F¿¿°°‚+Êð 0Ä8^°×Îq–íL9s ‹âú´í”Æû•éÅ­«š“Ö–ÜVƒôÊOÔiI±5MUÏ…Úw()ܼìFçô5!åƒ*ôD/“µ»Ï‘v÷9U»û¼ƒv'ËÀcMÿ±˜syÊdïg¢hcFÙXoB¬Mg?C;@˜SQÕ´ç Ÿˆý(ÚÌYØ€çÞ:Vš°- vgÈ»‹÷ÛÎ[ªžqôˆîÂô†^ô. ÷]X_wG0ª–kˆã@¢š‰Ðd€Þ“ÓŸ;ls†¨'äšÔk¡ÉÀ&Ñࡊ¿!la™˜È_‰kr‰€¡R ÜbHE<ƒjˆwËùÛ+Ùawkó œnŸgÛ¸•41¯…e³6¬Í¶ùr³¶¨ô•§&­<9¯ðùöÏN Ò.܅̾ˆ·7bÿæ,»py‘¢NçêCHÑöµT÷±¿pm"oã7yªùh¦¹?X*í&T@+’½¶-eÒ–ñí)T……ç^üíL>ÊiJ0ÒEo›_èŠ$ £C²âFµë5¢Å‰ë“|"ÛT&¬bdÛ¤–Ø6 å/Xº¢í¬Ô…ÖÔ´Œ•I…Ù“Ò¡hA^¾ºÊ“8aV “› òã0‰ø‰Ï‚êcìO¸ßŠÜ©²»"÷Ý@K1j&ÓŠ€iÍPµ!·!¨®ô$ OÓ“9ûïʱ”›"¿%å ÓÕë5_¦»Ç)<Ü?ô‚äé¨$g66m²Y&„„€ÊlN%z«ÛmòÞ‚§ª÷–À‚ «Y)r„:CqÌ|eƒR[“[_QýIJâ:YbíæfJ¹gñrÔ‡Š–6víŽtÉ#í›ÝX /ìV#-9»‰s·i¹YÜ’Ÿ2…Ôâ§b²)êvä> åŠOT)#y ig{”¥¶§VÁÄÒé¼e9e•,mí9«pÏyg=©Cvdóƒü‹]ˆp°TÚ/{Ž!¬qRÆ϶>Ò²åÒÚ[¿V¤¬¢ÛÙÐv”¼›õbÝÈMh›lÎÆŽcaÍNÝ·K+\Ú®{‡xAïjkO¢¯Ùµ}Œl]衽lã{]­Ü@̱·VÖSýŽ‹$¤:ÝÝBSŠj=¯n\æZ7š¯ òª•ý¡úb× ‡bcH7 `a‹øÙ:*‹&·¬–IE‘›Ø&yÔ6ÿûí‚O±‹JܲµùiÕ×+Ž5òóâ3¬÷ e*Îl†mC~Ï\=VÂÚ¿&’Ôž3›RKÞ̱õ’ºçž Ñ*˜±8¶C`k‘¨˽ÇŸ a(ÊDn°§cÛÐ>’Ë™,w£½ru#DªPtcºÜ4~×t‘¿{SÇõ°S÷(«8£U@ÿ=U['ç”u¹0(~äŽ%E°Ðîj[xõ:¼šQIŸ@äÉÉf"Å.cCþ/d¬ë·‘™Ñn¶ŽŽ÷@¶ )ËZ=ZRçPų‡Ÿ5ß| 3›I„‰ï2\¿; mŽF¡‚J@«M…rSÄî ñØÔ…2Ù?L 57¦ÔpT†FÇÆÈ™äfb\ßiÖ’š«„-§8Éåô½lˆäHNk‰€¦unÄ*œ˜Ã寠e,¹ª¤$~ ¦¤›ãæ¨PXõ÷FÉy‘”t×™1©×œE"‰_17:+ö¡¶ç5âç!R…Ê(®£cσ…ªÃB¬ÜïY½D®,lÅÍÇr›Pæ!VЭ=ìu?zxa8Ù6'Tel¢¯—“¡9Eg;Œní$ÊB@ýœæ£}.6“5Ôï;ŽŸ~HFN­Ò)Ú^üŽÐ¿Åé·r˜Ê¹+·ÓFœN¯'ªÔ–…oZÖ`ð¿ÂaJ'ÕT$ߦ"©(8,5ÛiHv¬”ùGÔlí9<ñºpÉ5vЕ=t¾5QwpÖULÈã°½ä&°réÐZ4C@1¸nå”] ô¢kúôê9»8Õ<4Æðë•·˜a£æ-t"QL–µ¼Xu™ù&ºÌ|“z™ù&¯ËÌÌSÚ0íÙE†Zµ.2¨qkîºÍaëŽá¼UýÒ†xîÝHø3*èNî·ömóé~Èz=GŸ%ðüÂqüRõ«mÑêžÜQß\P§vwaesÒÚ’×ý…•Ÿ¨Ó²n›«K-Ámåû!õöPÚ'Ù&d§Ûfw1éSÕ™Ž@}å9иĬ¥g*ÌØÚv­jSn³tu#NÒÓ3ÏÖÔ’Ë0c³õMÁ3—‹?¦G¦ãÈwi”›@ŠC++u¾s^ô½êâA¬Ï}AŒIwšmX˜)°¬5eZ7Žùð#)~vöåDmHTRü†'h–å1Ÿq“…ͬؾ 1L&%ÓVMŸè±Ù ~5ýi9ô§þlÈ͸)¶¡Å” ‘N¢º…GâW ‰‹1½æbÏY¸$HÃ[$(YVI{,gl©Ô­œ6õLàÊÎðÌ3]m¯hGöŠvª½¢½³½‚Qˆ G¤">DPX|´°J{q)L‘X˜n”Þe+ò’·Òª=Q$¤±Y÷î4gkò¥ŠDÊü™8J»;`é;(3GÙš Ø q/,+Pm´mÝ!…)Ï!kæùúý©è¨Ül3WpÏ:­å„7⎿ÿížwG÷¼q‡þùó¿É›‘¼jùp˦ßÃíQ°Hi÷ ;Œ»Àoîãg—½2Lúœô $Æ‚®ñèaУ3MŸVÝØªœƒosè°Ayìÿ± Š4ó²]S§ Âk¢;÷æ² Sæªï.YœD˜šëjKb" Eè3ÌcÒ%ÏÛ9¬ê·yà#ûÎÂã0GêÊa? g†BÓ¹ècÍÀîH¼œüâŒå¤—Ñ—%Ë᪳٥ÙZȃXÛQlÙjkv¤KC¶ÍŽë“g(Pásdd WDX¢¨\ñP&¢íO0ÕÑÙÏÎk³\èlŒ‰Ég¦ùú–Å]0ò‰–eë>ÈcذUà\iØ+«„+•hQ`•Ðv$­Âà¹wtMæÒlFôh¿DØŠÐÜ–›Q¿ ¹­ì ŸvâÒýy¶ßKóüëÇ™4ÿ‚̉1(„ó¹e¬!"ÒS- –mµO‰|#ÒŽxPÑ”À÷C×#Û4íÀÄœ–"܇z#¶õ‰h6Qß|jÐ÷h)¸*)!U-¬_KÐC’pÃÀ¿¥"jaz÷Jù˜ç­’RZÝFXmdø! )U()•M¬_ËàƒR±*³å”/ß4W¹•()eW6µ~–|Hꦸ+)×µ¶~½"ÇþɬPëÚÁ ¤HÑ A%Ò”•ÆéXTiTåhZUYiÜ$À%9 Kú¸aGêj‡7ÛP³ cf¡î–X¼T–‡xB‰Å:q¸qû];sþ‚ýÎL{†CðZ’©¥ggšÑbNæ–°ñ9q¥ÇLsÐR2¯èZ›.kcë|Ú“‰<—­Ñm¨Wê©”<ÔN¦ÍWíE €i×C¤lŠ«!üÈÊlå|Êtä^¼íáØ/ØõùDq\à¯ó¬P7ƒ[ f‘–‡É5!9g圤ðQR㯥VÅc‹ä]À°Þœ"]l˜Ú½éùq`ûÙŸF {Ï}²$+¯_Ç`óÉ*›ò#XU ùéÚ'©Îêñûœ „°’ۚšU7õýùÏÆëë+4ï‚T>ì7úíÖùÛÌ:'ǵ¼ÆIoxN‘|Ô\¿~m‘G²1íÓžåbßv%ÚÞù Í¢oõkòhNLlÔ€0¸…:ŒÎÕâ}ønÜÅÒý/Ø›ÛÛߥ…ÙÙÿû=õún)z:Ë¥ÜJv&¿ŸÁ¢[î]ÝÆÀ–ûïÎÝväð=›}û£’}šû®Ý„9|¿æ³ùò/Ø·›l¾{óÜúù—édæ*ùÙm“«»agv±çE¦º»rž¬ž_ü`R¿üæ,¨'Íò4s s²¤;Æ2¤·‘» Ïwfæÿb´tnÞO†dŠËÖ÷C¥;´û$“¢þM|@sBŸÏ캌fšK'LµHñ:Åü&­3þ¦QèºÆœ±há{žá×zt—bnd+!Ì›k:~êwF"‚Öbbøç½Á´~mø"@8ââßiGc½•£,°_[Ç^I¿¹}¢,QB+Å^{l•"Z–>:Œ}a£nÀyiYo(KOÞ0°¿^©;¤F¿WNµV /KZßk¯l¢?—¥cÊ¡Eï¡{¨ú¤ˆ_DˆŽßX0ŸH³ Ay~Ø[,£ƒb™§ á¾ù?ù1ÇÀÒÙä´Ÿ+ñ¹ù¬ÏØéìõ;v=ÑÅI|€ÎÌr9ÛHçăL}“¹žFhð÷…ãcƒŸËJ?¨%f+î Vjl6:Osm„qMü‚£³~Ä› úƒ4t7SLêÐ&8Ö81 €—Áq^²éµ‘ ~k$_¿&e!ç®þLöIÄ5wðKCÊnâ«L5e!i£ÙI¹ÅºshŠæ·þ쑾ëm‹e!o^¶Å’ ^slAý*Ù)žR±!\˜Ç7)h›H/1¡"S†S÷éòO‰(´« Tœ[¡RQ'gC̃PFéôÁëôüHµV‘³ Œ·ûîs¾ŽLv0)²¨Î9 Bl 6q o™ºé£ÍZ`æ}\k4ŸMèÉ{Ç žh–”\s «ûjzù^Æ8|/d9 Púo~Váð=Rø)…êt[éû*¿ ÙêtÊÚ½ÙÃwK¾»²ÕéšM6hß;ElÍ–½^‹ÉÄ|ãÁ™':~ÖƒŽFðÁ@cÚδÔ=•Ui»!WÍ¢÷»Ñ)üžòèS¡3k:>Ù6ÀØ g ;±ÔNÔûlƒ;D2€cþ[ܪÛóüxÃ%v(äXîË'œE`²ô½"š™µŒ3:ÍUý IÄ]dìDYÏeçHœÍu“轜œÎ‘¦¥%d¾'8s¤ØZ©þp4ËÿŒeŽtÛDä>éŠ:™™€L®hÅà}é7o˜ Õ‹öwùºK òu—W´¿»ºPœp’«V2íŽ[sÀу‡2„m%ù©æMÃèwºç]xš~Nc‚ÉtW°‰4”k´9û’îcøá7ݱw›Á7gí—ÏØýo6rÿ»ÌãVÍÀ:ë¤2°Î lÜMŠ•EïMâø)ø_ä¢*5 ˜vvWʦ8»ÛŠGÑ+ŽÔ¢÷­‰O¿¢4¹"ÓëÜ´{C6fÈÓ1…I5ŸmÇÅ zð…kÆ´w¨mŠ£Dœ£24fÔŸd8xƒøÛµìžD ‰ù88dN­ÛZ ÕC±ûøÐ†á–£×ã”Jl›=a9œƒQ;w\ÿøtµàâÃü wL0bí ¾,OÈÚ³,òt§Wf™%v£ÖC·®áëqŒØ¶­û§›ö€ãÊ^ªŽ©Â¹° #?Ú!oEl†dq,¬²¿FBö×T!ûkÆPà¿ÿ>²}Jú$LëïB¿—Id`…$¯±þþ;’ Rñ‡c$@VìêÜfU!bË=ŒkW³¨‡yY’ðäe¾ 2(Ìû Á×Ål.»…"³@ =ØN]«ªLª)›ö—¬à$â²D “#”j]q¸¦ªoRÎtžö-âißRyÚ·¼,Ÿß¸‰å[¹m,1üÖêI?LÛ X‘a,äï×iIÂ= z¸ÃÀžš;fÖ~Ò¤Ð+¨8©GÃ}4îSGÃ}&3RZˆRp2ÊAA¦¤­â,äcNJ 6‘§™”÷nTÚ58Eœ3)rgšï?÷›­6?ô±ês:–ßÚÃOx9L“ò“Å%Äó7 Ç Õ“œH¯ŠgœÂµ±ÀSTYøZâ\˜Pï 1"Ì,Ê}Ævdc9ž$“Ø”˜¯pªPm˜«Äjú¼#ó™þwxJõ±iûÖ,ó)½öL+e";e™N=š~$¤Í–「÷Üœb ¡" wa´(ã¼Ú=6ûMfØde^éÔ’t7’¤»©’t7/½ªÛ¾é4CÛ~øVf²m;ÐgÄtÇõoú,žÂª•s3Me‚$ý·Bn¢ãäaë̲Þ+¬¸1 ÃHÑãƒ.ÚÔU67N¶Å¿;‹e©Êᘈ‹™0ï³ L<5“ìôžØÞ }:æ(ãÈW€neÌk[aÇ»oPfìÔò@/’z©ò@//y ×ì2“y(3±¶<’š™t*€È;ˆj߈…X`£ðÇDq¤9x0‹wh¼Džh K¨j|ß|Žæ›¿Ó2‚±‹mÁ™I;ú¼°4ÙŽ}î‘ ¨šõ³.‡Ažk¦=_cô¦]Æyßë¶îš}6 éãQòî^w0lö‡Mú|œx>ôšƒV§Ãå/ljéS÷s›[úXf,ÕëÖC´n=¤®[™v„Ößt!›ç+o»„uÉîàä³u´ö¢ÒŠ Éí¤´ ¦…ð­¦w(±åTÛB¯;ð%¨"Î73ò;sì+Þ6W'‚oªwub®é?´g|î-f3Í]FSTÕ<áñï”c#—i²UâѸaŶo,u´½aÔýöšF±L[0òLj‘?¦2òǼÇæ—vh ^ʼúm;ççQÔ½y,Þ^¹m"Š£Zqxngµ”ÕÉuÅWHê‚?ª•œX™ºÎ«Í‚Òr  LÜÅ5ÐKœ4ØÈH1ãÝdÌÜJÒò‰cYÎ+¹¡ ‘ Qhs@'P<—΂¾¾NaÝ{Ánm¾pçŽG#QÒ–þÔ´ g’/õRÄ ‰œ™¯äNÔæ’L†»”ÄzñþãŸIQ `JjÑïèî/ù.ÃþñÏúÕö?(a² c‘ÌÝ 1fÁQ¹¦þL|íÀhŒV¯q'NA²‚†îÈ›á¹CïYôNÜÚíÓÄÀY¸:æä–¾8rì_ £À0I@Æ›‡.º‡il¡ˆú%; ÚN‡*щmˆ~pXe[ºáùÑ5×ô—›âä¯<ÚDñð—Ì¯ÅÆ¸ •”°UWÕrÐDy¦‰H” ª8;t{%’˜KämÔïÌ´+ÐÙ±R63rÃ&.…îY/Ph(lò­Â˜¥‰Ç ã˜'Ó«EY) 1ô²P´Þ“˜Å0—ì±øQÑÎw¤V©ª¯ìN£t›ù+~¸§¹|È+`;PK8þ¹’dëf^Óö’‚¶‘A/~ ÁÙòô¶­%ü‡‘ ­Cgž¿´ø3t‹æŸ“ÇwܺQûÿÄ%«‡ýŸ²Èî.±‡6¨p kí3 *Ä]†¾c³ëpA¼oÓ‘~PR)ucÄÉè}lŠ¿ô]éf I&†µ™¶n- þ§æ-\×YØô]_¸0«Æ.È^¦¹B 3˜bìoEJúÅa‰Ø%‹æLù!ÅL'ãž´ÓímXÔ^°m’˜|¶òÔïleT%ž<¶˜¤Öªú¹(5ví~«Ý6¿°ó_Ñëql¾ÈØÞóäá8û³ßnµŸ ÁËqô%çK®éB ~=®èѧãÐ T8^FH^/–ï#,ß/–",?/–#,?/–ÿaù_Ç‹åŸ#,ÿ|¼Xþ%Âò/ljeä*¬¼®Âú¢«°þ‘¸ “£G“A`Ü\¼¦Øªö|3¼)FÞ ïÅò¨ð˜´k¾PÞ NiFZ ÍíHQšÉC}Ü!;Þ›;a™SŽšägáÛ÷a‰2Ò SîÎ}/¢I Ÿ88S­Qp˜æ® «S‚eT8ÚË!(ÕáýÆm@Ù½^Œ jÏzyŒjÐF™(ºÓ“¨•ð¤WIRmÊS“Ó8Î^’éåç±i’§5B›ÎE$ ÅäሳÔâ&ÏþÄ]ɱž&'ŒZ½ˆ|3ö+ê›qÙ ©6èA^6hvtC8rDÑ>íÖC™ØÙc™öËB°ëÅ«àµbç!‚fßjäÿe «€›Øhro{|·Y‘XØ>szC”­Èko9­ÚEB¸Z‘t¶¿3 [*ç‘OoJs˜€*3<·Ûi=Ü?ô8ÛåoÇÅyýðl 麂 l¨+>=“å—Ð%bÜ8ú‚¸Ólî´ÓCRH gÒûþ 1À>µ‚¼!hÊZÂ/˜^¦Û²€q›øI£S,1$’=_Gêå$wÚEÙÂL¡!þƒ.8€³Fž~Æ~ªÂCì¤Å$ÑùrzØÿR™ô^1nA}CŒBÙ5 £Ù›ˆÿ(¤À;ºQ1ü0çOöÛyµéB>ºãÐʬý'z÷ˆ!B«Rr‘Ã}Å â&Ã).F#ÙÞ¥M(Bä§™ic½NM}svóªq7-¾ƒtz°±FÙ5sŒ€‹¦îâñi“ €<¾8¹ÉÔ½ °uýû]ìy$ìvßz:ó0Fcl9¯ÛÜ\sâRˆHmîð7g:¯é t™˜Ø2BA@4M×mÄ[Æ< {,œ£ë ‘›!°:µ(ŽÝ;4^m'>f·MÍuºïck Ù±ŽéB¦pUœÃÖ«Gí[K{f” _‹ Qu`Ûß`Øïô¾0½ƒ>‡Ò¡Ä2ô8½¶ÁÐ]ZX\ ƒ÷Ê,É=âÁ«éëÓ¡y‡ EÄ—NiÅ–;¿j õ0²PS-ÔÃ-ÔŒ\dEÛÆe-É_=wµ1ŒÃEÐW¿2HQë—SÒãR«s^§EåM,Œ,sæÏ<üïèÒ_è‘ ÏŠ€ Ø¡ÁŠûrŒ:¦ Ç\ëDª\Ö<Ú 4&yÔ+ôõ(Ö°Ÿ˜‘ü¸ÑÉcìhf4ŠœýŠ”‹<úVe H‹ò(X•G%_–ËÛ—85¡?š´Õð3?ËÀ[X €7¼‘s¶Ø–·¼•?ÿÀ/rÎ;ÞÉÀ;òç_øUÎù €ßdà=ïåÏ»ìÊ9Iïž $ÑQäÏI¤½G9'ñ{Ô—ä"Ê@þœìý åœDe’dÎŒ˜ì@%‰«ðÑ@Âèáõšß?7ûbÈ«MÛÀoq„ç¯ñnÛg‚^°ûbâWÆNHVŠK0›}c«¤WõÈBOò*r/žú-ÌVxÄ9IÎ}ãˆ8„Œð–þ©ÑÇ/õàôúh¨²CzX¨3+ÒSlÍÏ Gßß;ȼ ߎ :èo×®ù<õãÃÁlb—8;J‰¦vˆÑëÔô±Ÿñûíïì©Æ~zí_‡ Ò¬(H‰ˆÌ¯P»w£d‡œòõoäœi–EÈíbëê´åÌ—”§œü§SߟÿÜh¼¾¾Âb}Ae²Î‚0n.f{ü¬Y sàdêøN¢®ÃGÊ‚þ¤ÃëßЇËË!OW~ M]䛾…¡ú_×2Ð/¦Ñ/xŒ¢ºO¯ùH–aÈL»ù“·˜_ÿÉÅÏÐÕäkŒX‹¥{3Ó¿ÀÆ"QUˆ­éS}ßC&LD" ±>µ¡kž—§×ÝÎP¨ö]ˆLŒT¦ ÏÅÄ +!;'W§÷½Í¬Ÿé[}5¨<¨õ¨T "'`܇j±«“³ò64ÄØ¤þ±€w5ÀðÙëéu§×ï4ÅfÕT4þMçTãßçЮoðB²þô5- õIOyP%HR/ظ¨yÕ¸m2 (dtcz0„ÍvO¯-MËô—ñæm]24k4t5Ï4÷‡wzíÏa¹»d=øè<¸º5T( ºBNÕxÎĽãô:xªY€¥íÁ"Lë"U@•™Ï­åúÍY¸L~Ö¸ŽC¶ÀÙŽˆ ƒj0¦]Ót–yìªÓ ä³­è=wÍM_ž“³žTSúŸ“ÇÅZvz=§¿tFs:d*¶‹gcì•Ù-—gCa6 ³©Æœp½±c,É/Y€ùýPK ä;ïí'êŸPKÕV 7doc/index.htmlíXmoÛ6þ®_qU±jjÉ/{ASÛ@ê8«»Æ5\¯i%ÑJTIÊŽÿýŽ”üîdéÒbÃP¶Hñx÷ðx÷ð¤ö£³7½É‡Qrýùâõ n-.[½ 8›œÁû—“‹×Ððë0‘$SL3‘ý¡ë^n¢u~‹ÅÂ_´|!gÁdÜ} £ jÖôÖl?Ö±ÛuÚjµ!]ŒÈŒÖjص8Éf—f.ܤüd§—©ÎkgÏž•FŒÊ„’¸Ô ¿ÓŒJ¢i á>‘9‰E"ƒ ü½*2hüúÉ/¿ž´~†þÙšõz,Í4§]tœóBS˜S©8z¡5x…ªàt48780gtÑÊN›³ì$åWé%§*¡T» —9í¸šÞè RÊ…DÒé¶„oŸZÇ}kž» º ZN(â%„³Hp!;î"ašVþƒÎú‚·“ÓñÞœÃðôÝ‹Óñö]wÜŒÌC"¯´È]ÈHJwžt­N”n¤ º‚„œB(dLÑrÝ…‹uÒqõú.D”óœÄ13»Ô(û*'‘í× D-Í_ ²ŽÛt7 yÜÇëüçq¢ps‡dþ‚È*i  ×ÙBw5eRi)‡À7C¿‚Ðõ=Э4Îfˆ6¢™¦Ò…yÕ·>² Ú,âÜ^Ç1¦s·û$ Uþ¼mV_‰8•̹Èt)Ó»›X º‘^Í t¼oòN¿ÝfÉíŽHtÉö­Ô÷ÌÇ)'en8®¨Ü¼A©_f÷¦ÑÜržÙþ‡‚`YLoj„ó{鯌 ¡<¯!oÝ ÀK¾Ë~`“1° a¨*¶%›%z7Ô3ªL[Ì‹6M7ȼC"öºm–ÎV™æÕ=P2:*9ˆD¦‚E+ºJDJ= ;ž¡[.fÂCæ3ÐÛÚƒmè6Ù£ÂC'6Wy7÷ß•-§¼ ûï'GöãEG½·O¾èÏŽroE¾‰´Œ^Šé70ÈùMcg%¸O`=k°îE—l¶ »^[a71º_â!ƒs{FÄ= kYq¨2ºvwä6ZÕc±ØV[!k`¨v+Ý1*0‚©qG©¨Ä›µZSEš¹¬rE1Ž"ߊú¥h/kløwøß«¢œFZHõ¨ýõ¤¡¿f#xœ[)’¯‡sÓ­Rà!UK(´éÞù_=üïÖ.%ÀÛÊ—ýÑu8ß+˜ïÌ÷ æ+U0ÿ³b"Gw¦¸¹ÆÝæ¥Óë‰|iàÝ^¦õ°öR³" ^Ӿʳ\Ö2¡YD?>Þ(è®›–†žDØ}^¾#¯6÷x HÂP®Þe½K!y —,¦pICØØöLõƒšQ¸¬öT§…¤3ÜjÓ„ÛÄ9°Â#å§Lû4.L] ³I”Šj­`)0µ•˜Â„FI†[3[zÝ‹ÁdËìS8ZѲL2âOåÚˆýáM¥·õUb*×ïìÞÊ Iù‰pÅc4K%þ€fh*dŠ£Ÿ ìk8-ôË®× ǃÓmXÎ1_S&|ùŸrÄõvŒèOOá”s›RhëŠ9}Ç—wUëw†}ruƆ0K©ôºœ‘q¦—»ð¾X3ºšHS¬3®•×Õ«öZï?äh5ÉðM‘âÁ‡VMÃ$‹á+™QbªDâ®ZÇUf bkKœ* yΗ>|…fNc™ QXètÂ($ Àù8î(£žd-Ì´/òw.ÙœDËšÒDS³öGEˆÈ¼nnï6£+?¾?öÁܵíO}Û>ÁÏƧ'°oíÁ8eQæ ?ŽX`Ûƒ3Óü˜3!’CÛžÏçÖüÀŠÓ©=Ù·´Þ>- /wEe¶å ÏìíovwÏøü‚Mùî.% ‹¦“G&܆ÁamelûïÞ½SHhÉgžZ¾çO™à8 øÌn˜»GpŠ?äìÿö÷ÿö÷ÿÂàh o÷öÞ‚$Dø"à]d¹àpÃÓ G.À.ü€KAïbxÃHðtÂ\nôg,½)gaÛV³vàG×ò cfbðlƹ0A,Þ1¿¶›e&ÌR>é¦eÙË%¸%Aä‚ó’n›`ãÒ¶Þ¦{ p¦nÄiÇœÏ|Á5_¡³üÀå¸7Ãù1œõ~zßUÉí2𽎱‡¥W"NLˆXÈkwºrM„nÛ¬ ²ˆ9'N=Ž˜÷L˜ûž˜uÌý½½¿˜àò H˜çù$½}5ÎæÊñ‘(RúÏ$Dó­YnäÍ?ÇÇ8/` ýŒÝ¼giÙGJ$¹F…º«‰Ÿf"çë„—ÞAè½¢ÑÀŠÔºœDoÂKÉ =z ‚÷#ßZJ•ÛÄ=×ГãHÐd§{Ž*yãóyÛvpC*÷õmädÉw¨‚ÞóˆÁÝ^“5fy²tñ(R.ÔœGSr,?M”ŒøYL¼ ¥„A¬}zTÁùR;GæÚö_˜ûkª°Ë‚àQÄ zƒÔÌxì¢û|1ø>Zliû¶´?y¡ Ô¦”úÓ™¨[ +/fØæaIek=´ºm?œ†ÝÚkA–ºC7Ž2{~à^Íâ·Ñi‘×âiÜBGK¤·mÄUÒKçµây×ú¶Ðç‹Ñà'èŸô./ÕØÐiä6цTÙ >vÂÒŒ§ö…üê#Å‚E"+$átÏ? ¹´b:‘¼&ó{lÞZýkÓP —OO{£_õN†ggƒ‘ºü·ú:NŽjwúçg—ã:P›’曋Yì]iÏcvOãçGõí Q+eŽå»W%v­˜ë#=ÉH"mÉ‚Î$wß¹%ró•éÅô¤;žùYÞã™›úÏ€‹™‹O “ÓA̘€!4þe€É7X$<Œ ÊC“Xå¨ÄœÂËu2 †]DÃŒeôÌpYÂ?ðÅD F<‘“ ”1dèXs=d¸½ü‚ýŒ°Im8È3LYýH®4ޝytÊ" Méêäi5¿¥¤´ßWN1¡¼iºÒè )py" ]tÞ7–Ë)t,ZÀ„e3\Ú* #Îq6mŽCÜpã4å®pFœ*>©;'D%Ëš¿%ŠF<ú–QPÅRŽ Ô†É” $W Õ Í¥ ´tv´° -,¡@!m–&—Žù2ª(i öI8ÂÅBárF…´~*9˘Öþ€EÎ툹VNß;•TÂ¥¢R¹z´»+DJ£x^]üž¥ ]îÆ×qÿ&ö½¶-o,ÃXW yOp´+ö2Ð+tWfW ëîÞTØYç‘ØÖ:f¨gÏûÿ=bÊ íæü(ÉEáìÐ)txƒ'™õ…M~z#Œ~ϧ~$Ýðrº-¹ý’ìq‘§Q&½S„a£ÆtüJ¯eìA‡Œ„Däö´Ÿ•àÒß}iÖoLÇâˆÓé{#ìc0’~C"º"‹'yäJç «0ßEw¯¸ï ÏRƒ¼3Ë´öSˆ™É8R ™ ¶¬e|Myç©‹± +*‡pI)/-6ô‘Fqi%}«I~FýÖš(á…-§žÒiû Š=Qââæ˜´DÚl`ËáhO&î “6Qf‡y£™”© J(p޶ÿß$vâ+{«Ž7îæ*ùÝ«¨#ªA䕦Uo\Tv¥8þ*«»dU1*=ú&õç—½À±èu¥Ê½ˆì{.†!ÖÚ$°âz£âb”>S2æÕ(¯²å€‰CªB?Y$“¬ÊÜOÄÊ0µ(+Õ²‰ñ5rð_ß”`.qsþ­®x–ãõ¢'@åÜ„¤"`iÊ+ÒiùµžìýH² ™b–ØÂïY\UTÁ Sû*9ûÆÊ%¼òèYPqý¥K¥¥Õd<à®joa¥ZãqÙÆU˱ֲ©ô`T_ùL½³2¥¹Å³l¬!hjÁèÆt½St«ÿh ˜ýjæH¹Ú©´ÒÕ>«M ½ËZŸcõîì`ÙúÀK’`Š«é>2•¥ÔB. ”ÐMŠmD.‹ö³×•­ xLkNVjFÝÑB5⌑I’òSÁ‡Ù.}ÆúijTæXê–$i±ìK§ ¶‚8šòt[{¸Œwˆ®Š#±ÃU“M5nU7·£O½ kSUºÊ©úT•§­ÌÀ’4Á:Õ/Ù^¬ aéO¬Æ–½W­5¢åUo—4¬ÚAYq‰„V…"Ç!šT?bFïå±Ë­áù@¶¸©/¾&Yí*à™]CË€šêÏæ˜¥œ^)Ýz.æ/汑å.–û™à }ÑÜÕ*CM†¢c°ìÏÝõû˜¯›#šíE«¤áª{r·}¨ç’Ékœ]òg5HŒÊ»—h@ô}G±šN¾¯O–©7ð™DÃÃõñH–42¶J/¿©ƒ'»×ºšñëÝŽ¬ö?Ö…Až e± Ø,•ª>?µ×aTÓ}xRºÿ ot©³Â™¢º‡/ª*z+ ìaž<­¥°!ŽTËô’#µâ½™#•zþ>ŽTÀž©%wׄ›cÉšŠT*ä;Ùñ°z,ž¥ÇÆ‹2¢Rcj6T«Î&”…è: V«bâG ?7žS{ÕÚî«=Ë“ÚÏÏØ W¯Íg±q±¥’Z }?zòâ%®Êt˜ä¿Ç(~Ëh¹YGq¬°\ƒÉb(Ö„”¨€Ç]÷d}V‘™ÖFIÁ` …i•O{¦òÈ3êAèqU+ÏRdµz´YlE‰Úœçüú»–V¦3T*`ï‘ÚSëPcµ­Šm­u¦"[¾”wr?ðŠ7~¬VZ áäéWIYgB.ˤ„OÏGŒÛF&®RѨŸX}ݾ<‘QR;‰ƒ€r¼Cø—Q¼â‡ê½µý]!dae¹£hÚ–ÚïÖ6ì+wŒòζ%b*H{Ä@šÿŸ{_©dµÐ«µmƒÀËr÷î¼¶„iÈj_(§½«ü…ñòD?ÕpêîTO=ÞìÄBÄáÊAa}ó{ÈYx×9çÕ§µ}¯G_:¿uþsu~=uüzêøeN'¨É!Úi=ý&©Õ“…Ô¿ÖÝGéIîq*ü<´Oø”¶Ÿ¤»Q,0}ÿíM¹@wy)η.¿S?§*öÙ|NŸ9NªÝd´>ÅiàÁ'Êá?qJÜ-ú%®ŒÀJѲ<é~›ò)Z]ÂV!Ï*–ÀͬÐ÷ò5T§(CæÎ0u"ƒaqb”1wgjïtÑêžÇ´;ËÍÔXåG©Ï¬IºD"²Öš¤­ÊØ&©¹D^ ƒ3¦~ ‡• Œ-Oñ°îg`ÿ™ãX@/Ç𮆭îðl4ìUÉ2šx|Í1ïb®õ9Aº~ÄnïÈæˆ$•щ\ ¬Ü³ úÉÃ}¿¨¸W ä«#?CËðCž¶º¯OE×É{òÊHÖÕ8ÅÚTög[]Q\/×}¾"»Å$rõ9¥³ˆ ¸4P1d HåÊ ¡É≘³X\XpL²éU6âJó€Ž,'I°°à—8OU^]ÔUúÀ¦ÛX_syœÙ 溘Ô1j«Jšö$~'©ÃÜÅ.ºw!³úßÞ\ÈŠ¥¥ãK‹Ö|øŸ–=åÔrA.« ¹®ƒ%‚ÓnŠ^aah‰½}SÜAç÷_PKæD °:PKÕV 70doc/org/w3c/flute/parser/Generic_CharStream.htmlí\{sâ8ÿߟ¢—©[2u’É=j³ U IvØËcа¯Ú½J [€güZ[ánï»_·$c›²aB¦†ÊÛz´ºû§n©Û:úêäª;øåý)L„ïÁûÞž÷ºPÛmµ~:è¶Z'ƒøùÝàâö›{0ˆY¸Â æµZ§—5 ðS›¶ZÓé´9=h†ñ¸5è·î¨½}j@ÝFí¦#œZÛ:újw÷’Oß³1ßÝÅKIƒÇ‚ñq5¸ó½ÃÂUWô¶ÿÍ7ߨN¨É gŽj¾ã™à gðÝ2'´! à¿OØÿ'ìïþý‡ƒÓ“¼ÙÛ{’á ·‘p楂Ã-$¹p»ð=6÷½Cèz,I,Ùkßt',¾1gþQKµ`ynðbî×1óx2á\Ô@Ì"~\üN´ì$©Á$æ£c«Öl¶æ?yñ¦,"<®]Óí´°é–ê0tf0Û¡ÆÇµéÄ\óŽç¸tú¸:ƒËÎo;}ó‘2×9®ìvÈâF5˜Ï wÚ²M,}Ôbm°Mlèq†±Ã±ç½L]GLŽkû{{©Í=/bŽã’÷Õu1[^ï‰"¦? éø 8®½©åyuŠŸ³3¬GL>®]²Û·,îb#ûH‰$×2¨»¹q"âpZ&<ôð Dï-} ˆæ¹c¤Öæàq nõµä‘Ðʃ¨¼8ü®©ÔùˆØ¢ëZºòYªZZû-‰?ùE¨¡»ã‰(" Àj–@q?§²^¶ õö‘ë3`×÷êÄveÉžIkz`ßLBŸ×‘q\§™ß Ça'Z"ý¨…ýIz>y-̼e†¾Éôù}ÿôGèžw®¯Õµ¥9RÉm¢ ©jȵ"'ä!3ôx?ò ©‰øÜ¤8döÇ4Ê$¦®Ê"b~˜â)ò{J¬4’Ìvƒ× z­1œêoð(i~bŽÓJf£—xNÝËóË9ÛŸ’Ï}.Ò8H,bs€KÑ|¥†œgpvú˜H! ‰g5Òúyq­üŸ™ÖŸ„'îÓÿÛŸbÕ1˜pËãwÈe›¡©A~º8·¤-Þ8 ¹ãÚLp%p Õ3±ßÒp 9jÂ\¡Wï ¶À(æ4Í æI˜Æ¸ÎÆÂÅÆ,Ù¥”˧ߦ׌c®ŒŠ69„¢â­#©`42¼È€”/2%vÇ(1#ØrÄ—å3aO8²v¤`ÈÙ/¤¦j¨á +¼þ\%Gö¾ 7º±q©I›ÿEfëËì4pŠX›ßx¤)ÖÚCB3a¦/Ÿd/_\ùÞ=2Iݨì¾ã¢ç³±’\v±Q¹1ò½Éóó™Ãrœ±£?ŠC_ŠƒœE ¡åþ¢TµLÕD¡J zþ×oZB×8H÷.ßÁÑ7ÊK'?én×\d°8f³QiŸþ£”¢\ÇJ²¨2FײŽÿë„ASfÞ 2ð=‹Ã¿ñE~sèžÄTvñ©\s%Üã6Å4åÂ÷³[]õy/pŽ̪ÈJÛœP±Íimý¦ò‹Ì&¥c”|®Mèžr‚ƒ —†7Ì)Ë›Å(½Þr¶Ö¬µÙ-é…4/©~×é°¼+ïD'0'\ÍC*¡œ”ð1+Û )ÁO™—4TÆJ»è‡ÊÄ’LX2ébÙ¡pG³†¥þw<¯6H¹Y ˜2W˜‹ð¨5X¥Ä#S@%=( u yYòζ¥ ìi'’ÆE‰Ej:殇—Eà5vr0Êã×,åG'Á –)ù%+`¦ðèÜÕ•žÖÝ™ëŠ.Ív¹[õT§àèð:ÑaÖ2i)(A! ½ fºtEŽWE4ºJž=ö´_ŠE¯¨kŇ³)q½ r…°+ÓËJB_šdµ`˜`…¥W†æ†j…‚Ú·X¢ßë‡{üσ5œ‚%ø5ÂÆ¥YÜÄo1Û²2ÞbÔêˆñŠ€}(úš©ÙƒQÚ ¥Z·-ë9¬¤\K*¨e0Ìã»ËÀTü]Ì u2=&†k-Äp+²<µi4¡™}4#¤UFRÇLËìQf*cRVNsE‡TËÃÄ¢'<±c7’±";ŒÜÌg›gk‚^ƒª®˜½£ö…·PuP}A{³Pû=º«Âï+j®*ü²ôv½üš—©µ™œË‰KÛ8ᚉ;¹ÂÒyªÖHðyXaÂ/Ka×L.zq[t9mkK5¶4Á™LKµuÕÉu^ôeiê#²ª¬¥§Æ¼ZÈTÛ:5²³´†šùZ•[ôY×2í\Ì.SûõY­—£¨I#³Ì42¸/,? @¯ù&ìV¾¤nÙ“ÐE½ÀÞbI 5†ë@\ÕQ«´¦TÛ„LB£ g~Ǩ¹†Ì„⣑k»¸°œ5€Ö>íòƒJã@²>¨­jAHêéĵ'´Ne2µ—‡âžI¦"ó·Ef]ޤB^]5š²L»ûv ý·QVXïºS6Þ Óº ~Öb‚Ÿ‰¦R‚ hÏä¦9êø0u='{!++«ñLa9Z1[Oï Ú,‘À»¸êŸ6¡c%j{=È`%*žº{FáÏ£}ÚCø¯¥'@ÇiðÎëo3ì‰f’M;¢©Æ»óvI¬ +¿óº)Bâu‡Hõÿ÷\x,¨óB–èÖÒH’Ô€4Ó&+À˜'R>´cŸ—\º_ÿîÖ/KøÚUêbA=UÆ* ³éÈÔB$J»~r'379ª&á){º,P%KhU0õyL”©PÅ4Ü­CÃY¬Yˆýát× èd)–Ë·÷³ëei<œž±bfËj¹¢«òà0bi™‡3S²º*ÎÚZ~D׺ÇwC!Bá L}s{ñT.;ÇsñiaVÕ8¾åùå(Ï/GynÿQž_NÕürªægqªf„@òâ::ò»Þ £™Tÿúò“j);Œ…›ú­s>f^Ëâ]zÁÁ濽ÊhÏ¿J{÷5®cfߪ˳qVƒË†ÃXnÕ cÏŸh¯ê'>„¼ï:vŽ-ca¥ëIµ¿ŽùAN_açˆY¥^<;iú®hr'-uu:ÀìIšp!è¡Ô\AG©ãºdÀíI€Ïêí‹ÞÀè¶‘jiöã±Ëš£xÞ‰<¾>ŠëÆñ£¸6ï<ë.™:ppÄ}ì–Çø <@‚FaìãÓßS¼ÐIÑ»P—õvï²ßë˜dYU<þÈѽdvóC„tý /¨èë†L¦ê“¤ìç—[î4-:Qø¾‹ïUyçæÄMY®ÏãzÛs™ZçÉ[»e$ëf£‡,Åêm‘}Ÿ·ûxE¶³JdiRyfi½}µP1¤Jû?OÔMŽÄ”Å(Àì›…‹$ò5lì+N=ž‹"oÖ„_Â4V+Èl£JŸ§‚«ã§uÀúøÜb¶>%£T"Y€ª­Åï(vo™=Û¥7Oä"ü·Wïå²¥®Ï‰•ˆÖ|øSÍ^p™ÕŒ¨’_d»ºÌ‹Ñ/zš¢w’к…ÎŒþ“éÃÉïÿPKbm¯bPKÕV 7+doc/org/w3c/flute/parser/JumpException.htmlíZ{oÛ8ÿ_ŸbVÙ«[\,ÙÉ=Ь-Àµ­{±Øn»0(‰¶Ôêµ$LJ~ø’òK’óèæ€.P!¶õàÌüf8/RiýÔ»îN?Ýô!q7ïß\ º`Ömûãy×¶{Óüöv:¼‚¦Õ€)# E˜&$²íþÈ43"»°íÕje­Î­”-ì騾“üš’A~Z{Ô–/|Ó1Z?Õë#ºº! Z¯ã¥Â‘dÑ6ibÂ]]\%¼]!­ùúõk-D² (ñ5gø•&”A}p×ð™Ü?õ M`ˆŸwËšÿ†fãâŸÿº8ÿô{S8k4Î@¡ˆ¨ƒ&€Ëh)(ÜRÆ8ZáêðYAçfp݈pn¼[ÆYÿΣ™T®ekb£…É`4j›\¬#ÊJ… bѶ)è°=ÎM· Ó²ìíßn¸¥†(†ms"o›`#k;×ÒMý5¸ /RÖ6WA(hnVho˜L;ã)\_¨óáMg¼ÿHiK ôÛfBn]Âf"ÍLHHLî8Š'ŽnÙÄ-D܈‚›2Ÿ¢ä† «ÐAÛl63Á£Q”ßåä5õ5ψ§®¢`òË„Ž’¶yfî9éãqy‰tÒ¾msDnßÖE&MD¢à{èfóqÁÒUøîÑÀn@ŸkÐ@¢ph=šÊL¸Í¯•”BV¢bâÃħw–öä–4KNkäÄ—i"$±ë\£GÞ†tÕ²]THUz½H\žý‚.èÔö‹ F¾ŒcÂÖ‚r£iäRUHÆôÖܩƠTy{2ŸKsÁ(}”ÚSøÌÖ/¹BDÑ£À äèÿ#š€FY³ç£À¼ÅÁ÷a±UìÛ*þÔI0%.qY€¬³†a‹Æ;”µr9¨9­0^l»Ö¨g^åÈ—&Ü^{³ i ˆvM&ý(]¤5L´zËFy°}—¼ ™·lг?ߌû {Õ™Lôµ‘[¤ÒÚ¢²ç²öØaœ2ûFþl«Ìf"\gÔÿmj(ÎÚæqiÊïÁW­ÙõKd8 “÷Ãagüé"Wd0õÇúô«þ¹ô¯zwvÊžHà ¶ôDÊfy®1îõh2ïÜ¥LS¤>Ÿ…I@jäÏæ,g ßLxK¶ Ö4@‘Þe:ÃþôíuïÐ*êÖëO;ƒ«jVħ‚„ÑQ=6P*b X±ÛÐõ* v^±¦Ú€}ª]•Wνδª3] ½ß³”kYÚµZ®â¦2*z$AtC;û^»Ÿ©'°ùûŠŸ¿×ë–W¡<¾nÏnEl‡W—‰czŒ¶šÃ–ÆJ•öVAcW΋RØhù^øB†Y'Š`geå÷a ëÿœx”_è¸Ãa’ÂwÞ0µ&è¢èiÿ•æÀÇjÖ%Ãíìm¸gK7 =퉀¢J€¶Ì…ƒm#M|Ç¢oDíiðA÷°E¸?cE Õìn›ð³†º!šP ˆ§EªêÄÅs•©_Ÿ§,VIêäa£cç4ÙRÂ%Rꀭ°Yæ:½Ê;¹Çç)éÐé¡Z*žKƒ«ÇƒŽå÷ÝéõøÝ=We´¼­LvÆ~;Šç”:Òf¡#=/µÑ=·nOwE¾‹Ç^‘ŸJÞoqÕ€´]9Ä,õߪ­Úa…‰Æªgþ°H«,JÊ8]íIpZ^êSÉû ÅîÀ=´ÜšÍy!N¤]çå«–­BžÖtòý¶ï.£¸|䄮Щ±*k²¢ÏNý÷øœö¡'—7í`ÆÓ X ýI×+ô—Ê)&K·ì}Ò+†;l±ƒÄžgà ìÏãŽó0ŠÉD`×?e˜ÅOaAÅUêé4¤œãb@ÝÜœ ±Oñà C¤÷¹KÞç3Os]Ÿ:ÿ9Õ_oò5ðç™y/Jœ+úÇ’Düæa¢æ\͵jN! <èâØSHRÎ×§†þÅàV$ûߘ[iãBáÚ«DºÛ| V¢ÉÑB”w¤uhÓ«~we¨Y*C=µ8ù{½³Ö»Xr¥Ke£èüÁy±áÂ;›ž7oÍªš²—¯Š}¢ïäõ*ëÅ~7Sr…¼B”|A7¯ *Úü㫃§îº©i\ØOËo~¿{à±íÀâÓ=Œ;‚?vìþ5wlÎýØœûî6ç°ãã1†« ù°ÖM³µråÚñÍkÙø¤L„ËØ¾¢ ÙaÆê²ûôèï';ÎöTÕ®^þ¢ß_nô¯Þ'.®ŠõûD£ö1e‘CŸÂGêÂNvM¾úDÎ8X;-_fÎ F°ò^¶ˆQ’yÜŠCaQY5ĉ$^°äTœ—PÈ«é¦Ô Œ„źæ Ó=±§P¹Ï&,$Öœm…¨wĵ9«í½1ž3s+|#FD¿~ÔxŒb)ÃÐÉý*|úǯt–Ø)èËš3}XF•¿Ð0µˆg}Î×ðB}u rãp,gŠ£HÌ·Ô· ù’á¾w÷ºº3ë…Ã#Œ)«9QHÜ0 ÅúÞ“9#¬.]}Š1ÿ…×±9ßòývGö6D²j,å.* ؜誛$‰Ï$†§s±" 'psf`/O®ä(‹-#Ù«gY´¶àSºd¸ ÅŽxÒI86±"„8f3@z|nÏÃþ$Õ$Ù“ì±ð–xë:¸Tºÿ~r£Vµ|#XEtn‡?ÅvHc—2´²>Q|óa°Æ- i¦äêËTê¯Õ` Ãä÷?PK0Lf½2!"PKÕV 7)doc/org/w3c/flute/parser/LocatorImpl.htmlí[{sÚHÿ_Ÿ¢WÙ —:@ƾGÅ TÀölìÂ$ÙTm5HL,$íh0áj?üõÌHèi Þs²¡üÐc¦»§Ÿ?5£æ½ëîøýMbéÂÍ›W—ƒ.˜5ËzwÖµ¬Þ¸¿¼_]B£~cN¼ æ{ĵ¬þÐ4?æBˆàܲÖëu}}V÷ùܬ’^Cˆk"5»îÇlÍjµ!]ß9­ÕðTÉàoÞ2©gÂÇ¥{ž9óÂV ·ÆË—/5IrA‰£)ÿ©G9Ôé>{âø6ø\áïÏ+ÿ‚ÆÉù?þy~öwè÷Æpzrr JÁ„KÛ¨¸pW‚Â=å! ŽZ8ƒüŒ¤ s38‡®KÂ.}›Ÿ–Û´ôT£é2ï8u[f(6. ” Ä& -SÐ²ÃЄ§³–aÖëÖö'^WCÁ–y+/›`!i+ZãÔw60Û¾ëó–¹^0A#¥BkûÛqg4†ë vÞ¾êŒÒ·ÔZ 0§ezä~JøDø YÒÌ•¶¢‰£›iƒú!S—ÂÔçEÎ'&¬™#-³qròlêºq&M×Ðça@lu~"E\þqEÇ^Ë<5“…<ëãçâçIí¶Ì!¹Ex‰4P%®‘’n2c<Ü_On}z¡OrBŸi¡¸lŽÒÚÔ”›p+©í½ˆÃ3Ï¡ëÚ›R-Ñ\#š|á{BNž¶¯Ñï]7­).HUëzîMÃà'tAçó„ÁÕÞÉP WË%᛽D¹Ñsö–äB}Ê$Ñ{3žøK5¹ª¸Kñ<Öʧt¯eqà‘µ_p…qݽ„ÈÑ(Í‚ºA sç^¼ÆÁ»d±Tì[*þÔA$`JœÍ"Y€¬³†a“.)+ÅbPi7Ùrvå¤!·KGlß ­õ™=YøKZAD«"S¾ëÏý &Z)zÓB~=I^¹Ì[TèéÖŸKÕ*…@öÖL–+ <¤ÜR5‹Ù“î‚ð[tG²ŒµŽ±6ê¿5º—Û[­àX³p0—+ê0rÉB!kVÂ`ØÿeœePâ@;V[®§Œ- ÓЦ·o®®:£÷ç†^Ç`8ìôáïúßÅ ÙË\IÖúLšQð•xe.³Ý½ÞŽG‰ŠŠÓ–T,|'™qÕ¿¾îe×üIÉ{ýqgp ¾·˜„¹HO(™¦|íoAØ+-ýQí_p(Ò³¼ zqr³NÛèUGv]yU]{Usª¨•`"œ€²E”0¬.A]ýzúÚ!äïøû·Z ý¯Œj=Ci*W«MÇÅGHÇí¸.Èt)+³YŸgĦá¹öd&g8[­ê!±cê8B©SÒܪ%f¬¦.³µrËI´¥.Úˆë¨ç„_ej‹Å áaYD"Kj•o5 Í/éG¬ŠLÝ@|z ?–®%hg­¬‚,2qY+CÁ—”{—íÚoºãëÑCô5ð, ßÈ•F¶‘Frè í˜käÀÜYfàªFvI}ìâ'UÇ’ökÜ8·+‡˜èªI"+ÜjYµ™²ñ¡4ª¸ŒüuŠC»iû•´Hì)×TiýYê¤4¼nÔ¿ ò̸µÔí´ý×XkBQ1Ñ'If ^4-µ#ÊúòçýíbY44xt{úú:´=ažÐ[ïU¹èc|"¥UØž¢fVK/¶ Á.#Ê<|ÀÇ¢ù_e¯Ò2¥7Çþõþ[@J‰QRÇ !áß3Üö4k‚B"TšoDhð²£€è‚fQ-ÈõÝÏóÿ—p¥D*èï¹ïÒ_Z}_ ³](P¡zNX>…'õ¨§ %²üYžµeþ¯ÑþiÝc7¶~<‡ù–`u%‡l ÊÑߜɌûˉrºI¾ýhãÀY ²sßC¨8¹]M‹8;ÁÖ!l)xÔ’+vÛŽÑx±]_fúÛŠ¸afÌS¦ª‚D¾rr$\tql<_°Ù¦jèÿ×­‚ð5ú©Âš0‘þ› Àò‡'£Ð²KõàtÛù-¸l.7åÁ\Ôi.éÀÅ=è'×€kp=%jÞ Rmr½î½{cqøìßLËGÎâ,›…ñ<îˆGÝåb_ù‚ù~¹ÓŽÚgPÒ>+i¦ª8TiiððdÔWU[\r”ôxèfDŠªÏä| û)ÿî*°ÆÁÙ]®Ÿ¶¾´äƒ¬ö_`ÀB掺_…ÔÞ„“ý¶/ÛùŠÓï“j|5Ò¯=³n±™-´¤ËTâc…¾SÑÏd¢X…‘²7P4iæ+¶Û€ÚlÆÔ–±ü÷l¨ê‡ æI¶úKǨòà×{QõOÜeGâÍ7]e{IåšJw—vé)=îXZJÓ|téNP¢œ¨3T®Õ,*ª#ß¶Št£FK)ŠØãjcŸæL\ öjä”(1~T+ÉñG|P•ˆ9©ZahÚÇ…CŸU“÷Ñ\ :°‡ò-i¾´Jï¨W}iÏÂ8À¬ƒ©oÒÒO –Å»£J6:=¼?êÐÕS_™Û›]|ºûªµ€m­ÎßÍ¬Ãø¾»úûîêﻫ¿ÎÝÕß7:ßèü ot0¼–ø2å»Y•®lTPT~¥@v–}.Øji]Ò9q-ðšlôÛô×g ööPUÁç6žþ¤ß)‹×Yþ¾™Nyô–—Qyçs×wÌ¡ðŽN!á]‘¯£!e¬6\íçœÎ1ôå!HìVàâÚa}ÉD:««+43±« ­Ƅ|ÙÍŸÁ˜Ú £`¾©´¯ãÛjáÒ|˜Ç©Ïø–‰zo¯2ã•Ô[|3nn™Çì`Hô+€+![Êñ¨‡Í|¾Ä»¿­ð\@g…˜CŸVÚƒáhÐI‹e”éøŽ2¿ŽÏÑ”ë?x"‡¾¨‚Ü.>’– ‘%¦‰{êÔ ùêÇ®7Kvºº2鱃‡-)¯´]F¦Ìeb“ï`Ê(Öd̉C1zïÂJ[ÄÇ[ºŸïÈvŒ}úÅÒ‘Ü–fIçéä³$r²ë\bD^‡tÓ¶]THUz=]¾úCÐÿs ¶Ÿåbäëå’°íA¢\é9Kr¦>u’Œéµ¹›xK5¹ª•—ãùPš FéAjOqà[¿ ME 3”£Qš€F«&fσ„y‹ƒo“ÅVkßVëO¤¦K‰…‹@WàÖY—a›.3)ÕrÐpÚár±[ØãpæÕŽzIÌí͉7 ’%m ¢ÓI?JI­½m#?È‹ž%¯Ræ­ôÕ>žkÍ*…@öö\{E§Ì>O<"&kÉÎÜ¸ÈÆƒ÷Fï¼;™hËîL ÷&¥~2Ê£Á/Ó"åš¹E¿z˼W™†^œ¼»¸èŽ?žZáh4ëÃßõÏÙppÞ/\É”|&'ØÚC;ÍÒ\e:½ËÑd:ÎlS¶¤"HülÆÅ`úö²_ÔùNÉûƒiwx¾ü`1}*HÝCÊÝ„ŠÅõS®öŒúµÅ>­öS"?+C* ßv¡4땃á„+dzT8Y:œÚ®¢¦²1”pNAéV …”àË’Pκt?QO püÿÿÞlbÖѵJ´\©±"e´ýO|!ƒ·E Ð¥¬Ç> eUžòSÍ8LÎð÷LPYœxÖ¤ÛÛ³ÀaÊ®’ðÞ>;.«µ…žŽ@–ÁöL„ƒ ŽÆ>‡²º¹!áNZwˆ$2‘r¿×H´¬Þ÷XCu1êð}­J+§èuµèR—§ë±èu¨Ä– ÷Êàúñ Cý]oz9¾‰¾†žuË9…rµ+ÝÈc9Œ §çZ%8wRÁ Àª±]V!{øÉUÈ©¤ý!7ÎíÉ!f¼*L’É -«vS1CÞ”V—q²ÉqpÚ^âSIû¾¡*Ñ?+\šÍx)Œ¥]çÅ˶­Bº®unúšïúœ•¯r£¢SÝ-á¥Ã¥”ÆÓH)'÷Ûñþ%@.”ˆ·á¥èJpåQmñ0©‡÷ï¡BlAÅ9"áµ?©D–ñ(‘õ˜.ËéÁÐÍeG}9C?¡åáÞ€xiçCÄúOæ<М"ÑôeTîŽ%(ÇT¬YÌ \1F¯p¬ôD>ó‚d"±ê+D`Ý– iŽc0”¡ üÙœ%Ë™òì 1Ò,hÜsÖãfÉR£©Bg²v«‰2KŽö‚ƒ<^UDõuÕ‹’˜ýmM"~ó0ÆÐý^Áü¥ í„={q"ÂùöÈпˆ<`CB‘ÿ.q}Í3*8,¬toq®*«Ò”qUÚNÔÀª]£ñÍ¡ªVUõ•¨eççz!­wî¤JWPP9øƒ“2¼Ç+»&mêZ€/³î¤âÙÔT\›öZlùŠ€fçžo Ï´òxæ@¯äBªb4Ôx#‡#ªžÀŠ(½‘Sô„îš|§Ð?MVÔ ç¡Ú(7Q:)äèi,Æ’•î+Óv{ë–&¬«íÆ´Q²rŸš$Wÿk ¢!AÕår* £Çjè5|µq4Í¿À.¹º&_Ék,“÷쓯š´žÃÁõ\ªR5©|PÏB¿ú@B,“boSµS{VËÞ6,Ö‰ôIPÍC›ŸÝw¿ÈM„H–¥—ôâ·»k¤¼iã¨|· ‡ñ´wô´wô´wô¿¹wô´ó´óµƒ½$_âR—‹O¾kÒè%«­Z›·HeK•0®—ö9]ÈW¬)ûZþú,#àìUÝ{îáéú-™žõû¯ÄuYúÖŠÑø°È‡ˆàu!ãÝ/Ø e¬–¯WÎsF¸Øå!¼h£Â%ò¸µ …Eýu…Õº™xÁšS!8 Ñk¡¯ï V›R/ˆq,¶ çb8ͱ=Ú+S0U³Xs¶g¢ÞDjÌY#÷^Òœ™{æ;v0"ú%'@ÇÈ–2ü£@ó„-ñîok<Ð]#ÊЧ g8»y±Œ:¦ab!°þ´B¹~Æ9ôåȰ±ôG–˜®©or+û¶ò[Ã@]™õCŽ‹'\RÖp¢¸aŠmQ¼{SF±fSF|Š«÷3o8bw¼§ûçÙÛM’g­öÙÎîÐÀÀPH”Ä><žÌņ0tàîÈÀŽƒÆ<}ÎlQì"V«hkÁÇdÍtÓD<$°t#Á17ÎÇûñ<Ä–$ö¨ §ÝËÞ+^oÛ䨭¨íÆ_Ÿ]©^¨‘nhªÚá«È^Ð¥KZY(ºé0ØãØ¥iJ>W•ø[õÖ/L~PKñÛÒ€Ô‡(PKÕV 7,doc/org/w3c/flute/parser/ParseException.htmlãPK“×2PKÕV 7$doc/org/w3c/flute/parser/Parser.htmlí]{sÚJ²ÿŸO1KöŸ­Û9gomÖ¦.|Â^Àylm%ÐØ(+ ;¾u>üíyIiŒ°Cp% ‰™žžîžžž‡æwñ§V¿9ú|ÓF³`n£›Ûw×&ª×jß4kµÖ¨…>½u¯ÑÙÉ)y†ã[å:†]«µ{Õ ‚¿ê,okµÇÇÇ“Ç7'®w_ jß½3B€_±Ü'f`Vë•‹?÷ðãqá–ò`Îýe;Uômn¿•îÿRQÚÙßþö7V!9ÆÉ(£ß°ƒ=#À&š<¡/ƃaºSä:¨ ÿÿ±tÐÙÿ ³Ó·¿þõí›_P»5Bç§§çˆ2Xë te/Œ°çã …7èýH¡ÆMç-jÚ†ï£Ãó±wQc¹*¶å|E¶/«~ðdc†qPEÁÓ_Vü-¨M}¿Šf¾»¬TONjá¿(ù MB ^V‡äqÕ€tWoâšOhr?um×»¬>άsy¢Ëð GÁõ¯P¯ñá]cÿ‰VÓ@–yYuŒ‡‰áwQEŽ1ÇÒ“:¥ ©/jFU@4ÆÄÆhâz&†’O«èÑ2ƒÙeõìôô¿ªhŠm{a˜¦E´vÆîý…1¥÷§„ÅÀ#&Öáç²z^*òª WWö²Ú3Þ^ˆœ'”ÝJŒ»ñåùç>¦~Z_‰éÓÓoÓȰ­{àvŠ{UôÀ社h…rWB¡xË1ñ·fÂD,°`;©?C`Ñ ?ûýY)²E]¶KêQ¸Qrg#Û%JY?m”©ÄQz5Ëވǟ ^V+tय़ÐÈ\'Ør¨–˜z¥ö7\NÒ£µp„棰2ˆTnùDRV訔0rßjt(¬v»9…WãÛÁuµN> O¯+ÛÒkô>Wëð¡‰Úè÷öçýA hŠK=”›­fµº¨õ µ¾&jïƒa{4~î‚®cw”ü¶ÓH¯š@µÙÕÄjÿºß#Ó¦ð¥‹b·Û áKE0ž–ÜVÍøU«1|ßmŒšï¢¸ÔÄcûªq{="“ÛôBÕßÅß4QëtÛ kú¥‹âBïƒ&j}"¿¾&Ùµ»Ãj>4Që_µþ•&jÿbÿÔDkØlÜ´ýÖDó‘Ý'M²»ê÷Fã«F³Í¢t¯Ç%^Ýöš£ñdâJë¿ à}ȧzàxÞëqeïÁ1øÔÄÙ¿€Ú¿ôÐê´Ú=hÊôKÅîMÀ;ÔèZ'íFOô×Ò½óì€av4™d§7&}+“px­‹vóú¶ÕÊìJÝ߉uý®Ë¼®ß ÀyTëì[#ÍßÛ#N®4ѽi  }ö­‡f·Ýê4˜±†—š(wz· |ú¥‰"aRw„5M|õ]° ò©‰^—„ù@‘~ë¢I7¢ôBÕ~¯1lv:@–_i¢{Û}×& ßzhÞ4~ãAƒ¸ÒDÆŽ7š†Ž7íA0ð4ÃkM´¯Is$Ÿšè ÚÍ6õïâJ]0ÒMöyó h}ÒC‹FoÚ‚7pàDÉôK#ÅSNòT#Í3NóL#ÍsNó\#Í7œæ4á4ÑHóWNóW4ÿÊiþUM 4FEƒ0*hŠ<*hŒŠÀ© õ ­†íf¿Žƒ}kâ®Ýíð¹¶ðRåÑ Óû ÈÒo4YD]ë¡M—W:sã^,µÐk=´o{ÖÀ‡6jÍ~«M)’ ­TygR‰ßêlÞö~ïõ?öÛôBÛd™¯2È pÊ5,yç bÛro›£þ k§!Û9¨Ú—Ì÷*·,—»0µÙÂfĨ¦„[¯p²ëñ¸neëW?ÿEãÊfÓÃF€ýŠü½øõÜ•V.6g†7 €á9Ȥ’Jò":|¡0zmB÷é½NQo½ _ªpÙoñeû턜¦·rNP²ÀW{:˜þJwö˜§u\´;SÿtèÎVË“vX Q¦îQî.È5‚À³&«ƒ\–æäný²åŒÜÄvùåþX,©P o§Î'–c¹?"³ðnÄVŠ™²Ÿ4÷ÑC–#8Ë'ÜN¡PáÉöG€©€’Ä"ÀÓÿž. ¶Çd¢‹È5~¿?B-Å*±“4JùÉþˆ/i“×ø›55ì[ÇÒ?ÆÁß´W!ßû#ÁR ðÎu‚+cJÛ­¸Þ‘)3b–GNÆÑ/R>A1&qÓX½ ’àDâ"[(}’WcANvt½×•<ÄÂPýAg¨ÎN^¨6Ÿ* §av0[²Í[¨íoS¼ ŒÆW˜Â‡¥¼}zÏO┋¢3ꟾë‚ýö=zø[@ ˆßÁÂhžD úÅÈnùiU\”Ò³’¦~-¿Â–N}äá`é9~Ƽƒvó˜x¦êËuH;³yfïÄàTO²¹ÃcÆ9=|ó»7þÝÍ§Í ¶z6¤ø¡æÒž%Àšáo´N¹C+‘!¥šbaÔwÛDJ9@±®‡‡D3t´‚N<ÚŸ¶ªÖRK[Qe%!?ÒÖ÷/Ò9Y¾'b¤û[/¬¨ý*}¢tJ3q¥r¦Möþ©~–žE;þæöw¯¹ÒCs¢å\Øür¾?Fÿ,±…˜jÉ[ˆ ‡ØB£Æ=‘\ðIöàK•¼09êˆ%HÌ5kŸàŠlŒyv|šNÐZ„ƒû¥ÏkÈ®kü€mtžØÇµëmYå©+Úx˜G[é=‰Ï ¬gi0eÝJÝx–ëYÁS.ˆÄ?œ v¹lÇ%MzÔàéƒa/óµ)ǧ ò¼Tnõܾ)6IÌvðútË/|`äoèg 5Æ®ÉFáà˜\¾F˜.ÀTþ—ïØúËþô0i ,‚w¥M$Ì ËAÐI{Ot6ÙTýì£Nl£ÎÓNÒ;¬Njk –ŸCË¥ˆD¦æ¼ ÄüUlsúÙr¦ö’¼ÀG˜¿ô^šî8œ“‹n÷Gˆ»ÛDÀÅ·rKóCm$(¥ßàå8/„¥ü‘Î ù.”ÄÒ%ÏÙ\Yiz/àÜ‘g—†ÜD: ?,d_{‰R'üñ¸8Yaû"ÒR\Šƒ$ºfv‡+cŠ|ë;ažU'‰°yÐO†~Èœ)õ$gÚIáyf('‘ŽUeÆntªdˆ2S°Ÿˆ—Á'B-?„ýÝ ¥ÅÑ>S“~dêj+ ;SºŠ'bìS¤Ï2ÔD ﹎®Ý©ac6E³ ,û„?`a7òäL,cׇͦ!E†„è—©†üI>…™™ÑéøøA~øÝ÷*»‹Gé’q–fæggàGëWýÉ¢øÉ•‚¹Ê=P¹ q—oiN Ó¼(ɸžƒä§¶ë mÿY¶ÿÝYØùÿÁ“{4Iæ×ˆ¼›Ú„´¯É˜ÖÝÓë ûnØök¸lñð5z4¬ þ™˜^Ô§e_^¢«Nûº…ZíQ£syZ6…²›80,[œ•-=“{Q[ÔŸû°ì³jˆZZ”Ǥ#E Ò´` A~ž²âÙ›z2ÑE ‘{PÂÂs°"°±u”0Qšn)%(‹zβ)O¡ Ž“U ›ÉYº\ü&æì»)B™ÜâØ$’`Uz¦âKÓS¹˜ŒOVe™ì}ù2v„cã7*†è/2'ˉmM‹ ˆ(Ï ¬râ™<Ú®ûL¾1Ó¬JÏTǨç;aHùrÒL6S‚“äc3~rŠ%—J.„Õ¡lné²Iv§äþ”“¥ØF5ÊÏ›ÉEÝL°3‡rÌ‹_ÍãX–—ô,“ã±Jv…/¸ôVi¬’¾ÔÕIX8‰ÞŽvu $¹¿Süò²ð!ÎR089;>&\Îñš†÷*mßðyx…ž'ád )´¡PÓ¬s¤$#Õ˜”1’&aŒœµCD(š7ý6µÒ·çñí&-qUeT.òA¹Qc7Â(Ú°ƒ¸`R1+ÇxI­ñ†Ì¡\ä6,?|‰Í—ûäl¹ëR„]äÀRQX‚@WI[¼d‡³ÄRDæUëòˆî‹« |ÁÌsýÂÊúÓåÒ¾J\D)#Zî[¦xT¡Iø\BYGÝUŽù«ODLæÒoPbq·¹Â…f¢ºðö°õEe ÊÔÙÖAfÕ©!d䣽ċкBht‹$.Ô%SNñ÷·óI(žc­lžG*q4I(LK¦LboIçI,Ã:‰<@T²X+†"X[ù:ŸŸ-0^*ô…Ïb/k\["EÒ„’©ˆØË~y»¸øvÂHK1B9½Ú³Ûo&D —ã …<³PUÖyV¾Ú7¨pP„¼T)qIU¸¤Ò¨)k…”β^>‡`©`°´‰EÓ90[TM„£¸lL‹Ì‡`úÙì#B3BœŒjE@ ̬kÝa¬6½k''¡¾„³_q$åH“UcRS¶Â¥}‘Í~X¨©ê—ÌìI,é‹Ì¼½ÐA{Eµ—¿L£â¨´˜ÊY«ÉdyÖV^º“ÑcÄâ]SFµ|'ÁÌä²%,º†'ÑÙ0Æ>˜dA“L!ßŧqTªwŠÙc2ý*sdØ1‚Ž$£â‚Ëä5»Ø†ÊÍ\ÄÖVÐÀbÈ6b[I ëF¡Ðþf9E)35¸ëÀj#Ð1èØ ±F10lÖµ‹U´©ˆCJ E 8Žsø—«xºOn£RvØHÙ¦¤Äã!mbZr&žo×+ðvÍ< ‚'Ëbõ‹†Øw+z¦–MXyáFYã8è†zfn‘KZ]¶<ÊDõIþ’Q')™ª^É“Q8‡‰|ê äX.TxFÝò† <µî,zÀ­ºý¥Ùb¯ Yü °w½ ߢœŒ,Ī9ߦ™lQin¬6IFè±bLNùê™£ÝÆh"ýÆÑiԪݩFf ¼ ††“a¯ë _DOº"FQ_³ÑÔ˪kâîbì˜ Ñ„FR¿Fe3!¢Í¶VD)ç»ßGx´–ÆØá^T¾£°’ϺM*ÃK[Wa摨ÖcÂÎZ±l²ˆ¸ãÅó4œÏž¶O¸ßŽCý(잣ÿ¬S+O¦VåÁWm¢ŸbpBÑ›^Å‘ˆ²Ô^ÀÛ%Ó—€c„æö*7±k÷‚ÅÊ'ÁÊ£jx%òä˜Ù<4°‚ ¬ 4‘h\E–ammF”Ñæ‹30~Â+÷ â¼W…=°³_×¹W–Jé ª)¬/?Ê“hù…2©õì­Ûl)ÛKí2^õZ?z]ݰ¹y¤&5†ÃP¾«Wh×d¹'~˜!mTa¨þÔjýä„u’Ô“ *K;+·=KÊ‘÷;oª›mU³R3i‘æi’$š×)K ÒÓÊ·Yi·±öíÍ=Ÿ½œ’NÔP×|tvó)€ü”Px~Ĩl­KRiÕ¯YÏWÙÊ&2ÿ¶7–ç°"I0å›RA'¼…ÿÍåz·ñº[è;—>c ][ƒgmºúRyË^TD3â?ñž7ãà˜Áì0Õð×HH½£Z® (âWRŸÎQ€&˜A¨˜q9ª«×½’"hÔqƒ yM†œwdæ]°cá-‡ ‡±g™Í€#Œ­Di_Æî\2uº ÀlÏ&QiÚœ¨e’‹Ì‹t–e +_‡Z÷"T’B =kYÝji}jLå÷§ÅPÖdÃ)Жi?)ȶ5}n:ÃöV£ÉH6í—×ãÂUR¸p(Â…ÛªwN‹ó%÷Ô)9í·./Ý8ó`ì­l–ð-OƒäI_þäòcí.òÛ¾ñê¿ü¦ãF¨F“Æ4Ìj) ôCýÍ#µ¸"&>g«ˆ Qbqš²liwK:Rû®ýõ€êJ¥ò4<)†„†Reõ™2kŸ?¥ ŸñµÔ=[Š .C%E —JE Ì"ËûQ®\¯.ÔXTԦФŒ¿©Rf’³>ãó¾¶ëM+ë3Þz=¶f¦ô6Ü-2Ox¶F“åSXInTP…­èÉì`N¤Øå‰ŽE!4óHB•o—I—_àXGå‰Â‘G£T®8G¸øÉMñà ¾J~hö›}3¡Zš¹B½ HsÓùd*°ëŽt3XLá,6ÕTj@³™í@”És@r¢çÖSïJVJß+3¦²â8›j}¥7Wª+•z=F§€eTèˆÃ7¢õ(››NA¨X.[«À4cú,Á©Öd;õ ¥ÆvÝ`%v'b°Ùê[ƒ¾¹…îd>ËV\&ÂfLMÙ(œj¥\Εê‰Àˆcvn°{D‡Oœ•7s·*LÉ7 Ösô„ƒJ¸©›ùu^ó3f ÅñBÕ6’B]i,©Ôë±FQfT‡i¤ø(·yÄû ÕT'T¥¢$rèF£‡$‘j õµé†?z® …)Ýpâa´’{´’‚<–4ªÊ¶’ð¨ëvZ¥2¼´7yã¦BqTS•" ÓµÕ’fWü`ĸBªp¬E@UU@fu۷Εrß8;SAcJ¾r'ÂUXEvÝ™°‰ä«=áA…õX[Vø…‚ˆ´J#àµÛz‡P鯤îºÍ)ª%?­J%–vkuxvɪØd€¸v¯…úW¨yÝQ«1j ®ךŒF…†£Æ`D2öÞ5hTŽñ0!ÉÄ w.¼¨üp UmJ†¦:KASÕ U]F˜:¯fƒåöŒ‡w†×"‡Š2]‘ßYž€R”ìG¿¦ŽsIÕCbý4Áú¤Å! §dÀ“!¡YµrWEa?ô1n!D8—ú h†IÀëDídÔë¨nç¡imwL ±øAûC…:dVMQ?T¸€Ì…j(¥×þ4’KQèrEmÕr’ÄšÊâÞv»Áç·Ÿ»Óëµìòdõ^1¬mî,ªuŠÙ‰#>ŽUæb¨«²qxÄ0ÃY”%²¶^ •ñmJG¯dÀðBu™rWAdHÕ ‰£˜À–Q@ª3—c€´Ì9ø ÒŠ=l_5ÝÅmOGœ“£ô霙Õõk9¯]ã{îY ï˜À»Oñ¿_Eêá%í@šÂíßÑùééy )ˆ+“‰‡+°!F<úèz¶‰>Z&FñEeÕ?¾ieHÌlÝ_.ê?yø¼¹D?_•T)öÔ?™[Á 6—©¢º`Æt¶ôqø¨Z³hzdûíOg4 û§£z·3Šû:ŠìâåXŽg'w^XÙ wytç¡osû-½«ÞA< Å¡}…BX¨ñŠÅÞ”,g9ÀÐëÍá×ÿ,á>@%„+ìö¨Þé :8[•Œ¿bË=1¦'_À×ï˜lŠ5êy¶DS> þå›'¯ºnyÌ€>·,Z–5ÇÞQݶŒ‰eÓ·ûãì¦ lGžabhÚ_ý£z ®Cº›òTd:«¿P€¸¬,É(BZü¦©ß½  (®*0†ÁŽO ,ò°ŒÅÂ~:AŸÝ¥Ç2 X÷h3¶°éƒ[§pt–S1¦SR gŠY’­¼žõ`LŸŽÃóýþýꆎ®Žêl”E[4—ÃVd»x>ÁH™]Pº/Ñüýî<;Ë`àÿ¯O>:þ':y{Ú}Ìþ t:'ˆ‰ÝØÃ:H€ÞSŒÑ3# *tÑúŠBÆdxІ~ŒÃg'ŒpØ ü(vü8:k³"gžëF!öε(~ñp´Â8ÖPü²ÁçZŒ¿ÄíEihâ‡ó†ÖjµÓ™y‹šÐϵ)ùµ†ÚPt›×u,_ÐüqxAx®mWnŒ¹¸è<ýAÓ™aÏÐx€,ãöaçߢuv»<×|çyî„÷q°Ñï¬qá7:-¬ÏÚŽŽ “3÷0šárGC[w¯ÎµãNçoZ`ÏÛ8Ë¥Ká1»6΂ÞwÅ8$/KÔá ÿ\;Ñ²Š¼2ág0€|žÁ“·œçwN؃BŽ ¥Ûȱ»pÃ(ƒí>ñì­Ã5(îìî2ÒÈñÜG`»Àäùkè™ßSh…¤+!xð®¿Ä_Z¬=ŸYxÞÏ<ü˜džëch—Ï.ÞžµçP!bJëõ£?6¿@\~¨ígÒ%£§õÚ _¤¨LXi&ú#bbãg-ÉXImµGÞÊa~«šÇ!ÆRÕžá7V¯)9ž'EfH¬¿#›ö6G0†J‘¹ã*.mÚ÷Û´ÿÑ'È»Rè>®âbÏBÐÙ(Ýð ¯3–ÍýI¡©Ÿ¹ëǤc7;M… ¡åpƒv{Û]ܯ‚5nø¼I†~/x š0ÐêgmÀCyêÙàµ3òî z’¶g¡¬„À·ÈTÓÞЉ¤Ý[9áš¡³NÔ†>f›·Þµ12aE»XæÝ ñ·÷w7q­ Êïeƒ'0½ ûãiƒ¡-Ë´YòÝÚ¾zp±·¼ç㉦†æu?ãÏí{ck:+12g—ã~Vƒ¤úæÌ^Ÿ¢K;®÷µŠMvw‚=G¦Õί|‚]…tÖÎçÊ&eúÜPߘh'׉ ë¢EH‹5³9--]€ ½dŽKÊXƤùž‡®ü`ë£ázãá5L^0©!:†â蔵)0%¹–%C€°­2èYðû#LJñ3ämvÿ ¢ùOÚeÊcýqIŸ©^ªlR×ÍÓÜsÈMµ¡óÓŽiùzýž¦Ã‹’¬†dc"ÙXI&/Ù¥aOÍÙýôãÀsw;"¥a¹† ]oW0Õè*_-ÐŒ\”l5dƒU7‘ .J6iÙ`ý¡Ö5ä2¦—#cÖ»Ù’¤’O^>s`Ü\Ïȧ54¡¤«!Ý‘íBI&/ÙpdÂLJ/J¶²ÝÑn•dò’ɘ6V㙼dæhªéð¢$“—l<ÉÆ%™¼dïA±÷J0yÁ¦=cb‚hôª„“gwj<“—l0¶f÷£gòØ ÷ê#6yo¬ÞlH>4JRªJ‹wa}M'¯J4iÑ.5]}ìQC.cJƒW%š¼hŸ@²OJ0iÁ†}Ó‚m(½(ÙäeMÆ6ÿ_–VÖа’¿“îÕ2N^GXÀ ÕÒ­Ž`÷äÏ}lÔKÓJÀö®oúæ”ÈÇRJdé¿–€äëZäËZÓ8týÇýûûé“€Àõóˆ5=Kÿµôü® òÆj:¼(ÉêHÖ÷M*I(éêJÇ?ZoäoÕ¹®*^Yãi€4¡ ¼t$÷ÿ*÷Yߟ½WŒïŽØwÜôfc[.Ež}ŸÁ òü[ 1ä“o:ø !Ͼ„…ïSŽ»ä³À+Iƒ±óʱÀì»_â³êòXí r†› k¤èÁõ|#ù.f;'PÔ4 þÏðHsGCš Ðh”s90jZŽ•O³ˆà"Ü,H¸$z–¡”‰¢ÍÑi@m.±-‡HM+°ÆÖ¸k,5®ÂÊÅmN0ó¡œEØùàÎ’òYʹdJå+qèö8b{eÛ:K2ã Ls7Ťx…˜4&¯,&5.ÅLû‹¸ŸH÷ª~‘EyM°²°¯"Ì,¬$v–¡œ•š0H"§Šð“`ª’è‰yöE†{Q‚y!wQ…Eƒt&h,b§ñ”DdƘ·âm Þ­<ÚmÖ8{†ã’ç7–vãªçFb*r,^Q€E#.ÊaQÓr¬ñ Å"q EX$T¡$1-ÇzŸB½#½—z_…Âß%X<žGÇ“ÄäÖå¸wÙs»+ynwòÏí®ê¹ƒ®qÔHlüØlrLv2•sJ˜%tÒ€f"&iŒ3I©})>ƱY<0. &‡ÉlKñÒyE<ŸHÏ#Uó9•ÀÐøS"$’JŒÚ–ã}JÑ>‰±>I#}ªÀaQŽ8y$@ãQä¹q9f"(Î ¡çâIRÈå8À#‰´S ’†ß)e“ä©C(ÍTÎ)íµCqJ÷ÔaUÍ{Iñ²ð/BÜ,"Œ,~–£‚™’²Hb¨9$aUd$ö¥øWYG»*éiWò]íª²¯ñx.‰Þ!@LzÈ&Öոę!Lʰ©¿C tj_ŽÏütî Âæ’Èܺ7 ¸À¡sè¹  rrÊ9Ш > a ÂfQ $q™q9fVá’šÊW±²nYÅJj%_¥ªúÐæ‰6`±óçrh̶ÍNùIm&?¼-‰Ê­+pÙÑæ˜Ÿt"óÃϲÐܼ;9œ€§g…EèéñaIøÔ¾Ÿ¯MÐùa[6?+‰Ì­KqÓÓ©9;­*ÀΰʡgöåøéG†ñ'†é 'UŸæÎE&x¹“’"ÜÜáIIü\Žr×ÙpÈŽа¯åCf[Ž—œÌK0Ó“z"Üôðž$vj_ŽŸv牸'O¤;ñ¤ªÿNîRœ;1Î4Î]NnkW¶³«±±«Þ×±?”¦hVIKå@•E´*Û'?À“픣vjÁvápËqkáÂ=)àž”ãžÔÂ=9„Û-àvËq»µp»‡p_p_—ã¾®…ûúî›î›rÜ7µpßÂ}[À}[Žû¶îÛ*ÜÂ^Ç.ßëØµö:ö¡½Ž½³×±«ö:vͽŽ}x¯cö:vù^Ç®µ×±íuÒ N<³IOiUs÷·M€¸÷­;äJBrë ÜÄ]5…NýW…è©K«,4C9æó™à "tî* Í­àæ÷#y'ÊRü:û’|ŽR9WCÎ#ï|(à‘÷G<Àcße’ÐÊPJ‹8ðq>Ô—O@„º÷É)AM«°¨ç[†ÇáĘÌ7N—™Â.¬ˆŠîdå,j­Šy*ø0'¬” ÷ɲànZ²¸y9væÅRæÄRÇeÏ…¥à@TpSÚñ!¢DûþFÜMiÏáH`ŽL«ÆÔ»6¦SÔ7fÚ1çßñ„¢›y’Ñ2nßöÓÉwžçNx?â8X'й§]Ñ¥iÇe©èßt¼çߤ—&½è¦KËÌÇÉ„Ÿœ“å<¿sÂB–º”t£HðþÁ £8 ¶BúÙ»…z4Dõ(PïìPïro,À~ŒÃ¢Û«–tUnz®¿Ä_¨XqxÞÏ<ü˜9uŸqøìâ-sè"¦´^»¯ µý £éQô´^;á‹• Ë#Íd@DLlü¬%Ë © qZ!oå0¿UÍãc©jÏÀð«¿×ŽÏ“"3$Öß‘Í {›£e°"s ÆU\Šž‡Á ‡XèÀl¬ ÀŸÛÚo³º¤MKÞC¶·rBXo`gTœ~ sÛ £1«cR9Ä.–y7Cüí=å+¸‰kUa/ˆÁ=]O¹íвL›%ÿØ­í+æ¬Ê»¶¦S§×Œ?·g“YáWl¶Êªs›×NQ ƒÄ]öëìú­îL®É|¹7ígË ´á5ô.ÒÞCì7{Áæ…¶¼&gÛ\Åñæ´ÝÞn·­m·EÚq•ÂØ}Z·¯ñ£ãµÝMxä°^À¿½Ê ÐÓ$j~\Àí/è¤Ó9A‰‚›@e>QìÆøAè-Ñw‰ÑFÆLìì¶©-{häi5DÆnÐr­ß7Àë nˆé?~B†ç!›<© ¡Ç?ãe«òŠë&Ó èoîûnÃ]ã°©{®3w=7~)Ò«]2кŸ…ÎC÷ý5õ8I§å~}C^$™È ÿ´†Å $É4 ºøsü%úF0Qðo`’jÀêû,¶(Vøäá9›÷ÒBƒ§,Æqè,H#‰`ͯP¼r#ÁŠ ?¼ßp XÎ9þ3’­–Þ›Ð}v/Gd€IÝ{5¡û‚¦Îö´GsþT±#¼žãTf Z.7C©YÔ‚.͆)rœ&œ`ùB®d6‚Áï¿PKp…{eRšPKÕV 70doc/org/w3c/flute/parser/ParserTokenManager.htmlí\{sâFÿ_Ÿb"×…¤Î?6¹ŠTi…X“A„¼\®(! F»B"Ò`Ö©|øëyô‹íñ®sg×®43¿éîéîé‘ZÓü¦3Ôí÷#ÍÉ"@£Ë—ýžŽÔ£Fãí™Þhtìzwaúè¤~ŒìØ ŸøQè†aª ‚?uNÈò¼ÑX¯×õõY=Н¶ÕøDñN(€(‘LëºG<µ­4¿9:2ñzä\á£#¸d4NxÕRq¨¢O‹àÁB¶¨µùCc[³l4ì"S{óR³²?1–ä{-5t®§N¼‰ðFj»Û3ú­Êõ递xå’(Þ¶Ò‡æØ¶nk¶ÀdeúöŰ“—Ègùê¶Ö럗†E0áaâøÁyHíÍBÚ ÄAÞèŠ!B f§2B!Âp;Ao÷&ÞâÍg?@ÆPT\3oîú‹Hvÿlâ'ö(MÉÄç8i{“Y-&Lä“[bŒÍì§*lº‘$b¬)8AV~L›Æ«iyŽÚÌK Ú0ƒ(3p)b$TÉPÓQ!°xМ˜*ñÃBžƒÉ¥ÕWÛôHi:TЧ™ïÕ6$¡Ù¯÷o‡V0Ó¢d½£Ã¤£ËBR´¡$´ Íödü~c¹bðrt@Õ’Hö‡&]ÉÁI"DÄNrAy:©ädÆm|1ÐlýÓ¢$®vÙ·éz›d¡¾¢ˆ¯$¡õŒ5;ÉB|CñÞHBRù %ÉÎŒÕ6$¡ »€6ìJBûÀ~•„5Öµ‘xì, ó•Ý;I²ëM{ÒÕtC8Äܵ—ؽ4u»G=YZ’Cú+KïCrðÀñ\Èqeà¿ Ž’(û Ð~“ƒÕë&˜2;IBŒ†–˜P·e™Øš™Î×¹k9êÙÅìIRÉž9¡s+—ð¦, [ï_vŒ1Eæ%9¸¯©v½–¥^ý—8µÍÏ1_¶@…’$Ü‘fi0úü,s`tzWÖMQrϼ„Ág'Iˆ”HYÔQÒ$ÑejÐ z”„7 a> ²³,Lö.ƒ‚²‚$Ô¡©õ^`EIîåà¥A%ÀÎr0GÚ+4¤%I¸°vIZ:Ž K ôæ¦, »OÍ‘%áY†n0ÿž–$á‚’Ž$éçè`½“ƒÅ¢7iÁ8p:Èì$ñX@KÄ<˜'1Oæ©DÌ3y&ó…À|!óùƒDÌæ’0ETdIŒŠ¬MTdIŠ,Y£"pjc9K«±¡Mpü,‰:cÐÏÚ6EIȶÕ3_,;ËÄäͶ,›Ð70콕ÚÞ–å`_šÖÀAš>ì ‘¤¢ŠÉDÉ^ÊYl^š¯Íá[“’Í ’Ȧ¯Ä[†üû¸ÊwXù| Ä3….u{híʯàùU©R"k¢2‹êq_LÝ/sBß*)Bê Ïòýê—€4bLbì,&@E¹Uúì»;дÅïÕ¶7¶id »þþ)¥_|í˜ø!ù*£p¨@ÏüFúbüû/ú2¼˜x…xág¯ ɓ‡S*Ÿ ÷0¿FâÕƒ2wY¹<9H6+LLü‰°&Ô ²76¦ð¸ú¨‰0¼»ëÈ÷UŽî…>ÙÇïóšÿO¾þï<`é<ñEFí‹Ï ÿ 9^ûÄÛQ:Réõf¬¾ò|››>w䌓¹ÅìªÜ±ÕãξwJ*ã“n)«Œç¹—s×eón…øá?VN¢™‚~þ w`Jcß ¢¹“Ìu¨{ˆÂˆø³›C…Ÿµ 8D$â鑇híø${Ügy¦”rà3Iíü›‘Ïä´‹o:r)íéwO-£ý$“ÑÞa4Ç0ó ŠXˆŠ¤ðtñ™æˆuv~¶M‡rúÈ&‰Ñôuú©Ä¦Vö«ñ9ï2ŸG-:.$WWt_H·ÎÁ¿Öàɵ\ÃK§ôšÝBU)yCZ9;¹’¾r¾ògˆ,§sŠË@;ÉΧõ Š ¹¾Ä²ïEg#KbÎàrOE 6—ýºâÓ«ŠG"U¶÷Õ—4'¥"{šß}R¤³Ð½pTèBÕb»¬;¿‚’u!&ïÐõ{?Pà â÷o_~üöÅvÈv…¨þ6Ð&ÐÚa§™§¥™1k§ùóOž°uŠ{fa.¸,®Ë+Ô"¿R/+÷¨}ú@õ*ß}°Ãnö]§ŽeïUsû銬Ì8]rP²Ó_ÒsÜiYyG1ñädQévøœ°òK7¡ù…õ\·ÛÞn~·uø ð³>)ý2ºâ#çÝßFßuÓ•iDH´(l_"n>Ý­W8»v_)þšãCyÞ€åy–ç Xþž°<ï…ò¼Êó^(K°Âøj±t—·š-o˜íÔvoNDèQLüÕ¢ÑÇWNÐð—ñ}Öèâß¶íM‘M–ߺpù3ߤ.å³zç#g:Å~qJímzë{½ÅS´í»F÷·d¨Ìu=Y-Û߯ø <-¢ïÒÌ®l/›Ô>©coUêj:à¸óU‚ IPFÍ't÷¼h†lìÎC0 «›Z{г3Ýf2p²ýøaì;õY¼é„mX›ÅµÌ¶€³XÝtžv‡L‡ï1ˆ€c ºÅ1üG8‚fQ¼€_ÿXÁ5AÚ B~Yk÷L«§eÉRªdüûQÝqë–@×k¸ U¿?Dt‹ŽT]‚g¹Æ^]¡›HUò¶°;“ŽŸ€eù ×ÚïLýÀ'7… £»"Y;v< ¦ý1©µIZÞàÞ_‘Ý´¦Vl—™Z;-* ,|uBIê&‰fdíÄ0€iI@‡ „‹¬¯xà9ËepSGï£UÌ¿]w\ª$ DÍdŽÈÜOPnA{ø]q\R't1¯@›ÝIÞËØ¿vÜ›#úø’m¶óûÁˆ-AjbOfÑB‚àÅÇ e^`¸¢ÚTKê`ÒÜMÑ×0»EÞ =Ó©œßPK"„ï<¹ TPKÕV 7#doc/org/w3c/flute/parser/Token.htmlí[{oã6ÿ_ŸbªÅÕ\l'›{ ÙØ€k'·nó‚ãv[ @@K´Í$º$e¯ýð7|È’lÙ›l“v›K8’E‡óâÌâÉW½«îðçëS˜ª8‚ë¾=ïwÁ¯7›ïºÍfo؃ŸÞ /Îá°qCAÉã ‰šÍÓKßüñ§JÍŽ›ÍÅbÑX5¸˜4‡ƒæGMïPp—uUèÝUè·½“¯êõKº¸&Z¯ã­á!"ɤåÓćqt\ºKd«b´Ão¾ùÆ¢IN) -eøM¨ І0ZÂ2'!€'pߥ þŽÿù¯ã£ÀiooÞ€aD1Ñ6ŠÎ¢TQ˜S!‘q”ÂÔá;$ëþ1t#"% ùMNš¶“w±äZ¾TˈÊ)¥ÊµœÑ–¯èGÕ ¤ôa*è¸åùFsõ›7o˜&†`Ë¿Ñ_ûÐDÒM7»—0š<â¢å/¦LQ'Nh­~àfØ áê .;?~Û™Y`aËOÈ|DÄ­â3ÓÒ7mC[Ÿ4I<” EF\„G>ðaÁB5mù‡ó! Q4#aÈ´Òí½œ‘ÀÜh•Ð! ëø iùoü|"¯Nñçì ûi¹¶üK2ÿ–ˆ.9DN »^»Û1R ¾Ød<ô锘>XcúÈ2 $bä6 ‰¢Â‡¹»722º÷$*Ï’~lX >Ñbq}=×ùŒ'Jwµ¯ÐçŒ.Nš#œnjæõu2’³·h‚áç1ƒ³½ÓN(Ó8&by/V®mŸ{srf~ª8йŸuÜ6¤iƒ£+ŒùX3W‚Ò{M{ˆ Yú¦P'Qt/fúºõr3¥Ñ¬ŽQó^Ì¼ÃÆ»xißoÿ3ŽAçJ‚M¦ªìY€l£ºá s.k›Ë@­}ÂâIæØµƒHT¶ì<‘ÍÅQp;å1­!ªUÓÁ>â^Ã@«Y?iâxPd=^k‘wS oVö\)VÍßëÅ¥9#BRѼ6ÿÌZrA´I‘I}mpú£×=ïÜÜXg’ûïòô§!¸ÇjßÁcõìJØè†š¸ùáâ¢3øùس£÷//Oöò·õY¿3…·.®øí³þéy/ç³½Vi ¸È{u¯.o†ƒ]Ýbª¦¼0ÎÅéðÝUÏê1“È'çÕ;vúçǰe!U„EœCÖéÞSÈ:lÌ ì>ë‹} N/{•k½[ì§ÂdÅ^y‚`lzaÖz½i£±¢ã c¬ k¬'#C­”þ`Säj&9k5tæÖ¸} Â<ñ7üû{½Ž¶\E¯áhŒô ‰Ãa¤?T{–Ž"X½ŽÃY“&>õLL®hJXß6ÁÏȰØîQ6¢Ô”Kf©¥éê’¸LX˜µËb3ïdæ|¡,6ØPޱ™Æy{›Š•Å%5kTLg›åŒæp-£9ÚHÃJ9›MoòE¢‹?…Eb¨i¿Ã¬ûvu#ÓêL3 7–I«•rhÙ ý_iïX2Î ß©s'– ’ÍýÊßÛö92÷€ l¬ÊÄÝW#:a ²•Ɖß.ÜXÁëúžóËÇç}êç,¡I0rçcAè,ÕêŒÛú øØÜ›‚)$À¬¿öÔ”IkÊo]AÓM¯ïCu¢¼"AÈ 6ž‰JµLœBõå‹:ÿ²ê\IÁo¯._ÔùWV§õMwñ¢Ê?F•y¶t£.ó­Wc1ã·Í¿'ÐépJ=i3D&âçâw, ý¶þ|áuY¦Xl¢ÌˆZ­ÍŒõ ¸mÅùYó³Ú€´[ V~[>….R‰ú{MÔ\ÞÞ–œ`Ô~½÷ˆ†¹z­4 Ô»…œ>‰R¬amÎÖ¸/Ð. ‹,Ja E*¢X…Kï‹ — ]XsÄDàV/n‹²Qâ×–q>þóÇ´ÑU©H¤Gp¡[X¸Aìöõ–mHÇ$Ôsˇ·tµÿg×O2ñÚÕSã+DÉ»%ZÔ ”nx«sŒ[#âÛu`Õ9¿÷À^OÖ¶¹ŒUܤ£ÍøÇ +ÆmJeaæMù1V â ÝúkJ"¹Åe‚Vù_üfB•AÔ÷aJä´‹m÷!ኗûžý߉¢}X¦ŠŸeû¬õÞŠ]€¥í¾Ç'Pi·/Q¥³½Š/ “>,`Ò=Ããºæ û(v’E´×ͱ¯[ìô¨Œ ã}¶ûáv*0nê}ŠR«âþ†ÝØs$ŽIlƒîƒIxU˜lÇ$Â0ßBq#Ñä¦(8 ål›Åwv Ͷy–"Ë‘K'²”Y!²º¹Ud…6ÏUdE[…Õâú„}­Z®b«“Àà-0µ|’Æ#j&#—RÑX—õ¸ÎQ£öÌ›„úõ¿n×¾®±oôIÀ.w¦’‚%"u_‰U'öc‰3lÖh4LIJ%FØ;„d §ìý6?UÉ"R›Bú½ÐŒ–°¥])aø|Àʳ»î°‚¾Ó“¹åW!\®Ã>p᱂™Al_™Ñ™“Ιf¸Ëˆ.9jÉ `R/Um$Õc¡Î¢ÈÚ€áB¤¨Ï$Z+‰~„Yâe³tÆs…¼ˆ“H^RÌ|hÄ0æÃZÞ¬àÚ^ÀÑ4Qý+4Ü첃ªå졌tUØEüzû(Q ² ~FVØkyFæUØŸ³44Z ø—pi0]cb§¼ŸÒ¤@!FïÖL'Ú²JÄ2T/W¯u™ùŠ1rk2ÖYÀj"˜z:l` ·ÖÓxÎwÎxº&A|.x:™SÒ+ªÆ²`ãÚ/šbš(ö·Êt^/¦\Ò Z"Z{ÚY/æ1æò4,¢­ÙæZd•Ê.êpÌ#í6Láð ³TyĆq1§Iÿ4ö êÔ\9mï•X^ó¯R9T‚D×*¢âëÒ/wUà¡U•ÑŸŽ‚n ¡÷,Ž2¸ÒMt…^VDœí¡¦ðÊÖë½xÇt®+\w—<…fIûž¾ ô»Ç¸®+›D C=~dÁK W{¢nó­9‰R“—Y¾pÃâT»y`ãUX•s0|˜E;Ò‘‘çqÙ3-p†éG‚DèŠÅ)™#KNÆn~’A^ú=së™p—ÍIêfƒd,{:Nõ{˜@°8šY&%×f­#_Äî¨wl8†‹¥M?ó4²ßƒãL$ZÀnÌ×{oÝì<bkç©Æ˜…˜@žÀJÆz]Š 6¡¡Çœ¦mÓs‚"³™à¸¹Õ"1†áPæMTÑáw¹€v­Sî=ߊWv·¿éûÐÃ@#®׎ո/¿Ü#A–Ám§‚ÖŸ–æá½ z9ôr0è¯y0èåŒÎËçtFg†þ£§kßÓçˆk]>[/¨m?þ¦SA.Kãæ9¨Éf¢®w úË«œ@{ui–½¯¼}kO>gó¬>[GF#áN${µ÷\`UýS xOG]Ó‡¦‘26¶»2µ¿Æ¢}]_Âëìõ‡â(Q 1S ¦C]  `ŠÙ¥Âä¾ZcJÉÖI6 ¦ :ÐdYk_ô‡…a÷óâ¦8K0gmŒÅjsº¼6µÂYó±ðWƒgÃÁ%±×±NKþ¦ÆýËL–Ù¯XgP“ {[k÷/ýN‘-¯JÆw”ñ fÈ×÷x£›îíCkÖ”Ä!¥F@†§)î:¹Ó Ì7·=&ѳXLE­a^Ï"¦–eöLÙº Rtí;Yk«ìzE÷ó 9È:é'Õ ]zh&Õ%È# #ùX-ˆ@fWV4‘îE i„U#VAѲ?ëjÇ@T®Ô ]YØO2eaB–x$0µ$,7 t·É ®9 –õUÝöË«kSóÔÜá8ãÑN¿‹ì5ÛèUæÂÐuÍòªQ—t.Lé-\ôx¸ÔÿõŠˆÁïPKW'xø [BPKÕV 7+doc/org/w3c/flute/parser/TokenMgrError.htmlíZùÚHþÝÅG;$ZÀMZ³«ôzÂ,M·À¹¤‘Paà´±=årÓ¬òÇï«Ã૯„Ìfµ±ú°Ëu|õ®ú^¹Ú? .ûöÇ«!¬ùƇ«·¯Ç£>˜ ËzÚ·¬=€oì‹1´š'`3Ä÷€ø–5œ˜àe®9Î,k»Ý6·§Í­,{jÝŠþZ¢}Ûà™ÖM—»f×hÿÔhLèöЬh£ƒO‚UǤ ·ÿ,÷ÄŠÑZ¯^½Rƒˆ.×”¸ªgø”N]Xìà¹!nè@ÀþþžÐú'´NÎ~ùÇÙé/0Øðòää%H Üã>í¢àÜO8…ÊbŽR8…üŽ]Aïjt}ŸÄ±a‡×4¸X±!c!k[ª±Ñö½àõ;fÌw>×”rø.¢“Ó[n9qlšÑeÇ0›Mkÿs¨Þ”Ud‡s&ŠM°°kKÏrº;X¬œÐYÇÜ®=NµX¡³¿`f÷¦6\žÃ¤÷îuoš}%gKÀs;f@n„Íy™ Í•teŸX»m‘.(!²ð),BæRùÄ„­çòuÇlœü͇ú~D\×Êk©ç8"Ž|>9\@èø"è˜/ÍÃDž ñ:?ÇvB¾sBn^ÖÇNZˆDÂ52èæKÅœ…Û2ðë‡g}R}ª@ñ½¢uhÀ)3áF?KÉ =zŠ÷—Þ6•%·…Xt[C7>./º—h‘7ݶ­NHT•óú9XÄѯh‚î—ÁÙ^ gŒ“͆°Ý£ \©6Fr.¯*$Szc¦ ïRÖÁQ¥çeÆ<ÖÌ9£ôQÓ¶±â‘¥_2…ñýG‰ÚßÍšúQ£ç£À¼ÁÊ÷a±¤ï[Òÿä¨]‰y«5Ï{ «(nئ›ÊZy9¨uÛÞf•:ví¤1s*kŽœ0ˆ­í©3_‡ZC¼SAßWa ­€Þ¶p<ÈB?¯Bä- ôejÏWÓá;è{³™z6Ô¿Éðƒ­Š+ôtO§Õpr"+5CÑÍÞ^\ô¦Ïôè£Éd8U·ŸÕ¿óÑp<È•ìá™g‰ÃC6×Âìö/'3{zÐq¹Ù†òuèZ\ í7—%ÚtÎ" íÞhœ4L—râùO@™6(Ìmq‰íÀp2¨\aõ»frÝζ:,ËÒ`г{Phõ²‹vŠæê4—‚‡4#ÂbÊÚ Ù› P ØÑE A ÆÓü©y¹øDŽlí3þþ½Ñ8¼±×èZbN’ʉëóþ.WQv¿U¬ºo€î_…¸Y@¹²” ¶ëãƒËEäèù>Œ6‘O7byua$Ù%qh|¦ V-Ü®æ…ÍeÚοÅðµÔ”èp/ñ´÷(Yøž£l Dø.ÚwλÈÍhàÆP˜½ª‘öŸ=£z~AVÇÒXC¦nc² ©ÏÒ‹Ù¾%œcKesŽºyC“~®­L‡€¼¡AÉœ¥‡•*W×å]oûöåô®þŬРš²U#ËÙÐ`º%ÚÖ*жÓ×ÌSÅá+a¯ÌJh‹¾ß µÆ¶}QÅ,‘TÉ=Xa¦°*Íçƒò]‘\Ž2 ·™ºm't©è»ÚfÄj…æaIó°”yX9óPf”+šÏ±ó‚ 1.ºÏ_´-9 èP¢Âá×üýî&¿CŸ’`>÷žýspêg¨çùÜYc® _Þ)/Ý™šêðò=>¨6Q%>½qL4ëÆ¾ˆŠöc/ ™j² 'žl‚ºQÄ‘©Ò[bØ«ƒÀ¥J„õñ!Ó=£$ƒÿ5–Õu¯¢ª¥º¡qŒäþ/–ß-¨wÅ( ŠdÜeUÔ,(0‹´êþôö¿'/$Ä#…ÈûÒƒ:WF±#ã¡®£_zŽR@Ñ8´ö÷4ôXŒBƉh\6_œÌáõf‹‹Ì1-tJ#_p)# "Dˆ2%Åb±IÆ×Ôc@…Y ÉxŽë[x– Äî ƒþ™x(|$h1F6ÑVÞ Ö2ýÖ6”–þZ•®(¿PAD¬ª‡§ÒŠjAQÃ9%lB×[JÍ€Üí —xïÅ üxNópƒ´va‚Ú“L]‡¼¸y_Dʘ#ë&zÍ|ÉÂÍ\jj^‘+˜F6=¡]žÐ=Jö5¤‰Í’E9P‚“°a x T€?Ã[z¾? ,8×6ú²´¥qè(Z¯ªÒ?3µŒbA©B•Aí*yÔËŽñÄVßvYú WÀ£mÇĉ®\‡¥H=K¥Ëì½k¯ûX·AÈÑÑë†ú©p¶ÄãٿЭq!ÿË$tjå|.ŸÐšÜ™Ï铊t.ÝSùî²¹V)›H¨Eåg¶}Ô¼‹i–žt)û*ÿú´¸ï€%évÞ¡¨Ú›xþâ°]¢s|ýä9‘zöQò§£MYi¶UØkÒŽ ‡ìëÎ*‡lì:ivVY«8uÈdkÕ-„h`Ÿ½Ý9´ÎFª•l>*!ªVâ]ÙÓÑ´TÉ>ÕzüdK±JçE¥`•ýZ™ß¯ÍçDiÀù®R¢V6%zdœ¹7‘H5~¶Q¡élþ‘Usš3Ê™ÔrU6zœE¶‡*#‰Kqƒ×í¦ù|Aþa¤ù<˜Tlˆ*iæ8¼¶˜<¯¯V–ê—}¢J8ÙùÐ Bó{ø"~oÈ {~/¶‚Þ±m^Çnc°ï]S_^^Íч†}{8¸Æhò®7 æãá‡Q¿7žÏìž=¨àb`¸$ºÀõÛ¡,¨"Üét„Qž0”s( ‰ÉÊaÎÀ”ÛôÂVd\À’+ŒÜ1EBX$+tú(dÜhâ¦"^ÙY.±Yœ8k_ë•QÕOzú"\2ÃÑÛãJÕR¢¹íxñmœynù£"eYý¨ÜÚÓß2ufYIþ5ñ:WÞÐòüI ªø®s÷ç §žÓX„­¢pâA~¿§5À»lßææaü8³ñãÌÆ3ÿ›g6~Ÿøq|âëODhÅô/añâ`e­F;i{µ»Ï‰ü¹‡—l¬1]ßò"Ö›,ýãÙ¡ƒîþV.6?;øø«:šÎ³ú°Y,˜>¢iÔÞ‡Ìwá=²xOp»&N“bÏXYíÄIÔý™Ñz˜¸…çmb”Fñ¸¹ñx“ºIi¨ T3qÖÈ×8RájÍãâ¬*ò8›:ë½`µ«u/FvfØú~29QyóHsÉöƒÈc·µ%«eá.™¹<&Dèœñ‡¥ ‘H" qºßþ™à3‡^‚K»z¬uG“騗…eTÉøšza“8ÍOâú>ˆª/ê Ž‰L…¦b™à u›†8·uß±°{Í@–Ì^ŒÎãm(«u},<ßã»<¼'÷Œ°æ6#.Enk]žÞïûýrCvÒF"Ì'âÌ Þh’þ!ó‡# ‡K¾Å|¡ÖMï Ì‚hËÄ Çb‰ôD‘¿kÂGÁÕ=Á¹0ÁC#‰‘uòµâý1Æf™yxA Á„CUÍž$oÌ&oˆ³kˆ¼UúãÙ•ÌÏjúØôh-‡¯êö‚n˜Œ WÉÙ¯®ûj⛋Sb“—UÌëä¡m\ˆ1øýPKrÞ° t/PKÕV 7+doc/org/w3c/flute/parser/package-frame.html­”_oÚ0Åßó)n-mo‰¡lÊ’HÐ :´fÚö4™ä–dMìÈ6 |ûÙ†Ñf¥´«ŠùÃÉïž{|åðhøeüœ ×U ³o'ãŸÒï½¥Ãd?>'Ó tƒ$’qUèBpVR:º ˜ɵ®û”6M4½@ÈM¾Ò•åu-`{éë;o™ÎHì…G¾ÍŒ-Ð÷Í­óP2¾ˆr«ªì·î¸ŠöTëžžžnŠXdŽ,Ûár”Lcó5üf7,)Só=_r较n§ÿö¤ß{£aÇÎ18#ºÐ%Æ&8+—á¥2ÆM =ðáÜ àÃl܇K¯yÏØ0nÒàʪƒšI…2¤Š–¿‰eD”^—¨rDM@¯kŒˆÆ•¦©Rr‰W‘G‚€îŽ[yà$‘Kû˜5hºmw.²5Ì©(…ŒH“mlCmAmdÆ+u^鯫9¹F|µ¬*&×KÓÓL.PG$-™Rg’Uº¿Uƒgbcóa.d†ÆE‡@Sd:H·Óyeíhi2࢑¬ŽÇ\£¼b)ª×|®ê÷ªšqpÕ"âê5Vg‚k‡sé:þÛÒ gòRKdÕÆ,lÍz-·aß CZÄÖê;ÖÌu1\iƵzøzG¥Ö½9i» ÔõJ]"ñÿG3°%Ÿ•‹ú"ýõ´|î«÷4)ÓBŽ«ºðõÔßk°º¹ú¸ $cSDS®©taV÷­¬BVâÀÆ3žÐ[¿ré¶1K½Ö©Ÿ ®Íâ(|‹®9ctÞ"TÈZ½žòH¿  &»`Îìs̈ÎÜå»dZ[;þ†Ô»%Þ«þÝÊõÌà§1_Ù¶¨àb¢ôAf#áƒMú‘ûÛ Yö 0CýˆhRš Ìó ‰ïÃØ€lPÙF °Žɦ©ÞÀ¨¬Bc«Mó5Jo?Ù{a›åÓe´zM”ŒRbÁU€Yù:9õ€îx&¥gb*<Ìžz;@y° }‘vÒé¾A–á2õƒa·÷¦û²_8µMÚÛ C\=-‚ê´Íh¬…TÁÒYU™çD.–»…Îeÿýx)§Ú£Áž ܃÷à&ížè_ž<&ês"•öðI–y€H°—_[;ùõxïPØ:Aªd»öî>Þ=6¼_áˆk{†ÄÝ;MªÂ$=!1…«Ê¨•õ¶wý.Z#1ßä¿„øã·–ÿzŸ{)‘W˜fH¾Ü7®ÇÚ«7-Zo\8N™¶‚˜PKQb\Jbœe€N‰†œ 5þàÕ‚:„[…Ëœ/ó‰ QÝ´ˆ .¡k>ʵ‡vÇ{(Q®ÕZ÷‰Ã¸'Ô´Nÿ+~dϤG÷!{oeñõž/íOìÛ²ËåEFs¼˜ãÆÖε^ú æ)•ÔºGí\L9ˆ¶ÌñƬên oÌÙºW½Á`Ãà»9Ó©(5”œÅ"¡N!EL•B~ÿ8>v.b‚ r€ÚÕöØyˆS}6$4aäœ)½ekì ¢©C¯F1¬3ïžW@ïêêVo&•Æâ†ò ÂñL؆´9ñ%­cåÖHl{_øé*ßšP`¼@§Ö†´ ÿ˜ú·1-l´?vrz]æÅJZmØ­±/‰Ö¹válÞqÞҕŘÙx¼ƒr“y#@¥Ä»IÊcQšJ“ÿ…+äîU•tŠešð]›8{R²Xù9Ó>MÊ=Qhl§¥¢Z+à 4Óæ[¾ÎiœrÜšé /ã ±Ïà`ñŒqɈ?‘+!ö³Š7‘ÞÆG–‰tW—âà’T_l5¡X*ñxMð‰9ÎþYb_C·Äó©êzáàr4ènÂrÙø†2á“ØÿP ®7Ø1¤ß?ƒn–ÁÈì”B‘èÊ3¼x9¦rw_að^7°#×§L¡ ³œJ/̉XÆôbÞ?挰®Ç’$#ëFy¡^¶W|?Þ‘ãå"“ÖJóB–MÃÞaLõç3‰Qb¢çxåõÂeËÉPKn^ê­,Yf¦,UÙ‡ßE)«Ê‰«b“) à]/Ô †¹<ã¼Câo%„Ç´"0Ëþ‘½ Éf$^4”&ÚÖ5þx2,#Dæ……ýßFtm‡Ob{AMù ­\5,ßš Vd¦„V§© 0YÏ||³ßâ0¯bòû PK){Ï2ÞTPKÕV 7*doc/org/w3c/flute/parser/package-tree.htmlíYYoÛ8~ׯ˜ªØªjÉIö@S[@ê8[w“Ôp¼=€%ÑêX’¶ãýõ;¤dY>’¸M²èCâ5óÍp.ZOŽßw†Ÿû]ˆU¡ÿ÷›Ó^ì†ç}<èxÞñð>½žÂžÛ„¡ ©dŠe)áž×=·-ÀŸ+•zÞl6sgn&ÆÞpà]kz{š@ùØPµÓn¤"Û·ZOs:ë“1m4ph0p’ŽÛ6Mm¸NøáÊ(•í-Üö^½zU0Ñ$cJ¢‚2üIS*ˆ¢søJ¦$ÊBÈR8ÿï&)ìý{ÍÃß~?<øºÇCØo6÷ÁQLqê£ à„O…)£ ïõ{‡€ìEèŽô.7'BRN¤´Þ2ä-ÂxÞò jV‹³ô åm[ª9§2¦TÙ æ9mÛŠ^+/”Ò†XÐQÛ²]׫þ,·»f‹!ض/ô´ ’öJ±ƒ,šC03ž‰¶=‹™¢¥ž¡]ýàbx4Âû8?úðæhP_2â`QÛNÉ4 âRe¹ )IèÊŒohâî–G|°Pe$à‚LD97m˜±HÅm{¯Ùüņrž“(bú6÷бÌIhÆM Q ýOÒ¶½o/yÚÅßÉ žÓºmÛçdú†ˆÙC$®UCw9bB*‘Í6/—î–`ts ôAgcDÒTQaôvbËų4¢×naÚ-­–ò¬U>ÉR¥þ{4Ñ)£³– @z«‘ëYÈü5š`ô}`PÚ+ír’$DÌw‚Ò/Î< ’›97+ÜLüÄü¶Щ½8x³E Z—ç¾Zݸâá|'Ýöôî¾ã:š˜ò¼ar'0oqómX<ãÓžñ+óP,]D°q¬V=Ð1 ïG÷jÑd‰ÒÙŒûŽßbÉxá°NÓ)­;{a–Jõeœ%ÔAªíèèγqæ`ÕÐ[òƒ:ôePZ‹¨› Ý_˜RÐýP¹î4‹‹o>{/cª¸­Ùr5ÿ¼/°w“$ß‚keúfX7=?®®Ùß]ðL‰ÑӥΈ„t×2ƒU2¡Ø$ñNé˜p墑fŠ…ôËÓ%¿z4òYˆÃ×E¿a;ÛL$DÙn·œ™à|d…4€%oG*@ʸ¹Ð¢œäþ3AÇh=úž/®«Î…‡ÒM˜ri4Ù`u†Ê&a<‘Tá[Es$SúCD6‚! ã¯f¶éj¯h£ÚVÛ_-² oœ6 an-åÐÂÄÜœ¹³e´¢ T€w¢Ñ"j`Ū·M”yÕ÷U¬T‚«6}‘EõÍdðzWÝéTÝk©E\¨‡Š™sÑ̘°„23¡uyijË9ó|UhCFÖk4øÝVò”'Ä<*±p‡Öõó-ø¤Â†¾™¾¹¾îNÞŸ§ÓŽFƒ‰ºüKý»®ú…'{<îàl-¦8KënõÆ£©=ÙQ•mEù2òö×ûrÜ/Îù³š÷vwx•)~´šåÄî¡eÆPQ²˜åfÞÁ¨_ÛËÓf¾d!ä¹ö@ô»vJ\/,Œ4Ìבf¨H3v‘Öv串æBö ?ª3ÔXÀ-C€7cì|@f„ŠáïOÍ&†ãÝBŒêÀް…Wk{Þx\”–n€  +ш=Šv<'.MÎUœ#™àðvI q^´rü ¸¤­J”¾Â¤O„èm3=âµø®Š"JÕh¿Ó„[ˆúhè%P6PŽÄϦ”Àz+ÆL¹œuÞ*ÐZ6Å÷Ø9}ùál ¾¯\lcG¦n8iVc**“¦B¼§WxsîÓÀKf~¸¤ Ë7›³h5“Æœô‡®)„÷0æ4/RˆqeUp`«„Ï*ീt(<ØTm1ötí\"\Göž R8Q¸éBNv“1 ¼MCù®¨t*…ùP5—*L¢MA¶yÔšv{³î¨?Ã’ÕÚÃñèä#Ûž _½±¹šxñjðz8š]¾¿¹Œj©$»Œ”2+ÞÚƒ‘]¦V„_uG¯ËÌ£Áë®=|[‘4 fã‹ÃúŽGWïg½ËáUEŠ|#Ö¾–I™ôf<•wÝ«2íÍtð¦?.Ï·mJÛÖ×rÕ Š ªc¼éÙãÉ¡S S×ÓOmÃÔî^ñ|a¤÷ðSŽôj˜ç×w³ï…©Rôq‚Ç~0†*•m‰žž•Ÿ.+³;^¡ŽÕ® JcýpK…‰\¹Ó£yB1ö’~LÒÆ­ˆö·Ç(á4Ñ„tSÓü uŒg…v>ÛJH.ò2¾û ãûZªøH¡}×B(S]*.=†Á2b¼X„ž.Gt ö6¦3ï击xÌì†šè“ Ê°_z¾K8úø’Ê-6ˆæ ¦œk™òÞø›ÝqG ÿÛ\tQ($™ŠOŸÄIÊ×,L4áYÍÀÍäý?úaZ¬Ð™#JŸÜªQpE¹€êñ¼]^ϤåZ»'×Ó–ó{sUÅ+È\-ôªË·ÇÀ/n…ôèŸk$'˜.!†õñ‰(§‚ù–$Yööˆûó퉦þãZøx4å grâóüßc©VY÷årjG¤¦Wè 8¶ÄrƦ› 5(6ÛyòÛ}û|«‚cûRÕrävpÒ/, QjYz=B-'Þò¬f+f;<é¾ÇøÊ|PF¹åÍ!ÏJÁ*«ù-JÀ§ð´ñùïÉŠûwEhšEíW…L[ydz\°ê5È.iæ«  * ¬Ī"ŒªÄ¢ÿU}Û á¡¨O¸]ŽQØ(›ÆÔõç¾üž¸¼[¦†ªª¦š²æ6jéç1Æ>öj·Þv¦¯ ¶½í«`.o|mgü2¼«Zÿp’)”G¨wIŠ, ã}ÕËâïaöšÒ{:  Õö¨ƒqõ PAv÷wBeˆÏ{¡ß}* <©Šˆ"ý¦£æK‹ÃßuÜ÷¸ƒq­JÒ‡_ï¡¥à¡så·•ñíè÷£ߎ>ü“>|;…ðíÂ?àBŒi²ÂY%C6zQ¼•ÁÝ8|nG¬­qaà¯Wæ]ÀôcÖ[.ýãÙ~kw)ÛÚsoU'9³yÖ "ŽÃÒ3•Zã]ÄÞù…wÔ½ì†8Š##± Ød[Ï]` ‹Kø¡M´Š”ÀMŒ•Ï ê­+¢®ÑÍÄ]®ÊyCôšÏÅS\¶ØÔ]†˜‹múÚ9±'»ÉLå‡Ì'Æœí„ÈÓ²9käÎÎΙ¾ž‰ƒQqgZ3ë‰+‚$A|Ë—¸¨ðH°6òã{¸.BGºT¶{Ù;fþ-q·Í„.»üñìF®‡é™™Ñ©¾hØkºr(C+« 9nJ;²—Hi™ŒØ¢"o+þ‹†ÅïPK‡éLÏ +/PKÕV 7>doc/org/w3c/flute/parser/selectors/AttributeConditionImpl.htmlí[{ÚHÿߟ¢ÖÙ ‰왌öN™$L†=FàI6ÒJ¨±pblo»†Ó~ø«î¶Á/óŠrÚ y¸íªîzüª»ªi×ê ÛÖ§ë.,øÒƒë›wý^ôši~œþNOÎù×ùÙ/ÐíXðæää HA¸Ë=ÚDÀ…·ân)‹Pp´ÂÔà7ì Z×½sh{$Š´çÌ"];ð©aozuSõ¢Õ=×ÿŒz =âF J¹|Ò†Îé7í(ÒaÁ謡é†a¦v†¤’}6ô±¸­ƒ‰½›±ÆÓÀÙÀtn^Àúzár›ÛŒ­ÖÈ‚á ZÞµFéGRs®ÓÐ}r;%lƒPŸ,iæNSö‰Ôu“4ACk‘©Ga0‡âÈ':¬]‡/úéÉÉ?t°©ç…Äq\áÈSÕŽBbËö‰‘3ñÇø ý¾SäE?È'lÝÐäöamìä%‘âj)é&3—Eœë¢à»G_× #ôINè3%4Ï£´6õ9e:ÜÆmi#©ÐÑJ”ûÞõzg(`×…ebv-æ¿|.ø§Í!ôÖ¥ëº9E©Tí¥?Â_ˆÎÃäA…¿ˆØŒVË%a›£D¹V•æœQz”Ú>±õËÐP#žw”<=Aý¼-¨ÖpJ=JžK$>$Ž)'S¢¼ˆeŒcйóφ`$«éã±N—;A+Å5¢Ò¬»Ëyá•“ DÌ.¥ìÙ™ë3{²–´‚ðFE¬^0*8ã Ñë&ŽiÑw³Xn .ÚôÍÕû,+ä@ Ì™X|̰ˆ23¢µyÀ"³å;™•ÆHÖ>Œ¾Q÷´û­ñX;±2¨„9oŽŸq½våL¥ßÀÏ¥†Í,–d(Ç@Š£<‹%( VQxG¯²Ü™K='š¸þ‚2œŽœÉŒˉ´èd¯StMå•cŽã$N=[ÍBöyšË>Ï )s&¿V©èÞ¥Ü}WÓK,½-¨Tv*Üt!•€­ ”Àf çCМ&ê}³»a¬3cÛC›ãV{Òt&8…uzVo8¨‚¼eY£Þ»«›z ‰ïºï{ƒÉå§ëËî ”J²K¤äY±iuVž¶W¼ß¼Ï3ºï[VïCa¤á ;^ì—w8èš´/{ýÂ(ò‰¨» ,£<éõp,[­~žözܽé óúÖMiÛò¹=β¦V›¶5í 00e«d\f•. Úá:ë‘Hoã'ô"ÌÓU¥¬v‚ÂX ú4`ƾœÐíÏ©^”?›ìfð1>÷ç“â”nߢ ¦žióUžE¡Ã lâ ЫU­œ3š}ã âuZ=zØß6£„ÓH#àÓõÞµþX<#hUŠóÕ —¾ÅPÎ'uß!ˆ¯¤ˆO„ßC5V"º\ú[Y»Ÿ­VD~WÅêiºX=ˆ%e^¬iYX‚›bIXDŒ,_nŠÄb…+z¸åÃCK@ávÙGfƒ|›,Át“ß%W]E‹Ó?µA«HlÓÆ³ë{¥[î[Ó§+¸Ù3u]¹ÉS•^ÑÜ…@R–Oñ”[=NPŽ}^¼pI núýTÂz/+Ož’ßzì+(ÀÆ4vI¸½À|v“IBáIÁ¾¯ш3ƒ{ó!ΜŒFt嵃ÖÍÕˆŒŒtŽŽŠ²¯¯î¹v!ùÚ¶s‰1cÛAä `•«¤^›1};x2 ˆz· PãKþõQ YÀ°ÈtÿÄ ³ÙÖ SÕ¬4{ƒQ¯•K+³ñêæ—ŸC”ë?ؤ¯« „§"g‘[êšxYàлa ïL:n„Áã.)«4=—L]Ï囬x÷îÅšXŒ8£÷KTÁú.¾Þöûp Û S-)öp€äR[Ej‡Œø<Ñ0Q0ãkÂÐÉ•†Uõ#ùe)ŽÅVžØCocÀ§`ÅTí@l’H+ª0Špnäß ÛÆ•ø6U‚í^ö™{KìM-â„ËCÔ¼¸–õ]%>¯-#:¶Ã£º½¢Ë)eheu!ûÉ`KaõOSj÷M¼#(þ‹ '¿ÿPK)fåa þ9PKÕV 7Idoc/org/w3c/flute/parser/selectors/BeginHyphenAttributeConditionImpl.htmlíksÚHò»~E¯²’:ì¸ö®âªà˜= .“MÕVQƒ4€!iGƒ Wûã¯gF½Àر³¹J(?4R÷ô»§{Õê ÛÖ‡ë.,øÒƒë›7ý^ôši¾?k›fÇêÀï—ÖUN°ñ#—»O<Óìt ð£/8ÏMs½^ë3#`sÓ™ŸÅ|§b‚ø²ÆS؆ý©ÕªÕt}Mæ´VáäÁ#þ¼¡S_‡ÏKï<3ò£F µÓׯ_+"bÊ%ŽšÞRŸ2©Ó |$·Ä l|¸ÂßßV>œþNOÎù×ùÙ/ÐíXðêääHF¸Ë=ÚDÀ…·ân)‹qÔÂÔà7œ Z×½sh{$Š´7tîú—›pAýçÌ"J;ð)lozuSM¨Õ=×ÿŒz =âF J¹|Ò†ÎégnÚQ¤Ã‚ÑYCÓ ÃLÿì0 %çlècq[g7cá§³éܼ€5ôõÂå4Ö64¶[­‘à ´Þ½iÒ¤¸NC÷Éí”° B|²¤™;M9'B×MÒ G¦…iÀŠ”OtX»_4ôÓ““è`SÏ ‰ã¸Â¦§j…Ä–ãÁ"gâÈ:>ðú+}'ȳ.~..O¨½¡ÈíÂÚ8É)r"ÙÕRÜMf.‹8 ÖEÆwî– ÃôIŽé3Å4Ï#·6õ9e:ÜÆc©#)ÐÑB”ÛÞõúÙP>^š‰Ñµÿ"ð¹ÀŸ6‡è«·.]×Í)Ê$@¥hÏýiþŠŽè<Œø“Óhµ\¶9Š•k…s4'òSÆÉˆÞê â>’©Ê˜LÑ|,É9£ô(±-|dí—yCxÞQüôôÓ2´ ^XÃìz?—|ˆS&S¢¼ˆyŒcйóφ`$«tñX§Ë£•ârQiÖÝå<‰ðÊI"f—BöìÀÌõ™=YKZAx£"/˜̸‚õº‰ô Íú.‹åRpQ§¯¶^½O³‚äÀœ‰uÈ ‹(3#êQ›,2Ë×#Y 1GÝwÐî·Æc¥òD×ðetÛ ×sÆñ0GrÐýÝÊ’,ñ³)×eÆÞ4´ûøæêª5úp®)ÉzƒAw¤.ÿRÿ.zÝ~'sg'ý3ajÎVBœIœãôf{8[£ÒŠhKʳøêZ—ÃNVæ;9ït­V¯Ÿ0~4›åÄõîÁe‚P`2qùB¡ÝA§´Nˆ …“ÕGkW\HG€NËjAëU cÍ6¤“ÊÉŒ­“Õ§r^™Ïሠ'DÞC†"ˆbÏ¥£1œ~ÄÙ°Pý ÿY«¡¦jAi*´% iuÇÃÃEbkyºe€=Q ̈M£s &0œ- XDZ"¡ª–‡Ù>Ây¤Ñå­ò6ÂÕÔsmåf€<%Í–3ÞÄ”úNy ¦@ÜDÄî–Cá%̦”õN•ÔyÍüŒË¸+`±ý ~.6lfMÆzìiqÈ:\ZFYx¯Šß™K='š¸þ‚2ÌWÎdÆ‚åD*w²×>º¦Ê͇!ÇW¤èfÍBQzš+JÏ •t¦ìVêÞÞsWÓKì½- TÑ*Ìt!…€­ „ÀaìÙ‡¼tZÈäûÒ¿da¬3´íÀ¡Íq«=i :ÌqžÕª oYÖ¨÷æÆê¦hâÁ›îÛÞ`rùáú²;(…’èÒSò¨8´º+Û+ï·oóȃîÛ–Õ{W 4t'Ëýüý“öe¯_ "ŸˆÎ¼€2ʃ^ÇrÔêça¯ÇÝ›Î0/oÝ”º-Oþqy 0µÄÜ´­áh_€©€)[Fãî«t…Õ·__èémüä=½èæéfS6;Fa¬}gƹZoÝ™ÆeýõìN°É.¯ñ¹?Ÿï ÏG¬"7M›/òØÊ}¼À&ÞÍ^Õʰ&ZÑ—±#B¼Ò«GûÛf”pi|º†½Û0G:Î…õ’f2–´¬Í,q¬bãYô#Ù/ o*‹µ±há–m4…Ùå™-ûmÅÓM~ß^MUd-®™üÔ–±=°qçåï•~ °U}º9Ü©=Ó2–«<ÕDÕ]$¥ùN¹ÖãÂâÞ7Ñ;ÆKž4Áà¦ßOU½çñ2³òäA&ù=̾l¬…—„Û ,Š7™¢*–èû&ƒ¸¦¸7ú™ójaDWNP;@´n®¶ŽøÀÈH¹ÎÑQQö…Ú=Ã#×ï"$ß+—I¶{>:N²h*î›ïáÞGºö–¾‘ò³c<ó‘¼*«è¯éXéŽ|çU™>½Ü¥R{ÑŸâ­†ØR ‡}èž}ºVèÓáè>]K÷é_`¹”l_ÓlIƒ½3Ù¶å.7WÜ„ú1üÝ1¿§ï†^!€Å@SÙ‹$_ç‰*l‚UÅóDo(çTÏ…œð"`bm‘ÄÍ—X8b™·RÀ£"&¯œW¾Ì¬±øOiÒlƒŸÎ)9h³ÿ|Î}ÿN΃eî m|óÛ=¬Üw8ÿ4#‡öã(ð£À?ŽÿŸþq*÷Ç©ÜïüT.v;ÑóƒˆXñâQ¥„8•ýgäÅ6nÀ¸»Zš}:'žé†¬&vÕmúdzÝÍí¥\2ŸÛ8üU½F•ÈY~ŸL§,~I«¼˜çÀ{סðžNaG»"ÞÀ™X9l´ ›Ïcz—ð¢N´ÏŽŒ¥Ë ê¬ ¤®ÐÌÄ^¬"Êy=´šËE}‰5¨Eí…Q0ßTšW=+E¶ºkNÓt\Ÿ¹Ä˜±-ùªZeÆ*©×fLßOÈÁ€¨·à%!YÊð¨ ͆­¥û'ÖÅXöVX ¨a¥ÙŒz­4[Z™Ž?Q70°ªü"_ÿÁ}Yq6y$,!IÌ·Ô14ñ.áW%º¼3鸻¤¬Òô\2u=—o²ìÝ{fdkb1âPŒÞOQ»ºøz;ïÃÙNjI‹‡’Km©}1â;ðHd¢`Æ×„¡“+ {'êGò{V¤ÅVžØ†CocÀ‡`ÅTÇ@lá$‘lQT;anÄ_*ÛÆ²”ø6Uí^ú™{KìM-â„ËÃÜ<»–]]%>B.#:ÖÃM{E—SÊPËêB΃Á,ž+NSjÏM¼Â(þ‹ “ßÿPKªðänj ¨:PKÕV 79doc/org/w3c/flute/parser/selectors/ChildSelectorImpl.htmlíZûoÛ8þ]ŬºWïâb)ìšµ ¨¶Ó¸—Ø­¶[`ƒ’h[­,y):®ûÇß”l=S'Mz{@Œ<ôr>çñ‘fë‡Þ¨k¼éÂ/¸y÷újнišκ¦Ù³{ðÛ¥}}'Æ1ØŒ„±Ïý($iö‡ºøÑœ¯ÎMs³Ù›3#bsÓ›_D'¢ƒä²É3­ {zGkýÐl鿆Ìi³‰·C@Ây[§¡_–Áyî.ŒÛÚN^½z¥”ˆ.”xªgxCCʧ8[øDn‰¹…p¿o×!œüNŽÏù×ùÙ/ÐïÙpz|| ÷y@;h¸ÖœÂ-e1G+œAÞbW`Ý Î¡8Öº ?ð&4 .Ø`¹ Z¦ê@k~ø ÚzÌ·”røvEÛ:§_¸éƱ FgmM7 3û³oaH)Ùg[ŸˆÇ:˜Ø»™ Ö‰¼-8s7 "ÖÖ7 ŸÓĺÐÞ}`b[cF0´Þ¿¶ÆÙWrÐ|¯­‡äÖ!lÊ£•!YÒÜ“Žì¥[&逆†"N@Á‰˜GQó±ßã‹¶~r|ü\+ây¾˜Ãu¯ˆ+ïDÎÄ:¾Ûú©¾È‹>~..°0s[’Ûׄu±“D"ájtÓ™Ïb΢MøþÕ×G}\}¦@ ü9¢uiÈ)Óá6¹—6’:xÕsï‡ýb(Ÿn Ë$͵¤ýErÑÞéŒÐ7o}ºi™ŽIˆÊ¡½ xõ+:¢÷0<8àÏ",ãõrIØö (7ªÍÁH.ä§ É˜ÞêiÃ:•RµÊÌè|¬‘sFéAöQð‘­_å Máé§´ Áª‰Ùô <—(|S&S¢¼H0&1Åüù‚çC 0’UºÀxlÑåh£\–¿œ§Þ8n@ÌÜJÉ…±¹9s§‹hI€·¢ѳ°]¾Io0Æ»©Õ{kuûÙ·²ÞÔéößXöà}qH7ãQ·?™ †o¦‘ ßÕŽífÒ×íTä»F•Zm¬²ùç-SZ¹:§'e?hªr¼ëMNUuLX•…S»{…õ.ßÅOÑåËþž]OÊ5Â(LÐÇqkìûÁ<ª˜¾%zQz\›`¦å72ŸïÞ#ÒŠ!R‘Óù©®Wå,ˆ«BE¡ÊiP²®ÐñsâTnõêa»ŒNc@H7UÕÿP'GOV|ç«Õ¡Àåÿ.2¼¿¡g_KˆäÔw-¹R踜jeñú²‘ÍHO0sÊ­y>ÜG‚¬x¾sþÇôÖ1åkÆ_PPa)fã;ÏE¼ˆÿž†OÚÛMž}ö$·BM°–9eÈ^<ß%C„ùž*D3H(G¥'þÏâ"—9¿ë$å«B:MûÖðëâòeGÊï×êi“÷½˜¸ÊÙ%*®våÕÚcð7ˆBzô5 â#˜ù!úðŸø=A.²`AâEe Œ¸?Ûiê?®|€GÎp$G°!>Ïþ=„yj¥u^fá¦v@**sN>ÇW Mjéj²éQÁVÓí'_¢Ý·ªŸ”øjOB-ºAfÇ&ù"ä1‰£–ÆØã²Ñb.Ϊ61ðiº·“lyÔmvÔ’XHù+Ô}î ŠÓw‚¼NBM¡–šf·8JŸÑ’Çg¿Ëï×å‰hêµ+z’塇9«^ÍÙ’ÁÖº ï©äxeÿ©u^Ù…(„åÉO˜T3=1óR,·76YQןùò;èâ™JÍ•T öÃÌþŒ’>d›.IÈ{W¬ÜyÛÍDÄíg¡Èîª' Ï÷ÊÆ—¤4±t^¶ÚÊ–ôýéÝ7L@×ÁƸɋ”,cô[Ëš]Û›½Àßðú|ŠKf¤ÐMõœ<À¢Ut÷‰:O’/,*¾{¨ÿÊâ¾§#œˆóhY8g<üûž‘PëŽIß–üîù¤ÄóI‰ç“ÿÏ'%ž-<Zx>´ýî9^b®Ñ+Îh6ºÑj+ƒ¨QœH,Í‘Ðúë¥yEç$0ýkŠ—þþbßAgw)ËçKoU'LÓqVŸU"ŽÃ’£žZãCÄ>ø…Ô½î†8œŠ=£°rØx½ê¼dtŽ©B\ÂO-¢•´nl,}nPo]RuÓLÜÅ:¦œÇ0ÀYó¹8úŠ|Û¦î"Ä(˜oëQ{´LÎT~È|bÌØN‰<ÅÛ˜±FæLïŒé;å©:u@pÄcTKþ Ð,bK|ûÇï9Xk$+ê¶Ñ Ç+ K«²ñgêG2ÌO+Äõ¼¢?8Ú13£JL·Ô34qìë®Sewº|2íù1¿¤¬Ñ |âøÏ·yx÷îaMmF<ŠÑû9ntxz½ë÷áŽì¦D½ZËS!Nz©¡cHBKBIMÍø×ÑNz¥áº…†1H©‹­±×²Z[>Fk¦VÄN#æ \ú1Ę›Ûã{¸.RT‚Kj% šÝËÞ+æßwÛŒ9áòpÌï/n䊪‘Á‘Øá›º½¦K‡2´²ºý&b°‹ i•¦Äþ$–¨ÈÛŠÿ¢€aòû/PKô ¤ý Ã/PKÕV 7:doc/org/w3c/flute/parser/selectors/ClassConditionImpl.htmlí[ÿoÚÈÿÝÅž{ï¸ê4º÷t9@¢@îˆÀi¯ÒIhm/૱¹Ý%”§ûãß샒4©útE xíÙ™ÏÌÎ,Kó»Þ¸ë¼¿í£%_…èöîõpÐEföß]tm»çôÐo×ÎÍ[gÈ¡8b⇶ݙ‚—¹ä|}iÛÛíÖÚ^X1]ØÎÄþ(Æ;èËÏP[>÷ͶÑü®Ñ‘í-^FšR†G‹–I"}\…—¹VÄZÜÎþùgÅD ¹$ØW#£7$"sâ#w‡þÀ÷Ø=GèþÝDèüßèüìò§]^ü„ú=½:;{…¤ <à!iƒ ÐU¸áÝÊ@pÐÂj _a(Ô¹\¢nˆ3ä{7Ž|9»Áj6m5‚Ñ ƒè¢$l™ŒïB–„pñÝš´LN>rÛcÌDKJæ-ô,;û·§°d/9fËœŠÛ&²at[ÏÖýr^Æ´en—'Z½¨•¾ÐÔéL4¾B£ÎÛ×Iö‘œ5Fß2#|ïb:ãñÚD^‘ܶz7mÜFh »!AnL}œÏL´ |¾l™çggÿ0‘GÂp}?FÑáAÔ2_™û‰¼èÃëê 脆[æ߿ƴ ƒœƒ$R\##ÝlPÆi¼- ¾ôéä„>+}¡„F8  ­G"N¨‰îu[êHNèäITÛ>ˆ|òÑR n ÍhrCÓ_Åôn{ à¼ȶi»0'ÑUNí‡Èeë_ˆþãä ~É6«¦»“D¹U4'Kr%_U’LȽ™b)ûWé~žO5sN 9iÚt|bíW¡¡Ãð$y¢÷ó ´$áºáô$y®¡ó1qlléˆòB˨}Š‹%Ï»OVáü±IV{Akåõ¡Ön«Eâáµ³bÔ«ì9ðâˆÙÛ o¶ŒW¤ðVM¬a¼ˆkq…èMø¡¬èû(VÁe¾JQ}H³BÀž‹…Ç^cʵ ‰ÇcÊìî2ý©nŠ¥ÆJ>p¿Iÿ-ê;Ó©Òv¢fô™,“• ‡ú¿9yÆ@;¢’jeæ ^"ÃOïnn:“÷—†šß`4êOÔå_êãjÐörwö:x!lÍéFLg¦ƒœÙîŽGSg²W]™lEø2ö÷7}çzÜËÏù“’÷úNg0L?YLŸp„2!( ™w¹b¦ÐBýQ¯2QЙ’Êô#KµÏ.$P¯ãtPêU ÎæYj–‚š•B­éÊqe@GUYŒÂ®)È,ò9Kd‡ÖØýÈ!ý þÿÙh ³±ª†v…>äÈFÓ¡ás»:aˆD²+½b½Ÿc°K…uè&(ü”'¤jÞÕáœ.ðOÕbŸôŒ#Í"8§êMÄXoÜ0ðP²à•ÄOEámÈ+Iä3TÔQ¦K̉¡O ®èé2Úy«òâ¢*¾‡¥9 c~…¾¯œÝºÇt_ íÙyü J¥ã”:ïû«„vÐg³ Z !ÈŸÍi¼šImÎÄ4T ù8bí:Ë\µK‰æy!Ѽ(eǹTZeWmGŒ=ݸ×PyWôR‰¨0Ó•œJ'Ä$ ©¡| –n)8ŠèR„I¼ÍñöbŸ´§î¬3êÍ lõÎ`<ª#yËq&ƒ×wN?óÀ^÷ß F³ë÷·×ýQe/I.‘R$…¦Ó9žƒóagô¦H<ê¿é8ƒ·%NãQ6¾:,ïx4|?ë^†%.ò‰(¯K$“b×ÛñT¶:ÃbßÛiÿ®7.ηiKÝVÇs½îçL­w]g<9ä`ÊaªVF]QU.šÆñ’ê3‘Þ…Wée˜g HYìES%èÓ€Æ~t"UŠÛ2‡zQ¾?ÛGî)ãh13Û•Û "¸¸í‹Ý•ý! Ù—(†^\գǽw)Áœ0£ˆlQyÐ['P§ò’OFðBÎ¥±XÌľBÞHŸ€Çê¡Dt)¸´·Ò8[Æ”çCÅs"yAxz×Ù­ÉLà¶x3EmMôÐìD†XÏ„ºææ`Ä—DxŽÔ¤3K›l[_Ø EOý¢¶ÆGà<‰]ÒÏb“ á1CXa?›ÊíâI¿Ûø¸ ³™ýbä4¤h·˜r³ŠKåBLlùð#ÖøsƒCÙ2Ûâ2€ÔΗYž rÔ€!œDµ¿2D($w“AŽì½¯ >oŒ¦B>³%R"-¦Q²$De=ç/mS7ŽC‚£/jÊéšxÛ‰ÓÏjD5%H¹H2x üto†Õ†q´Ä÷p/BäãŠÚ€#™¥@Ж0ˆA»AÞîÇÞF”§u·ç8déÈ1t¥Û€ý½|ô­PTbTÙxv¯T¶‰ †´Žåx¹”í@á\Ü—Ðñ@ªçÍøTa«D¯Tb«-›ò6ÌS"^G¤ŽˆXËXÍ…Ûÿ…;"ßÄuð5¶ìBß:ŠbÌwuC}v°Žx¬0\G[ðìû)¥¥QÚÀÉìȨíÍŠt>×?WHÖ£zG³¢Mö:Ÿ}ëå¡¥Ày© íIQ‹0ÈlǪyŸT&®sZYô˜åEån"ÜNöYõæãÁmÇRí©‚ÆËânªßÖÕ#:^=fw KðÒõb _Ùï¯ó[ßùZ1ÁÈWU*žgKÅ¡QQhé™V•`V/ee›ËâQX¾ÜY¬9e w"ôØ"L˜]Ž‘Û_NSäÌj¨²h:ùˆ2û›ªë‘]NïöثܱNUŸ­£öjÏUWÕ*ÏÔ[eu—Ii>CS­u½`?¢(ú*Ê,½”HŒî†ÃLúx©Ã÷&”'iä—‡R{äAR¹ÂÜ[Bv¹Ë%+kaIA~hÑÐkõƒégþ#¸­ÙøqãÓ¦½IøHÏÈ@çd¯¨úöçîQ(&÷R¬2«$_wžì'y²§v•GWœ€÷‰ÐNù[œ‚Ì'BU^Ñ_XÙÒvª\Á[ ©L \Æ“.Ò5Œ2]cè¯Q*xÑɯ‘-x?Ãr™¹}I³%…ëÞdi)[m.]Üžìúºÿ§}þ@=‹% CEgHØ“x]\$êhoja(j.9¦z.æ‰~Œ©T)‘¸ùGHó6ªsͪ‰Ák—µÏ3«žþsš4_¸éÓ!=ŸyèùS7æ<^Nrê›_ï)T%ࡃ¨Å§¹yß΢~;‹úí,êÿùYÔoÇB¿ ý» …r‡­ @—?}©uãõNzNíð)m±?SlVö,phkÚÛÕùýÅ~€vz)×ÌÈ^BÔHj<`\¦6Æpä£'bÃâ9ßb L® (žHÄä7–À‹nB±¿^‡; ½7T• Ø a²FQõƒØŒ€^|=‹=òRyDudÒ÷š÷ØÛ5Ç\=þýÅ­,ëjú„³ôh­‡Ïö†¬\BAËêBŽ«»¡´ƒ¢K‡)µé&~D'>ÅÁïPKc!¹!W 9PKÕV 7<doc/org/w3c/flute/parser/selectors/ConditionFactoryImpl.htmlí]ÿsâ6ÿÝ…êí•Ý9ÀÉfz7Ý3,Iné%$CØn;ÓFØÜ5¶k‹d¹éO’müE6&†Åíij›€-==½/=ÉOQç›Ë»Áä×û+´¤+ Ý|3 µ¥iŸ.šv9¹D¿|˜ÜÞ óöšxØöMj:6¶4íj¤*.uI©ûNÓžžžÚOmÇ[h“±ö…Ñ;g‚-«Ý6¨¡ö”Î7­Öˆ<Ýãiµà+çÁÂö¢«[E_VÖ»Ä7ÛïJZ;ÿá‡D#Œä’`CPFÿ!6ñ0%šmÐïøŽŽÝÂÿŸÖ6:ÿ7:?{÷ý¿Þ]|®.'èíÙÙ[Ä¡&µHD€®­5%è‘x>0R¸@-ôBýûá;4°°ï+Ç6xÇ®±No3\¹VG4”ŽeÚŸ‘G¬®êÓEü%!TEtã’®Jɪ龯¢¥Gæ]Em·µø¿m6/ÅivÕv[EPׂþÎcƒf ݱ¯«>-MJ£nt¡‡ISÑ“iÐeW=?;û‡ŠtbY.6 “©ñ\|÷]¬óïgŒEê±ÖáÝUߪێ¼º‚ëúê1IwÕ~|½9N8»JŒ»éÜô|ê9OYÆ·v÷ ÁôYŠé Á4–¹nubSâ©è1øÎeÄ;TºrÝ›¶A¾´…Yw˜d‚êJPÿÚ±)«?ëÝy>šä©£Í O¬(ïÚwöÌwC4žÇtø3óL½ZaoSŠ•{Q§4'×ü’q2&jX1¯I^ZånkóP=§!¥º=‚–¾ÌZزJñ3d¥ËÐ’Xn µ? p;;"ÿðø”g.–4éb€mΆÍÅžO<Í'aƒ‹¯E£ ¶‚›lÀi‡ 8áøêg4¸é?<™‡ÂFÕ¾$>€mšÓîèê—I²]‰µÈE.Ñ„Ö3Õ@ûooûã_ß)¢{ÃÑèj,>þ)~]¯n.w¶"xÅN½5ëÎ4@:µ7¸=LÆ[Ée«­]:ƶÆíÕäÃÝe²Ï;9¿¼šô‡7!ã¥Ù4Ŧµ—a… “I¿K‡ ]t5º”F A¸°ôx ¯µ 1¸! Ëþ¤RµÞöÀÒÀãô6·´¶°´vdi§ËQɃ+ ìºpÍ»6 Ûw³ß¥Âÿ¶Z`’Å µåÄgL&œ¶Ò1,øbPb}ËB¬Y±!ß@C6ðϱNüwÂÞ¡«aD­BÌÖö±žiŠré3â‘ÖÜõÌ2ua/ˆ n9J‹"VÄ ÷Q îè–»˜~Qpº·ßÂ0lò¿EßJ{çö’f½4°‘À“f‚2ÆÈý#SX^ ßø8˜Üóè‹`WæÿAð(…%=‚™ô2äy*€¼ÈD½‰YD“ÛÑxWl4ž0Ú ȇºVDÍ„Ë=a%!¯èAð*Ô”„Ô<æ­Œ§X ½Žî„Ñ®©õñùÖ^æÙT²ê#JØÈ×·1±ª‹âAh0w£§T{Šƒ"5g˜-T´)u¨V‡‚‘Úh±î;4ʨp( AK¸àAÕgÃ<©6ª»ÁlRt2­%š/Ð[ŠÍâQnÇïåÚhnD˜š§ô¹ e¦¾ËÍ#ÁG¹vÀWm\T½³ÉÝüxÁxù¿kîØ9ó:à'51k3XšVlüŽHúáQ–C:²6gí¾hH(a²qIž‚Ͼž~XQÔSƒÅÚ;¯ÌH\f¾óöžk°Tëxµ±‡{'Lö;¡=H˜˜š6 Íá‡HñR¾€ª¢³nP¨©$ÆVæ#èRjÈe·nÄlmô^‡ íÞ'ké°ž%#PïU-—s\´¸•~¿™x]éƒ[,‰öaLçž³šrB1 ‰„‚àm¦²g­ã¾íL¥¯q»~Xϲ/<·/9}1Žãܲù‡xƒ®[0Z7ùc-¿‰æ0JZæÿà΂PnbM´ÄþrÀÃv¨9ß4ñ»oYMDaCMô„Mÿ™ô,ù[l%“{K¦ H;r)’É©*¹¹AΑ$•"ÌFª]&Åy&“â’³š6ƒX”èwN:CÐ÷Üd‡´W,/r’}àA˜ídä½~³Í^ʨ=ÈaÈè=žþLKæ/„º«UúÂy<}¡œÊõ`o÷•˜/ ± Y AÖ.JDåÌvdÄŠ\Ķ¨Ò•O>ŠŸKŸ.Y6p–þÃÃÕ¸¬‰tFŸÑ ÆN”Íp`ék¼H"ûí!\8A³M:.z‰TÅPoÚð/È ¢§ÝYx¶o“éò8»ÇX Ï$"Ц¸òBVZ -"ô)í³¨"’¬#îI*q&Æ„®=;ÃAʇ&˜WuÂÕ'ç½H§[öÌ9phúˆDê†/0„"íºŽÃ|;+ÈT†b¾â—†‰#,)棆$&ßÙZ1èP”„Æ(¶RY ;ø•!Ÿ ºÐB _[%=Õ ßb"P‰ô³0Oažl ¶"òåMýNŒ‘&ñ,ºœ9¿‰$‡q;K‰ž xRò Evµ¥"@ıg¦ØQVkëÙZ%(+b8úš%u·3 q K²Êo #êír8^l1uÅñ£fT¥ ýÈÙ[¹è¾#¡«Ðï ~|Ì]LJÿØuœ‘ vcPˆ]ÕbâRsÕF‹–õ2püMŽ}L©nÈúìÌH%X÷z~fe.Þ§—¥«|šš Ñг‡Æ½Š@—Y1¯†jiq¾ÀXm`ÌŽu•k½,€å™H]ÑjwBo2p-“œF™œà2«’É:14ÊP“áO,>`ds+B†<üÄ Ádœôv't¼@¥—óDVS*Î¥NzÏŽ¼ë\Çî·’_4†Seˆ­º¸npm}X·¥õâh™@çK/¯ s—Öë绲֓²3Ç=×GRY﻽$Qaë ):ÒU –4ÿ ©8š¤3ê«ù‡l3CÍ=„ `¥g“9«©£ìµA é5ûí-Èu!ÉnƒÝn”©´u% ½Â7Ç‘ªª¬lUt2ÙΆjŽ–·÷äÄΦ§Ùi…ÑÚ^¯l äU7? ½åHû4RKüGÛ ’ë¾¹DªEŒ¹d¿Ò‚þWZÊ?â"þÑ–ï«.Ü†z¹VSì{Yå:Èb}ó©Û ¡³d#UÀe{­ Ð7»ûªÔòVo³„xªæI"wƒWUxÈvòk C‘1ïêjM9½ã Å_)É·¤rj—Ú³í8Eç™f|8+Noƒ«nÄ©Öņs:Z7ް¶òf¼tô}€Ý}ùâíé‰Õ ZGÏ«>VZuÕ…_iÂïs½2³«ô%§ú¯’S­î½3éöûlâÌuoé¶ÎÝn.©¶us)M±MmwˆVòíð '²ÑÓÓ­:u­8 Ë·²VCü=È'F°³I0ï†3Užs@Å2}Éü/4‡óLFùKgm {‹0-X+~ؤÏ&Ê<ÎxMÄß‹n"vH /ÕDívûœ‹"Øçg°Á»ÿz±ÂïG3z…íÛEc3÷ƒÅ ZhquÑ Ÿ»µYIbêówHçC¬tÓtµuJ9ͣ稉ë8K|Uq2g£wE¤”ʹPy°E¹aq¹–bUÔB’û¸ƒã$'3äè°ï©Q3‡Rg•:)¸Yß³£ƒyÇG¥Ÿ&ú¡Èúñr‚ÔË R/'Hý…Nz9Ìéå0§—ÜzüÅø+@ æ·ìÔÊÆÀq7Ü}ù¬ûŠ˜ë•vCØÒL×k±?a£“ß^m ô¢|àüN‡¯?Šc7Ã~ÊOoó™~©4>9že O&Ì?‘Ú¶Ý`'ve(, "¤ÞwYH°èu+™V,Ýo¯LÚ&Æ:ÓÔ-¨ë˵O(õÑ´fRöJbÆ Ñ—6xÁbÓèÝ'±f›Qg¢2mÏÄí¹5Â6m̽Fì Ó¹§F‡Í¡¦©Ðã14K<øˆ ÁìxOÿ€ 6¡¨¿†0E|mô†£ñ°gK‘Éø316Äž¿»À×á +ú¦‰ØaWc¦)šèx„0Saá³WhüÎôÒôÁyÌñ=ËÄ3Ó2é&ÉÞÞ”­éÄÃïýì7z4üÑ}¾!ëa¥Vø?*`<”e jÆwæô { Àð““fbû:ò¶¼µÅ&‚®kmÚèWgí‰ÙL¼ÀH|ˆ éRL|ÀfõṂu‚SlÃd‰`Õö’·ë™Xß´| ³EÖ÷ß^Ýóé|#8°Œ{t ‡JdoÉj³Að*þÓ Š¡¨Û»ÀûÃQ0D9Ɔýf€ßÿPK?§ØxPKÕV 7?doc/org/w3c/flute/parser/selectors/ConditionalSelectorImpl.htmlíZÿsÚ8ÿÝÅ[w¯l炚ٻi˜¡@Zz dÀm·3;Ãȶ·ÆfeÊÍþñ÷$ÙÆ_Ò&½Þ\™|±%=½§÷õ#¡öOƒIßúp=„_ûpýöåå¨zÓ4ߟõMs` à÷×ÖÕ%´ŒS° "{a@|ÓŽu ð£¯8ßœ›æn·3vgFÈ–¦55?‹ùZb‚ø±É3Ô†Ë]½«µj6ÇtwM–´ÙÄW)ƒO‚eG§Ÿ×þyî-ˆ:ÜZ/^¼PLÄ”+J\53¼¢e„Sì=|$7Ä ¸Âß7ÛZÿ„Öéù¯ÿ8?û† žŸž>)÷¸O»¨¸ð·œÂ e ŽZ8ƒ&¼Á© w=:‡¾O¢Hë‡/lF}êðÖ¿mªi´¶ïŸ€Q¿£G|ïÓhE)×ï7´£sú™›Né°btÑÑtÃ0³? CŽ’svô™hÖÁÄÙÍxÉvèîÁ^:¡²Ž¾[yœÆ:†Nú™Õ›Z0¹€qïÝËÞ4Û%—NÀs;z@nlÂæ<Üè5͵tåœ8ºm’.h¨.bûì¹9Ÿê°ó\¾êè­ÓÓ¿éàPßß×õ„%[ê=ÚG¾Ÿ 9\@ѱ#èèÏõÃBž ñsqtBÙ}Ln^ÖÇIZ(‰WËH7_x,â,Ü•?tݽ‚œÐ§¡Ï”Ð@|o‰Ò:4à”ép¿KɽˆjÛ{K?ʳÛB31¹Ó_„ôvw‚zãÑ]Û´qMb¨\ÚÓÀŽ6¿¡#º_&.ø“Îh»^¶?J”kEs´$òS%É”Þè aK9¹ÊHÌð|¨•sFéQ˶pàk¿ÊšÄ÷’g$F?®@+êoš˜S’ç5¾MS&S¢|ˆeŒcŠyËχ`$«tñئ냠r‘htÛÞz™Dxã´s*GŽœ0ˆÌÝ™3_…kÚ@x§!J.Ãf\!zÛD~ýÅ )¸¬Óç©W×iVȘ Q}Ì aefזȔΞVQkŒ¤üaüM‡ï ͔ٛº=ÃWòLØ]Ѱ/p·ò\+Üì…T«2gîš}ööêª7ýp®©ÅÆãáT=þ¥þ]Œ†—ƒ\ËAO„¥9ÛŠõÌã§wû“ñÌšôV&[S¾ ÝÅÕÐz=ä×|§äƒ¡Õ]&‚-¦K9ñü{H™”„Ì\'t`8T„'¬˜Yª¶ŽƒžÕƒÕó.ú†šcH?3”Ÿ©Ÿµm9¯ôp¨V8 J¼a(¸Àu†@‰ÆÄþˆC“þ…¿o6Ñ+oçeÔÎo ÍÈéµ¶ëã‹ËEëù>ˆt-*¾ #Q÷ġѹòz&(Ü”1B6#"N§(J{´R'¸&ýÈGPH–"s³µ}ÏQ.¢0Ö¯1•—w„ÒÀ ¨ÍÌ/YxT¼‚‡"LdÌèð‚ÒE…ýŒ…Ü“²[ðså7ݼ¿Ép-Îyƒ’WË@+ >ŒWðwáQßæ^°¢ S–;_°p=—:×Y-ƛڗÇ¡CRt¾n •¶ ¨ô¬¥s¸[AÔÚo‰¹g[û5n¼/F)Ô*¬t!×é@¬_c/;hjv»”Êëò¿”`îr¬Ð¥ÝY¯?ï?ÌÇ“Áp>^ûÖdz¢¹/’ ¶õ­Ñd\ É¯G—ƒ"Ñäêj8¶*‡Oƃ‘˜«wY  g}Ì=¤Ë“ FS|›÷ozýa¶W’áK¯ñðUϽ+.éz:ég³ÑøÕ|$’úÛÚµ]φo“”E~šédRÉÕÂÊœoo›RËÕu  ù@SÕæ­ ® 48U5Þ‡U[íöØWº|?E—/û{vÛÙU3fJЇqkœû«ÑW>‹Kö¤¦³œlrUd^êO癣صuCd'»ûËí“+/Šrmå²–òPÃäõYì¡£ÕýeûŒN#@@wõˆâØP@WHêÎR@‰q±ãwèÿWRÄrýÛöo‰èRpip¥ñZ7É'®G«%å‡1‘mHá!uJù–‘ÆWÒh‚Ml6¾‡•X4`·Š-H–b|cE«ñoo¤ÑÚohb’lÛ£X¥hù,)Cäzá@ÒâÂİ%A¥úú_ˆšâžá››ªPmbc¤zä º-JЉ>—·kð{q”‚þûQ=nÚ¿ÒWÙ¾õÕþ±¼|äøa@O€þ¹%~t ]Èû7¶ˆü*ˆO`E¢UÇž@ro±?ÑÔÜŸ`>œq†+9ñxöï1ÈV+í#3Cu*SQÓsãsx¸@R ‡ãƒ˜ 4œÑ<úð¾x UÂÃ)jÑ 2§Hñ÷1Iµ$ÔîruVr‚}ÉéS|Úrû9ËXŠ0nÿԮ㞯ÜnŒƒáœ=u)ÅHŒ|KA’ýæ0ì˜G½‰£W ·•½Çù·^@†ñ*‹x±Â§ò²ìHõ¶EóÄ¢j–Í?8Aj™Ú(Œ/gÉØÍ6Ôñžü½xl§z^0UȽ s\¤†ul'ðƒVž¦f(ƒ%ŠH±ÚyìX¶‡„¹±îóc«ÕßS«¾?Tü Õçå:Zû_®ò"°Ë(½„ù²j×j/ À»¡2c‹¦¹;$ŠxP¡«Ü \FM¬¿zo5d­þ:VõÇŠ¡<–‰¿ç©øÊ¦þ›žûÞ#±CÎÃuáFFÜøýÞ&QÖ]()ö–\ýÇ’wJ~Ü)ù_¾SòãzÇëÿß×;6kL"`ÅÖF?ÜìeÜ4êïZ‰„ÍÞvm^Ò%ñMoÚâüÆ¡<9LÐMeÅ|êàëoên²Îê‹\ĶY|Vk¼™ïÂ{Ï¥ðžÚpàÝ÷wqf¬6ÚnºO]bvðK›h%.¾kÔÝ–X]¡™‰³ÚF”óFh5‹ÛÁˆê-ꬌ‚å¾Ñ½Y¶'ébrªòæcÁR&ò¢scÁ™kÏ ¦§Ìv0& î®xŠl)Ã_  ´Ù{ÿÜâ;‡Þñ‰zmtGã騗K«Òñ'ꅢʔë_ø"†>;qñe*,!KL7Ô54q'î¶+w·ºl™¼ƒÇ[SÖèú±=ßãû¼x÷žÅš[Œ¸£÷SÔèòä9÷ËÙIˆD‰ÚÊË0nò¨¡cH KˆM.øŽ04`ò¤áîˆbFÉ‹m}q¨ƒ;û½Â-S;Lâè$Bg¾Âáþ=é±_#Žƒ¨”UÙ½ô½aÞ qö͈.ïýñäZîÛñý#ѱ¾jÚ+º¶)C-«9o< ÒaîÀâ4¥vbâ*¼ø/ &¿ÿPKÐäsî æ0PKÕV 7>doc/org/w3c/flute/parser/selectors/DescendantSelectorImpl.htmlíZûoÚÈþÝÅYwoÙÕ;$Ú{Õ, ¹@ZzˆÀm·ÒJh°pklv<„²Ú?þž™±ÁOJÒ¤Û+åáÇ™9ßœ9o†iþÐvì7=Xð¥7o_^õ; ×MóýyÇ4»v~m__AÃ8›‘ ò¸Ä7ÍÞ@×?ú‚óÕ…in6csn„lnÚ#ó³è¯!:ˆ/ë<ÕÚp¹«·µæõú€nnÈœÖëx+1ø$˜·tèðyé_dU¢­ñâÅ ¥Dt¹ ÄU=Ã+PF8uaº…ä–¸¡a×øûf@ã?Ð8½øõßç¿B¯kÃÙééH Üã>m£ àÒ_s ·”E­puxƒ]uÓ¿€ŽO¢HëÒÈ¡K>¦>uxÈúË•ß4U/ZÓ÷‚OÀ¨ßÒ#¾õi´ ”ëÀ·+ÚÒ9ýÌM'ŠtX0:kiºa˜éŸ} CJÉ>[úX<ÖÁÄÞÍxÄÓÐÝÂtî„~ÈZúfáq›Z»ŒmkdÃðÖ»—Ö(ýJŽœ€ç¶ô€ÜN ›ðp¥C@–4ó¤-ûDé¦IÚ ¡µÈÔ§0 ™KQó©Ïå‹–Þ8=ý—õýq]OLdCÝG+âÈûS‘3ñÇ„Ž/‚–~¦ïò¬‡ŸËKl'lÝÒäö%aì¤H$\-…n2óXÄY¸)ß¿úò2 Os Ïh ¾7G´8÷œ2nã{i#9 £Q>÷^àÒφr즰LÜ\‹Û_†í§í!:è­G7MsŠc¢rhσi´ú ѽð'›Ñz¹$l{”Õæh$—òS†dDoõ¤a•J)ƒZe ¦t>ÔÈ9£ô¨aÛ(øÀÖ/ó†:ñý£ðô…ôãZPUÇ”zž×(|Ž)“€)Q^Äã˜bÞ|Á³!É*]`<6ér´V¬µvÓ[Γ¯Ö bN©dß ƒÈÜœ;“E¸¤5À[5Q üpÖ0ã èMõAú>‹åRpѦg;¯®²¬ÀÌ™(>抰ˆ23ŠkKdvÂÀ•…ô’ˆ[QmŒ¤þaŽzï seÇÊà‰¥áë´v=†W–û‘ˆ„—®t)݃ÞïvVw‰»0L¹I3Ó^h†Ó?~{}m>\hjˆýÁ 7R—«—ýÞU7ódo†gbÆ9[‹áLâT§·;ÃÁØí­Wl¶¤|ºû×=ûõ°›ó‘w{¶Õ¿J€ Ó¥œxþP& ³—ç -è º¥t!æ &IHºÕžcHG€®e[kuÖFoÃs ém†ò6cçmÍ©ìW¦u¨âWØ ^1Ä-Ø!¸¢1œ~Dd¦ãï/õ::åaUFU÷SaÙ»Öt}¼q¹Èd–KQ÷]è‹ê?àˆ.”Ï£˜háîô"q3"â”(:Ñò2ÉìFÎŽP¼³r‚bµžúž£ü Rõvhx‰&ÊD7UJÄK†Á—±«v ”Þ)²œ·ÆX«=ùiôüX:ÂU;ëJ2’c?Šƒ<ëJPpXCá½¼b¸3ún4ñ‚e˜ÜÉŒ…ˉ´è¤jNbJ©Ý¯q%1ëDÏjˆg#G<Ï l9C­ ­¬â¶è{¼ž¾Æõ6ï)ELÅ,]Ê1Àn Æ€·±3pÌi!KW¥v‰`n2ªÐ¥í±Õ™Xƒ“Á°Û›Œ{W½Ž=€xÜùŸuìþpФÀëþU7ßhx}ÝØ¥âÃA·/ú²®rº½qÓ›…í²MºýÞM¬î«ÓK¿•Íð¦J× ÷ʲûïòCº ;½ñ¸?x5é‹|ý¶rl7ãÞÛîp§"ÛÍh8,ÕjcÑÍ>ošÒÊå)>fÙ@S…ä­h\h*pÊŠe¼Ô*­£ÚáµÖWº|?y—/ú{ze)W { 0V@Æ­±ï{Ó«Ò.©Õ³òw•©fR|#3ûî=b®*"3MÛ?Uu­|Ác‘()^5J6Ê<û9öLˆ ¼’¹ßߣ„ÓH#ÐM%I86ÐÍ7úbéÈñ¾Øùólð;tûk ñ<þÐÊ,.ËùV¯®)étõØÑ4§Ü ®áÃ}Ä Ò’ç»xxH¿Q¾fA¤ñI7¾ñ„D‹ñoný䡽]ÑÄòégbu+й™S†$ÇõÂ1X@ÌØˆ…p13)õÉ,B2ÙóÛÏT¶n$s•õ³u`oHÛ-q÷ɸ‚‹ç—:;·V›ËïÄÚU /Ðvµ,®ì‚Ó8~Р®‰ÀÌ Ð‘ÿÂ'è r}~ -:({AȽÙöDSÿq©|<s†#9 ñxúï1,U+¬ S‹<µyRR¨3òn›kRImãý’f›ì¤<úrî®E¾Qà¶] 5ï©Ížøë“ç—ZhÀ\óÁ¸8¯ÜÿÀWÉQ¼erp³¤’õBBxáàç0vÈ1áüæ’ÛŽ -&´é]“B\Ķé/÷²;‚Yúš8÷wÅ^iözœOëå$/l,q­RRXô«JÏAà¥]ˆzYô€˜B953/Å2Ûmãu¼™'¿åÎ﹩ ^ @•j/Hmù(écvþâ¼½wÅÒͼÝLäß~òL°|²Ü°h|ÉbcKgeË­l©Aß ~Ådqmüû›<ÏÜRF/º´Ùµ½Ùs4ï¯Ï&¼xFrÝ”ÏÉ=,ZFÉ¡³|"þJ¤äÛê/Eîzôbr.s‡â‡ßï °ê FþmÁa<Ãx:†ñÿ| ãéDÄÓ‰ˆ§ñ7ÙÑÓ„\qö³Ö W[?µêcJbñŽ\Ö[/Í+:'¾é­X]ì¥8ôgûÚ»KY9Ÿ;xû›:¾šŒ³ü ™NY|„T«½™ïÂ{Ï¥ðžNa¯»&N¾bÏ(¬6Z¯ÚÏc–—ðS“h-¾KÔ]T]ã4g±Ž(çôqÖ<.ÎÕ"Õ¶©³0 æÛZûºo§Ôžì“1•03¶S"×f¬–:0ñÕR†¿@4 Ùßþ¹Æ{ÖyŠº­µûƒQßJÃÒÊlü‰z¡äòã qýo„èÏ' N‹ŒÄLE¨ÓÇ-u M';tZí È'“®aðxKÊjmß#SÏ÷ø6 ïÎ=#¬‰ÍˆK1z?Eµ6O®wýÞß‘¤‘(UkyƤÖN.5t ÉeI੉ÂßàºÖN®4\²Ð Bî(u±µ/öZV+kÀ‡pÍÔ :I„š/pMèEanlï5â8ÈN ®¦•€hv'{¯˜wKœm=â„Ë£6<»‘‹©Z|ªGFtl‡¯êöš.§”¡•Õ…ì7ƒXd`H«4%v0±D…îVü “ßÿPK£¯É¢ù 0PKÕV 7Bdoc/org/w3c/flute/parser/selectors/DirectAdjacentSelectorImpl.htmlí[{sÚHÿ_Ÿ¢WÙ »u »ö®âª´€r\ $›ª­¢i%BbGƒ Wûá¯gF½Àر“\m¨ÄÖ£gú1Ý=¿nÆ:öýþ¦ ¾ôáæÍo×½6è5Ó|wÑ6ÍŽÝß_Ùýk¨g`3D÷€ø¦ÙèàG_p¾º4ÍÍfcl.ŒÍM{d~óÕÅñe§F.wõ–Öø¡VÐÍ ™ÓZ o¥ > æM:|Zú—™» j–p«¿xñB1S.(qÕÌð’”N]˜ná¹%nè@@ÿ¿^Pÿ7ÔÏ.ù×åÅ/ÐíØp~vvRîqŸ¶Ðpå¯9…[Ê"­p5xSuÓ»„¶O¢HëxŒ:Ür?‡|L}¼ Yo¹ò¦šIkø^ðõ›zÄ·>”røvE›:§Ÿ¸éD‘ FgMM7 3ýo?ÂTrΦ>u0qv3Özº[˜ÎÐYSß,Óaã¹|ÑÔëggÿÐÁ¡¾¿"®ë‰Å¬«ûhEy&DäLüpEÇAS?×÷Š<ëâçê Ç {7õ¹ý°6NRGI¤¸ZJºÉÌcgá¦(øþÕÝd„>Ë }¡„â{s”V,o×§Kzé û»eZâiGlRnÍÌŠ†áÊßôûÖèý¥¦të Ý‘ºüKýºêu¯;™'{ýŸ‰Åæl-Ô™ÄYNoµ‡ƒ±=Ú›­8lIù"t÷#ú]ûÕ°“ÕùNÉ;]Ûê]'‚Ÿ,¦K9ñü{H™ (™¹Þ¸\$3Ë÷AÈp@ˆÙ`†ã£KåûH&F¸;ވ݌ˆ8F2} o¼)âÄyB€sÈ%\w¦NDX­‘ÖQN(Ïqvâð‚MLäí•"ñ½¢Dä{Sæy«sÞ?âfíɈ¥ÏáÇRW­¬CÉx޽)õ¬CAÁme$ˆ÷ô1fœyÔw£‰,(ääNf,\N¤M'whcËÏ›#…¢›µ @´ž¢ôœÚ •ÜÕm1÷x=}…õo *TÅ¢]IU`§ Uð6ölíNg˜2ø¡´/…›ŒNèÒ–5x? ;݆)oËóÔ.ωJå^+˜^S¥ÁƒÆf—­X<|Ókö¨‹5¶Ú“dÁ&ãîu·mGUÛ"ñã³¶Ýrš$xÕ»îä ûýîÀ.%:=1—uÔéŽÛ¸OY8.;¤ÓáÝÄê¼¶ÚÝô[9 oñt_Zvïm^¥›Ñ°Ý{ƒ—“žØxßÔífÜ}ÓîXd§ ‡¥\mDOÙç'Ä@6÷BoÄàC¹RMê‰ËåR@ô´.߯OÞå‹þžîÈŠo/(Œ• ãÖ8÷ƒùÁ}Xâäg‡ßÌ7“’}Dìл÷(û±í_ì,ÓÖO‡¦W~ä,<ß­–¤ø4'Eêfxý;)Ä MÑ<ìg›QÂi¤èÊkœÓƒ=^áÝ»€€žÃòqäþ7})â#9ÿ±B;] .×[Y$}Ç'ïsÜ>Õ DGŠšwƒTk4î= €×’`{¢ò ”‹‹£ C|´Uã>ãƃåÄ•Üù9®äÊŽ|WÖmÅÕ¯Ò ÇB¨ÄõB!VÒ_Œg[êÙZ!ñ÷oªT¨§K…ÓÜ\ÏìXÉê.qª /z‘S—2tb;,®f¦<^QÇ›yò(G¾§¬2ofFµµzAª¦¨îì`ÆIvï$¥êRÛýÞFi Pn£=¿¢Æ‘2[ºWf¶:C9tº<к9}Ië¼0[ùoÌÒ–›ÖRß?‚Õïë×6yƦ¬^qX>¿ð'¸y6ÙÇ«Rü‚áqRE¹g>…OgÑUüujÉ7£‡¿P½ï‰­iÈy¸Ì}Š~»ç¶”€‡ŽnåßfôоŸÞú~zëûé­ÿóÓ[ßR}?Hõ·?HµÂ \b†1+N‹WÚáj+C§rø`£èb ’õÖKóšÎ‰oz+VM%‡þñl?Akw)7ÍçÞþª½'z–Ÿš$Ó)‹k•w!ó]xç¹ÞÑ)ìyWÄyyœ‰•ÃFëUë9£sLâ~j­ÀÅw"céqƒºë«>.3qëˆrAWÍãâ4>m›:‹£`¾­´ú=;ŶºS&c*/`1flÇDþaAeÆ*©?3˜1}Ç(#:¶ÃgMÛ§Ë)eheu!çÉ`GÒ*M‰V.nQ¡»¿Å†ÉïPK4xIÀ/ V4PKÕV 7;doc/org/w3c/flute/parser/selectors/ElementSelectorImpl.htmlíZûoÛ8þ]Ŭ²Wïâb)n°whÖàµÖ=?[i·À%ѶZYòRt\ö¿!)Ùz9uÒ´èak䡇óà7Ã4›?tÇûÝM–|ÀÍíoƒ~ôºi¾½ì˜f×îÂï¯ìáÆØŒ„±Ïý($iöFºøÑ—œ¯¯Ls»ÝÛK#b Óž˜E ÑArYçiÃãžniÍêõÝÞ­×ñVÚpÑÒi¨ÃÇUp•» ãV…¶Æ‹/”Ñå’Oõ /iHáÔgïÉñ"¢†øûzBãßи¸úå_W—¿@¯kÃó‹‹ç á>¨…!€ë`Ã)ÜQ£á…K¨Ãkì Ú7ý+è$޵^@W4äSP—G¬¿ZMSu¡5?üŒ-=滀ÆKJ¹|·¦-ÓÜtãX‡%£ó–¦†™ý9H²•ì³¥OÅcLìÝLÜu"o΂ˆµôíÒç4‰/´ö˜Úí‰ ãkµßüÖžd_I· ø^KÉCØŒGkB²¢¹'–ì[7Mb†¡"N@Á‰˜GQó…[ßãË–Þ¸¸ø‡. ‚5ñ<_ŒbCÝÇkâÊû a"gâh:¾[úsýàÈY?××('ÝÒGäî7Â:ØI-‘æjëfsŸÅœEÛ²á‡WŸö gôEÁèKe4À_ µ.qô«ÐP'Ap’=}ÑúË´¤ÁºŽõô${^aãûÌ1e0e"Ê‹ÄÆ$§˜¿Xò|Šf²*˜Mº:Z+O5«é¯i†×.j3·²eßÂØÜ^º³e´¢54€·jb¢ETÊ+Loš¨²¦ªX¡—cú|êc‘v æ\Ì<æš°˜23Næ–Øìú ¯ÚÞ{âæ#1'½7д§Sö4Þðyºû^' =9‡Žz¿Ûy…H»'&ÕÑÌxI G~z;¶'ï®4åW4êMÔå_êßu¿7èæž|?ƒÍÙFø6KªœnuÆ£©=9„¬,¶¢|y‰aÏ~5îæ}þ¤åÝžÝîRÃO6Ó£œøÁ¬LJFæs®HZÐu+™BB–Lò¬Ô^H @·m·¡ õÜBˆa¶¹†„˜¡ fì!Ötd¿²¢C%¯Â.ÐÚ5C£¥3A4ÆÎ{l‚tô/üýg½Žˆ¼_QÙ·#""»Öš^€7å« H d“}1åÏ1ÿâ+…vl&$¼½RdkFLÜ¢–s(6Ø¿ÑJo|¡1}:ä  «öÁOM\oœÀwÌí=âÛÞNn!嵐C1‚™&~êp\2ºÐ¿JmËÄíbÍÅ ýˆó¶/_ ŸnÀ•¾­­<¶dj'ÀJ²>-(!X&U©ñ¡½b»sŸ^<óÃ%eXž¼ÙœE«™ŒåìØh%ôR{œp’6 EÀY%Ú(ÐËsÎÑlÅHÎè¶è{ºq^áZÅ;¢•"©b”®¥°÷„x›`¼ Ìý°;¥²}¬ÖK &Ñ6§ÚûÆàáñúh*ìÓ­0µ3µÂ@B¯=¢ñ2€ýšÃ˜>´wë}ŠgŸ}‘al‡š ± ÊÎz¾K8ÂWf¨Ø~y•pÐ=£ý$YÊM3GˆqQµ_-Ïþ=…k¥hfE©¶n*(H®}ŽHDŽòèd·¦‚F§û8_|íøPúÒ(é®4µƒÌV“òû4:›æÎ‰ä·˜3ËËêÝ|žî"%»'Ç÷MJ¤|¹¸_äY í…{hov»£„±„è–@–ý†.¿·—'¹)P¾)ŽÛÈrÜñQ`…‰—E®X1àyöXéÒp¢iy1•G6a xßiLJš,}£ÛÁ fý#œ\Špw $Üiî¹–Øõ’½¼Ü~ßtM]i8»â¦ŸÒœsbA˜ÙlRÍ>¹á˜TðC"Uî!îqT ‘(Ùe5šò|ód@åÅžScšŸ ƒ½¦'B><_ &zÀB‘¢Vc!OZËXÜ:@¾m5ÚÊã‡sÔψ|Þ®“#rÈó<(ù"©â;¡ã_%=ô¬Šq­ §>’‡ßî‰eà±C+Å·9?´ïçV¾Ÿ[ù~nåÿüÜÊ÷#$ßüí WX!DΊs²µN´ÞÉÔ©?Ò%öhù›•9  ˜þšÕÅöKÿ8;t`í/å¤ùÌÅÛ_Õ9ßÔÏêóbÄqXrÜV«½XàÁ[ߣð–:pÐ]G„±gl¬oÖÖ3FX Ä%üÔ$ZIKàÆÆÊçõ6%UCfâ.71å<†>ŽšÏÅdä6u—!fÁbW³†};£öü°tÈêñCæcÎöJäYêÚœÕ2'«çLß+OÕÁˆ¨cÚ€OP-eø 4DƒæÃå€ÿçï9´7HQÔmÍê&ývÖ,­*ƨÈ&߯Ѯÿàhúó9ˆC61R1ªÄšqG=CGïî;Ùw/ ä“Y×1yüe5+ð‰ã>ßåÍ{pÏhÖÌfÄ£˜½âšÅÓë}¿²› ‰Yj#àÔ¬ôRC`HKBžHMÍù–0ÀôJÃ… cù]êb›@ìg­×Á΀wц©•qHbdÏ|©1Öf@y|¯×EbJB\”ÊBìAñ^3ÿޏ»zÌ —+¾?Înä«–œw’ÄᳺÒ•CFY]È~“f°oãŠ7)Sjå+NÜ‹ÿbÃâ÷?PKÙ)ãEE I1PKÕV 77doc/org/w3c/flute/parser/selectors/IdConditionImpl.htmlíýoÚHöwÿ³îÞ²Õ4Ú;m(†=8íVZ í¼56;3„rÚ?þÞ|Øø JÒ¤êi‹òaß›÷ýæ½aÜü®7î:ïoûhÉW!º½{=t‘Ù°íw]Ûî9=ôÛµs3DçÖr(ŽXÀƒ8¡m÷G¦àc.9__Úöv»µ¶VL¶3±?ŠùÎÅú²Á3Ø–Ï}³m4¿k4Fd{‹¤Ñ€[ÉCˆ£EË$‘‰>®ÂËÜ]ÄZÔÎþùgEDL¹$ØW3£7$"sâ#w‡þÀ÷Ø=Gè~ÝDèüßèüìò§]^ü„ú=½:;{…$#<à!iƒ ÐU¸áÝÊ€qÐÂj _a*Ô¹\¢nˆ3~7Ž|)Ú`µ›¶B7ša}@”„-“ñ]HØ’n"¾[“–ÉÉGn{Œ™hIɼe˜–egö–„’s¶Ì©6‘ ³ÛZT7öwÈ]xqÓ–¹]œhÝ¢VúAS§3qÐø :o_w&ÙGRdŒ¿eFøÞÅtÆãµ‰"¼"¹‘¶œ ›6n#Ô„Ý 7¦>Êg&Ú>_¶Ì󳳘È#a¸Æ¾ ž«{¶Æž¼?,r*þøX‡QË|eîyчÏÕà %·Ì¾i&9N$»F†»Ù< ŒÓx[f|ÿèÓä˜>+0}¡˜F8 À­G"N¨‰îõ½Ô‘èd!ªmD>ùh)n ÍhtCã_Åøn{ žymÓvA&*Eû!rÙúpDÿqü€ÀDP²Íj…éî$VnÎÉœ\ÉO'ro&ˆ‡HJ *#0Có©$甓Ävð‰µ_å †'ñ3ÐÏËÐ’„ëäÒ“ø¹àcìØ2 Ø2å…æQÇ Kž1‘¬ÒÄc“¬öŒÖÊ‹C­Ý V‹$Âkg5ĨW 9ðâˆÙÛ o¶ŒW¤ ðVM,a¼ˆkqëMè¡,ëû,VHÁe¾J½úfÀ=«Ž½Æ”j3Ç”Ùý¬ çLõ€Xl¬d݃œôߢî°3*}'ŠFŸGt+pn}Ëõsò$+œìˆ:ª™3v Œ>½»¹éLÞ_J²ÁhÔŸ¨Ë¿Ô¿«AØËì¥!ìÌéFH7Ó ÎlwÇ£©3Ù+­Œ¶"|û{Œ›¾s=îåeþ$ç½¾Ó ÆOfÓ'á¸LJLæÃ­X%´PÔ«,t•°¤²ôÈbí+ é¨×q:¨€õª NæYÒÉ,ådVêdMWÎ+“9*•S€œ®)0,ª8KÔ„ÖØýp¡ý ~ÿÙh€7§a•æu…&ä´FÓáÆç"cu kP<Ä*?Ça—ÊËL`ø)A(Ð,†=«Ã9 \ žªE˜ôÌ# "(§ŠMØXoÜ0ð” !‘Õ˼§|ð6”’$ò*j'$1ôi®^ÂZF5oU\ÔÃ÷°òTȯÐ÷•¢­Ûy·‘Q«}FtÞmPÉ9e¼”€÷ðª†$ôÙ,ˆ–„Bæñgs¯fR•³ƒÖ0 U5>Y‡„.,Á©Ú¥Úò¼P[^” â\õ¬ ̓ µ#æžnÜkh‘ŸJÕžÂLWR” „p«ýø˜Oº¥œ|(‘K&ñ6GÛ‹}Òžvº³Î¨7ƒlÕ8ƒñ¨ŽäãL¯ïœ~æ!¼î¿Œf×ïo¯û£J(‰.=¥ˆ ·Näa%âÃÎèMyÔÓqoK”Æ£þl|u˜ßñhø~Ö½ KTäÑN—P&EÐÛñTÞu†EØÛiÿ®7.ÊÛ´¥n«Ó¸^è󦋻®3ž 00U ¢n¢*×Jãxõ™žÞ…OÑÓËnžíe°gM£OãÌ0÷c+§BÒ–uÓ‹ÂàlŸ³§†£Å ¨—²½È)nûÇ"¬2;òRûÒK©zô¸¿]J0'ÌÀ("[T^ô&lj~ΦªO&îB…¥]°Xw}…Îw#Y|"¿;Öù$¬KÆ¥½•ÆÙ2¦<Ÿ!žÍ„§£ÎnMfÂc‹ƒ©Ë>¥_v"C¬a Ba-ós0 âK"·ÔPoŒ¦‚?³%\"ͦQ2#$c-ó—6¨Ç!ÁÑ—³ãtM<éÕ‰Ógµ ’ª+’L¨ÝÛ`µa-ñ=ŒEˆ|\Cóp$+ÈÕÒbPmAœû±·h]§ë9Y:s  t°¿Qt¾ZJ,*ož=•aâ‚­cE]®F;Ð ÷t g<ëyK¼uÒª²+µÒj_¦¼Ýò ‡Æ©#"–0VGs3ÁaDÔX¹Æ–]€­£(æÁ|W7ÔÿNÖ•×Ñ<û÷”Ò(mÔdv^ÔîeEýžƒÏ5ž”ƒ}§Þ°¬h;“­Ìgßbyhí^j<{’Õ¢dv[•ÜŸn“¸9¡Y,ÆÊò¢¼YcɪÞX¬ÞR,5˜*Q¼,n“úmÝ"¢ã-bv°äRº),ùTöëèünv¾!Lüâ«êϳýà‰îPÑPiI«Z­ {—›¯²Áe‡(Ì^ëLÙÂ=¶Ùf—säöŽÓZ¹»â²šªÌš®6¢ÌÞ¥=²ƒ©sÜÞ÷*w£SÕg[¦½ÚsTµÊ3­UYÝ¥@RšÏàTk]/Ò辊ŽJ/Ò£»á0S/^ꔽ åÁù…À¡ByPE®0÷–PNîrÊZXR šDÜèõùÁxàgþ#¨­ÙøqãѦ½Iñ‘‘‘q“£¢ê›†G¡uÜGH±§¬’|—yrœäÑž:TÝ_>À½Ot픾•ñ³S<ó‰¼*¯è/éXÙ^vïU¹·Ú¥2=oÙŸtK®Ý(z܇Øá¥ÜáÙ÷3,—‘íKš-iV÷&KÛ×jsé†öäÐ×ðŸŽù=,”XÜ*;C‘žäëâ"QG»xS CÑgÉ9Õs!'ú1¦`¥Hbð%ŽPæmpͪ‰Ék—µÏ3«ÿ9MšoÖôг‡|<ô8©s¯ 3õà×{¨T1xè\iñiNãÛÑÒoGK¿-ý??Zúí”ç·SžçSžÐê°$®â-–Z7^ïdÔÔ¸û¡1åÁfeɇv°¦ ±=í‘ß_ì'h§—r½üÁƒÛ_Ô8‰œÕ§¹±ëRý2ŒQ{ÓÐGwÄE{Ú5ñòÌ ÀÊaÙfÝþ’äq‰~lb£D%ô˜µ ¸EüM‰Ô ˜{Ë #œ34«\—P€:Ä[F‹]­}3p2dëûÎ4K'ˆh€­9M‰È·œjsZ˼ó4§fJèýÀjÐÒéëtÞÇ;²— 5’þ$—Ɔ©M1ùè‰È°xη˜‚“+'1ùõ$Т›PìÁ¯×áÎBïã Uíö„“0ÙŸ¨^ˆAnF€/¾‹Åž5)Ž<¢Úƒô½¦Á=öv Æ1—+Õï/neKWÓÇ–eDk=|Ö´7då ZVr^ †R0 —NSjÃM¼'þ‹ ’ßÿPKëUщS ã8PKÕV 79doc/org/w3c/flute/parser/selectors/LangConditionImpl.htmlíZ{oÚÈÿߟ⬻·luÁv¯š$ ¤a/Üv+­„ÆöÓ›¡\í‡ß33ü"%iºê•‚ñã̜ǜÇïxÜø¡;ê8nz°ËnÞ¾ô;`ÖlûýyǶ»N~¿r®P·ÎÀá$Œ™`QHÛî Mðc.„X]Øöf³±6çVÄç¶3¶?Ëùêr‚ä°&R£-_øfËhüP« 鿆Ìi­†§J†€„ó¦IC>/ƒ‹ÌY7K¸Õ_½z¥™È)”øzfxCCʉ >¸[øHn‰y…pßßÖ!Ôÿõ³‹Ÿ¹8ÿz]^ž½%ˆ`" -4\kAá–òG+œC ~é }Ó¿€N@âØ Œ(ô•rýå*hØz£°ðp4ÍXl/(&ˆíŠ6MA? Û‹cœÎš†iYvúï0ÂRTjΦ9‘—M°qv;QÖü-¸s/ "Þ47 &hb]hî?0qÚcF—0l¿{ݧo)¥ 0¿i†äÖ%|*¢• !YÒÌ•–š©6i†"n@Á¸O‘ó™ æ‹EÓ¬ŸýËÁŠø>“kX×çñŠxêüLŠ(¸üñEÇaÓ|iyÖÃÏå%Ž“fnšCrûšðNRGI”¸FJºéŒñXðhSüpëËd„>Ë }®…°9JëÑPPnÂmr®l¤:Y‰òµg¡O?[Ú§Ò2Ép#…BŽw[#ôÍ[F7 ÛE$©RíyèÆ«_Ñý‡Éƒ ’a¯—K·'‰r£Çœ,É¥ú”I2¦·ænà1–йªLñ|,ͧô$µ$|dë—yCÁIòô%õ·hAƒU ³éIò\!ñ]âØ* Ø*ÕA"cSœÍ"b€‘¬ÓÆcƒ.‚VŠå¡Òj°å|ᕳ ÄÜ+¥ì{QÛ›soºˆ–´‚ˆfE šG̸Rô†ü -ú!‹åRpѦ/÷^}̲R”ÀžÉºc¯)·cPOD<¶û~¦ÐX»ª‡Á7Π=™h[ïŒ _ÇpÒѬ-g.Þ?Æ|ØûÝÉ2/qµ;ŒRnÎÌ’†áÒOÞ^_·Ç. ­c8ìõá_úße¿7èf®ìðL®¶àk©ç4Isf«3NœñÁ|ÅaK*‘qÝs®FݬÎ_”¼ÛsÚýÁNð“Åô© ,¸‡”»!³A—Ç Mè »¥P!Á ®HzÔ_(G€nÛiCnÔ˺†›g)w³´»Y{wk¸j^•Ò¡Vá(늣ÈÏYZ#÷#ŽF,ú~ÿ]«¡?ÞÍÅ*™Ù•ÖP ?À_ÈÜÕt)+½}YïgÄ£ñ…öt$“#ü=K„jVLŽ3ãÜÅO…Œ­PÓ³Âåé!eOl…ó)JP’îefq[?å©õâË /'¤–ê;ûípJ !Ý”ÕãSýM#/&îºJ\0¹¾Cç»V">’ßÝÕûìDW‚«¥ÖÙ ñ xNÅþª³]Ñ©ô×üŽ»>¦S¶CCV±9åXÍ|æ bAÕc5ˆf uN4unýÃë‘ÑriäÝŠÈão²c*Ö<Œ iz©çZ=û9ž2~^åk’Œ{Žú¶ â^8Lç…Ó¾ˆÓ£\yAÒ*Ð?×$ˆ«0c!úëÿðŠŒO9¸ /:H[…0l¶­ú?ö;U‘öØ*léßSˆQ€ù)Ü®ûޒ쟡ÏÀ–Ü£¨%iuK@Ë® þæý¾•£^€-]%jÞ R}ºÖûø°‹œ“ F>^çe½&^ݵßIgz¬'-•!^ä{l¿•@ 8 1Ò]dÁ©PQðªô†FöIHPì<ã»Âõ4ž8Ñ!JÊq¢iY¡.Yíbé..¶BrɋIJ´·ÂCKµ\v5GæÙÃdE=†í¹ÜÑË?€ÐSEÓõŽ…©ÞW“ÞÑ'Yîà{¥O3ö¦OÊíÁâ»ú[nh]‘‹ö-ÄŒ6µ&/·pRƒ![ƒ¿ÂxšÙÉ6Ë=2ú‚ݲI>yÄXò´ðøCÆûncº‘Ñ2·!˜\ü~73µ€Çö3ów3zO[šO[šO[šÿç[šO»‹O»‹O»‹ØFÆKL2hå;T•N´ÚªØ©ßî—ÝÂT¶^Ú:'ÍV¼&›[þñì0Ak¨ªæsOÕo€íô,—€¸.O^Å2*ï#øðžùÞS¼+òå1œ‰µÃÆëUë9§sÌò~j£À%ðbkÉ„EýuÕ5.3ñë˜ CW ùj‚h‡z‹£`¾­´®ûNŠmu¯LÆT,äŒX3¾g¢Þ²«Ìx%õÎÝŒ›{æ;v0$ú>@ÇÈ–rü Q YÄ—x÷Ï5ž h¯£èÓJ«?÷Ûi±Œ2¢,²S~\¡\ÿÅIú¢ rv,W*F–˜?n©oòµŒ»Þú¸Ó Ô•i—ÅPó&d°'‹±[MÒ”|¤„%*ò·êåL,`˜üþPK(·yw„ c+PKÕV 7Cdoc/org/w3c/flute/parser/selectors/OneOfAttributeConditionImpl.htmlí[{sâ8ÿߟ¢×³7ìÖLjïj³@dÂ83;U[EɶÏ›•EWûá¯%Ùà„¼fçj‡Êò»Õ­î_KÝB®×¶­×]˜ó…×7oû½6è5ÓüpÖ6ÍŽÕß.­«>œ'`1D÷€ø¦ÙèàGŸs¾<7Íõzm¬ÏŒÍLkdÞ‰þNEñe§¸ —»zS«W« èúšÌh­†M©ƒO‚YC§w ÿ<Ó ¢F‰´ÓŸþY ]Î)qUÏðŽ”N]°7ð‰Ü7t à ]púo8=9ÿé_çg?A·cÁ›““7 á÷iMþŠS¸¥,BÅÑ gPƒ_±+h]÷Ρí“(Ò†N[œ3ÏFâv¸r˜½ÅÒ¯›ª+­î{Ág`Ôoèßø4šSÊuà›%mèœÞqÓ‰"æŒNšnfúgÇaH*ÙgC‹Û:˜Ø»ÛÝ Ø3'ôCÖÐ×sÓØÎÐØ~`lµF /`Ðzÿ¶5J?’Ã'๠= ·6a.uÈ‚fî4eŸH]7I44±} vÈ\Š’OtX{.Ÿ7ôÓ““èàPß_×õ„7OU;ZG¶O„Šœ‰?. êø hèoôÝ@^uñsq|Âà }@nßÖÆNNQ©®–Òn2õXÄY¸.*¾{tÿ2JŸä”>SJñ½jëЀS¦ÃmÜ–6’:zå¾÷—Þ Ýua™˜]‹ù/€ ~»9D”Þzt]7m“ •C{ØÑò¢û8}pÀŸE€F«Å‚°ÍQª\+ž£5¹Ÿ2MFôVO÷‰”4(UFcJæsœ3J¶…„Ïlý24Ôˆï¥OOP¿¬Bsê/k8¯¥Ï%RÇ”“€)Q^Ä:Æ1żٜgC 0’ÕtñX§‹¢•âBQiÖ½Å,‰ðÊI"æ”Röœ0ˆÌõ™3™‡ ZAx£"–?œ…œq…êuåAZõÝ,–›‚‹6}³Eõ>Ë =Ps*V sIXD™QŸ:žkj€½Á ;R—ª½n¿“¹³3Â+álÎVb“x–Ó›íá`lv¶+²-(Ÿ‡îŽãªk];Ù1ß«y§kµzýDñ£Õt)'žÿ-†‚’٘˧ è:¥™Bœ*Ì™Ì?Ò\»ôB:-«9®7MÄF›cH¬ kÆku[ö+±ó+ì µ^2T^¤x†H¡ý ûÁôôOüýg­†È<,Ï8(Ã’"´ºëcÃåb:kù>º‹¿ =‘L‰C£s…~$îV8foFD£(¨ªåi¶°é(!ykðDåÊö=GA Dpx[xsN¸ä­–"ñ’ÁEpÿ_¢fÊLïUòœ·É÷¸l{ò¦ÕoàûÒa.›YhÉÈŽq}ZP°Œ©ñŽ^%»Sún4ñ‚9e8;¹“) iÖÉ^ÏèšJ/LJMœ"Àš…$ô4—„ž2çLš­2Ò½+º%ú¯ìK¬<±z •JR…›.ä `;ƒÀfŒéCø´ óö¾É^ª0 ×ÙNèÒæ¸Õž´ ÎhžÕª oYÖ¨÷öÆê¦hâÁÛî»Þ`rùñú²;(¥’ì)yVlZÝ•§í„÷[ƒwyæA÷]Ëê½/Hº“áÅ~}‡ƒþÇIû²×/H‘OD ^`åI¯‡cÙjõó´×ãîMg˜oÝ”¶-Ÿê㜠`jA¹i[ÃѾSS¶hÆÕVézª.·žˆô6~òH/Â<]\Ê‚a§(Œ•¢Ïfìû±IÖ \æY¯LvsùŸ³Iñêyp3‘Ýü!ϧÀâ‡ñèäªVN€ùΊþÃâU\=zÜß6£„ÓH#Ð5ìÝd9Þˆa•ݻ䒻Ùù”ï+Äô•Tñ™à|¨òJT—ŠK+‹GóñìÄóEâbFùö®µYÒ‰€zþæßωÑV ‰erF.—®çŽ.>§r{Â)¨Ñ§VLÙ6¾°gò!û×8©ŸÌ!‰ƒ¶7^Ä9#ÊW,ˆ4áŽÝ°J÷¬GÝvíná×D¬Gæ«U“ª]Æõ¦œúGÌ…š:õá=QíñeKoŠKSGWf‘r ‘½zÄ„Oˆ0ˆY’ÞŒz JÒ÷¾2 ¸¼6 ýôfh ±šZÁ¥8aÇcþÒεÃЧ$øk|:^RG¢=qèöÆ‹zS “<štî©ÈÝùc±Š8ÌÉ-Þ €Þ-±žö8ÈLçs‰‡Íìÿnè¬DA\§ô)ñ£mÏ!’²µýM£ö½°Xâ]Ùxñ8UN s5%„™ünO͞߉Ó?í\/›>¨¸WYa¡ºWÛFÅ ç¨? h¨Xæ¢*LEüxÿÅ;"'ÌU ºhÞFÚ*!÷¦›ª¦þ·|¿ OvãÔû÷N 51¤Êa¸ÿS`WÅr~kÙmÆ5/®yÓ»¥œÇUnèéï÷³ß d+ܬ_U{š.pè^RÆ#-«K`T¬ ‹Ø‘%¯@P‘X,~E·xlÅ(Ü.ûÈì±o“)°7ùvÕUQµ8 R{¼ŠôÀNo<ñî°Wºk¿5}ºÖÛ™=S–›Ä™ûiKù¥sí€Ðº¹Úñ‘‘‘‚ÎÑQQö ØÃ#Wçî"$_—I¶$>:N²lÏ*.†ï#¡½•o¤pv 2Ÿ UYCI`¥‹íª2%x9¤REyOñþA £éa =°× %8]‚kéü žKíKº-© w.ÛÖÔåì£C?¦¿?æ÷ÖÐ+°hhjvÆÊ!™¯ó‹D6áªâû¢ø“}ªçbœðCÈ4äÚ2‰›?bâˆiÞJWŒŠè¼r^yš[ãῤK³d|x¦äÌþã3=Ÿk‡œ‡‹ÜI×øæ×{JW)¸ï nþifÚ·³ºßÎê~;«û~V÷Û±ÙoÇfÿöÇf±Þ‰8Cˆ˜ïUÚár#C§²ÿ»Ø© ÷V ³OgÄ7½%«‰s‡þþj×As{)Í×6Qï8%ã,?#Ol›Å¯i•!ó]øà¹>Pv²+âõ(ì‰`£Õ²ùšÑNâ~¨­ Åw"cáqƒº«‚¨+t3q櫈rA½æq‘abjQg`Ì6•æUÏJ‰­îÊÓ´/`1¦l+D¾GV™²Jê­²)Ó·Âq0 ê5ÀP,eø 4@…¦!ÃâÒû3cÌb[+LQT³Òì F½VZ-­ÌÆŸ©˜W~Z¢^ÿÁ† ý± â ñHx*B‘8yÜR×ÐÄë‡Þf8ygÒñ" oAY¥é{Äö|o²ê=¸gTkb1âRŒÞÏQëºøzÛïãì$Lµ¤ÈCÉ¥¶ŠÔÎ \x&1Q8åkÂÐÉ•†Õ "ù%*Êb+_lÄ/—þƀኩš8$‘,RTAáÜ È/¾1&Žƒ‰) ªÛƒì½dÞ-q6µˆ.Ï_ÿþêZÖu•ø¼·ŒèØOêöŠ.lÊÐÊêBö“Á–,ª+ž¦Ô®›xËPü N~ÿPK!š“$i E:PKÕV 7@doc/org/w3c/flute/parser/selectors/PseudoClassConditionImpl.htmlí[{“Ú8ÿߟBëì…¤ì™Lí]í,PE€É°ÇÀx’MÕVQ²-À‰±YI áj?üµ¿ 0™ÉæjCÍòÕR?~Ýêrý‡Î°í¼¿í¢9_„èöîu¿×FfͶß]´m»ãtÐo×ÎM[gÈ¡8b⇶ݘ‚9ç|yiÛëõÚZ_X1ÙÎÈþ$Æ;èËOQ[>÷ͦQÿ¡Võ-ž‘Z š’‡G³†I"}Z„—™VÄ%³ÿüóÏj1äœ`_ŒÞˆPÌ‰Ü ú€ï±{(ŽÐ üþºŠÐù¿ÑùÙåOÿº¼ø u;zuvö IFxÀCÒ «pÅ º'”ã … TC¿ÂP¨uÛ»Dí3fÜ2²òcyÝŽ#_ÊØ[,ú­Æ1êa}D”„ “ñMHØœn"¾Y’†ÉÉ'n{Œ™hNÉ´a˜–e§v–ì%Çl˜cqÛD6Œnk™ÝØß wæÅaLæzp¢•ŒÛ;­‘ƒ†WhÐzûº5J?’²cø 3Â÷.¦/MáÉÜiÊ1¡wÝÆMd€¾°äÆÔ'0ó™‰ÖÏç óüìì&òH.±ï”çªÍ–Ø“í3Á"§â€ux5ÌWæNg]ø\]ÐpÃàûט¶asàD²k¤¸›LÊ8×EÆw>/A†é³ÓŠi„Ã`Üz$ℚè^·¥Ž¤@G Qnû òÉ'KA».4£É MG\лÍ!@ô> ëºí‚L¢«íyä²å/Dÿaü€À…w²Õbéæ(VnÍÑœ\ÉO'#ro&„û¦”}`Vé~©9KrN 9Jl:>²öËÐPÃax?=Ñûiš“pYƒ z?×Ðù;¶ ¶tDy¡yÔ>EƒÙœg] '«pþX'‹£•â*QiÖƒÅ,ñðÊY1ê•öìyqÄìõ…7™Ç Rx£"Ö‚0žÅˆ¸‚õº ó¡4ë»(– ÁE¾Ú¢zŸfÀ=˽Ĕj3Ç”ÙÈ §-ÎiàÂóÌ¢c% !8â¨ûµû­ñXé=Q8ú²ÉÕr× ÉÂÞXßÎM=èþæd§.Ýõ”+6cü€`|wsÓ½¿4”„½Á ;R—ªW½n¿“¹³ÓÂ3awNWBœ‰xf³=ŒÑNyE²áóØßQÜtëa'+óg9ïtV¯Ÿ0~4›>á8Oà2!(0™u¿|ÖÐ@ÝA§4iÐYÜÊT$MµË4$P§å´PŽêUÀŽçYl–›µ[Ý•ãÊàŽöçY0°¼¤À¹Èó,‘5ZC÷ 9êŸðûÏZ `yx2kÿ®Ðߨû!4|.bZ+ ‘è ]ò̞ȦØ#ìRẠ;3¤pÞUtÞª‘ï³}ãH‰™·ªNØX®Ü0ð¨ðúBlâMÈ:Iä3”×WªKHÆÐçÙWt )½U¹s^!?ÂÂÈU¿B?–ʸlf%ZÃIûzQ¨€[éJ…λþ*Ý$ôÙ$ˆæ„BPò'S/&R§“½f1 •`>ŒX{‹ÎA]ÍBzžKC/ ¹s&ÑV9éÞ5ÝcWî5T @Þ½Tš*Ìt%…@[!šЇÀéÂõ¾/YÅëÌÜ^ì“æ¸Õž´ ²NÏé U$o9Ψ÷úÎé¦âÁëî›Þ`rýþöº;(í%É%Rò¤Ðtº'ß·W˜¼ß¼ÉºoZNïma¦á ;^íçw8迟´¯{ýÂ,ò‰(Á $£|×ÛáX¶Zý|ßÛq÷®3ÌË[·¥nË#¼Î²¦Ö‘»¶3ís0å0ek¥®·J—QãpÁõ…HoÃ'ô"ÌÓå¥,vŒ¢±bôqÀ cYrUŒÞ2·z¶ïédÅǘ£ÙøÙ¿ˆpã6_ä‰" UY‘—:†^€Õ£‡ýmS‚9aFY£ò¬õxˆUîòÙ˜žËË4:óÙÚ7ˆËÉâ#AòPý”°.—öVgó˜òlðxzlÏßÞu6K2ÎßÜb7(z€¶"C¬s3Ba½ós°âs"wèPbÄj¬p([fS\øù2”ÁCŽ0„“÷7ć@‚ŽänÔK ’¾÷¡ÄçµÁXðg6£„K¤Ù4 ö„8­eþÚ–uã8$8ú :^Oâ<±æöÆ“šR ÉI”ÏX1ŽæøîEˆ|ZBp$³ã 1è8ˆÀóýØ[‰B¶ª#ù‡l;r ]é:`G}+Ô•˜V6žÜC•…âœ9­C`&¡ÛShç÷1t¾gœHõ´ùàI¹J %¹Úè)nÛES®u½? |ú& 2½ÄH îúýTry©Ãú*”çuä—ûÒäAʹÀÜ›Cî¹É$1KaIA¾oÑÐkøÉt€3ÿ³-eH­˜´n¯¶@| g¤ s´W”}‹t¢{ä ·ä+Ñr'ÉÖ¦GûI–ì±]åÁUé ð>ÚÛù­ÎŽAæ#¡*«è¯ ¬tá»CU¦.‡Tª@.âIòF©®‡1tb9lÊatt9l¤Ëá/°\J¶¯i¶¤ Ý™l[â–›K½G»¾îÿyŸßSç¢^ÁEÃPÑù$^ç‰*ÚÄ«JŠZLŽ©ž 9Ñ‹˜@µ%7_BâiÞJu®X1xå²òefÕâ?¥I³>wRr„dÿÉ“SO¹º1çñ"w^TßüvϺ*÷wÍ?ÍÈa|?ñúýÄë÷¯ÿç'^¿>ý~øôûáÓfú´ [@°î+^¶©´ãåFzQeÿ¹p±‡S¬vŸÌphKZ[ÚùýÙn€æöR®ŸÏ=hþ¢ÞJä,?tŽ]—êwvŒÊ»˜†>zø½#.ÚÍ]/ÁÈÐY–­–Íç”Ì VˆKô¢ŽÂ,¡Ç¬EÀ-⯠SÝ€™±7_1Â9C=°ZÀE² ©C¼y^0ÛTš7='5muW©¦ç "`kJ·“È·²*SZI½£5¥ævòd:4Àê…/`ZBᑚÆêÌàH’!¡m­ [QÍJ³7õZi¶Œ2$AlAŠùa |ý¢ëË*‡rGÂR ¦„èqO|Ëç÷½pòΤ0pž`Ah¥Ø €o²ì<2°5q(ö xïGVO_oÇ}8½„¨–Ô{0Ari¬˜Ú$ÑiOùS0`re@!E"&¿Û„¹è*{òËe¸±ÐûxEUù€=&ëU1ˆÍèŹØó GÅ‘GTAv’¾—4¸ÇÞ¦Æ8ærÙøýÙ­,ñ*úì´ôh­‡/ö†,\BAËêBŽ«»¡m7˜SjN¼¶'þ‹ ‚ßÿPK}¶0ú^ “9PKÕV 7Adoc/org/w3c/flute/parser/selectors/PseudoElementSelectorImpl.htmlíZûÚ¸þ=ÅÙÌÞ²«’¡£½W…H˜–^Fi·ÒJÈ$Ò†„uÌPVûÇßc;¼`˜G«®î yäáãóðwŽ?×hZöÇëÌù‡ë›×½n ôªi~8o™fÛnÃïoí«ÔŒ3° "{a@|Óìôu ð£Ï9_^˜æz½6ÖçFÈf¦=4¿ˆþj¢ƒø²ÊSÒ†Ë]ÝÒê?T«}º¾&3Z­â­´Á'Á¬¡Ó@‡/ ÿ"sDmµW¯^)%¢Ë9%®êÞЀ2© “ |"·Ä ¸Âßw«jÿÚÙůÿ¾8ÿ:m^ž½i÷¸O- \ú+Ná–² Ç(œCÞaWмî^@Ë'Q¤]Gt冟.hÀGÔ§Yw±ôë¦êH«û^ðõzÄ7>æ”røfI:§_¸éD‘sF§ M7 3ý³“0d+ÙgC‰Ç:˜Ø»;= Ý LfN臬¡¯ç§q”¡±ýÀÈnm\B¿ùþus˜~%'๠= ·ÂÆ<\êÍ<±dŸØºn 4 ™ø&!s)j>Óaí¹|ÞÐkggÿÒÁ¡¾¿$®ë‰±¬©ûhIy&LäLüqMÇAC©ï9éàçòåD¸zŸÜ¾&¬…ÔÐi®–²n<õXÄY¸.¾{u·£ÏrFŸ+£øÞ ­upà)Óá6¾—1’íDùØ{K¿ Ûu™X\‹å/À ù‰5@ŒÞzt]7'è“h*]{L¢åoD÷aö ÃŸEzF«Å‚°ÍQ¦\+™£-¹”Ÿ2K†ôVO÷©”mP«ÌŔΧòœ3JrÛÆ†Oý24T‰ïeOW´þºÍ©¿¬bU=Êž·Øø9¦,¦LDyÛçófsžM1ÀLVåó±N;C+Åi¢bÕ½Å,ÉðÊY"æ”¶ì:a™ësg<´‚ðFEL~8 +Xq…éuõAÚô]Ë•àbL_nQ½/²Â´ÀœŠùÇ\QfFñÜ™jÊ‘o…+§U1ãÉ4ˆY8켇V¯9© 'цÇiNæ·K"þnrJûßí¬Ò¬ˆJy<3c^ñÝ\]5‡/4å[·ßï Õåßêße·Ókgžìü?ÃÍÙJø3Žëœnµý‘=Ü…­(¶ |º;‰«ŽývÐÎú|§åíŽÝìöÃ6Ó¥œxþ=¬L Ff³.OÐé·K¹BLæL2´ÔŽ`H @»i7!'õÒB˜a¾9†„™¡`flaVŸÈ~%Àá¿ÂŽÐæ%CÓÁ3]4“OØÉéßøûKµŠ¸<¬Í8 a"¢#hu×Ç—‹bÖô} ¤2Ì® SâÐèB!› w«¹›ÇÈi9…|ƒí­ðÆ“÷¨C °j;‰‰ËÕÄ÷9Õà‡[k¹…\”nùh¦šx‰ÛQÁô\ÿJ(±0½÷ŠOçCõ#Îåž|L»?–z¸´²h“ÉC-®Y´AÓ2Í wížzÔw£±Ì)Â厧,\ŒeDÇûÆ,¦œÚÄãDŠY)ÂÎ*ÓZŽ˜žØt†z+–ºw–·EߣÕä-®P¼%Z)â*FéRú[@ø€·1Ò‹ðÜû¤PÈ÷UiÁ0\gT;¡K­Q³5nö?Žûƒvg<êô:-{0<ñ¸%J >kÙÝA?×@“ Þv{í¼ÐàêªÓ·K›úí®è«ÙË µ;£VÀ&ÊeEÚÝ!Þ›íwÍV'ýVŠáÍ>]ýΛ¦Ý}Ÿwéz8huF£nÿ͸+JúÍ^ß®G›ö`«"ÛÍp0(Õj㼜}^7e”Ëg˜)dMÍ57Bx_¢©Ä)›Oã¥XéT«^‹=ò-üä!_Ä{zå)W;Ca¤ }Xcß#}%5\°“½¯Ç»b>â ý£E&Qz&ÖOy) ?tˆßÇÁü9FÏÕêõÃþ¶%œF€®¡|'åH˜"ǹ³¾çø[ŒÐ<«û±y%M|"XZ^%¦KÃå`«ˆç‘‘­%ßê3Ê{ ÇÍé['…'@èò "Ï)ìœ*Ýúĉ¡úeáWž"ó¤oW¥iׄqÝ’éè/fjáîßcUÿ\_Þé–¸ôn¸Z;²W/ªâgüÂCAd!½v„¤Ÿ}g qyµ?öéVX ±™Zn8!‰Ã·×h Ø~ûÁLÚ›å6ÝÓϾÊ`6MPÝeHy]Ï!¡,³UlÛ‹‹yê–õÞI¨2ÏžÅA~áµ]QÜOêëÎ[÷ZF¨éª°ŽPKÓâ:ó)H–ã‡=*jct S/@|ÿ…O8rOáæ$š·°í)!÷¦›SMýÇ…ý)ðPU®SX§ÿC›µÂ"5µêT>%¤$Ó>C¶s"{¹v¼ÇSBµ“ÝŸ¯¾¾¼/¡©Èv[šš‡AjƒJù}²›dнr>æç‡öPðm²ï¼ÜµçR ×°cÖù'׊ 2 Èé­’öbJ\_ú¿ìNa–'ú®Øp-͆ÄMŽ9Æ^æùdÉàgfq¼ ɦeeÄüTÙ˜3<€~Ä2.u²$öoz½dúõö0pH Â9`£íøéRb×÷3{…£%u¤0Ùä7 •æl˜c ‚ÔF•jvçfe\Ùw‰Tºÿ¸ÅQŽbî ”çžåhʲѣ•{jL=Œ‡>[MO„lx¾r u‡…’ò|$åùHŠ ¤Ñk„ÈZqò¶Ò —™<•ý‡ÄÄNR-oµ0{tF|Ó[²ªØrè'»¬í¥œ6_8xû›:?œøY~L&,>À«U>„ÌwáƒçRø@'°Ó]G±gl¬­–Ö FgX"Ä%üT'ZA‹ïDÆÂãuWUW8ÌÄ™¯"Êy]5‹ƒÍÈmêÌ̂٦b]uí”ÚÓÝâ!­Ç ˜GŒ)Û*‘g´+SVIØž2}«ê‚ÒÕ•¦===5ž.Ž;×&#í™Á»`üŸuëÝ0¨¡¶•æ7õú<Ýã9©×áÓ`a{ÞR‰­¢ç¥u•8²½–ÛÅÛ·orA°! £Ÿ‰M\L‰¦ô?bÃÑ‘c£[øÿËÚFÿFçW?üëêòÔïMЛóó7ˆBMj‘6 º¶Ö” Gâz@8ŒÂ%ª£_êÜ®Pמ§Œ‰Etê¸×˜ýÝ –+«© JÓ2íOÈ%VKõèÆ"Þ‚ª"ºY‘–JÉ3ÕtÏSÑÂ%³–¢6Zü_Ô£Á[q˜-uÌN«HèšÏîÔ16h:×Ëq[êÓ¤Ä_Ô ?h<éŒ&èî ;¿þÔÅ/q¶12–jãÇ)v¨³R‘—$q¦ÍaB릆ÛH¡ÂS‹ ©ã0Ÿ«èÉ4袥^œŸÿCE:±¬6 “IñB{+¬óãsF"uÙépÁn©oÔˆ‘W}ø\_C?6Ð-uˆÂn€\%œ\%FÝÃÌt=ê:OY£KÛ9H}ž"úR°eÎZØ”¸*zôùq†vfB.{Ó6ÈsChu“Œß]ñû_;6eý§í;ÐÎG“<5µ)ðÄšrÖ¾³§ÞêGPDc?z€áOÌ0½õr‰ÝÍN¤Ü‹>;SrÍ?2JFäQ :æ¡äm+·ÂÎCqN]Bvb{ <ú2m¨cËÚ‰žk}\‚ÄZÕÁŸîDÏ;h\DŽÆ€Æ ‘ÿðiômÊ5ç š41–,ÜØc“,#BkÙQk7Íå<°ðÚy y®.m9ÐÛÓž.õ‡…³$5 €¶j, XÎÜ©Çe¤75À‡â¤G^,傳cú&Ô꼑etÚŒEm…]¸šç‡O»÷ÈÚpúY‚ç " 9 ‚Žú¿¢îMg<£ 7_Ãþo“àrF —³œK¦ˆgüþö¶3úýJØÃa$~þ%¾®ý›^âL48¯˜D¨»f\>ø®Hmwï†ãÉ(b,ÛmIèÂ1¢·ýÉ»»ž_ÀóVÊ{ýIgp¾3™¡Ø´^@eÐ!CdÒ0Òñ¼…úÞ4œûñ|áò$!Þ+ʸ ^gÒA©^oÚ ƒ`zƒë`Cè`#ÔÁæ”ÃånI“Ô®\ šå] –Å5%äŒÁÿÖë ¨ÅxRØS6"´Ò4,80(ó1ËB¬· Hù,.ϰN¼+aÐŒõ0B¤R5<¬§±@K>ô v8„¢Õzj™ºPXs( ±Ñ6¤xÄ6<”‡X3 ÛCÛi£m1î jšÕo!Dšü¤®oзRÞVí¤†põÕ÷ݤ† ŒrÓÈ4–·GÂ,Þw'w£<ø"•™¾ŸØI½‚Ïì@GÚ™äî"•Ü]f2ÒDú*2½(Rvá‹”û$àз˚¨™T–§'­h,hbJzÓ<̱Œœ§†vSw Â`ïE$zËãÇ+É…‡À*Ut6ÊÓö÷¯›§ùŽA¸¹2åîÏbéYðšÚ'´)|EJljâÉÁIôç–“x Õ)Ê©Ò9á\¢bÄ3N‰;¬@#|á‡aõˆÊ©»¦ó{3 A+®žÒ+GQÐ.Çä)îb{ƒl€‹Ò'Lw]3âö0Å'“OW`×ÙRO(¤(ü© ú MÖ<”\º›àÛ€L•CÊé 4È“SS-áöˆ§C&£¬ÿóKvaZF(Ò¼\å!{%á0b¢Ã ežW Ð ™Ò™RŒC´Õü£?â +£1|gŸ”Ù|²åéÌ]ÐQ-C‡|Ñð×ÉO(Ê Û¬:s=„—»„µ<³—t@ÖüCȾå‡G²þˆÊ¨MâC–„ _Fˆä8 Á¯Œ¾ŒÍ©.ötÊbºp¹c|Äz%#r¯:#óxým²((¹OÈ­RÛÔñmêÅ•·•èjîN¯Dd9›¿Y¡ç L¦9 ¸TÑ>º`•ŠÌÝñ¸ÿ¬“KÔÓåLFÛ'(g™Õððv‰ ñŠèæÌäÕîé: ß Ê™9iÃ?¿dÊO¶#ùž/ª)Ê£mDèÚµ3•XtAŠä]'|å jÀW f Ó  Óc®yëÕÊq!ü4²,¤J¤â:»ãöv¥_¶'ž«Ýò]òí*.Må"M—ƒ•$NˆçLûÙÀáìaËþ|9ÃÅg°Ž{øwâæ¨9ã9Rgf4âLÜL ,¬`̪jj¡Ù¨à@IYãÁêòí5YÚ°ÝP³Û\1+M+ØùBÁ¦W9+Ý(E]ž8ʺ€tåEI«OŽmÌ]ˆ0iðâ\ÖnC^É.ÉqÚÝ[8Ë)ÌŽ˜˜¿˜ˆ¼µî$eþÛëTòí:]¹R>§!'ú–µºœJ™’Æ—æ½æW6ÚʪªYÄAË}ÒáöÐÅDÖ)©/ÚÁB³Ýâö)¹uW0MÙPìrIŽj‘Êfç¥=„´&ª¬ƒÈ«…;­“ðRÄÔ–2íópo;¹³k)ኺ–ƒÖ„¥ËëÍrÝŠ¬­\F/ƒxü´^êIR~+V wÊ|C^0WΙäVH~yù~4<©T%;lËÌ?ôG*"L;š£Õ*æûœœòÅ]Vµ…1§“2¨†DQ!äüLȯ£< Ž”3K–a–CYÖ£å—k–tk9b­€kÛ}Y"è OÊ­åŒÝßÒ·©û—±*ñݳýŠrR¦òi»'Ju‰× ·Täo·ÎB‘©nÁ#ËP‚‚ÿ}ítëçXU™Oɹ͎w ”ó!»ÜrrZ‡"ô!™`çÒ 8åv™vðÊ»¡½oÉP’Þ§Ä­ù^G~·G‰9OÄ#Ï|Ä'ƒ!vÓÉ)WyóïM)é*äc] |jÁ79|ò ¼lò€¢Éƒ€¦üÍ!$·ô$ª‰¥·üä:€ì]@û×gaí_P\:¹—ÞnTÎܲü¶¦¸ˆÅjêî÷:%Sî]nŽÊÕíìíR¥«˜² TD\2âHoÐ*§ýYÖ+gJæ—Ùaª’%ïŒò‚+yžmþcp_ú0ü©C©³L=VÞ?YÝGâ 󞊟¾šàC‘ññõÁø_ŒÿõÁø_Ѓñ¿>£¾ýõõ_Ä3êW`)K0cfXìm9µ®³Úpý®å¿ØÝ& ¹‚¹^j7dŽ-Í\¹uv×¶Nþxh‡?ydûN‡ÃÅÛ~>åoÀS˜1‹—î(µŽkèƒ 9Ñ2Eî{Q@†Æâ6jHaÚß¹dVÌ~¢ï›XÉ`±t¯±4iƒë ª[3ÖkPê!¶ÚiRö"g†&D_Ø`óM­};˜ÄОE{™q<¦íš¸1sC$üJµ™[‹½_iæª!òb¿Ö8ZâêlQÀ‚fŽ»„«®á˜¢ÎòqXk†£A'N–"ãOÄt~\]ÿÖôõbOñ1Iy€œÊ#ä {GÑû= Õ€Ÿy虹$n­m™xjZ&Ý$É{1d ëaâbƒ€õ~òjmüáî¯ÈzЉ…’57@­üT@1x®‰mçÌèvA€Á/fÄfKÌ—»¶Øjµ²6 ô»³vÅäó…gR\ºðzðÍúÃuë:dØÖ‰hÀº½h¼W®ùˆõMÝ£0Ñb¼ÿñêžÏOkþ«¸EûãP ì-YNa6VÅp¸~36ó`Râ»)ö¬ˆ\ޱaß,®óûPKÎCƒOmPKÕV 75doc/org/w3c/flute/parser/selectors/package-frame.html••[SÛ0…ßý+Í´o¶ÒËÆ™\J.™’NÛGÙ^bƒ,{$“_I ŠN&Ûsö;Gk+;8_æÈuÉaþóä|6Rú«7¢t¼ÃïÓÅÅ9t£,$ªÐE%§trI0/’k]÷)mš&jzQ%—tñƒ>X^×¶‡¡~Ve:#Ã`p†—ØÌÙÃМº œ‰eLPx(yÿÅ™P±Ç­{tt´1±ÈY¶!Ãw(™Æ ’5ܲ{–U)T.Ìçl% ûºþç/ýÞ'˜ŒpØé‚ ¢ ÍqhZS¾Ò÷(• nºÐƒÎ Žç³>ÌYzgÂ&†I“F7VÕL*”‘BŽ©®¤Ð /ðBÜD¥×Uލ èu1Ñø iª\âM(¢ÏßO‘S9fL®íeÔÐévíI•­!Y¦¯dLš¼Ðh;Ãv€mMxêÂÓMxú/¼¹àÖªUY2¹Ž\£ÐL.QÇ$åL©©d¥ñx¯ li.K8BRÉ M¼¦Èt“n§óÁæÔÒ~e ªF²z8²¨>ŠDÕß` j&À™ÆÄÙÎ4–ÓJh2$Òõa»Pr,²Q%2÷ÌÍÊšo¢?&^Dÿ_kÃnyðÔZ‰Y[{¬·Â ?Áe!N×uŽbŸw‹½–£¼àÙõöþ¼gñJìGÚŠÖ±_«ýÐGã­ÓúKÞÆO™Õ­[³Ÿé½à1ªEÆ„nÛ_á‡Ò޳[f*Úì¬òšL8–{Ð=r/vÖ~cÎZìËs3$Z_‰½È+W7ûïÃ7ʼ6s…«¬ÚoÓìªyÃ`ÏÛ¸³Èkñ(h¹{;¹lö?w[©˜C÷ïãóvì’ç]6=蘭ÎúçPqËÐ$‘L±4!ÜóZÛüìH©ìÈó&“‰;9tS1ôú=ïNË«h³fI­ÌvCÚu«ú¬TêÐI— i©„]ƒ“dX³ibÃ]ÌÖz‰¬h«¼yó&W¢EF”„¹dxG*ˆ¢!øSøBÆ$LH¸Àß÷£*A¥|ôúÏ£Ã? uÒ‡ƒrù ŧu4œò‘¢0¦B"p´Â!”à=Š‚F·}]Ü"x a šÀhn7#BRáJÊi R!«^.Ϫr–Ü‚ ¼fK5åTF”*Ô4£5[Ñ;åRÚ :¨Y¶ëz«?Ë®á22kö•¶ÁCéÞlí~NÁ)OEÍžDLÑ™±¡¶øàªßèõáò:ÇÞ*ÉØ€ kvBÆ>7*ÍlHHL×FêF&rW=R íF|NÁOEHQsÙ† UT³+åò ÊyFÂé-­ä}™‘ÀôË¢úŸ:’š}`/ò¼…ßé)ÎãD¢'tÈø˜ˆ& © ×ZAw3`B*‘N¶/I__ÁèòèÃ4Άˆ6 ‰¢Â†ñ¬oldôàEï=KBzçæ.^Õ–™M·fóOÓDéù~ý]uÌè¤êù¸&Íj–ö2ñeö1ÜÄsj¾"<=:¶çwé4<¨v+Zwk¼×»×Ôƒ?&|aÞ,‡‹9‰Ò™µŒ6é÷oq‰pþ X…¾LMyuÛ¦‹ ÙeYx¦Zxyµðæ.)GqLÄtnu ­^ë£Õm4?4ÞµrÏm ߤg¤ß­¥ÓúÔßÔRàJ÷,ºp§7«N Z“¢3«:‘0¥,:˜§øZmEÖ­¼]ÙÈÛ‡[Åf­2åI|/MüV⥯eŸamŹMÍboU)mB“ à*·lnÃuÚeF#¿—NVeÏá½~ad/÷¸‘„Í4 ÍAªgót±9œïŸ¿ÜÂxüy˜”ÌÇí)DVHÜ+¾c:dÉÙ4‹hr/Ô¯òíu3b<¼š9ú Ê­ñý¢ÒsŠŒ·MØ/®¹f‹lVL}„§DëŸÁ[!íÛ •xx I¢ ŒWLÜ/>&Pq#üBô»ãN†½âlq, ìY»°l´±jœ]N·1mïÕeB/÷V‰{8öŠ´+é(Lwæã]äGÀ¸;*vÒ÷Šr®x;1P‚lyþÔ­ÅÉöGnaüT©4޸Ϙ þºw19À]×1›ÔµuXO72O72O72¿âÌÓåÈ£]Žd¸õ1ú¥öý˜à4Ólj6ÌÙ}E†g™ ÅF±wN‡„{,¥$U, ÿ<_ ¨/š&ÿ¾ °û6™›²øþø¾˜½IXÎu*x×,¤pM}Xêvô£ JFæÜŠr”Õ_ :D·ÔMø­J¬--`G³þþ œCOï”D•%cº–¾Ê¼ï¦ô^70#7'L¢ ³˜ §Îñgjºï›%#¬›¾ !ÅÀº•N]ÍÛ ¹ßïÈÁ|’Î#}Dó¦…ŽaND$ á'©‘é@MˆÀ œ·,Ž«L$ž@Œ.1âTÉ2>uás:Àô1Ïè$b*1 à|¤[$ðŒC’€æ zÚ7Ù;lL‚iI*¢ÌyúŸçݑȜzfþšˆžÙá‡Ä^ÐØ§­œ7ŒÜ,ؤ‹!§)/ÓYO?KšWJL«˜üþPKæ@i—3{PKÕV 74doc/org/w3c/flute/parser/selectors/package-tree.htmlíZûoÓ:þ=Å!èhÒm÷!F©tۥܽ´õò&'qƒó¸¶ÛÒÿþ;I×µI×bL¢b#ŽÏãûŽíãS{Ggýá‡óCˆUÂáüßWǃ>Ø-Ï{·×÷¼ƒá¼=<9†· CARÉËRÂ=ïðÔ¶?v¬T¾ïy³ÙÌí¹™{à ·£ ”-µ¤íF*²}«ó¨Õ:¥³s2¦­6 NÒqצ© _¾£•Ên·/^N´É˜’¨° Ó” ¢hÁ>‘)‰²²NðçÍ$…¿`§½ÿÇŸû{¿ÃáÁvÛí]0@Sœú8âEaJ…Dà…=hÁ4½óÁ¾…îE莴”›!©p%å4T™ÐçDJxÍ…ãyÇ+ìZÎÒÏ (ïÚRÍ9•1¥Ê5Ïi×Vô‹òB)mˆu-Ûu½å×®‘26»ö¥~mƒ‡Ö½2AÍ!‡ÏDמÅLÑ2èÐ]|àrØ»ÂÙœöÞ¾ê],w™X`Q×NÉ4 âJe¹ )Iè7¾±‰Òø`aüHÀ)™ˆ(znÛ0c‘Š»öN»ý› !å<'QÄôÐîm™“дÛ¢úW;Ò®½k_y|ˆŸ£#ÔÓáíÚ§dúŠˆ>ÙA$®µ„îjÄ„T"›­¿îºÁ ÐíÐ{h œmHSE… Ó²mbdmM¢~ìYÑ/n1Õ;:2¥ºUêe©Òú†SvÊè¬ãÈI‹jOÒ@æ/q"F_‡ Ö«UN’„ˆùVPΠٓYl¥ƒfãGæSgü‚NíJ±É‹‘AJCA—ù|kTëF¹E8ß*¼-ý‡yPLyÞÂ乞×(¼ Žg·g˜y(1–kE°q¬n.ÀZ¤\gš\uÖwÇï°d\­\§í€a­ä ÌRéaú¾Š³„:@uóy6Î̤zÇC° ý:;­¤Öõ˜î.&TSd5Dà™ Ä+6¯Zd gYr\F‡o‹¸Vµîd|¢o0}zø~X™®™4èÕŽéêÓ…ÃÓƒÚ¦Übbaö­"mêö®¿Ø4á(P¦ؼßâÆ·«aTv¬Nı©¥,´Ø•ûgì×¢ÑbZ­Å±Ì¥ËQëqn•&e¶ÈB{\B8k%€†hu&ÜTå–2âæí››JÅÕu{|Bfp‹üæ ¸w›{ =¯—Fý,LÅ6Hò*aYá¯vUsž2lÑã/µ)®$¡ÛÏ’€¥m/tŸu<Ît8~03¥ °«‘_­ÀV,×Uï‰ä+:féëyÓôV¾·Ê>,êý˜ñè²l®P]ëÛŠÚ•˜T"’ªJõ¾¨iãMøÞùÀÆ­òOxÓèÕKl™Ötï›çÑ/æM$—ºïưT¼'zë‹e…`½ÀÃZˆLàS/úDtµÑD´Qh+²—,àøõòž™ð(ÖônÅmE KœÁWT8?M"=Æâ±‰ØZßVÔnhÝ«³”žn­e6H=¬A<—te7ü&‘‡Htsši”y@ɦr_¿ë×ôn·IÜÔ+¹u<óqéyñ¥ô[ŽƒL©,Y9H-_þ¼‡ÀÀ¦sàÕÞ<¬_GÁ¿Ž‚ÿ¤GÁ¿NeÀ©lŽƒœà ÔsB_Y:ý,Ÿ›¡qšOᱦ™Pl’xÇtL¸ÇrÑJ3ÅBúññµñh’í“›/‹{Ø*~õGü$Dyói9ï2Á#xÇ" ïh×¾}…‹–Q¸ˆ¢œäþAÇ8õ#<íkÍ ¥›0åÒh²æêƒMÂx"©R©Ä}Aœ`HÃ8Å¡Ïÿd0\rûj/,X*qGbáÄÜu;#á,Ý|„½p^¹ƒSRœc2¾@·TàÐ2‘`ïl+èMpk+šŽ?8½ô–aYu1þLYæb]ñ)G\ÿ`C‹>{=ÎáB”D—¸¦4r-}[²é2fã40o®˜Ä)Ì*Ÿ30ÎÔü&¼;[FXWCA"ŠÓgéøªz^Øýú‰VJ: NLMæøÕ£…Ô?$à;¹‘ÙH͈À¬ž,Ž,S‰å†ñ%&œJ yÎç.|È&˜®9°ÄI"±êR1¨˜I˜0õ±ß"aˆ ICZhµ;Å;lJÂyK*¢Liúññù$@dŽŸ›ÿÍŠ.ãðMfOhPQ.ŒÝR bX–{ešòrõô?˜¿…ÀtŠÉïPKLË©é"PKÕV 7#doc/org/w3c/flute/util/CSSUtil.htmlíYmoâHþî_Qëì ;º`C¢½ÓdÁd‡½@ràÌìH+¡¶Ýàž16ÓÝÀpÚÕÝæÅ†$ÌËI{RP ~©®zººê©r»ñCç¶í¿¿ëB,g ÜÝ¿¾éµÁ®ºî»Ë¶ëvüüþÆïß@Ý©ÏI*˜dYJ×íl ðcÇRί\wµZ9«K'ãS׺Ÿ•¾ºRVåÞh'’‘íYªÕ]Ý‘)­VñTcHH:mÚ4µáó,¹*œ¥¢yÄZýÕ«WƈRSÍð+M)'’F¬áY’( !K¡ßß)Ôÿ õÚÕÏÿ¸ºüº.jµ Ð@$“ õÐp,$…%å£.¡ ¿¡*hÝõ® ! =ÝK–4\3Ìj$,ýœ&M[ÈuBEL©´A®ç´iKúYº¡6ÄœNš–í8îöo'îh­°iÔe\Tíæó ²h Á4Ì’Œ7íUÌ$Í ÍíF~kèÃí5 Zo_·†û·ô< °¨i§d>–Ù܆”Ìhኧu¢tÃ%Xè$‚ŒG-×lX±HÆM»^«ý͆&ÉœDSËV7çbNB}^S%W? t¼‘6í {7‘³.~®¯qœòlÓåkÂÛ¨¤ŽH4\kÝx¸<[ßÝzzеèKH¦ˆ6¤©¤Ü†e~®}¤'tò$Ž, Ês2’ký9†dH—öfàC&µ ZÕ9·gó{Í\rJOš¶‚ßÙû¡P%Ir˜ž’þ¢‰i2¯"ožæ ?†ÅÕ¹ïêüÓ9À<•8›Æ²˜Y€ lXÓ°Ag;”•ÃBPñl6Ý$v¥VÁã’½0K…»º Çq6£ ›E÷I6Í*H´ zÃE{°}G^%æ=tèÅ&žï†Ý·Ð¾iFæÜÊ=rÔÛ ¢r'ªê¸ ,*n7 3EL›¼A÷wßÒ¯Òƒ¥~×ñ¼~0 ½?ºï÷[Ã÷WùzƒAwhÿ4ÿ®{Ý›NáJûv0ò‹B béyÛg3*ã,ç„c{ý®ÿæ¶SœÎ“ :]¿Õ»Ù`:ÁÆó•„%Gãµ\]›ÐtŽ×¼ºÆ\—ìýQ»Š¬:-¿¥Q†Fjèè0pT4­«Ôo (¢šs§ÚG5KÎmð†[³?ñû÷j#æPŸ³Õ¨j[ÀQ¢~¤7_ a°c3ÞÅ¿»‘ ¥,-‹] M#eF-˜kF5oMKuUÐy?"Í3}›­ øoE»ñ9À¹WtªŽÅÜ£y˜ K§Cå@ø¸<˜(ºoû·ÃÓôƒ ¥Gô›Î«”ySÎŒýþ×Ê;haê¥æò ï*4i¦ŸÙU…6~öª‚¯t¿Á6Ƕ•ˆ}а©ìk”02(Í2‰å!6Ò†Ùj_ù#%`]G2¤žD²Ð¤ó.àF’#↫E¶â™!ødÊÍ#\3îÙ”Ê/2|ˆ0êÇe{cDU’1ëx?•e bñ2ÇyV›Ë_÷{/ðñFf§h.)ÚºMÆðIÁÎq>Ûòá.Ř¥1å¸ZÑx³ÙX/Ù¸œÕy¤Z_8ê‰NüøÔÜè(-‚ÃHÞE¯€-pPÀs–;$±o î<Ã$Ké9ÐO ’ˆsC«ì?xÃGû9ÄDÄm”=‡4“l²>·ÌÿV’œã*›(:‡arÿ·óGWYy»D›{UØFa0/wí‚©æ‘—s<ÅAû•¼Xy#u¤'z¸•úÒí “2›•6 ò‹ÝMð¡}ŽòÝÂ<¬ç­Žç­Žç­ŽÿÏ­Žç]‡ç]‡oÚuÀfOÌ0µT°«W•v6_ë°«<¼ƒÖÎR‘qÉ3÷†NIâ²9¯ª4¤œíxÛC]g^„xú‹y}²™çñí9ày©aUÞe<‰à‹(¼£ìlWÔ›ÔŒÂ&ÐÄbî½àtŠÉ¥á§Ízî[IBá̘th´80ÕÇ5$a¼TJ½Tà õ^'›€OÃ8Åè®+^¿çï™=‡£›,åŒ8¾5¢_QU&¼²÷ÂjÂí­ñ9óö pÆC4K9~¦h’ñÞý´Às ­VusZñzƒa¯µË:æã”e sÄõ/Ò:z&ž¥ýì˜ n)·ä}­¼óe–JÕ9ðn0ï]µÜ¤Dõ¸^¤XüŠ!}í'•‡b9Ÿ¾> Ê­és4’K}B2¢wvÑñ>“Z­ê¤+ÙüV#—œÒ£†í£à7öþ^(ÔI’f ¤ÿhbš,êX8ó…ÂâêÜwuþé‹`žJœÍb¹›Y€ lª¦a‹Î·(kû+AÍk±ù¬HìZ£‚‡%a– wuNâlNk@¶kªÞ'Ù,«a¡UÐ[.Úƒ2ômñªTÞ}‡žmâù [4ïNÕúâ.%KÜîxü Gczúï¬îUg<6>-œ ægØÿ݇¼yo¦€ux@;Nßë†Î¿½¾îŒ>\XÆú`8ìÌå_æçrпêí<éÞ Çþ®P‹XÚöÉœÊ8‹&y½±½ë¾ÿæ¦gü^ çQP½¾ß\˜ŽDPÌG!¢’°ä‚Ýp­.®mè{×Ö|q¹^±Ë½¶ ²ž8èuüTzy¨¡£ƒÃQÁÑ ´®*ß@Y„µàˆNñG±%ç&øHC‰Üì/üÿW½Ž‘´¯ÐÙ* ÔµŽ ä(Q'é-–AÂBãy@=åN-,-†Œ†¦‘€*#‚çD æJQÏ;ç.vôDÞ÷Xâ™n@¦Õ„ï±)Úöϱ-¼]ê@ÌÝ™Çè®GaoÞtœì –Bo»þÍè8ý`âèý†uU '0Õ´(sœ&o¾4+ôå|sí4Ãe¶+BÒŠà+Ýobbß®±÷ÈššÀkÆ¥™ÆÝªr_)ÒFÙª¬üò_@×À1ø¨'$‘,4¹¼ ¸±ä:.µÈ¦€x¦ >º !®ËðÉŒJÅö‹‡“ªÁ ªȘ‰ ¼«²2ÍÅ^æX­<µMë×»YФP KƦŸ …`©y¢Þ_X*3óúR4[¥fçpÙÛ”ÍmЊ KcÊq^£É”gó‰žÜI5ÿ󘶾°×#|ý‰_¡@:ÇË`?æ·q.`ð¼ î—»'¥A¬a’¥ôèŸK’ˆS˜2|_fÿÅ'gºþŸBLDÜEÙSH3ɦëSËüv’ädfÂíV„Éòy7;βòv¥À–*¦Ym)˜»³ÒåpAÞ”Ì=‡ f¾\ïÖËb ÿ»•Ëf¹\ö4Èj˜”†çãE§È«#ÊS5—âso¯`᳂Fä+¾)²PÕ§8À^ï¥nS^^n©…Yþ#¯(VðäbU&»˜³ë~jö¥»%A&e6¯ì;äÿ¾{&à}Û&ÕÖqXÏ;'Ï;'Ï;'ÿÌ“çMŒçMŒ§lb )sÌ,ëêÃF­›-Ö:êj÷ïÇáR/2.Ùrî^ÑI\¶àuEUCúÇÉV·¹ÔËÌ‹o5_cŠqÞì#¾;™O$Ví}Ɠ޳ˆÂ{ÀÖvM}ÈAÍ(lh¡X.¼œÎ0·Ô%üXÌgÙJ gΤC£åž©kœCÆKA%ò˜A*°A}&ʦàÓ0N1zgëšw=ðKfOáàÖ%K9#ΔoŒè/^µ)¯•¾M¹½1^˜ƒ!1ÓGŸ†XÉš³rR†¯\rÅ—ð‡=³²+ “pgž›ƒ„è#Dáâý‡Åì¬W\‡á58lPðÔDq@Ï\inR˜7F >ï¶ Ø±âÉÀ{ÃÐÁ£­؈˜N^,ùŠ‹„h×5çHÇž'ùi¡5ZñÇÄ#A@_ïå+q‚ ÙÛcÔHÓ“Ù¼+GÈ«¢JÈP7ÈmlR=µRêH©%¥ýdÂׇ¶ej \’2UqLH!˜ÖÅZ#yÉ&KÁ3±\pÈ;UrCšë„DaøÆ¢ ²¯d7(Ö§K+Êõ[™ëþĺgÜ „¸Q[äí¦“HÒ8WÎê‹—å~ÿ`æNp òTaÉNÍðÚ½–EW6²:o÷Îú_jœµhæƒ6fê\PçÕ.lìî/±ÔóþPKÌ 7ÜèLPKÕV 7+doc/org/w3c/flute/util/package-summary.htmlíXëoÛ6ÿ®¿âª¢ÕÔ’¬šÚ\ÇiÝ6®á¸M (‰¶ØP¢FÒvüßïHI~'Kú!‚¤x¼û݃w'5~莿 {è”Ãðã«÷ý.¸µ ¸<îÁéø>¿Ÿ¿‡†_‡±$™bš‰Œð è \ðr­ó“ X,þâØrŒGÁá×0 ÊaMoìöc»m§ù¨VÐÅLi­†S‹“lÚriæÂMÊO¶f™jÖxñâE!İL(‰ ÎðšfTMc—ð•ÌI,"œã÷í,ƒÆ_ШŸ<ÿóäøèŽá¨^? D3ÍiMg|¦)Ì©T­p 5x‹¬ 3ìŸÀD×ÞAˆ&ò'†ÚŸiÆ›AÁÃir–]ƒ¤¼å*½äT%”jô2§-WÓDJ¹H:i9®ï«ÏšÜ·$–a˽0·]uP*Šx á4\È–»H˜¦¥u¡µºàbÜáà :Ÿ^uF›KVi,n¹™‡D^i‘»‘”nÝi[žHÝ H4 9…PȘ¢äº ë¤å6êõ'.D”óœÄ13>ls•“ÈÎ뢖æ'„Ž YË=r׊<îáuv†û8Qèú™¿"²‹LˆÄÂu6Ð]M˜TZŠÅ>ðõÒk°º¾ú¸ „³)¢h¦©ta^έ¬B÷Vâ€ãYÓ¿è¦1K¹×)7Ÿ‰L›ÍaûæœÑE3Q!Cjõzš…*‰!ï‚9³×!0#:w«·É´4(¶ û ©·K¼SýÛ•ëš›?Æ|eÛ¼€‹ˆÒ{™uŒ„÷6éwú·F8¿˜¾¡þÑ$”ç5ÌŒ÷ó‰ïÂØØCe%Àò|H6Môöq<•ÅÑdzդ饷Ÿê½v“¥Óê´zu”ŒRö#‘©sòU"Rê!ÝòLBçb*<Ìžz3@y° }‘vÒé¾AVÇå Y Ø’äD**E9´*¨bRÍÒ”Èeeü°í G½O0ìtßu^÷ SW6†âoÐû<^ì…Àx:i·N´ 78=X&Ê:‘H[|’£*À¡ò‡Ë{Ùµ±“]÷JÂVý(Rí:¶»xmÄöØð~ƒ÷v ‰»WKŒAm&‹ÂÎ…A·ý}›é,ÿ‘Xlò®à=byW®w»QíÒ嬱•@üÙ?+? @/‹„1D‰ šÞÂ:Ê0sV>þ‘"Z‹t§—7Ý>¢x[+±»º¥‡óÐM¼žœ¼…Žß†‰¤™âšç„ F®ø¸‰ÖÅ!‹ÅÂ_ìû¹œ‘ɘ\~à¶ôÆi?Ö±Ûs‚'­Öˆ-Î茵Z8µÍf]—e.\§â`k–©îi/^TB ˄Ѹâ ³ŒIªY á>Ó9óò Nð÷M™Aç/è´þøó`ÿwM`¯ÝÞ Ds-XMÇ¢Ô æL*ŽV؇¼AVpx6<("j¨üRs}A•r^s”,£dŠ—ž]d¢ë*½L%Œiô²`]W³kM"¥\H$›v×÷ÉêgMî[˰랛e²&µÒa/!œE¹Èe×]$\³ÚÊÐ]=p>9OàôF‡ï_Ž7·¬òxÜu3:©¼ÔyáBFS¶µÒ³<‘: ´Œ†‚A˜Ë˜¡ä¶ ë¤ëvÚí_\ˆ˜cnî²SÍUA#;oˆZš?1 tÜȺVäéŸãc2é  ×Ù@w9åRi™/n_o}Yƒ-Ðí ÷+Ð@Ÿ!ÚˆešIæõÜÚÈ*ô`%v\<ÏbvíW޳Ôgúðqžis8좃Î9[$D… ©ÕëYªâ%º`üm`PÛ+›ªLS*—‚rVù1Hî–dìp7ócûìb>fs·9x—Kƒ*M$ÛÔç{­zëŠ[TˆÙvh¨ðo¢I˜(Z˜$æ5߇…ؘ&6®ì X‡ˆä³DoG ``VÑá°tÒ»õ½^ÀÓY°^Û%£”Ã(ÏÁ4}™ä)ó€îz&·‹|–{˜@ ô€ <Ø„¾NJ72êmƒî­\i§Y Ol• •ŠI¢˜`‘Î¥"M”it³ÆòGãÁûʼ]êßhða²ãºïÁ¶óBn–…. FG;«B]ikM•êÌ|¯·ªrpœK¨#GQĵgD7g 8õF€†gê R÷ i¼òƒm«Ö9oÓn‡B40Tu«±Õ܈[i€Xlö€"mð9A)l®‹rÄe„¶gMjûßt#þiøo¾@Û þC¼Ã’þùù;s`å õBãÜàýD²(7%o-»YÙ«üÆxeßïi7Â\ë<½Q¸ëÅŸ·é¨ÞÕwÜÜÝÒÃyl=[ÇÖãçj=»€/uÞPоcnÓ¼Ózý¼XZ»zw·l}ìÃr©y™’·lFá…le¹æûôtÍ ·Úù,ÂéËêå¼±ìî~†¡¬ßŽï"—"† 3¸`!¬e{æ½9#qUÏTYôžI6Cï1Cø5 Î-)"R~ʵÏâò–¨46’R1­ 3…æ«A>… ‹’ ¯f¶ôz'ÃɆØç°³»å™äÔŸÊ•ûÄ›JoãsÈTº+á8ÑêÛ  Æc˰³aÀ24ÍeŠ»ÿ–8×pXb9ª¦^o87a9»l|ÅxîÓÈÿ\ ®pbH{¦ß››R(ýyÎbß1­õ}û½n`W.¸Bæ)“^OprÁõrÞWsFX—Ic†õäJy=ÝŒW|¿Ý‘£æIaeŠ%4Cö,4‹á‰QùT/¨Ä lFŽ@-3e5”%KÁТK>æ¥nú'QØ)étÂ(L€çqß¡Q„MÍ"V˜c_eïBò9–-¥©fF÷OOÏÊ‘y½Âþ·]Ûá»Øž°4d­\ ,ßš VdÊÇ®Ò)LÖ3Èì÷2̯˜üþPK Ìç£þPKÕV 7doc/overview-frame.html­“]oÓ0†ïó+Î,A®§+jI"vcöQAp…œä, síÈv—õßc;e*Ð `DrÛç¼ïã“ãôh~3[}YžBcÖ–ß^.f@"J?g”ÎWsø|¾ºº„QœÀJ1¡[ÓJÁ8¥§×$ûƘnJiß÷q?Ž¥ªéê=}pz#'°ûŒÌ^v\™ŠäAzEר/YQd§ž3Qg‡5Ÿþ4:;à6šL&ƒ‰“lUƒ2¼CЬ ØÂ7vÏ*Y‚peÇÅFÀè5Œ’éËWÓñ 8¯à8IŽÁƒ˜ÖpÌm àŒo Â=*mÁmÆÁ…•‚“åb 7vã¾Å>¥CFòVÜBžm¶uƒh˜m‡1ø`h©5Fáí~DìW½FnµrtwœBV[(êRr©2Ò7­AwXà ŽPHU¡]NômešŒŒ’ä™ßWîU½b]žyÊóð÷:†yÚ®ëja‚Veˆ\”RhÚ˯\cŒ›,tÕâ²–¡O)³ÃºQãè©ç ž6þ[wL@É™¶ÿÿL±5. ®Ï¤0äñ<aœûÔÑ­‹‰}G€aªF“‘Ž•w¶Ï|:ÉO8fCôÀê,r°l]¾"uZ(ÿþÈݕń޺~¡SÝyâ ~²ù¶ºeìóã!ìé,9–F*ýTªøQéÿðmLËÿÉeà o¸CÍ×åÏE¡»7»w³üE³žvû;PK õ›1PKÕV 7doc/overview-tree.htmlíZ}oÛ6ÿ_Ÿ‚S±jjÉI°ghf pguŸ¼¶·nÀ€€’h‹Þ’¶ã}úçHɲlɶâ¤Y0Ô@¾ï~w<"[ß]ÜvÇzÈa€¿}¸êw‘Þ°¬Ïg]˺_ ?>ޝ¯Ð‰ÙDc†#N#XVïF×üt_ˆäܲ‹…¹83c6µÆCëAò;‘ ²bCF›žðt[k}×hÜÅOI£U…!ÀÑ´­“HGap¾Q‹x»BÚÉû÷ïS!’¥O°—rF¿’ˆ0,ˆ‡œ%ú‚çØ‹]Gèþ}šEèägtÒ<ÿé?çgg¨w1F§Íæ)R@±Áè2˜ ‚æ„qV8C ô X¡Î Žºæ}¤ †¹þ²e¥µV@£{ÄHÐÖ¹X„û„‰eBÚº Âr9בÏȤHaªVÅ£­é#Ù®# ØY™VNì-‘3uã fm}áSA23¢vþC£qg8F·—è¦óû‡Î°Ø¥´Ãˆzm=Âs³;':ŠpH6ZlŨ[¶‘ÁN@3€ä¦ŽÔ~[?i6¿×‘K‚ ÁžGåd¤už`WÕ›¢`ò?tèˆÚú©¾VäM~——0NÚ³­ßàù̺Àä(¸ZÝÝ„2.X¼(_wÖ`ts ôY á€N­K"A˜ŽæY]ÙH)T[ 5ÙšN#<˜©·¶¤)2z-pGBpì[ðº9%‹–倒Téò6rxò ¸š÷(»E °{+0ñììÕ9ÈüRýª˜É\_ Ü%EÑ€ÉÆŒ‚¹ŽÔes®8jÍW_R?Ïdå|$ [µ|â}ò-µ-µT!•ù4£S_lº8‚•”.WX-®‘å8lØ-NW+Ìhˆ3·’²ïÆ·gî‡Ä¢mÈhÄÓØ€ˆ'¡·,‡ŠÐ×Qd+–xºr™Á°÷{ZÒÒ?7½?Æó±‡Q¥õ¶ƒnõn.*cnt}¦"yHdýÔÎ÷ t3Ô `ÿM—",èa+j­åP÷„œæŒ(ßv(áçé´C¿$õ $Í †¶&r³Ì8aðGq€-™Ì³€fÇ5™ÒÉYx§àÅI@\3^—«™ØÏ&hp˜§¤J½ÅS“$플XÚ¡¥aµÖ,P›t¶#»”¹°ÕÚjöU¦`ʼüu¾Rt€~¿’fmûu"¯GžJ‘úa’ÇÞîIgÛÚj$/YÀÂäØ5»qèÐë|ì-+ Rý¯­‰Œ:еKŸÊþZZ•‡¾”RÈ”F—‰O¢½úA–f¤]éŠ ºj¯G×®Oo”U7ç®ÔUkÚ.‡XæáH¬†¾˜*’Û?,÷½rÌâ`ÇìTÔ ¥±/®×%– ËJz§Q6ðqêÈ­e§ jwêŽF¿I¢5Ò´aî…¬W^\›ö«îåëö‚2(u¼/X&AÕŠi»‰jØuà >}iÕz)žj*:kÍÔÖ¸çvõ^äÆò¤\šµ<ÅÙ˜L}À¡î]×Çl) ×âË}{Íô±%qEØ~)7éïJûGdƒÿÜžu™ôEJ]µTÙu”°_Å..­ËBc=”)ý×ÀwM<Н(›7škauºù —r‡ÛˆÜN´=T/™:ÐjRå°Ù±¹À”ôÝÄ‚f\ÀÆÌ3ù[­GGªZÂÇñ=‰®qgó’þžg‹É_Wç#üxÀÉÌ‹÷.vQ¼òxÂÞ›£ì$ùú™Êñz­äU1*:ëEÐÍq‡tYZû,^¨‰b”Pý4¶Œâ€þ- ~<ôýiÍ´ÇXÌŽú\uÀŠé’ž2%`mµæÍ<°e) uÍÑ{pI"½¼¾²ÃY$hHj,G£G}tÄÊ%lɼý«æÓ,L*°l4«üü>¶å[‡ ©O¼}ù|'ÀºŸyi>àYNê£Øö!d§ž&¼zÌ·ÞÂNX6\þYü)×ÅN,Dn]¼f¯÷Ò8¸ëÞx»wCíÛÕñ·«ãoWÇO¼:þ—Ýâ&`Î&Wš[¾ò1ºq²TF0vßËà3Ag¡uE¦8°hÂQ,¨Kþz³f`çE~ÞºPý%}›´šÜêËwì8lõxÈø³ÀCŸ©GÐgâ µlC>kÎ@œî|–Øo™ÂTË"ú¡…µ’”ÀåfH…I¼YIÔ5»þŒrv *䣩x‚ÆÄõ#˜šéÒ°¯ûã‚Øw¹2¦¢$¾æ„åBÔû/cÂŒÂk° ËI+qè§W4‚XyA$@“˜…Ðû¿ÔêÌ Ø§UÃîß û",­ÊÆ÷rrH¿$€ë¿PQÍwêÊ~(gŠƒHØ~çÄ35ùŽaß3‰½n Zî.(†ä–v@±C*–[·åå °îÆ {$Äìž¶X•s¾Ç;²»$ãÍLe {UÔÀ1TB€#=“OÄ3˜ÀUI @ˈ«ïÑ ‹ÍÂN’`i¢?ãC*ï‚S8 ‡Ï€;9>.QéæÕ¾ÖR›ŒõmGèW¬Œ¯‚Þ´FEhò²EØ­ŽÎWh…… Qy<]{7¢B¢°1ùÛ;>bdìTƒçèjéÖ-ê°O¹È£”S¤§`]YPKbuAxKPKÕV 7doc/serialized-form.htmlíYmsÛ6þÎ_2sa2‘RÜÞMRI3Ž,_Ü‹­«Ûi;\‰ŒI‚€–u¿þ€Ô eYqšÜKo¢™Ä¸Ø—g»X°ÿÍÑûÑäçó1Ktž±ó¿¿yw2bn'®FAp49b?½œ¾c=¿Ë&’*Õ©(xã3×aø¹‰Öåë ˜ÏçþüÀrL.‚;ïg4½±Úuìþ7ÎÍÏùŒ: ­/f— —ÝåÙëÖ¨PƒÒz¯^½ª…– ñ¸æÌþJI®)fá‚}à·<;Å¿ª‚õþÂzÝ×ßýùõÁwl|4a/»Ý—Ì*¢SÑð’dʳôŸ`p,dÞêi§Ÿ¥Å “” \¥©„H»L/J¸šît)å²DÒt“·³–ÇÀq/ͼ˰ C/X8‹D&äÀ'©¦$6XýØåäðbÂÞ³³Ãß^l¾²ºs–Æ·à·!—×Z”.+xN­™¡å ê~À‡Ì½<̈…BÆÉ]—ÍÓX'·×íþÉeeYÉã85®èÕcUòÈŽ»FE-Í1ƒêxQ Ü—îÚ'cüޱ.ã <ã·o¸IšXu í®§©TZŠù}Åׯ>nAKéî–ÒµÒ ÞAÛˆ MÒe·ÍØbd z´ÖÙŽ›1Ýùu,ö  ½Ó,8…6 Âáû[’·)ÍûA# ©µåiªò{„ZüI <,êœG7Ø_ˆ/Î~d&?ù <Ñ@‚TAô(' ü2¶=ØáYö(N õÖ ¡¬ì U=J· Þ'?°[3°ÛÃ>4J5‘.ÓY¢Ûϰ¿êMŒ]Ò§|­™w?÷zÃ~šÏ–ûÎëzLÉh'åI$ Ì¢ëDääA=ðPdX&fÂC4ª÷Èc›ª¯sËVb¼âK·1ýübücýäÔÎÆ?Mvøc£èm§âŸíÌÄM*N¤Íïuz1ãÞýš‚9HX’Ø5 ¯î·ÈB%<&ˤàz[ îà^Vn¥ð:Û­q„ßF N ïË*|‹:„å#Cå¶â¤É&âV %„§Â!| Gþ4«4ù%—Šd;,›ŒïîZçÿPååø.¢Òšüï<†´UúA9¼WþcˆmÔ@—Ml#Éa/À˜ÀÔÆ-cš}ÿq«­Nš—åpbËØ2ºýnœ›?ôÁíÜ mköy¡Mù¹nP«”`2ÂòÔ³5û_Áv°uùÙLg)e±Úcpr0T%E ¡hYEZ U`Ú !A ‘Šï¢ ;Kèôã ƒ8N’T¡|A ƒELÈRyZbHîQ¢õz6çŠU šjÁ"Ih mV‹ðEšño’„fO§˜RfÌå¼Ði©pg¤OI)$A×ÉI'"fÏÁ”‰ùs¿ÄÖ|£âªÀʨ’27T´ÌþH\ÚM86‹¹M½m†¢“ÖvÀ¯¦ƒC®Y8BÂÈ`TåÀEUQ»¦U–-|v2mÁ³&·ÐÅ,®È É™U“‘”B¾°’¬g*2ÀQ̘åR ž§YÆžY”§BÒsp´+ì¹¾fQS>"Ý!0 Þ}Iÿ¨¨€Î-8ÓBÿòÛ/¿„¢Þ…Õ˜#^§\°´¨•æRò…Á1Y?#Àžf$•ÏìŠå¼³œGcÎʦŽè©…Úà1Z(ö £SɰsStÃæøU‘zîX¿@ÜRm†¡U¤ྌ?‹÷ƒY!'¹­Ð ˜ö×7Í´©%ötÏ&ñ¾øá0j §Càs» ÖkÝ58æÍlÙv;uÃë0¢hväÊ‚ÆÝ"²aûlÒ‚<¦)öqìX_l0e¾ïÛ¬À Àt9åÑÃxÈöaÃÄÐì¶j"/À2ôüÈõ’© S£mŽÀü–ðýÖÆâéLŽùûëk›ô^^[Æì«®-¯ÅõÑÅÕî§‘ˆi;Ú_¿ÜèècÓÛ«.ÈðJ˜ kÒQsÒ©K úÃåA×Ù<á·äˆ‚–»Ÿ‡hãÙ·MNÛ½-?çF+Z‹|ën¨™ü߽ת|èjkûmËçëíÖ×Û­¯·[ÿ–Û­ÿ³‹&T=•ùnóy‰raAð¾Â3‡)!uZåÁ;šñ,HKÙ):úõÉšÁpõh“ÒÓÃïëO&Kçî¾äa(—_=¼+!³˜]¥1±+ ÙZ¶7¼:3ˆë*¬ªrøTÒ ®6ìYŸ;÷¤d‘òóTûW÷DlÏÐñiœNpbL5N¦NM(J ¸f¶ð†§'“ ±/ØÎÛδ@%ö§r%Ä~–ò¦ÒÛøH5•«¯;ÞR;ãõ/œgÙÄ’Œì™ á™ã-úFšV(õОœ]œnªåìÂø†RáóÈÿPB¯¿a`HŸ¿`‡(ËÆS "qÔ¹ÅéÚ1W­ûnr÷†¹>JB8ÍIzà wš¥zÑVï“9C­ë‰ä1šly£¼¡^>¯øþþ@Ž–‹L¾©ìùÑ.†=&˜¾ÿ ‰Qbªç\ÂË''ƒ•…BY¶²d•áˆÅËÒ4Ø?‹JÖ L(Û(Õ…BÂ@/Dxïð(Báç¦÷²fÙ'á]Êô–G‹z&mÑ¿>9¯Bhæ Kû×îè‡Ïb{Jyˆ»Ê>X¾ [‘™Ca“¦ÌQù]Ä ûÉï_PKL@Τð”PKÕV 7doc/stylesheet.css­’ÁNÂ@†ï<Å$ÞèÅÀIP¢Æ£$ž§tÚnØvÍî´Š†wwwÛÊR¹8§2Ë÷Ïü33êÃV«5ÞJ“1ôG½Þ¨7”ˆ‚`­¤Òf‰*Ø1(ÎH72k•Ll’€¨Š´±ýÎbJ°”lUŸ1%ˆp½Iµ*­˜—w‘Š·ð< ýÓΖ>`çùF²mÊaç>qG‹"]x1¡•XØpà|¡Þ@ŽeE{þµŒ%:ü­–iÆ]õ±/~¤ÖƒxËS;¥+”†bHJx˜¹'s) ×.—î÷J°$8}·¡_4…Béå¬N%˜ ¹m“vl5ÜøóøÉð=SÞ>vo?1·+S ›•¤`°0CCZ$tÖ½aïÕ2Ý¢%'ãwî¼#Y‹5àZ ”ví¨Ÿ°)²P…Ý:¸&ûŸ9êI9én±¹Çæf»#§Ð/T¥Ç6®æžö‡8—eÈ:¿“`Ê­ÃÆV`tïpöx<ÛˆÕœ.V_¬ m]œÜÚß ü º—ÿ©ÛûPK×åe¯ØPKÕV 7$org/w3c/flute/parser/CharStream.java½WÛn7}×W Ð_ ® ä-A:NšºH"1úRô»;+1Þ%$ײPäß{†³I¹M<¶(r.gΜ_]Ò+vLâšžïŸþnÌÍÍSzáÉùD\ÛDik#µÖqA7[Þ§À¦+>à&ýÉ!ZïèIñ]^­zSÝ› “›b÷¤*švH\ô&DÏV««ËË]ÒØ³.qhLÅTs¬‚-9’¡ öM…o(f/ðmu·ñ£Qqµ˜©|;tŽÜЕ¸ßûhB‰ä¼âÅT,ˆn™6zÚš¨_šÞ”¶µi/–’§‘}þnòì)úމ»׎l×·Üá£WêÉF1±¤ƒÜ†0­ËÖîü=»7Æ–pú~3#_æ8ü?2\äìºm³ŽÓÖ×áTܧ)ÞÊ8*y±«~ÛScâ>Šñ¦˜rÌ0 É¿¨|\¥|Pxô„|/ñÍ©2µü¨¡Ñ;Ži:b3ÅA¼9øÙpB80Ú©‘ÖÞ³–P‹¶þ´Œ¨m6 ’Y·ÑòW¨j² TŠ$4ßwBRq'–ÊýAŒô;TöÜwÞM#9Ê“¥ùñY.霼ä{µZõCÙÚê ÒK3Ð?«Q¦7elÒœ2Í?´n‚ï”eÜÂ{®W?½îf Õ°Õ;ŠëE¡—|{Àb•Ä3ç[£>ŸSÖç‡g7FØü.sEZ¹°¾¸}û2³Ks&ÉšrìpgjI÷üBŸÅϽyöEÆO=úI‹âNÙ‰ú¥_jîÁÀ\’ñ$2Ó`ÔKWßdss„HL¨¦§ç_ã€zÿ7„×0u€œ}Íý1Ó§Ž·ü@Vº&•éç%£„j }Tmiäîò\šýöœ7Öݽū‹â4¸¶ÿÐwŒï›ðklø>æï¾ ÂïâçP|Ž€±ÔèÈ8å ™¦óƒ“î1*_‹foQeC5‰lC6©µ­At­´Ê>7ŒÎÉeÞ®©Dµ‡¶žôY瑚³#£†Î[ï0/…‚Þûµ\ÜÓÎ"YL© ìVã4#˜èç#— caR‡R£?O…ÂRÿ(HAcæ“‹"yÙk®ïK:㯿ÅÛû wÞƒw)$)2¡ ØŒæÓ„ äZþ}< ² –‘`>¸F ø‹d9M^/2ò ¶w:‹ ¼ ¦Òl:¸û1DqÁÈ`d9ÉFÎÎöv¶á0:_ÄdN0‘F@F²( Ø}zp7#Afäb« Ï‹9rÎR¦B"‰àðâøôBB„ËÁ»£l– Š„†é„À"KC’ç4™úƒg¹³(®bBD“ †0Fô‰-ùÃ_çs@Ñç\ s•¦1 5ø>¦°Qçd„(*\QNÿ1QŸ4®b3ÀÒ’‘)MFvE¸Hs„ëŒÞ¢õ·Øå¸a"Lãbžð©Êœœ@¼a•Šcáøn‰DK†¿åŠ8ÍÏ]ÙÚ×½·ëœ…Ü•4œ“`B2ÈÄ«´‚›órÌ…ˆøL™Éypÿ;¹gb‹dÒ$MŽŠHN83ÒN·)ÀÉý"H&¸(ò4×wY°8ÌÒ"™øHíŒâ#!w’ÄÄßrX™ºðÃðåa†”Ë¥]¯%ÐöZE"iXö (69L„Ž_*+ð¹xÈ™‚, ÂtñàI©zŽëõ¬°=ö´ÓBßYã6ºX.Åú§i×žŠƒòî®]´»¬ãŽ[¦If9þd¡ ¹‹ö(ITøYúõ²H§i’FÏó«ÙŽñ9‘%O²,Í<6˜ö‹$ ÞëØz³tU;û–‘šœ|½Ã¦á³%¿óåïBZß]QZ.5#[‹æ¢ê>®ºÊ­Šy–îŽUŽÞÂÐ"¥è–SÅE“Ñš*z©C-·`DSK–VdVgâ%²‰×° Å,ãý¾tD v…›bá ¶*Þ\ÑTGPJOödV)FP.9Ô†i¥´­<$€l^!T.Áf4ÜÈfÇQ!„«’ÞŸ‹ Žœaá9Ùß“;¹}³ïv5*Wœ{,¨%ºæ3ƒž7¦øìúe+›àt)+v)Ÿ`¬uCnÔ­OÉV‹sWøä1½‰×®@¾s<¶ò²Ö¸”mëS¶{ͬaʬàs…f¿UQ’V”ZQXEŠÕïêƒBì7˜D´ì/`øÚ÷Wm2!QPĬ¼…»fiëº8eIæ'Ù éIu¢²Óº[i =*×syØ<0•ÍÍ)b®šŸ@Ä‹ïÉ×ð>ŠP'2U_êNÉ–zÔÜ®?› ë¢{Ðí*©ª~ÄYÒ“pP-«Ö­m碃Ôä‹üÙM%M=h~Œ¬¾Q·¸ ؆_&ý.—Qj$'¾Ã&î$™H$1¾S³¯€¸Líf2¸Ú­fóÇîÍ%Y½3_Ñ´¯ëˆÍ¦Œ„à¾ç«y5`-7¶\l€¶’§µH¢¾¨Ê+.Éæi‘0'ðd¬aF‘ãÒÕDëcOšÄí5íyÒiëÜÝë×^å–j’«ûIÎV΂Œ‰C[çÙ³g’35ªÏSê.â7¦²a—*‘íF™”2¨#Á•£¦Z8È<¨èkhWå/µ©i¼¹R+Æf‰=Sê‹§Ú÷ä×´è¿Ô§Ó[ðkjÏP[ʲú_z¥2aJ8×99M(Û”›ocXîÑÚl¨î"ŽáËgSx®Í<ˆI2e3éèºòlæyÆF¾±‘wèö¨Òp´·d¥&Ußè¶+Wä®+>ÉêO~ÚýV±ðÏ­fGŒ$šL1¸Øé\Üt”;[ô›Î·*sóHœÆ[0G]õwm·Zjl7F¬ß*Aw’@‡†;ÍPsw9æº@*z/ŠÆHýN™w=׌ÝÓŠçlÅ5ª0äÓzŸh´‡Ë9io#8çô5~ÞQiÏã˜}»Å®oпÂak £õ< ÕÆUÚš}Àœ‰”«à«1<ߥIÉ›mfÂÜgûyˆJƒ6ñ¨ár¿÷°YÊ¿B0¹.rõ+Àä¡“b~Å¿Fi¦¾:b0òÏ“tØÁÛ£óÕ–¹–€¦ëQ}”ú s&"[ýÁ)7VuŽhºêQëú⊸¶ıß¾ªm‚ݲQšÑÀÔbé­y5hÓýÏÊ=¸–¯ç"O*ãž7ïïhÉÒ ú¿ûnF±|y»8ÎÑ‹%×íäµ® ð½fy¬ŽNbžoÞíVWÔTgàÔ§·3{ˆ¨pì°ÛuZä›±Œõ÷zЪŠÉV¬ÔðªÐÒå²(bUñh’ibÖµ/IâßqLµ¨#ù¢™3çœ6Ë0ÃI=ÅêÏÃSµþuýˆb¹\b£­l° aCÏXiå´õ"ìþŽ;Çë.8òÞa­œ>x‚Þâ‘êNi©Û·ùÿî¹Zq‰HWEÙxF&Ѝ­¶»ˆx òcê2x}ÈÌqCBã¯=Y'üÛ4/¥D%Ú.ÊWäÈöÔäè¼7%cÃ0äÃ"×¶eß¾Ù-µ\²Ø;¶OÖM‰ßag®ö5™Ñ\þÂ{>ïQäEÚ;ýÉN—(ÎÊE¹XÀHê"ƒÅÕÞ`9Xfxý·qjÛF½:ßʸƒÜpýœg›%©‹ä[+L*êÅø+“È$yð¶ÀC'¤0†pK¸uÈi„g)jÔ2nüØ0hïI5qþ ¼ØÑwá=CŒ$?Æ +KÜ“‡¢á˜åaé=ˆN¦¾tgÙ'PKšÑ÷ƒj4PKÖV 7)org/w3c/flute/parser/LexicalUnitImpl.javaÕZ{sâFÿ[|Š9jS» Ø›ºª[;N™€ŒUË«dT*[²@·B"ÒÛ—r>{zFïш‡Àë„T¼0ÓÝóëžžîž–šo+è-j;ë'×\, ªutþáÃôÉq­údÎ0ú„ïÂö—˜þŠÒ×úºçéÆÒ÷0!Rm˜Ä'9s4ÁÆÒv,gñ$Çh Ó±u 8 ° ÿSIÛ@5wÜPüîc„ jùÄ Gdô›šÚ滞Ižê ÊØ²,¤QÈô°»Á³Z²¾h6ß5wÑLp7{x¡[Mà¥ìoÔÙêáGÓÐ-MÔÕÚjüOßèò7¾CïÏÎΚgï›çÿAgï/Îþ{qþ­-¼.R×è HiVÖºñE_€ÞîV4s ¬ÐXë. º¬TÌÕg Ïk€Ù©u¨ù–!ºfê96z£áI¿]0$oؤã"4Zš–¹^cÀŽn)LÂáB°¾…WØ&™)ôG¥‚à“Z»xs™µñ#EH‡½%Õ„<­q@fÚY¦úe8–¿²Cr:`ssËÑ üs™’ƒf&À¢J£câšöyÙ_s[_áV¦/^_y—9õèd-Ñ@ŽÑË)är^\ý*’9Gµ5úײ}Ë‚¡ŠDÅS‹¡+´¾ 6¨±`€,M@ =W$ú­AWÑÀTÁP° †_¾=f(8*"¶ò³X•=áBÓñ½€Ê¤ÈQø¡«ÕÆ­ögu0QºŠ&‡â"Qký2ÃÒ0yJhIJ¼"Þ}9ïrèGóœ)’ý”˜ƒsn,sœÆ4^šˆwÕgúçô& Ü5²FN÷`z?µ=ŠzëÞí¡­ÉD; èé@m;йx}=v†ÅêN¤‰@SÆcÑæ¤R}§øW_Ù…}û‹í<ØüÒÏA“uÐø>[t'¦sïпá¿wáíVJN GÈD¦ª Ø-ÆyÎ #ßÃsßBóÐÇÐÜq‘@è E 5aöªÌÚŒ&êµGàSÜ î™¦Z6zÀ%›Y`CãE*|ðV •+ßµwLX½ÈD‡H‰ÒŒ iEì)Óî´U˜Í¶kŸ¦¥TRù=Qްk`›è ¼(ÚÖ÷Jïl ´ÉÙÜ(³£˜}Om”þx‹è+ª¡ôËÀ¿{eøø»àGw;°¿ô¸€KoÂÁøÛýןõœ¤Ò,± ý¿‰Ia\B uðšžD+ÿ£i4yÕƒ@/Çáo¿îAn·Ž‚רW ¢É5î(à’÷ª*—Ì£Tèî¡ÃË*Ñ=;ˉ=Ë]VÜ~ÎâŠ6iÅŽèë©ìî¹hîh¥?±ûÕ=ÒàÜàjPƒž(BM‚!z‡]þIfIš%G¹Êí/_ÝUn\ü»mãéå ÃÚCGÙåãNÃüó,“=Iq­Ä9b]­qrëë1Qh¬ì %Ô ´“²Ý@y‡ÕpA¸Ôí÷¸êµ£å¤}æ܄،c ŸtîÀÚÔk.ž›xöðSÏ.ä4å.eEíÿ2m¦c÷ ’8ºóyþ©Ö+óNáDSM=p‹vYËWk§€L{¿an;¾MÊö×òó©³¶© z>½·§…¼†U#@[MQÕ8Ùõ¡&ð¶·îŠ÷M@q¸ÆeìàUåÚ>wq,g»/¼˜¢§>üë{±‚õæi@ÃÆî¨¿OQRûôó­}LàÞÓZ z`Vrû#‚Üë›GøD‘A5$·Þ ì? g†5ÝÞÝÕϿϗ¸…&`OËœBËûpwk6Y(øq‘NP¯9ÝçÜèuè*Øà·,­æé†ß^ôñÑHƒ—Cçõ® ‚zªšÚ?q]†Ì¥â—à/'qöt‘LjÍh¾¥Ò‡f-D¿O)«w¿ ï £_³=hº–•ùé"X4ÜËU¡#dKœdc‰8•QW(Ùc.GŽR£<ôCåáŠU“k8ÆÈ%7<ü—ƒò 8³ò¾(;î ÔûNÑŸG‹7“Z)Þˆ’[[SùT–ñŠÀÜñV²êìOãHŸŠœU0Ë,E+Ñ+òCr}‘í«BÕ7^}õ–_%‹ìm½Ð>®Ñzó]üØþyAÿ°¢ôç†>T¼îšnB{çýPK½èp › PKÖV 7'org/w3c/flute/parser/MediaListImpl.javamTaoÛ6ýlýŠƒ‘rlHr› ˆÝ Ë‚a5šn…Ó! £ ¥“ÄŽ&U’²k¬þï;’²ba`Xâ½{÷îîIéu×çxøãÃ_ëÕoo?Âüööž•<óá·ð ¤QÚòvçñï™1,¯[ƒÖXIc¹m-‚*á#æµTBUÇY€ß™åJ2D·&jú9&@I¨Ré!¾¶hÝÑ}kUw2ƒwÈü)ùµáö8I\â½°æUMå×hPï±H ¶¶Y¤éápH¯¥«ôEwúˆ)åºô«U±€÷XpöÈ]í‘|a{6ÛÃ<¹WY–¥ÙMúêG˜¿^Üd‹ù-4kbÐðë·®ˆ#–ÿÍ*êZWT/OJA3H¦IÏ2Šø®¡Ò}47&¡¡%O÷}aB¥×^ÐϾ;%áj{îî^Ê•²ÖÖJ|¨¹àMƒðˆðÖ©A”´[ÁsÈíeØ ;”4¨ËÊðO]OVsY}ÚÓšá$·ól³ô .-ä­ÖIJ i]A¨Ð>¢¬lOˆtD’Z-_à}$vàw±#à²Ào>——ÇþÞ@6ïß¡{üéîÌ8ñHG×U’­ËhtêKûN>ù¼Í þ^ñXQ¬\åNÅŽÒîúêá1Á¯-&3!Æ/q¶¡)ùÈ2wÂèt¾¼TD‘·!´I€lIoúáŸN{öÿ–ïÙ£ž5´äÈ]N_þ.L„ßFÏÛoXÑ Ýa– w~f›žEn:ìÓÑÐØŸ’«æÝ ²Y ñwç …Æƒúîl:uS í vâíï®kz]˜°¦w[Zÿõp[sjûs›tiéÿX˪pé†ÿ™“qGæÀm^÷#óÑœ„l1°ÔØ­ÖæÃÀÙ.°d­°]|«”@FfTös¡$R³V·ØÍ.¬ÿârN¸ÜÎ/mY¢†m[¶Žã²I‡.”wáFŸYœ=Bóuoî¬pÙ¢O½PV’¹œ´Ñ îzÈíxcOxêìúô ÄgšÉÀê>õeêÞ!®èý PK_ Ç)gPKÖV 7(org/w3c/flute/parser/ParseException.javaXko#·ýî_q3_V²YoS¤€HÜEá¢Ex“¢°‚šáX´gH…äX«&ûß{.ÉyèeÙ°+Ïð¾ï¹êý1ýMji…—%ý¸:ÿ»xWWçôWCÚx’¥òäçÊQ­´Ìé'aüø¹ ¯ŒÎAM¿Hëð@ßägtüþh!Š'ñ ÉØ‡|ùM‘Wuëe¾`F{qt¤š…±¾?-œË(ò«››^,¨ÞÑ1}bͲ{Oxðsk–š–s©)È$i­±Ž„ÅŸº0­öÒÊ2göÿ˜– ¡!aQ«BùzE…•p•ÌìQÞ‘©¢wƒ¿ZHš­˜½5¼~…¤Fú¹)é!Åj=¤t êNK掳cSSªj•µpðÈPÑ:oõ?I+ÓÚèYÉ‚~fod1Z¹Æ‘3TX%SƒÌ‹¤~ÑÎà&UJÖ¥cÅHF|5m-?{©KGãÐÓoGGD!úÔÅ¿0ÚyÛFá±u@Êl5ŽJ¶;,Y²œ.2DW}€7Ôt´.J¤å2å¬OYHÔRùy¦¬h­•Ú2ORg§‘=CþÁ)ËðöFþÚ(Òe§$4Œ÷üöºf3rÒîO83¦–BG U-(s¢D}5šq@D”€‘3‰÷’¿•.UÁ@ósᣌ-'—"“ah¢Ÿùž 0()`×µ iSjû8ÈfáW꜠×Pel!Ã1œ½ gY—;„ù@È’¤ìW˜˜Õˆ†7QÄ>ŠÐl¤s\â)³ßœGJþ¬ƒàœ¾³ÒµuH܃ôÿŒ¼ßú÷ø?AtkREãlþ"êÏØw{{O»3ý"kŒx€~ù¿…ÃþI–M/âã8è2À!=ÁÁ†c‘f·ñ ÞëUä g•c/øüËFEs¾êÚ,¹ðFÀŠ©dLr}ssáÇ%,Ÿ¥MPhí¸ШB?bõRËÕÜ ëz¦\ï*Us#4ª_OÒmÐÍä\<÷¸ÒÀ•¨Q'+úšT.sl’Qš¢m@TO"ÞBoªã®1äþѶPÆiˆpq³ìVÖòY .”æa FqˆŽ:^aJ !ð—Å À]Kå8 y*‹½u1]CßKثЗd€ÝÒ"ö»z^—ݽ|µŠõ©ñ,¬âŠ–•Ê-j± ÷¡]ØmdýhQM¾Úî…Ý1¥¸Æ1‘ÄQñåhX«†B½¤,‹ç\¨ø|Ã÷K:‹/yÓ˜ð‰ ïðõÝžBÍk©ü$''ƒMlt'tç­ºOÌL9Äu‘x¾¤ïÞæÇhóã+4ƒjlö°ôÑÉxw»Ý+çöñþžN(£lÓÁ~¶C†aÅúpO_Á‘}Öeè:[JÇÒÔÁ2|²PlÐÆ‡{:Ýu°ˆƒ!ØXs‹ê~¤ô퀃JÞ$½ìÁ4&€®ü 75ºÜðzàeäìþ¢'˜¡i!.töö®qwŠÇ»/@R‡{on¼*hÅå…êÚ±'v-Í0ˆoVΈÛßOÖ úÕ$ ¿‘9‰Î/øÇSdQ‡ûáØ€Ÿ»u×hܪ¥áyº%pcìÕSÌ·Y±£ æa" ¾Fɘ_ŽþPK/ÔPKÖV 7 org/w3c/flute/parser/Parser.javaí}Ûv7²èsüí½#2¢i’º[qE¢mMtñ–äL2‰—V‹lJ´›MNwÓ¶&ãO;ë|Òù…ƒÂ­q)ô…"mÚ“^“1Õ P…ªB¡P(<úÖ{DAì§Aßûéîñßü·þÁÁcïpìEãÔ úÃÔKo‡‰£ é½ðã$ˆ›¯I)ïÛG&~ïxãø¦ùn½×„Ó4hNh¡½†£É8N=(ÝŽ›ßîio¢ 5_MÓaØ|î'·'þùr<îùa€| Åe{¢7½$i&~¯y0ŽÃqôÔï¥ãøn¯° ³ÄE£’(w±ˆÆJ4xI‚S’úPîÏ<òX-ýøãåÙá™ü+zÈSÕ—wJf¹» ÍD)ècÝy;ö ùS6ÕØ?^Hÿ©“žÅãw‰Xí7ùJÑU ÔÔ?šûW§g—W/_¼8;¿ì^uÏϨ]iž É8 +01ĪfŠi@Ó?2â·ªÜðÎŒ\+`l«Qã;iÔwã¦ØÕ åÐjß,@:€Ë®{¬0ÕTj TEU³µ–ÕWU—‘~Ò?];ñ‡ë‚7 ÈôÔOø)6ä£? ðà?ÇöWzGä ¹ ˆ1‡ˆÚÑY&Jåž­¦Þ5פ}¬¦&KJUB20LÉgï­e]›töôïºW³t]NŠ©.Ä “'¨'RÛ‹¯çÁ1Uj7„ó¤®ú;™S§ñ›o¹ž¼šÅßO˜nSÚ„Ç:ÛÚ¶NMÿAkÉæd¼)„ã©CŒ#½1ù“q6Xm5§"#àÞÑTã?*/Ï’¦ƒï2×õ)K H¿ïˆ“ŒÃ·d¶$Õ>C¶ä°@lfž4áÂh),_“ 8ãô X•!ð8 ¼xJèYcd¥¿É0ùéCøIŒFÚïÇÞ-ÔJë®±s)€²”ÃtN:¶tzãKUâ×UFú*¬ês¡W U¯6ŒzáÖfŒ ¦d.œFôïÞ4ï¸ëB•ùÖjp)™˜ê„ì“1ô'ahe~"ë†7¥˜;!³[:£Ä[¹MÓÉãGÞ½{GÖùM²Ütyþè¼{ð\ +ÿ° œ?éÔR²ªÆ>|V"CÇb¿0ß„¶ã-€waùBµ:½)‘ïúÎ;<;ñŽƒ·Aèu²%™&[.?¢î™¿ö'ãoetζ†ê$èý¿Fê“TFt Tß5ŸA„oô¯ûÈÆUì•1 è¸)nr6l/âñ$ˆÓ»_üpºÄ²Æq ÞOâÚÀ“Åîz<?˜ Çñ0½[z¤&¤£«ß8Õl»(Sö<ðûAÜô^´HaÆÜÈ×bú4æFî™e@`g¿0j á4¡RE 69æ„aŽ>±¾ÆÙž#ŸSSáu/ Cn´ôÓ]5òè‘wÂh¢ö‚× ØØÄ´`®¶žŸˆe&ŠŸØÇ!m:ä™·;ÞDãw„ey…mcÿâàèÈó² øÓ0mZU9]²•9E‘Ž}Ã[¡pW’)d³»7KÜ#˜Ù;sx­¡Þó½ê´çÃ}¾ÙžûK‰VºL²Ù˜^ò}0ŽGlïCÚ—àÓ%ÈjÖrX]’â¸*mãX¼…U›p¡KXdÊ™”/jG~ü&aÎ&Å~/ߤŸq´ý‘'/ß@H0¨Ä=1êÚ´áݧ«a{w}W!F òQK(=šž‡j…b¸fœ£~žQž‚ýM9R~ ~€Éd š•àzdD¢c.SéÏ`(«*6 ˜Â¥ÑÃÞUFŒ¼^7¼6ù_%uèPMTvÎN/N_v½“n“Ø9„YÂd¬LuÆØ¨ð¥Ä<±Õ ïD¢uð|y~¬ôðåùQMboD¢£–ÂêùiïÖ«ec`êïFnWžÃ@ÑuV·Œžh½Qy-xuˆv ØÔ¡%-Åd4ï­y+™·(ô›¦:§}r©Pù‹/Ê%/?“CL¡ß»~âጔÕ=àõHÁUoÕ0©¿¦0š .@hb¢d E 2‰†€lÓ?è«B¿££iT¬nÙZ»ÕR;OÚ­u^ijf. z 6«?®"Rs;5À¥F¬f_ªÄ üR/þ+ ?Ÿx¤y“kÒÿß_y×Ó'}å_íÙdbý#…^«ámTá#ü&¸{7ŽûZ4…³àÇ+4ƒN‰È×V8+ÖPq¤ ’›o†‰s.øúVõ–Œ®wDæ°Ì¶":qxs«W~ì½»’)‚E€Ö%Üe›D¤l,ÔÃHÕ©èLSÓÙ`“ë?§ã4(-x(ÓQT2ìæÚò£>$ŸZ{6€æ5Q›Ì<«+¤‹ß|ãiïþX]Eé/9É![Æg}·iËFÔŒ®cªA…cåB†pæïõµW˜¿Ž‘SmC Òá‚F!2™‡ <Ž·mŠѸDH_¹ë\Ðù¯éDZ×Oîj¤*ZBÄh÷ÜõY#ˆ*Ínö›9r~¼O‰ BÖA>áÙž02Jt‚éF`Ö½¼–¢1±&FC¯7‰hû< ´þü˜õ±·ReBæÔÑ0IèÆ©ìXñ¤ 2{"ÊuˆÀp®&§B¸Þx4ÝôJßs—ví§dÙ¼÷a}Ó*×ïÑÍVbºÞúo媓Œ[¼¼|úpÇ ñˆÎs„Ã`ãüfL?… P> üs$г!Ä×1× ËÁ<Ù.âŒF¨ÁO‘¤}¬©IMx›äü·þ0ô¯ÃlÎȪã7‚#ì~eA· Õ8ú²Nf×Hrˆ: °VÁòE^1Ps±Àu¾è?€°pŸºŽ[—ò'0@ka,ê^k*…ë¶B ’ò5ħvÏU–p+ò%,>,ì ÇdY.ã‘‘r°˜â?µ½0ªHµêNŸ°QŠâ£ô¢`p;ÇëŸÎ±hABJê¼TpÒ@Áïrü&ˆ¼„ á1m°…¯Þzº#°ª¡au5ÑÓ°á9V©€¼_ç˜h9ÂÈtÝ ˆXë¡ð«¼QÚñ´GW"ÔÛÍ‚GA’ø7ˆe¨Cõ&๮™MøŒ6!údô†~x š;-<-Ò›vê õv(iÞ%ÆVs'<¬¦?!kæ~mÔÎ4Jaqéý±²RÏÕf¢–ÑlL¥ÒS‰Ý °ósq ÞOhè6mí‚L‘¤×AÒ ƒè&½¤[0nz÷¤sN¡'=×dÄÏÕ²¥ ùç;¯¨_¤ÔÚZ^¿4À¯à×y€¾’°_æ$ ß€Eû$ìï¯s { –Ä‹ü¢LãðèÄ'}H¡í£‘¼ßØ«ª»á€ _\ç½â¯ø—Næz‹ ׸¦kŒG sÛ¸ªá`>D¸α‡Q­·0åŸ0 ¹¸®F¥tÒy[E¥qX¡WÐ>Vv·gV*¡ˆš.G÷tùw?Žg\¼N.‰BU'NîÁJAÏ–˜8Áie=ׄ aøŽµë¢"ôgB¾ IVˆ– Z·ü‰àœÖ¾…sû£‘OMozfk þYϾ$ôð•8Ø5F3O&”øÎ8Ô'½²>c‚Î>ô§±ˆJ¤•°­v®ÊŠ˜áQÔb»Ä€Êf:ÎsMbŠÄòЇز¤IÞ ©;¼öúõU”¾yòäa»þû]«?f?²‘TïàùþùE÷òêâ·“Çš+™›íâÕ5±Á߈?ùÖhV€ýöï-ð‘ß7A”Õ¿_’eZ^µEeî@!–‹f¢UC…#sñXÿûàðÌzs`¼Ù¿ü¹ûÛßÏÎ+TW%JÃÁ]b߯°çõÖ˜õ{_TiÀè$ Š;šç%Kùá„F|Eî1άu>I“VÈôÔ!œ)¤a£ïk¯–¹6~æ;3ÌØöú’Ú±÷Š&£ë˜š*aÈÎ`Á°5@ÖÑ2 çC—%C‚C5lÀ¢~ð¾5‡°u ±7E0œ‡‘ÍÇšW×6:^ž EJØ81DcÉôšœ¯m4¬4ÉÇê@Í ʘÂWVÑH05ìÂ9!ì“P%ë`»A_(³zõ'—ÓÌB\ùÞõbߺazl,©œ:¼Ušœn|<9ÕVÜPÏfÙQXÙ„F=O•WÆrâ²Ã0–ð©´QGm‰a”Hû(„]õcm±€ /÷ È=:Kn5×Eºé½ñhDìy5Ó…þ¶ü~ÿˆ ~mÅC$ÈꢵP ³8Mª§A`6´Š….þ|½5Ïbôdy)j÷àžû ¦KŒé±õåÂ,"m›Ã”Ò­å”ÒN ç^{kF)½¿²EZ¦Ð$’c΢£>037$ì…æöç°Ðì8¼/Æxi{•š%§±ºê_»ø/sX<_„9ÜA,ó2‡Ë›ZKº{ÕqShJaÖý+õ‘ ¦›“iZ–‡þà­ü×a÷éþËãËÿZñó”P95í"t–·|&æÑ\ ¾9ëЙyh€!ašÃ‡!¦íÒgnÜÇ0eI·2;e\@³îe:†bD€{x@(%½º–´Ú£û]]ƒÎÖ’Ò¹DŒN§5#yõ´qÂèn¼<Ü¿x~²yðÜxtzpüò°k†±¾8~i¾:9:µÞœœìïäTd‚<ïtí–Ì]Q{_ÔÞEöF±ÝQËuvJϺšý4Œ6̘gõ_žüÔ=7^jëM÷ü€TÞföIÝ͉âtm³æÄLã[¬y»¨®}4¥Wû§X3/OÉ vÏ÷O-üž¾<=¸<²ÈþòôçÓ³¿›o³hd/zVÙ-á~ëÌ/zñ‹q!ÂE´Dwöˆf^J¤ŠˆßWœÿ#e—ÙŸ/YúºBžÊUG cþÂh¶(| æ9j,$LI gtÏ/4H–w=b†ŠÒ`mjky$zÔ´F C Ó×\_ä/\øêdÄ‘qpSéÌà£Ãw•Q¾šåÜ”®'+îᬣnS›Öu6Á¢  ¦-é¦Üz‰ÃQY7åreÇe$kÚ\ÂaY¥ç¿"üÊ›/³ á•ðdsnΗÍ/fgqÔ¿«÷f!‹_裃=VŸÃaÏ@dSÓ§+'<ÿHv+”¤5L£^–‚kA¾ƒéæ—_†s‡µ)ðì—ô^¸ìµWà˜¶©]–tj½Ìé¹%ß…â½ü,ö‘ÖK¾ë|”}¤uÔ'7‡A4V~¶°s• âÔZŒ‡ÝvÌ:âe\%=íÖnœ<Ýú”í†#ÄÂ8êÜÂÄ'ªlg;¯s¯“+Œü†c¥p_×Âú¢3NÌÈé%N?¬£þÒ9¸J%BSóÊ…CW8·…n=ÈÁºæup3ŒŽ‡Q0@ãp:Št·•êF ‡úY¹œóEN' À°]'ŒüV¢¾¦Y-Ι(Ïã¢- ®Š–ú*ñAdеäu½³,KÔ tÙ  ^G—¨Ù–¨ð|Ìe*¶ÌÌNìÍ»`Ô¼ä¦æ]Ò%Â^Ög=ÐQÎà^_RwÝF‰@‡õÙÝu%"žZ'L?­q½QjåÆ)³˜ú¹×%–Së%CëÝÆõ3¡ÌѸv¦ñЈáÌmò¹׎eÕ½ëíåÔc›%ÂÓ×·Ëqú—¿ogé\ÍŒ\„ó9“[áX† HD-O¹9¯'xâ4õËÐ\?•/SÈe\‚žÿ7]xÕŽÿçìZ¡emùÊ'¸­h‡’d·OtŸåBÈ= n‡oà0 B,u ‡¢í°šõ­†,儃F˜ °p+Û‚g„‘à x!'4†_â©% à•–ÉpÂáðBN(zL Ã0ÙMVˆ ÄŽq6á˜ñR(QÈ E‹¤ÂaÐ"Nf ÃÚ´ X¡Z8YÌ I+sŒÇ„€ÅZáh”‚nhYXZá) ÓxÇѱ¬i‹ºJNWRÀ]ÛØÃ!ðBn¾WÃqž‡9£¢Å³9„–Á`à:6·±µb†Ï>ú%©÷ð”EnÃáF÷4³·)ĉ­|»¢‚Q±£ŽÝA8]“—ìn—1ÂKF½ Ûã·BÏ*Û%ªLäË7ø—t—s³ÌNÀ<Ža!ÎÈÕµU™üªHkk Þ×%=ųY"Zd}ÖS<Å”þÞMi7‰³†fpƒ©âÜži(ôò"áSMî×VsFÑÑÝ2Lènñû¼søÆá/Λfà©.-³O[ӛΌÓZ¾éûnM—rÐn–­¡ºÃXO‡Ñ8Rïot,UŒ¢Ì€1žqz7ïxÕö²ln¢ž`Û&7Ͳø¹Ç«*™f>O„TÐ ÄŸfþÌ¢R³ËêØßйÍ^¨»P5Q`¹..£¼W>ñè09EÝ£ÛXÒ3)›%B¤6f;“ÂÐÂcâÐÝ:1¢µð>vÊ·ë¶*\E³±˜ýé¹m×m•8;±QrŸÚ¹]·±ñ9[Ž%’A 톋Ïx»n˱R±û\m»ncIs¾m•ˆÈؘ-ç›Ü®»„9+è/]H܃âî× TÑRotŠ!4OnbÚ«_Ua3гî¡Ú3an,žj é¦Lþ™G¥(eBQ7á¼h$ïeîs¯3ƒJ?>¹±µLÇ'·Ðu§¦%¶tñ/y|rcIã¶J$DÙ˜-Ž¡Ì#¹ GJo3“ÏÍE”†c/dµe\YURt ¤þpøw<º¶W:*e‡Dœƒ+ÙÌM O½Ÿ–³C‘—ÈL¸£sÕ®uŒð…‘ì+K5žCÝÑ€=œ”ídÅrP?´ªÅ§¼É%õ*o•ªÛ˜Ù«ìн²³4\– [b§l÷ŠþQ“vA¸œK°»Áq3²ÒªëçÏøðÔÒ¦¸Ã™i\ºŸ•½Ì–$Þƒ¯ žþ™/ɷݳ§”e¿Êú‘ÊÖ¿ÄNÉTÏúEßàè~¨`'()‹êTP´24¥\…²’‰½üà"“Å2‹ZË5éžZj}lhKñ6²íÊ•M!™€¹­¹¯ÆQHk‰îËOô;pÑ õÕ£°Df##‡‘¹Õ’ ‰, j0>WC±fL$› IçÈÛdgiÂéé—fUØŽÐ_Uao¢IæfBØì3g[?¹­Áï<MYÿªúIR‚Ms ÆO‰n».ÆòjqŒÁ a䌈ã9Ï 6×Ö«vK—kh8S,ä$á¬1#÷o—ˆŒÞœ_š¶/Ÿy·^ÚÁ¼ê=unÊòA]ÈvƧWçÛ%¢g6Ñí¿Ôù‚$Âá½þ¡_ÌèFˆóÅBv€–@&JøÓ7Ñ£¿dbA2መù2a]yê¦ g…œN]±(sF»luèô8 ’^õ}eP¤ßi.„ðÌ¡q?Yñ*zk…è9ûê@{“·ûý×~OåÇZr;†½Ó{Üšƒ6>/p÷&ä÷³òÉ™Yí­°yàu¤Ðñ ŽbCõ­ £·~Hà ’M‚<Ñ2¾w=½áÞö•úž½ÿ¨¿Aöž8fœJO ‹ÔBæÍÓ 1Ô Þ!LyËÎÖsÕ]áÆÐR9ç3ÿ8·^²“8è— .V\ìŒ.ÖÔLÌ%N²’׿õX&EÖlè¥lRÌ«H¢EÊ_÷dŽþê÷ÍãìŽÆ c]ÝúYG¡+ ¯WGn´_*†0¶Vô}'7HfpÜÏèͰ¯¢…ï•`œYÎáhNXðá³ÂSEÊ‚œõøÍZ7¸Y«.yQU™ËTãßa*}±ˆÆ@¹QSôò•oMü±f°ð ùªrâ¼-Kй[UæÓ65Æru¥x,] ±••v_ ÂäûÇÇ…­rºž³ û[9%ƒÅvJ…‚ß› : •«ìêÂÚð~PuÐ^«÷˜VS-‹î2=> WårÔç¼ÎŽ&®Ùý;ªÛ;ÓªbVb0Û â©SBþ„°Àža¬ûW§gW/Ï2òWÄ+‹5°GcwN¤vòîÖÙYH†€¥²¦2Û˜{õJ›×ä’>ÂØAØ{`v…œÑ"Ë;í-7ÅHá_üp`ßÀjÀÞ³K`Ý\è°ó…SS TÞ\š 0v /ÀجzÆýŒZ6Ž% %õác¦‰?d¬€n ³Ç4÷½2êe²œŽ¾ù·zòœ±¹3'×<ífö˜Ö3{>˜82!Ê7é2zÎÄ ÅRQVHÐ=bS,f›ë'ÕU%Qž}n¿WO+wÎ1="{Å÷Ÿ¹¢›óé‘{(å“#›Å'Gî©”¼qHN3úªû¿g§PVé÷s™JmmÑ$lH3V ¶¼Æ:y!W]Ú^?+Ï^^sëUùÝ2Î_Í–¿AžsÞ’>Ú)q²asÖÃG÷?&Î ÑÊÊS1T ¦-óxм¾ÔѬ‘‘®¨i®µÙ¬}D …÷5ٛƽ¶Ë$˜fD7ém­îiÜYŽíÑé9³ý’¦ãÚ)‘_asÖt\…Óñ.âµRg«s}5¤E0Ítª‘ƒú-• 9»"ûtu9Uvýk`…4Àhj°LHôµ×HÛlϱ͙¥EHd‰þvJö÷, Î ítÕž¯—ìùOpTüùÝä6ˆrû¿Ž³g$`O9B âþèQVD {¤lï6è7 *eîŠL|ówûòvú]¾9íð-µ?ŠGˆUßîe?B?º™Ê ÚÒ}jJ“…oü±‡»"÷þœZš%5ƒN »×VÃ8I†AšñJÝû÷¿=ëÛ0 V¬œá’óÊÄ1œ•ñÅÁÅ…é¡èO'd¸cˆ[ù>,ˆË0b¶RYH×¼¤¡eHEC>\Að¨Gæܤ²…8köØeÖD‚Ÿ‚Éâ8ÐX1‹c\¸õªRpŽÑ(msæ)ȹMµ¤¼wK¤aÚœõ€·PpÅê‡5´µC™s R‰S8[è¡ÊD²w^ìŸïŸ¢‹-®Ÿåô3{@VRÃÔp%ÌžLUô-Uá²c33­c‚äÖš£Õ²Êƒ=¶ücº‘=¹ŠÄ®¼:écê„·Œ¼/èMÙ©MÄ!ò‰MX<ÌkZ}NƒYmP<«UYè!ð/v[’žy¨nFèG+¯.=R8T¤WO¦× KòÐÎ$°ª±ß_”±ß_jcŸfí—»ÊGfŽ Ø´ ¡Êv1üy¼'Æiø’¢¤Kxe¦ Usåðý,c­Ô¤¥r€êéùŒµ¤wÇî–8ß·5Ûݱ2C¼ŸÄ5:2÷ÙìE/“ñ´ÑŸÄÃqå4Ÿ»¥.÷ìLm’;˜;ƒ`ÙÈz#4©H©ó·éh‚eÔÜqû²ˆë"Dò'g…Ôvˆº™àît:ºâ§ãxä§3ç,T 4é5ÇœyÄç̈6;ã,ÀÆó A‰^0;‹‹G£Ô õ3#ªJžÇ€P0…9–J -¤¥ht®ãçžg’Òe^™&sa¹&³Ap\ÃŒ}%òKÒÊÙÏ<É„çÑ·¾Ò‰K¯s©)¯êÆå._A™faõþιÏÅÅE_ÉœQøÑ®>k9$ç?-= B¿"ôk5„~ý´)ë—/½û¬ B¤øbZÏGHñW8"%ª DŠR„žcô¬"JÏæŠÓ,Hén#Z¬PÄæ&K3Xn…ª®š¦›£¢›A-d>;WÝ?ª óüŸ™Ÿ ±ù¹:?ÏŸY¤Gs¡:·@I÷á“È<¹ ¤rfi\ÄÃ=ñCï;/‘§B1$á‚©ƒ[?ö{i7‡Éáðf˜Ö’&¸EöÓÚ°N­¨/ 6rµ¹ZÇϬ¬­éÑ÷²Š&¢á(ˆò†‰Q¾úÂîi8öÓæ[84v6 ÈdÁŸ­†Gpl =T6S’ q˜Ï¶?\E8Þ(K±=³ªÞ 4Jp^‡xM¿¨ºÃbî¯è[)ÆžsÇ`–hã°6>-ÙGµÕ•WŽ Š ëܸ9Íã¸ÐÚ!ðüE˜~º¾ô8ùå­åfڜ׳•ÉTpÒ­9•õï–b+΄¥B3ÿ@–/§ž†pážñÇLøS!ëç<{¿dFh.#³¢•0…ô_¹c0T(þoè­#¯ªtØG»å¸Ü‹ôâ DíàÏò§KÎÊ0º âaº"Î.%Ö4\ä*aæé85¦*4²³¨WÖÏ¡OÎÊ )p}ë=ÊþÜŸ¦cR?†$÷ôŒè¸xÓ„Ã0¢û[Þ/<  Þõ4õFÓ$ÉV9Š×¹¾ó|èÍ»‰ÉF*wØYÜ„PQÂv`'Þkþ˜¾zަמ~ëÁœÂkï:ô{oø»kòó&)%ˆ½—ôÃøÿ_9.*åï“`4˜3ήO•_Ø¥£Êu¥ÚGJIòueo…¼§ê…Wxâñ+^ÿdw¼>zäýøãE·{Òmz5"-°b¼cÁ´?ÔÍbÀ猋õ† ) {•ÄžÂ86øå±„ p‚r?°oqðš ÃJvšå’Gá œB¾º=’!»®Ä³Vìƒç6xO‡©–g¹™&Jýi–¨ŠM*Œh|š Çm<.4ñQ‰­o$®òþ[ßà,-R‰mÉÏÜà‰Á–Ç¢ñÇ}"Éq·<”Ní®çÓ°<¾gáý˳ó+v€ãÓ¡œ{¥<宵‚ëjÀb’C×%®²‚‡Òà碮 (¥Oƒ÷*µk×ÛÐ3ívOì[±jCXŸ9ñåb\ ¥W¢ vî±¢hèêg'Oærì„»€¨v5GÍ™p¤Ô¡^åá“­GBñÁâ3 œ*uŒæ€mÕ T-$æõ2ù`<~Ò=GìÝs˜´!²Oþ¤x ÀõDãéÍ- ⤹’£ØhQ¡úQ\âÔýgäf:æÛ9Í–Hî“O ¦ò yx0éLGò)F$¦ ©d2A§rd ËQýRH·…Ò¬½4Z¥ã±7ò£» LU†R8•Jç–]lá0d¬‹ 3³–”£f)óÌHÏÅJo<!ò åÍÜõjæÒŽV2ÃØ†×rœÕ±ù˨”¸ÝËh´ FÄc]hÈÀ³„¶#ý¶ù—]ùÚ•Ô”Ü^È– ÌÞóµ"KZòWÙ®Š0칟ýhG=f´›ŒT_ù°F¯ûÅaDJ‰ÀŠ‘Q%ò¯«‘'‚×­VìP*ä“2$‰Z’p‚Kšô×Ù ¶úpU€-2Và Œ*²YWÄ3µ£æ›ƒ6Ùð8ì& e#ÔÈ»öV–ØÚRähSDõsH€žªFDÙŽQV\R ´5,]÷:úq*–ÕT/™€ûÑ|“`šu±š"¡%Îeå} Þþ†ud‰v“|ñÙÆ„Cç[ìüáʪ 0YêãEþXUcÊ²ŽˆÒÊ ùRéíˆÒ¼q~\<‰¦æ3È NÍ%cÚï“*¸ð:Pþ±cJáY-+Ï,m©Ù…lrþfNGÙœY¿t™.ˆNcÈe`´Ï†€­¥$ ½¼ò¥Þ¤ëUæ'v‡ßzdRÁ­Ç7ƒq ñì½zßh¹î£ýªÙühlë½3ÕPRÍÍÔ‡ü"#‰qJŠc jg1} æ'àåV;çi&a­ ØÎ}CŒ´µW!Ž‹šV¬zœjYkŒBКžÆƒ·ÐRw° œfÙ X<\­ÿà=<ö’hÂò{3œ\úä%fU~šAÌ,O2dêKÑ~þvüF=Ûâ)ßßðS´HŒqÒô'“ êg¥4Z8î@0ZSÍWÑ¢8£Û={jŸ§TÓ%÷Cq—0ðÇpC½„Á½¦ò°±úM‚‡Ñ k„«Ü¿DÈzuû½À †Ìƒ•Cx ‡³bn¨(œWFa.ÍÊãÖ lùALîyôˆÊ;XîÑÜy¬§¡AúÂì¾³²ï(vÌx'…rTBY÷)ãWÍYعx=I ?ñø¥| ‘Y'Uç ­u £’¨ðúp–ú*Kâ8¶´‘-!lwg_c˜¤á¼ÂfJ2審œ4+pÊõt€ñ ÉøC:»¡>‰Š¤]ôÓw¬ÕŒ8tVïÑ…žÈÅe8Œ´=æûúÃ:O ×Ö°eyàÅ#‚"z(؉\m­>æ¿ÚòWGþZ—¿6Ví½=öeS–Ù’¿¶å¯ùk× Á—e®å¯žüÕ—¿ùkà„µ/Ëü$È_‡òWWþzŠÀcOÌ4j¯bg©×ú4ñZÏ4óª4ZÕŽ¸Q‹Àfl{kÏŽ­‡Gc±5¯ÍX6äïŒE¶I ‹?Ö2GÖŸš]NE& cyJÕäïoiýµJ´ÏÄû–Q'¯C 9_'žR'l2i´7c˜qÁAk”¬£ÌÉ÷^¦ÏýZá85ƒ¾%:PÌ@t9R—Cé GÛL˜þˆœ’ù&´Åc—x,á(:“§ËÔãûQá°óyœV…æ8ƹAÊ8õÐ:Ú_.¶/µ¦gK>¾x7Ö宩kÐÑe%ß–* º¥u Mvž_ùv±·iLÉê6s`æ lŽ^Ö­&DâÖj~K¬ÐÀ°_Fž(:êô XO»e[VßxYD~Ç tëJÔ=´2\Á§Ò†»4“•%º4—U›L¤·ú:³v!P'{«¬Ûô`µãK{Ë.w.‚ª-8iùÖà%™NcH5HÓVˆ|=žÓÔdƒiHk¾wxvBsšáRã(¼ó|‚ ©ðà ë„Ø¬Þx@§*–ƒ+Ô3š¹îŒ¿¢ΧaîÒ‹³AMó$ò$6;K“q§Þç¥eÜÙï•q‡]˫޵Îî6?Ì’~d¬d&p¥ ¿Ÿ»jýÓßÔl4gê·,#'K¯ìž“ÌÇH]³½£þ±+S¾¦w!çW7Oº‡Gû*Š£ ?ôÝå_ì?ëªÅ'ô^rWé§g§—WO‰H«Uã(}J=H5WZäê.ÆÃ†‡Ña»C4 -/üpÒ„¼ÐöÀZ¹¡Ñ–G‰r„ËU¦FŹfLÜ›VâDðð&Çþuì§tP <×ñâ"#ºì¦Á4ŠƒÞø&þ+ðbÒ&Û Ï¶×æJ¤õ]Ьh£(º#*ŠEêΓªmwyTz핦Úv+ª6‡^Ê%à ziúm·–‡~h"n•~Û­ŠôS”^.Í ÿŽ{oÊ‘®½<¤CSëj¤k/|VUϱô ¦R×t€¤ÓT;ÅqéÌ™ð½Ǡ÷›kÐ)i‹¢¼ê’^êÞn—¸É{{Ö[ÝgHã(Ê„¥GM ©wŸÌ.‚¬Çññ0I¹~¯’\Å¢Uœhv|ßIT9]—ôv÷v½zØ`ŠY¯wª$ ™tÃÐN˜pcäARã¨ô͈O•– UÓK×½ 4Ã0<Šˆ…Ú{sÉöÅö2¦˜[r<| ¹šE‚CB¡ÎU».ë÷¡/:M)OC^í±?’t2NØ($=?b(.ÊN¢+_“Rëj}÷’ªv<¿ño¿1íõ‚$ñ¤žU¢9E˜ô5ˆÐžÿ6€èßž%!6>ëçWÛ;5 žwZÜXpÞ=èv/êu­iZš¹3Þ'üÂvTÈW‚_ì–Ú°LÐI 9ë{ê芻£Åù­Bw7sPÜÞÁ«ÜÆönNe臓ŠÃ" ìlÂù]‹@3öv;oÐá‚èÏzÀ·³¯He Œ"Ù­•²;ÊîÖ0’Þ Ë<–c¦Ì<8{'WhTü,%Õœ’`t¼Àåž°äÛﯸ×oWëv§ý Ûô+}Õ**Ð.*ÐQ ˆ…‡žù$4ëM§¦• ppÔ-Á²À+¸¾òþl½o5Zï·:âÿè_ðÖâ¿õõyÔOZõߎò·ùn{}s°å·´_ð~ƒï :­V+û ÿîèb•"­¶Ò ü×ng¥Äoø·0½¿AžÅýʆ ÝÒ~ˆn+È´ìð>°ð44œTènóùßëÚ?z{ÊÉDÙŸ2…ÄþPŠéÛ6Ó·M¦ç½kñqÔßìØ…Ä„{ÈÓÆ>íìH_ÚÚgñßv®wôŸd ¨ûüÛ=hÇÏk§|ŠPZä¾UúÕÖšÍïLÃí²dÊy,r·ámGCaw-­¿Ù PžÀ:]Ž‘;6#w0íÝæÿµ”Íßð_+Çç2ÿ vZëÙ?Uk—ýo}±àÍÿz:ÓnàÀfY¬ƒ}Þ± (5ØG£Œòg¯L2¦Ò ¿ýíÀÄ«8DxžøÂ,Ä Š0Ü0«KXV=y Q3(iúEþ‚PÉ?‚•Uë’wöAk¼Î^V‹†d§QíòÅ -Ê7ú!Ê®–e̤™0‰·w¦×ÅŽÓð•«!ÉÆ£‚²êì5ƒ T‰Pc΃#ÈZVŠ4M^øK#glÙáb‘tôÅ`¯²Á t¥$W†úŽ-´Q¼eÂÇa_†5óP>ñJìVÖYH´<훪é7V™FÅÙÅB&±`a‹òü¤^ɳz !e&'#“@`‡Ä˜.ýÞ#“‚º—¬¨XñªÂ¸dp<1 ô8‘:^{J¾Ös]ÁD×4¯¾ãhÔ½^Ó‘ÀcG—z ™Ùc+ÿ ÏE6ª4¶×Gœô€ß— ÿp¡ÛæâŽbìŽZÊ‹ÆÒœ±f/ô“ij¶­IŸx¯ý·~3ô£›&Ý‘÷þD¦Z«2–˜mͬ?NoâØÉ¤ÂrýP¿ÓÅ­b˜ŒÙQP½ço{œ_;÷ÿ­ÊÅÂDœ–†¿§1‡§¸â•RÌŽÉÐTÄGM 0^¶9L¾(¹´ùŸY“°L„m/Á:!™šëƒL¦H]¿ß¿¢9QùÃà6¼aéºÀLœm`|àÚƒ8‚ôÔÍ LH(k;¡UçŸ>Ä 3**ó£êZ]—šê#K)WìÄ­u¾Eó:þ ó±vöQÆ¢¡ÙmíeÕiäë2$ÑüÈ©c²Íœ³Ú¨±È®'ÙX7ˆ¬’ðÊH?Éé[²k=p<ú#+Ìl%Þkªp§é0lþBãµ pð~Di< „R5 1ºX>W^ïYÂð9„±â¬MRЍhúˆ[­W$2MP¿¶òE,çMuWÔ6½qpÙ÷O˜)Àhߘ8³ÖØÙGMå‹ÿ. ­­½ÒfI%§@HÏ£ÐLA\––fƒÃá¤0Í*3õgÖˆ¼ÁžÏ‡Áûa’&ž‘òš6žq@7"†$¿t7`À3~iì„L»^мõ““qt³—Zj :üÄܨÑ7õZ@YŸ×ÒNQÒë•yn…‰âó·ºQ%Ó/vV†zzW€Ì_?1o.Áé+žÜÜúoz›'VweÊP'ƯEY}¬ˆ¸+=—Ô‚ÀXVç!…£Ÿ0Ázèµ öÇÖ¤ÙÃe=f~JOã`4~쇡ÂIÎ%lDVVš_vZ¯Ü“ÈNËZ … Ž2Nš¹@µÙ÷š(g5ù÷W»™JP€Ì_3ªS›²~¡»*I@¯ ×p¥_‡ükò®˜•èF€ûÆ«µ¿ûîu¿ŠCÁÌÄ ãK¹]òzg­ðNà[EÀu¡q‹Å/4;˜Â35¬ÎjÊZPÕ4{ˆ}+!ªj¿UÉlIŽÙæ|^Ì =sÆlÁ¥é|]L‹4F¾%Á?*ë\2üWP«“²¹. «‚AJÙ=> ³ ¤$À,3䎾“.7˜±w$(;Nõ»Jc¿GÓn:Êö‡IAaÃNÑ#ÓxÒœq*ª Ê §ÃÄátèÕI´:õ.|è,L}Òô㛼@õ sI¨å¼éˆßpDÃ+X »5Ùai&´m™*Œiáïé¼o;Ós‚†ÁËõ 3•}a¡,'®èƒ ŒØ†@AËrãéQÍ6Ø{Öœ˜ˆqJúL&`:V{b`äJ› ¥ÇNzpߌê“Øþ)Äß“gCØŠMoø ü¡‘It“4ðáÁÿPKm÷é$;ίPKÖV 7org/w3c/flute/parser/Parser.jjí}k[GÒègéWt”}—qqœ¼ƒ#ƒlkÍÅG‚$»qžAÁ˜ÑŒvfd›ïÿ=ÿâTUßç" XÉfÏí:H}©®®®ª®®®îÞXeë«ëïÝîº÷)õ‘7‚ßu¶Ê¢émì_]§Ì6ÙÖ÷ßÏ~Šâ`Ä~òGûÉ»„aÅ©?›`yçØMwx=K¼4MX/LR?¥‹ÆìÌ^‡Q]ݶT;qS? Ý€¸>ðbø‡˜B©qO Ä?góRLêÌÒH¤´ØÏØyèðâÄOo›m¬Ø ÖG”˜xñoÔf×i:ÝÙØøøñcûã“v_mh¼7޼+7Ø€ºXý/½Ñ{ëÆP³ýþ}ëÛjo=eÛ›››[›Ûß±í­Íïwž|Ǧw 5cÖý4eºõz4Åî$ì®ÎàÓ{urÚï^t]ÆöXϼ]ÊœuÎz4vƒD¤ºý‹ƒ×þÅà¬ßí[6VÙa÷Åù«‹³Ó7Ý“‹ãÎIçU·o/ò¶Óèu‡7îŒN|t¶ÇŒU{JÙ»õº?™‰2FÛÚ«»VJè¥Ù¤Yêí×nr}ìN rŽ¢¡xT\µ'±&I˜© C5ò‘®/ÝaÅ·» ––x‡0A’åŽü$]X¨¼¤ÞÂb‡Ñp6ñÂôµŽ¯¼\/œÎÒA4‹‡^i™nGñ"@ƒA÷ÓЛÎ%">Y\‡u^ÿ޼O> <jº›d“åÚ‰ U’¨2¿¤j–]xÝâÊÄ}Ýpüð m¬’è0èý6ã …bøÁ¥×QÌÞ^û?zìÈc¯ÿ/È¿—R6)¡(dé{|ü¶ÃU× ÓÙeàÙ0ý(Ô #îÀOr$%îê\ú7XìMwè%Ìõö.m±wa Tâ}ôÓk–^û ¤1tâÅl<rP½$M9dc¬™Ío;]P¡÷ÑÊp¬ÑÜU­¦× îdל«èdÊÔÏ4ŽR ¾7b^VµK=äÕj`M¶æõŠú( ,! ™Ï%Q^tZɲæÔ]!ò,Éê…ª‡¬èBSv#A€iâÍFѺÇù‚µÛmшÿÁ…Y”•(Õ RŽ‚„‹Bwâ%S„:ò€Ùbš^ ([øîýOøó€ÐÙŽ{”ü€ {P  ¾ÕÔD¶&¸œµyŽÓ¦­!?:ÎÁµÆž;i²pMŽîç\?üpvzxª~yRã0SQ±“(e·`(±ñFEˇÈýS>á8ü èO¸"Ž>&6pB’©“fŽcþh:'§gƒó·oOûgÝËn¿_Ú¯`;G„@f§9˺‘*'+d¬"};#u0Èצ¸L3­dø×YÀϺµL´–cýòV³bæ,”;Ýp6Z.Òò¡)ÒA•ÇÅÔJN^EiDMHÒÏ2ÌŽ]?äí³‰3Î(9J> ÓH5‡_ÁƦ_é-0{rí}V S½SÍõFå¡®¤ìRèËQQMK`Œª@¯d²Ù7ðUÝÍöñ zN^ 7Y½†µ d´e¡®˜×ÞSj¼Ö÷z`i8WÀ[Jý³äÑ,¾qD+ ²5ÌœëîqM…àiͱ6͘yã5gí3šgË Ô¾%µS`¸¸õçH´¡œR}>x¡š†³1ôy¿—´Kxè6ɨ7¢ÑŠ·`h$Qk&¬öÇã¨BIÌr•˜%eçÂRYP8,“: f霡úÔ'h`Ü…@×(ôX<2:œšôFÇM×ñ+s„ûaxµÒfÙ•‰=BùÃŽNûJû—¸×.4ÕÂi®UÃöcŽƒ®oøÎ`ò™…ô{8‹ƒ[ î2ÆõŃÙ.×àwÎ9ÔHþÉ‹åEƒx/À¾©Ä— L'é,ÖÈ{àÎúýîÁ:®´zèyÁZ¤Ç+VÍi1 Àhð¥É|ÎW(¢™°ËºøÖ4ÏØ x—]Þ²ÃÓcvä}ð¶­)–LÌÑ=rOü©'Û횥k *yì|÷O"?†Èšt…46=¦BçJÜŸ´®Nk¡—.2,$¹áWåGS/NotƒÙšÃEG¼OÓØ¡]ŽÂ.\FQ๡Dßb?½ýc`>l,µâÔ2IÂ4 ¬ï¹#/n³sœÈôÏL |%'g‚©Aøé8 œ¿ø·B²‚dH@,O%Ú¢¿Àižè4L€_eUtyNäNæÁ02ö‹ÛÔ+»±ÁŽy߃Âi‘"/AfPîwº ,b¨²ÝŽôÑC+¦”Õ ‰YxFÕD‘ë z=æ&`šŽÝY ךY½¨#Äu‹ûÔb ‚„^qBKPáî±à |hÌ‹z§šQôÖ´”‹O• ü¦Z2òÞËF˜÷š6¸®y(ck±á›’Þ/¶i£P±3Xž.†>šùc\x@qnr3¬ƒE*ôÒ{©` ` #D¬w&n|“ðe/—7ÄÄðŒ=X>3w ÜË‚(ºAA +‰5¶¹li±Ûh¶¸[2*+ÄI‘â5–=ÚBrÕòCH°A±bµS ÑÕõÜC…7Ô ¸1®§ÓtëÒÓÎPYH‚:AeeÃ2çD·trÞ+/ôbx¡{:ÁÛ‚ÿWÓ,Ù™•˜ÿàôä¬wrÞeÇÝ6Ìà0öAú²ÉùÔ›¦a^ÑPb5„8ïXœ÷{ ”m˜WC‰ŒÖC7^3GŠÇ•’lÃò|;/ýÀ3ÔF®Ml¦¦Ú0ÇÞûÔTà‰Qäþæ“S™&Økè58vÖà Þ®ÖBõšXH)ÆÙ“:J=Ûo{¬x ¡0JB‰¶"-³¯¨Vz€Ìƒ‚‚ÞË–0±/|‹Ò™T£|9"…´V%ÐjSm9[››„Àv¯&oª¬í(»qˆœ·òÊÉx׳I ý`u¹JI<—è¦,ñÿå1Œ÷€&b—€Î/¿²ËÙXt…°à¯»F?yãPªÅ6[ì;Ù-Aÿïöc¬]Û|aÄZ”l{ÿœH8 d£©æÌ¿{I‹+T?)Uv_Õyák :ëZÖS5¨Š 2‹ï°×>h=¾ýˆÚ†§]HF¿§SBk’n(ª™÷2¥û1,(þ9‹Ró%ç"/¡BÁäW¤»?6qàhäYÔàJ€ÿõ¯ÌJ{·²Ò´š„qU$ÁYÓå­¶MI+˜`ýPE”²T…€’ÀN#ƒû‹¿¶ö+ÖAŽiòÎÊaö‘pÈD¼FMpY @Ý]JÌóÈ=°æ¯”= åØvãØ½FÓ[jCIÆ"øT”W•l-õ Épè}JaÑ…QÊiB€æRˆ¶k×#ÐùY0Ÿ+¶óæóÇØk(û ”ãÄOÚIPí(íX3´a8úT®Ô„5§fÙŸa4™¢Ð`7ÒQ™y¥Ê¿£Éûä¢Y×RÒéifók÷ƒ2‚(Ü:?{¹þ¿Œi1$Üù¹ŠÀ°z†ÐRh…μ„û¯4×}%“ê¥ÐŒ,¹h Š:)¦ ƒ¿øl ø’™_¤­Ü®¸—Gš G7¸G+íÃð!Ï5ôP ^7lÕYQAÓÛ$LÎ9`²¶Îƒ–%³yÉGbŒ`þ4È÷ )úÀíbáXÅùÚ¥÷oŽ­kn¶åìI`s¥ü¦dËhÑdèÁ Š*À¬ Ú{â+÷ì’°êåý2™lêÑ®ƒã*'TÑÉ,*†³ÆÎ‘£AÀà=,ë üYtãÁFd©ÝhqK茂T0häa=4ß(‘H-–5±gV@Dv¡B€ý’Ô…uˆ™‡¨Œ˜!(Ä4ž É#7æ˜xIâ^ÑÄm×dSô9YpžÔÕSÞ©7ôÝà@‚ŽŒéØŠ £¦Ž‹Bèšæ EùøZš¿Æ´Ý)ØÞ#§";ƒ:ظì]£Ñ¬ O,ÖÆ™ÓÒ•ø×†‰¦OïÓ”ÖÆ”84ë%íÀ ¯`µnc×f?¹ ãµI†¸ ¸Ã¸º®a¨£í0øóŒ-j J­­‰ÖCã=‡ñ~Œ_ü_˜÷ ™‚7h[ìÍ­úË{nÑÀSyèù@É`¥£7Öú+üÊû]Dt¶"ò>˞їÏEC%¤€Ç9bª´YÔàÓH˜Ê$ò>È•8AAÄ»'ÝÊñi¿ €7Е8áÑÍ€†l³±±Úh;¬wrqpz|Ü=9£êúç~}ð¦÷Ö@³±ºÁ«ˆ&råy‹ªü¿a TÐB!ž±ƒÃS(ÛxöÕú:´I÷”x€‰ëëû:íèEc¦!ùN'öUâç†L;ì ^wÎ^còýž.Ü;98:?ìfüÛÈèþiÍA†‘þöè| Ò×túqïDd ’ÚÐÝŽLoéôA÷¸wpztz‚é»ü~÷ +2ºzØûQ㳑!Á›î¥ÿ’¡‚LÿU§wNþ®á¬ðOÏtzÛ€œÝ9éM¾™î(B¿í½íŠÄ{Hœ7ÈÔyQvFž½tÈeˆó-\urzÂWSä—Æ»íÍM ý»'ß}×øUaúõk¦>X ‹|’ä—±Yðü†äPâÿî]ƒ={½âˆÿm>GTzÂ7—¸·ìn«õígé^.ü¨šòËŠ²Â²•TÃsÝ£îà ÃzôLôoòÞ?‚¶Þø7p¦I<„¢œÎ:ý3I?$Û¿°¹|ù~¹"BI9ÿoyß„‚©je0Ô¨¬W†88ë÷N^!T„I$i!q_Á¿¯áß_àßÿÀ¿¿Â?‡º +¤ë=’iÉ¿ÄÆWùh[Ruš‡EìgpÝI縫òaø9¡öIÅÏ Þ}]±æ)Ö×dA|+ Ö\å™Mø]Ї åkR•UA+ÌCPÞ Ýg‚7ö-ÄWUé“óã]>èPà:u/¿®’¢QéûLRä⼤)Æ ÇsUŽç"úkX$Õ³8pxgƒ!”à‚ò Ñ!t›ªW…f¥ò‘B­ØíÙ:¯ºD3"Ê>ƒ¾ –¤6ϬŒiªrŽ­œÉDåØ9CóöÀ†6T9½+ÇuŸí:ŸTN÷x`eyº¡îÏ™,]ë°ûÊÊyW*¯ß9´òbw¤ò^e3¯ÌÜ *“Då º§'‡ÌÊÖ¹¯ÿae¼þ—Êy“ɺ1ò{`©X ŸûïÏÌ×`l «} ó ·(ÓG¿ FâÝCÖ9ëŸuÙO§ýÃN!ùyO™N½c<Õr1øû1gàø¡95ãw{‘Mù 2 ×hš ˜/w´É|)P‰)˜” ¦ò_žžœ]¼› aþ8 Óõ±;ô4 ì'Ùž²Œ:ôd˜goºÇ.Ëvè) Ð9á]ØAu åð9°0Qà Ó2 Bòk°W^u7q8a†5ÿÑöëB›‹‚[¹9ÐxÞ“¬Ya» ‚*\ZëI¦V¾FiÕoŒªsª•Ö*êW©[ ä[‘ç/B2Ƈ‡t8ýu{¿hÞ’¹OtÁoô×§úë·Öè‚$&/Ó¸«òE–Gp+ÞÖ~©w/ŠAÝ}Z"ðoóXÿåùÉÁYÖRRÀ±«´˜¹îRÕÑZui9M†3›¸!Hµð‘I«;òæäô'l€–h\OÉe+¨ÞÉÄ%¯:½]Ã?OôyÆ„¯fÅ]¬1ÁƒR°¾Œo3g=ÛòÄ®#ÏøuÆhËÈxªL­èxQqà;ùY·ØÜ¿Ëmm'©«£z2¢ —Ç5Gú׿5®Qî™F±7HÝ”"s0ws¹ž1ÃÕÑÈ—Výk*r=¼2íõò-×kϺ§/9«}æg‰¢@¶ÿ^8Êõ^;-8Q5m¸K4D݉AÝgÆL²¯Q ÷”µ¤­£Ý†ÀM„JdǺ)ncÀé¢6|ïE~Ut!íÖkÉ?5È&·RмFæND‹e*JZ”,@ð·ÂG†¦lôqœ„ ,öÒ]$åÛ­s‘pàt „_“U@ߦäƒ/8¿¾„u©¢îXÀö¬ýàlf/ƒ­¬B5Ú܇BÚïx–3$g0ÚÔ!$r×c—bHɃYL± …%¹Û[A˜È°ÔÙlfAXNþIÄp²ÃCѬÏ}ù·I+Ȥœ|A­žžÒìspx€]jÜ–àÏ–Þ!$ÜR´e‘Ê$¥„×¥ÀŠ%ÇHqÚ›bÅJFî¦>r•=ÕÖ©ž¢ÅS9Üa;ü403ò¶{áÈûä„mòbÒ¤tr‹4Í@ë[\q×M.-ÊhÜÕè‹dÕdvÉ«8ß´X€kC&‚Õ‰F†Ã+MîºG¦Îg[A+,¤[‡^a‚Ѳn’;ïy·š$±Õ\6 šdõ ýj”ÍP»2 ÐdI Ä“öÏ=ø7$&ú¶ýD£™>ö†LýáÈ5B ž;õ§N#×B $&¤³^H»@iÉ›x×+Ìó50ÉiaJ}¼&þœ‘P}‰Ãr…´Ä:(’S~Aã*v9âk-ÛÊ$XXžw!ý’KHMZY>×°þT••@“öJ½Sw‹ umH{:K9Db TÅ×bðuŒ|žM¨H±>Yé-äÎù@þúËDVšR;r'Bž˜¡Õ†}ƒ˜a§ÑïŠbÊ2rªœ<ûsägL½SˆðÛÆ EÔ"ÖØå6Ð3¾—¶oʾmA"MÏù¹‘…žõ3Õþ¨£o¬’”˜!¸õX°pÒª+ÆVæ_†òÙa5˜CpÀDšæl²‡•gn[Òþ Aõ;sšR5*@>ÂÙBË`n‰©lŒ6ßÒ-¼Oé=7€¶ÃØóào»Ý¦½89KÉ¥¸ž/Œ.É8¦’ici’)–6ä=)Jpnò}ôL"Ýꤒm¡”~ÓýâùÒž kÿ¹¨ê>µ sÑ L"WLÀìzF‹2 8F6`iL(To¹)ÍÆ]¥çE;Ž•È»áXSWQ …ŠV„`•1?@Í ß ü²¨;F\àYh_zW~xä‡ÞâRQ0›„b7UYà @^{ÕÊUÖ*öa7%úðó£[éèJ g1ÿ…*Ë9DUpãþ±Okø ¤§¾DpmÙ³ö$Œ–ƒ•H@•‰ñ¥Âh÷?Æíÿ¤A)›–¢Ë œ&…«"î#îNT{LÜ9zG1´YßÕ.¦.¦’p)ç–R9xl¥Ð¥4vE?”@Æï/Ë™X¦ÔQL/i„þ&ñÍðÑŠ20øw%~ÛR$ÒÄžƒøií¾Yif‚ˆ¢?…ôñÚtå¿Õf½øÉwVù5£ŠŸjÛ\$ˆe$ÿaîÁÈ$XÒ7tÐß5ñw_ü]oÈÊ´ïA\¢Ä.k¬k¿j4ÌzE¥ 0—!Â9e %_)!Ëó–\¦–ðW5æZªDòS‚ÑätêGm-RÃnDgÕܰÖ(˜VÖV¤^½§·‚"ûTäž2È• îì–Œµ+ÈÁeŠ(ô¬Ö˜5=ñ¢Ëµ §âÎ[c±?„‰l®é̸$æ"¶á£Gð߆°dfkø{‰ O…PMœŠ RfÒ®+£5k³NÛQÇ\¯}Áä½hî>ÃSTÞèw2X«š¬4ZÛžeQþ!ÍIwìØñUL­çpú=ÌžBNãv³),~—²f–¡áW—dg.¸1¶fEUA™ü©Ìö+pøN7ƒ~Õ™ÚÌ*SóSÔ·n+€­‹i’î2‘…±GËQ¸Y¢“Iì\Ð “iÞ¿0¡eU•î,ÝÎq¡£ð¶ø‰YíÚ>:=}ÓyÝí:ÛM·gM’¨¼ÊàÉ/-ªGÕŠO9z3”ãô¬$¤B…q5rû…~8ò”Ÿ}zJ1`æàçyŽFÙl*ÿ•çÓ¶<¹C,È-¨âÞåõAv6Ÿ²•º§/…í£ðH ïàtÒÎñ¢”âî~~€ª0öÈê2Ô{E*Tï0ÿ«üN[Ä%Kd†ßs²Øbʪ4Ý¥Öû Š˜Õ,ûC]ÙEwz©,ÊS·±Û®;’Y䞸×ý·:Hd‚·wí&×tú¾)å‚^ iuÚ‚¢t7F¹´ËrDšÚɹÏv A×¾¸ªj_äNÔcµ2¯F­ •­=ªÉf½fœ„Ír¥yÚ.DZ™{ìÚCº¼¿ËÙn`O/ÆÆ¸ÜS—·ÚÙÇT+¶¢dÄ ôälUÕ›­êz¼$ô }šƒ¸c Þ†s䎼iGÖ+CðÐK† Î]ƒZ?X˜!4 su†ö ÝìªÖ׊Z§Ë2Š1ðcHíŒÞ»Cs<œä:B#p«ecQ†]5Üö«Sæf’¼Ee5»¨MqÍšlRÏÙ#Žòê mÀ{›ðv v9»s¥}‘> ªŒ› *yÒ Ùæ GSÍûÃz+p(<…_3ÃýY vK˜&õä%ô“N˜ÆÞÈvu3œÈðäŒò#(÷6¢<,xqA[RÀ¤Ê1·‘h¨ð¨{ö^}Mßn²îÁc†÷¢¨ÝN8Ò­"x˜ú³ÛVË0=lÓ!3±ãLQ´8¢&ï èÁz 6*B+î[SWaE¤Xjâ—¾FM5ƒ<òW‰‰ï,ä Ï'’¨á!®5ùc-#6xÄËáP£aîcâ•‘ŠùS›Õ¨x  É ©Ñ*&dŽäï[müÎØOæpB5e¤Óä•Ç5n·gí¨‹‰˜yz´O«ÞU3¯®)¡-«›„Õd½ûã÷ÈzÂHãŸUŽê ×óÒhs9Mf^o]œ÷{º×Z½ÿ’a´ÌQy©³ž°¼ f=j / A‹)á÷Ça×ÝP¯À Ö‹•*Ô;¦k—‹òPQ¥óؽòqPð/¹8=Íûа6)𲯠JÎ}C 왆²aÙÙ« r=SOOBæ 󧥂˜Ã²û-—:5ñOf‚âŸÏÙ~ñ1›¯»m Ÿ¿`ˆŒcüt޵ MD "k-†¬Ã¾9¸´êäß,_"ؽ†Ñý;%\[»Üнgz×Ì߆|ÈEôþ±Qä ¡`„`ÔH£†BG\µKEu|°Q¶ HXU·Â„5T;RZhÊ“]2«ñ+jEÉÔ–e͓Ԣ»'ì_Z¼mî,0¯;¤ÓfƪÛÁ±£@ÙßT3Wør™&Ào-¼$‰$caSÛ‹š: ½ÓñƒÚ#ÒÍmôÉ¢F_à>ÕëÛéµÎoÚ\xgШÍÁB¯†ù]•0Þ8¼Ægnnz>ГiÉ¢H/ˆ¤NÑk¢G­‡t«Kžl…KkÞ“ ÜðjFÂY7#¼ÌÕ€tƒÉ½æF% 瑺ô–.Ž]¼4õâËåù¡'ïÄã7@ÐÖ=–Ùyg4›þ¯”!œòùNà?äThH¶YcIËŠî(º¶Ët)'ÒÕ¢Þ%ðFÅCÁp/T KpßDá=Q÷–æ˜ÐÄaX€óã–åöMÓ|Z2ƒ´ª—ü’hÀû1¤s€c#f<‡a„b¬xá; ãJ`Scˆ <µ¤‡GP_wÑjV¢®ígÙB1¥µPtQƒÜú‘Ñ*?Ô’¿L.Ýv‚ÅdzŸæ"‹Aq7^›;.àoãÔ–úBWÝ7—«}È%?G÷ˆ¸à0¼8c¿pv–c]BÛžAÚüÁŸ-í?˜¯ÊGKQå£å«rŠÜeC!UÜŽºÃŒÝ1Ö9øÓ|˜Æû4Å$3€'¯ƒÕötS]˜™˜žÌ§!ø{Ïx`†9»=þ|‹2 ‹â+T“|¾H-  (Håo³É´hûc=:x€º Èx eìáa(9V0ÊÉlréÅ/é–ä‡U¿—±'=¤ölÑÎܳ¨r쾨díL{ÈnøBJ<2ŠrËoc%‹•ÂOµh©¹%­x)M¦l Æ¾à¦Ò³%ŒYÀL`E:FR3ƒZÃ2í!Çu]‡v†– bM6dΔ‰Ï²‚JÕCS\-¨óó™˜ã‚(I¾¿$ ½HDGõCäÍf>Xó"îá]Œy3•Åd1p* ^Ôrɵ®É|-;Úçq±Ðj«z«xå§[Øj­¸Ášnk¹æ/ÉaGàKa²hÏ_–ì´,À˜éĈ݊¦z³† ì§N„½lÃEâà"…ŠÉ) ="¼§;Æ¥~ó9%¨ã°!‘?EÑZÁ[Vtõ,tãÛS‰!xUŽ^±Ñ<$Úªþ ĈQ$ -V:޹1bÎÓo›;ƒ'‡UÆg|œæµ&ÛËK˜Žy¢ v§.– >}Û¢Q(¼Ã|öu"0IÂÞf¢Ù3‡7ýÖ‹1ÜçìÅÍKñÏ¢°•Eá¬RÓg‹›,kq;ÓâÁq•Ž—×âq¥—ØâÛƒJT=X^‹½“*-öN–ØÇŸ+õñç嵨=TiŠUk³Z£?Wkôçe6zØ}U¥Q(ö>É4ÚïViŠ-±ÑW[}U½ÙJíò»?«´\m\«èÚjì[•{«ðÑëTiñõ?–×â›jM¾©Úf¥Á¤KW ý̳#=Ëúy1ú-"¯ñ‰‹DoqGÆQ«oÚ~rè_ù©“Èv~“_Xf$Љ»öŠ|4É_[ˆ…Ífâ…óˆ"H!'ø—Aä¦í¸mq:<´óŠ®j¶ÇX€¿!¬×øf9ßx‘à^ ·'=‚Dk¾€iÒ.á½u-9ÆØ½Ùá -ìT] oÕ{~Xîfܿà <çþa÷éÝZ'˜!>™}mzFË2eíüÜ6xÉ.xÑ&xá~7îmó7í‚CòsûÜÙmî„}1Æ_¶m_´kŸíÍ"SƒÀ{#9´†û&‹~‘\i"ß#²‹‚ʘW¦7øïÄ•ƒÓ|@D…=0ÐðÃk/öÓ†zM_dãñšU'K±pϾS¼¨‘5QE/+âá#f¼‹Ð™¥ÔˆcqÛÜ0Ñ;¶#ó…áÑÃIH/g)›Ì’¥Ã¢KQçòß–Šøãt0 Ð…uò–ÙãoœDòá©Jz½E´XeŒÞ „dv¸Ã‘v _¯bz Y¼˜I¨ëWëµ’ó>""äïrϤ>”£rÚâí#uêÇÊ”/¸4v‚aÄ‘Ÿ½=&Ήq¤vÝ.¾­ë\áën¸Áé2ñ€Íóf¶ò¯§xø‚ ËðõD˜(ý‘þÔÕà$åžKæÁ»x¯ÒÒ-šá/ä]þÖŸ~C^rPSÓÒµ÷‰FÁ!v­ñ/¢^ÒOyF¥Yè#߈t-¬Fè‰[cÛ†WÖ2ÚEÂýÑôü2qœ+ñ¹ì%:PÔ,<ÜeÑÊùHrîźµe ¸“¤(R9¿-+\!¼ ߌiàÌæ(T,½üjɦ5Èç‰7=úÉô«•¶'UåKdV¥Ý6@vwR?qµÏÖøzó[E!é_ÛÖ¯oð¿¯D\ý©Hpv;Å ø¯¬9€Â{'gÝWݾzØmå굵׫©öÉ™¤¬Ø‹¬‰7×Ô¹…ð–…þ…~õöOÎÙiÿB³| * ˆ•|æ˜Á“¸oÉ9€¿›&c'x }=tÅIÝăœFŽñT!£E‡!¥‘¿2ü”·J>re¡ðfçî ¶,+s¿aÎV„0±HœÔi¸0wÇÏ\ÓQ!ÜŸ’=¶n¨©îRÁÃ`„.Ì„g0±aVüâfaG­NòÍ>I¡†ó2é^Í®®y§=XD&íç*ýê^ðÆhGî ¯‰±1Ž0›¸VBŽK  &|䯯2eqef š*>Eâ(ßr^ YäÄ€›H>A΢¥8Zø¥Q„ï"ÜÚD”]É#)ÄPw´ò;‘güÕÀh(Ÿl¬›ï0[1 ê.ÚÏu“»âÒÂéé¡sÌ“Ï1TË´Ü~ì„ðÿÃðP…/”}VÑsM¿ÅÝSôýIó Ôþà¡j[NÅŠ¾^È–I!_þÐ7¿#w>F¸‹íâÇÎÑy÷O é7'†x<]‚x$Uå£D@,ù°^¦Î&3]GWYÞ9hŸQ*?ú{%¬ž> WuoûÝ—½Ÿ»‡BlŠNÍ¥*ó;ùéZ‡¾L̜֚ÄT„OÅ ^Bnt1-eŠüî —aê×·$³N1Ù…TRù’õÙŽ[%ý=àÕ+/ô0 ¯åD[PŠQ"^Ò ³ÕÜWyò«mw–F2Bû îï”çý\ž÷¸ó¨<×§½ãî™ aa™ãÞÑÑ¢2½“ƒ×s8í ª•àxÐQ4ÅÓ'˜±áUž2Æ _:Q¨_Oÿœ6òËçï¾dùŒZ¦Ê$Q6AÔç×{P•w9YÇö¾¡À¢6¶vÕìÝu‰G Œ»¬/Mº]Ký•êzÚºŠã·of•óE‚íÒ¤2ùÝ^£KÛêÖTÔ帙ˆGqÚôít쬬¯˜×ªŠ{ØgšT{e[-¤N«Dƒ 5Úäüíá k-¶õmÑíݲ[[„°½¹‹hkÈBÛ™B²ÄïÓ…-هߥµm›bu’>G6Î9CöݰJìœP89,aõ8x›ãmÜ»Õáñ@ž+èó3‚k„Üã3j#üžÁh´e¦‘¥3/ÑðDë5&¶jæS¿TA) øtµÄo–ªvn£è«ÁÅé"yQ*qdYÐñƒ5Ô–:sÏÏ=š¯ßqŸ‹ªSânVHÏËÉõZrM¢‚E;Üm[–|*«È}AÑ@ôb_dg"´,3u&æmAØŒÈ÷×­˜C^AÐU‡ åf÷s¶>Þaã]‹8r¦Ë¼kv¿ÂÍÃ"ø&º1Ão6E&ËD7"„æ«|„–¾.X–‚Qd̼ñJ8‚0 À¬™iQ]©k´*ƒtð^ÞŒSLʼM‚™7láU _Þl7‘½ØÌSà‘øit1ÁSš@ۋ˘lÉ”Ÿk!ð#þºj²1»Ðp–Ò¬qÍòoÖr}LžKÿÁWa4xx£ˆÊyüguoŒÎv¡…aKz'–^òŽ0cãS­PJd»ˆ½-äB¬Ac†^’bxEÑo'§¥D\‚€Š JÁˆtˆúx®×L¦'â$qÄ4À2ŸL·ì®UáØ>Øåë8 óbõØu&‚N¸Šè,EÚ³$…aæu=ÄEåßýL£(Œy¤£U:Õ=ŒÂ•-@L 7իï— çНBÿ_eÐí"ØŒê;ƒˆ‘W›}$H€Iêú!²#Þ7àUø7…z5Û´ðÌr|A@»”>ÓÓÛjÒ/”„ËÙ¸H°¸æåßBxÂG(뙄_ãרÓÒCž_N%º<šûÞé¨=L][Ë‚©ƒÐ·<›W#m ¨Ñá̉Kg¦†MÉcv¥Ž”úÐ~íÊÔ¦€ïfË8Á5¸@àK¡óYí‡^wÞˆ¹ÊÅyš°ÄŒBS”š`\¥}äs[º’°÷ï/ Ád6ñ.Dq{+käMùE÷_±uÇž\è~3Ð^D²CüçØ½ñø·ÌI,’Òå%ên¾²“Tž(+€¨ü]ÃGK2ëâÕt@(œ ¯ ±.|˜¤²a¸ðÙs^4žJé> b,J^V)z^&÷ØJa— K¿Ìx’>Gxê‹âÛ广ÆtÂe< Èëá²ÃÓc:“á¤( nÉf £A§øDZ4&öäG9û` Žç³ JÒOÀéW­ãêÞLÒò'û=ÎûÌáòeô{ù³8^ro¾óz_ôj"úuî õK"ªxZ ïÁ7Mïå¦ :àäÞeËn<ÒÉkU|¡3“:WÿÎBm‰Æ…{­”6TpÇú³º|ͧ‘Ýx°O?d#®)˜ z|1n™jÈA4¼)«¬òØr³¯¦ñ–eR›´_!œJ6Õ—Tò‹ËôM¯XÄ~qå—5Ê¢UÞòã¹ßªIOíý è…ÀÄÛ³Øx÷³žSp ö£ûÈZɦ £ÉôÕú]½áh‡½w?¸Ã!ß‹Ûïß³¿ò$•?°b “ÿ?PK´žtÔë,ÎPKÖV 7)org/w3c/flute/parser/ParserConstants.javae–]sÚ8†ïùÚ\í²‚1$ÍG§Š,À –½¶Ù&ý˜Œ—8)MbpÛÙi³¿}u >:òr¥çõ±ôêXz‡^›Mò"ßfe~Ç®þ9û#û– qƼ5+Ö%ËïV%+?¯vìiUä]eÛ]¾ëbWfE¹ë~Ñå¬Ýkm²åcö³õö¡û}°ìÞ?}-ó>oµ6_ÿ~Z-Ùª(óí}¶Ì›ó°­ƒÇL†cvɎϘhè× ¼PãРÐ8ªq~s!µrR+q­œÖŠÇ“iÀS1ÕâëZô•˜/ˆèé ë…Òûõª‰Ð´LßÏ–U¤<›ƒc£‰)ABçIûjRËèÞBãŠ0ùÀµß ûžTÕjh[-‚+YM‹Þoñ4~`tÉXèyøÖsÑx3»h:Ѭ¨Ð´N¬‹^}è°kNÆ5 š”œÊëŠÍa–°M ÆZ3Dg“ƒ`¼ÁûCô–HªªýMߢ¿ÙžÑ ç,Í÷× 4éQ§·É l|ˆ^éù¼VÑ1|ÛDÖÕ#ÓSÝäZD÷ãP¥·c}¡ë'=IDžà~x:“7ïÂv9rm\áÂCÓB5‘Ç ,©Ò‰%9 ZҤזäB[Ò¤¾%@r, ܆¾WÀ.a¸gXˆþÇ %R¿º¸'#S=Sá»JÓ[ÀÃ3æ‹yJ³ÖW·aû»Ò¯*“r»*>|båú1/ügˆøKÖLÿŽ.tV¿9zu€‡zíG†Ú=CÕDl}ÏWÅsÉK¿t:ôµNç Å^(ü¼¤ô¯EünMOá…s –‡…>Y¦Ð¥ð…_­MP8# «c×tzj†‡ƒ`„}Ú>D-àґφ!k4”ë«Õ,6\+)®RÕ0D*ñJÁ„)ÑÈTA`Æ‚Œ#AVWD¿&=×tbÐéh`b`Ÿ’¤ûïÍxF¡ GR§“‘œî·«çÍz[Ò¯üöYÿ»Ê,eùþÙU}é,á~]”øe©Eöœï6–zñGšF³6‚¯Áý; 4Ømð°Á£[çø‡ºQRG­«r4¹mÝ¢öÏú"¾è0{iýPKꎲگë PKÖV 7,org/w3c/flute/parser/ParserTokenManager.javaí}ksÛ8²èwÿ ž|˜•7‰ð!ÅÉœÊf²çä¬335ž³÷Vͤ¦™Nè(’K¢“Leýß/|ˆ/4ÙH)÷^WbK$Ý  Ñhôãßÿêüg´Š6ó$ºrþöç“ÿžš¿xñÄùaí¬Ö‰]ʼn“¼·Î2^EgÎÏóÍ6Úüºþ­^ÏWówÑæìFÖpþúï'·óÅùÀYoÞ}‹³ëå]ݪ ç'ñÇÛõ&q ðY¼>ûkõÉ*Jêî’xyö_óíû×óÛ–7ëÅ|µ¼(ÏAYl·gÛùâìÅz%ñ‰×«¿ÏÉzógwAm‰ËhA]-åå.âmÒYH_@>_FÅ~X/î>F«ä¿æ««e¤/÷ju{—\®ï6‹H[æåf³Þt5ôâòòå—Et‹’JRÓ¦»$ *†ßEô%–Ãþ?«¸IËòt;Ûf”ÚÖÇ镤cߪõÙ‚ÔU3ïåj±¾ŠWïÎONnïÞ.ã…³Xηۖ5ã¨á„‘Êßʾ¶É\~?ùzâ8Yõbµü¼‰WÉe²‰æ«èíÝ»ìó3çòÏm}<[ßI‚ìê}ZÇWÎ6J~Ø•´¶µ=u¾ÖZ¼Úž;÷'·›ø“d Îu¼š/Yù¹¹LÖ·²˜Äð"N$ÇXþp=ÿÃÀËÛõö‘³\¯Þ9’Tñ§È­|c§ +gû9Nï‰,} ßÕCù³˜o#Ç}’}“?ñµ3™d-9ß9îîÂÏÅ©óoÏùgWRþl¢än³r„ðÏ‘®nåmË›–šÊž=fçepnξVú…nn>Î%y¢«Ÿ×[(Ϊ U+ÈŸ¢ü?âÕ•¸À;×&e‹Õ÷íd J¥î»ÈÀ­’¡ ¥>üÜâxÝ+§ç¼¯vÜhëj`jx6¨ácÔ¸ò†ÅÀ§aЀojäW÷¡Ð¡9³{n•É{tJaϼÖgïÃ…ØcÃ5Þ‡„ùÞW#.3%nÏMÞŒy¶/úþÌS ódfž¼DÇÒ äzTßD¯Kx–#9þ@,ÇëX‰5.SÈÜÞ™‡s™ÚzcµnzŸ×¼Ì/Áѱ'ÇzüÖèŠ÷³/gj¬¨þLÉÓ3%”÷ôà3<ç39~c22¯?“A7þýn¬5]O @J£[ƒÐéåÓ–‹ññïÇÚ®î÷\-颬II¬·”ä“xóÔ«õÓ[ň£³÷êoLõþ«ßnõ‹C®~]ý¾¡ˆr@ÚI0yb/à Oñ¥„3k𔦜c¾˜püëk©Æ˜)™g–×Rcâô_KÁpkÉ;äZòѵXÚIÑAIŒÚ\eŽ$ †¤íÝxö2ŒÒ0‹@2‹)Î,ÌVWc*õ_]áp«Ë?äê ÐÕV—é uZŒMë©=&#É0M3C)»CÌÆéûÏÆép³18äl ÑÙ8%ÌFÓ«ÂYßÙh6æ ûùl¸19æStÌgC”››+5H‰6à ÖÐ~ÞÜdÍúC°¢ÆÔ§¥rй¹yñ>Z|øñùÕÕ¤nÒ˜:alÖw««íoêÅÀ/{T¬›õþ2J~»¹YEŸz/VÉÇoäTSï΋¢Õ‹5/˜À”f9˜›$5ÂŒ ƒÐ«uOxàÑ—$mî7ÕÔ›´sçóûx9õìáCÀšï¦Ý¯Ÿ×Uè¸(>óÂHtGí´P:èç¼GŸ$rìÚoAþtOìë´`«í/fªo@–x‘Œò·7²îÛ8ùg´p嘪sCÎô÷uí§ýáÉý¹–_ï £4—©ù,|—ëgðÚJÊ*‘Ðì`?Ϧµ¶Ï Ÿ›a[šŒàï’9iAḸà/Í^7[?YçEá›GÊÂþf¨¨—×ë39?¯¬NXÈfËLmE«ú%zµŠ“_ÔâœÌêæ›ÆS'ðò %;µm-ú çéÓ|‹)q³×°™\¬×·Oä¤Ü=®šBd[A ÷Çã7>_ ׳âG1k÷‹¸¾®phÉ·—­\ZÓÁ®1Eîï¶ÕK²5„â§¹dÀþ‘¶¿oy¶Û…21X6Pb±n„&.Byæxˆ&ÍB¹=Og­½µµ,DwË;öH¹) ú7îS²q1íßø¬7Mfr"ÍDÿ–½þ-{²å°µåŠRüdÖšAcQ¦ÊϾXys±>ÓÍl-Nez:d?hýDÍzRZóÛ':J ߇rZi ––í€ÙèfGæAW~;ϲݕžísÏvWºòFéJùð1º@@ÑÎ*mw¶¾bòºe²sÜ{Ú·Û]y; ·Üƒ%ÌG! ƒÈFYÂŒCW£Ì@w]ÂÝ8{»Ì`»+à®?JWÊ3À&MpŸèöÙ6I \D$¨ËöûJ@:“î»E{9®CnT¡pvú}«æ7•ºŒÀòzÑÆùî;'Ÿ¸º3F>k}"MѼ ã“aÚ=:×f|f/°:Ž'æÜ¯ÊúÚE .FácŠYÔºh(rkß0À´ÌÇ`,ÐËO`C²X*CÒç––%YL‰ìíÂ-ØÐçfybÃX»$‡Ö‹…öP<í·Ã>P¸CC¡åäýh]Ô°V FË¿­ëÕ0ñcÖéÖ^ï'z˜Á¥åÙê ){p-4>Ì1;Ò‡\Z¾b‹áy\¯SÃÓ²šýÅ3Jaò£J)E'y3åƒK>l¦yÏS²ØM°€~N\’ `(ÃvÕØà’dê±i»½P°,~-AÑç$K?̠вòýÅÑz3„ÓG.´vgˆ‚ñëa®Ù|~-üVYÎ&ÎçÕlêß<Ò«çœûMAá<%ï°¶_ØV~€é›ÐÁq.$:K÷芒£AÎÐlFŸÓtÌñ ,G™k.E0”éÊcA™ƒ—k®Ê0”éÇ»ãA9€ äS‡1ë6åƒüøãóì½qÎÇ®Ñ9]ëîc<Ûö¦|øŸ]Û`XÈœ|æôÇg×ÖPæP¦ÏéñÙµ=”Õ(·›~a(wœe¡âJ“µ<>]“x<(ûe̾‚ñÖPö@ôÒXjb(Ó•ŒÇƒ2Œ²ÆäCù–B|B|ú(r´‡²e²~ ø†E²~ ø†E‘À”ÉûrÐK±lËÓd€‹À}a ;vð”ÝB箔ߋóa‡s8­ÇWíƒó´ÛÄÀú¹úðH¿‰ïs¾ðCNC2¯›b›¸ísõáxüýÛÞgŸ’eñéøû·5”§ ‹OészüýÛÊj”éÖÎã«ì¡,—2Ÿ‘FÓñU ÖPžÂhF–ŧtA„f0ÂgpÏ%§}Ì"=·døv2l%%fXop0qfC›ùÊÐmþgúH´ÚT\€Õ¿Ð¸ña€ m*.À•Q02O˜ mÒ) ¥ÆsŒÎŸ‰€÷¬ ë gC›v ÑŒýÖ °^\ÔJ Ôh|í­Öwuœìã5‰":˜ahOWT¸^>ŽaiKõt¦=— Ã`E=Ý‚Qàc|=Ý£Qà³Òîé&ŽzÖ &ôt—Gl£í6n°­£gøÔ/q v†…‘@L°ëNn0Q¥gXÔ«sŒaÅ« À±Z±03¨Ûé`)=Ãí À±·ba‡PàÆV,ü ÜL C…z}ØÇBq¡€u0à!<6:t<~u¿ƃ.%¢6VC9mÞãkG÷F»8>ƒŠ†nuÄPK+ëŽÇ0ÈôSÆÁÑÎ쬄÷?€m™=œ!CݘÀ¸ÌÎ>Œ3ÝÒŠÀºÌΠÊõéëÌˬá¬ò]tvc+{8€³Á8ÀOÇÎ`g"è6T 5ì:vœA ¡[›°`|Óok8Oaœé¶,ø†e0¾Sº¶7ü†e’)ÜîÍèûsØç~B{%ÑÈLnšžÁÁ6ìŒÃ¸ç5êÓŽÜÜáx®°3÷ÞÆ¬ ,ÂXHßrÃ>!-vlp»E\á<íÌà†‹èP<Êà–‹h:¼)] ìeºHˆhº¹ÞxÑ,h 9 }báÆ ”X’Á±œ2Á›Â†®+á¨M¡•´ æ õK0†ÂõÖ†BŠ1QO¤`ÚСp=PŽytå0›‚1µO¨àÏw ¢†-lú®Ðlèã°6¼>ÝL–žSÁYŸ®Üàƒ'UðA¹áÓý>¸í¬ æKÑrbs@Ì­ÀÉɸ>»ÂÞlÓŸŸî“Ãy¯{=‰Ê „}”ºsHZ:úÜ&…iÂÖ4 ãϩѭ¹ÞHüЈ6§ðmºÙ/×g†(M§@”=e@FaÐäÎå-‘³M¨³M’¾ÐÇå<š¡œ„ìãzW£ÁkwúB”>¦×¹/Ë|!‚‰»ï äøv ¦8—± $¶t³tn=9ÊùEkÆG>Û‡>N†o°#Ê„Óó–q}‚œA·}¾ŽAÆŸíƒ 5€×'÷>²tÞ•óãˆ8æ~{¼°­fÇ‚j;ÃÑD$Öá#»óä äã‘·1ƒdûŒŒ Ã7¾ù0#C>Zê`D[—Û „Ú$€f|É›“wüç²\†‡ØÃ>Ý#†{w¬G±1…éÊ.¿ó÷àX rºQ×û Šõ48rê3v –Å@‚2žñ’ë}ªûé†Qè“8)4ÈFç܇Ä]ñ©wÄ.ÓJŸº§y¿8€ô ;¥?%c>¾S’µ… `}º“!?€£´…£«bèÞÑ6÷0ÁætÇY~i{sTº]Š0p&^™°-ÒCŠs7æÞÊRƒ„Ù,èÛb f®pƒ[K€šO76åNÊTÈà>œÑœÀ­ÖVägBšût[~·Z{8Ã9iF¯àVk çH*–ƒá·›‚ÂWöô¨æ\ïJü à,÷ÈÀÀæõZ>nœ°¦ èî«u‡¶±£à*XSê=¢­A&×F@ÏŠÉáwá’W6"¨·Ȥ|ƒ}ch7™@p€Œì’ÌQn;M%dôˆÜÀûàA¿3œåšé“乞öŽr.¡¦#:B´gÙ‰Q¦®÷7'†¼7 χó)/“Æ3 Ï ²Êý)ùë]Íéãf0¥Gˆ×,;1ŠKÏ»’ôØr&Ñs;ð~‰zú}µÏFÈ,;1 ÙÏQo|kÀ1£\W\ïO7újG}î­‘Fe3àÃ9ß—ƒ´l3:3ÐûßÓǾڇó±/“&0JôÀ‡s³/%ZãzO{ò¸1ƒÕ>Bö•¡Ë †0HDNvb”>Lôòºï9näÕ.ôNö6IÃÒƒˆ1’ùHæ#èQÄD/×ûžãF^íÂAÔôÍ sŠ#Ï‘€3Ê'¬»Þ·—fœ6Ξ¾„îë#†óªÏ¯Ã!Ç``°ØLìiƒÊIWïhO4Ÿ²µ^E×ó»eâªf¹U0Ò8Üe‘§±äý—f¹°æ£;‚ 4tƒõ¹¡%–SÌ ÕAÚÑp" ýÛÅ\›“c×!$…#±Ef4ñëÿ§r+•úé¥=¢W7íw?f‰må‘aFÞ©ûœª•Ö>ø–tß²> 𞙘ìF)7 ;׃Ó6$ ’  úݽa=ýrUëî  ŒîäÐð²ûªƒ{ TÇ»7LJGHO€©v÷…I€¾Ù£Û4u™¯éàŒRžõftã«>±žŒ „I“Û>Ç–~„À«M<œG7Òëè5'6`RYì ¾„ „xf ccj”}a‚½ŸÑ·^4jáÞ0ÁØ…úÝa Á†aJWÇcªËvÁ}ïü˜¶öí#Úõ4 ¥+·úhD{r;ð·¢ç@ÃÄiv¢ožìhì¹Æô?8ºùšÂeÝ7wÄØÂ@aÐèuÇ‹-lÙŒ>¶$Aüx°‹[º/NK„ño[dNwAãô1¶û‰n¢ß›ÏŠƒ {+´-€hñAu‡TÅ!¦ëcâ7†ÚVŸ `89äðÔugÞÝ|…ƒ]"§+×ôðŽ[àgtë"4ÎÞñb Cá°õûŽ[5¶d‹?4.àñb öœnJ€ÆØñqk*¹ôhhl»§>ßκôfk}ñtË}¹ãÆdUzl4nÝñb ±¯ ‚¢ðŽ[5¶d›"}d½ãÆvjØ äw¼ØB¬2ƒ°Rhh@¢ƒ°™QÜ$}`>ã­"ÝÑç„ÏŠõ¬1‰´«S1ÝÎ }·7L`Eë¦xg¦4üyÝ¡qðö† æ=®þn_˜R÷{²Ì¨zg¦ÔE™î  ÖW1ç1œí“ó¼24`˜]•„ÄŸ 6µtJ‰2½tŒ>§UƒÃÐ@]VÕ$y*púXX=É¥Kð—“‹ªTb¨ÿT¡ŒÛŸVŒªÁd¨ÇR+deBu¨øÉY}ê¬dy2ú0bÛŽN_¦WÇ…‚GU¼14”M Ä vÛQåóZ‚uÈ÷(4“í F½ì`zŸ®žœ«Ã0”œ†™¡‘víO,NÞƒPǼžókÚA/ê5C=Ò¬Ò‹Ì+PÇ´ÝŽT³RÑ';Ƭ’Š<ЍoÚnjYL5Ô¬´Ò(ún‡å8Y€@ëØ»8–x“!Ãd »·³’ dè0FÑ=Ž' Ÿ|B]úlŽ#yËÖ;Þ 0Žä uÊk窆 ‘¹˜×ëÔl~ǹÑ'¯IÔ¿Í®@´zÑ«ãà蓹êWT™ûz :i>ù¦wÿ© ^ÆÌ,PÇ žë8¥ùdÉKï¹c`dyuæ)Múýa£Ë¾&tÃÝS†ñ?ï8Šúýïÿ%øÅñFï§b|«Ã|ˆtã“o5îE23ú1ŒÁ¨œ{c\(ëáò‡îaÁô.G.x6zì6®#‡=t!:ݧ‘ëÉa ]pÒtß6®+‡=tá’Ô'_þ±q}9¬¡À½"=nÓ;sì¹;šÀ2nôk¤‡¬AtW ŒþÀº`›(Bú vðmÊ!ÈtÃS†zÒ/º`[,èÖ‰ õÒ9btÁDdJ6¥a¨çÏ£ V:3º €:$Ø4kqÕÉ^tûUìi<çA¼žßéQèÑÐ LnH—ÕqŒýŒ›¤möé¾5|Èä >8×øtÉœ™ÁÉܧ{²ðÞ†»û_T“Zp4uª]%I2t£*´Âó‰öèeí{œ#ôH]ÜfJt Õ¶ˆÛÌ,€ƒFž¼ƒ$˜pzVŽÚ’¶CR²Û1›x(<¹3>htÐ,òh4ª ÇsçÙj¬Éñ¼Ç qöOŸ*AøxPÏ8žÑÂ"hyÓ7ïÄ S…lËié'öª%,7WÄ0ãAµ´åã¦i2“¦Eã&giæ`ÓÁ²žkù7È`øT>n@iS¤§LÈÿåÓívø¸æŽ{£k$ekã¸7Ž¥• wUœnÇÇ5s´7‰áÐ5]43G¢þ&M—I¦Æ!ÔoÀÌé ¡s+ÍÒ@ÍR¸†T»A`:Ÿ~‡Âi–}T B =Z×Ûß ÝdÔÝÑV´3âöùwWãZÆÙCôà3º:q\Ë8kèÎ@ö1¸JB-ãŽ]5ºô] Þ}Äè‚‘¡ÁühÑ à¶/ Ûáq4ÆøžûVvxÁm\|o ä:蹯8V|_  EU@·Ãã¸åë¾@AÎAa° hO°ætÃ}Pn@©)AÐUt=¿[&Γ¶÷÷»o÷Îç÷ñ2šÄÒ6™o’íó¤è'/-·Qöñë®n¼Jœ˜K.Rˆ{ß9î—ëëSçûï2cY®Wïœ%”dÎÓ§•òUƒã×ódñþb½¾}â\­w¿VÀß~Že©IIÇòøqü¦Jͯ­£¤ßYonÞÆÉ?£…û[ÌßÀqdïÊø.×ñ]§`½¼•õÞ vcp:ö‡½¿ %d%‰–{+õ¢%¤€zŽxηíàùtöÍ€ééÙßÿ•øj õhT 1\È,=30ŽÓ˜êÅ  Jˆžñ»å6}®ßņ˜[ÏjÈ7Cà{„ÙRÒµ¤?a%öÎá¡¡â3±ÿJ5 N ¿Òde|ñ@Lœ÷öSc¿=· àzìYË[—n(o÷ÜSÌq€»0þÏá/IÙ77áä]ý#ñPé¼åõÏë­|+?òCé}¶Nv]Ôyø°ZG8–U*·Ëj%Orl€‘ ßyìL*…œ¾§¥¡ØDÉÝfUƒ-Ùüé|u m¾<òÝÞ%lIÛgò×<Ÿœž€.æêh6ÿ4?‹×g¯~zùeÝ&ñzåD§²¥j'i­û“û“ÛMüI‚ç\Ç«ùR,on^¯?E—É&^½»ˆ“h3_þp=wÿ`“ÓEøì˜Á¦ùZbrY¯˜õÛÞ(“º_¦Åð“¨Ñ@jÉCWçßù"‰?En=°8UOZAìC¢2kTS*Rä%AÚÖkAÊËd}û<‘ã800å5ZYzzbò¤»'÷'pª;ÂþöFÍò/IÊ$±YÖ#®RÁ/•òÏN!Xˆ«^„ð 2è€_gb3‡$*ôÌUùudªMü9h²S%ÀDeªœ4ðL½U»¸«¶rxrgšfDÀ/ؾ¸zë§m ‚y@ÒÆU ˆ~ Ô— Ò© èL0h„É"Let€Î²¼€P_ìMpöU 2˜PY2 ‡FÀ¬Ÿy\e΀_*_àã©OШÝ|<õi–µ™æ‘œT\P„ ¸éBmɸ¥1À)Ücæ*j(€cŠxÓ´M01®hP­ 4âA}O}pTªd =|å¶%‹…Y¡0 U${ÍÒg¼üj«Þ¡#¨Ý¬×¨“>Kq¨÷!ÚËçí+²*£$Wïféû šjÄa4võá½j#¯¯©‹µ ïÒ‰ô tðW9gßEéY60PàP._/ÛV7¦Ú(=WíF@€V@þ÷²ï~é˜^¨ÛéôšÙ»zÙ¶ºmÏTaú,ÕHÀ-èÇkÏ@g×~í9ßÁQ~Ö¨«iŽ,Ó¬P¾yésõLö l X^ž×Ë©6ZêjÛƒçò;0Aøœ3¾üð?õÜOßÏPˆÈÿÓ]½r;ÐF½Ž®ÝsÕ†Zâj‘*޼tÓg‘ªô•¶Q-›¶õZÚ–ð.Ògy›éK”*,¿Ì^ÀW0Ða¡Ûò¶Y#…SÛÞà®ö=Ø…Xoà g?E 0<ٽ̞í¾B9Ô“5ÇZÞfS–MU OÓˆ¶¾îEÚ&ïê:ëžÁ¢`0‹LôÙL”_¨6ÕK˜ÐY ¿Q,+¢ÞÂ3µÉ·4§Ê¥p¢-õè§Z$mS‡í•»ŠÃ«á-ž1·ùBÉ+n.ÇÀæÔ^LÕ‡gÌÇšK_ä­¨6Ñ­ý ER8spÓ¸2]Õ<æ Ñpµ“DÃA˜ájSS;+÷óí²x®v@^8ì9ÜS¼vœ6â©E› ùp%‡ø¢Üæîyfû¦ËÐ0ˆÆ³Ôð >Aß°ð (¿Pm¦/›eÏž¦|›jãvkOCè5pœW^7Ê·7P{ª *šVì¹´]p £Ñ|ĆV84Sì)•"­õôºvò®”|ºÃiµµé©Á€Ý&—¤`VÁˆ«±Je!5Ö°ËCC0aÊɺ²Œ,tQ!Œi> Uzš( ë7T¬˜œ¸«V£ZÎÀÏfJ¬SYýRå²Ìôô®ÈÚY»>O_g¥XúÇÍ:ÊZâ"Íß'ý‹þ?Ò(¹ fú1%|×ÄZF_ÔáúÇùÇÝûÁ/ÿþü.~}ÎÓ¯~üãÅO¯_¿üQ=Ñ4¹;¯¾ÈÍÛ{,Wü—ÿÜGÅ7›ÿ˽ ùÿÐýñ+T“"{²þuý!Zå$k øy;u•f1àáÔ…X3—âÛ]+SUÍí¨óz½‰vu˜W©t»Y'Ñ"‰®ÐE]*EWEëuÞT©©v7ë»ÕLJ9¥ÔC!ü7ºÂ¹EH©xº²x:Õÿv'i°qbàç'©ÒN}¹ˆVé÷e´z—¼ÿéZ¢”¡^€ž.Ó¤SÿçùfmÉ_ÏW²Í¤„]ŠW¦ð+£ªT°)Î÷”¦9)ˆéºÊ5‰ïãí$ëJ)Ô.•Öï×õ¤(XêæÓ:¾r~‰^­âD jM[]×§.œ’¥ž)ùò'çÆòMÚÿ/j`')t•Ñ,™ʉ˜8ñy £šJižeGHŸ×ë£4ãršœ;ñãÇÎ÷â\…™O§ßâ7åªn_ µŽ@V˜6E‰–A›?r¾æpç_ÿ*Ê8O"yTò~³þ¬fz:qÞm^n6ëÍäúóÄyõnµ†y/¡þ4_Ê^e#ñBRX­ç‰óÀy¸kø¡óàÌI?Þ­ä|_½‹®Î$¯¯´}öêÇ>¿xõÃ/ÿ÷«Ï/þ¸üõù¯/S¬KfbÕé±,æÅýIiM¥¼êææïñr©>ç㜾€É¦>I Ó÷•{–´Óä,»=©¼KG!I‘ÿ¨ÞÖe§ß*Þd)v6mPë™ÚXOÿ¨êçÿ3JT“SIÂøcVómô.^]Ä«¨®Î%ËßMNË¥_¬—wWºòéÛ¢F´ºÒ´þ2}S.©mùeþ.+iÞ540«#ç¦l±¶¾w/*Ì!¤ÖXþeÇKjOÒaÊE:äÀ£/I65 R~Ÿ––ÚÞF‹x¾Ì·:£Ýˬuõå<«žÞ7¥PËG/ú;ت+ Å/΃ø*É‘ßͤŸ¾ª¹¼›Òm—5j¨2€Ó ¢vm³k~×Cý±p–/ã¤æriÅäe²¬£ŸÞ¯ä³:'Uiß+¨R&E~O´»Aº(X”zQÜ}ª‹¤²ùH‰Æ¥fs‹)G(ÆJwèNÊwMÀ+«­Éæ IŽï°lkT5¬ƒ–ÍŽJ—ÆÕ+å†Eéà˜33̽ވ{Ýxg+ÿCwE¾ë­ìC‡É,E¹rÁXY\oç‹w·“Œ2«Ô{ì”mi2›ƒLþ­F„ïl&™rõmj†|ڸÏT?êÙEºÑ>_ÀrßNÊ•w¥S¢”ŽJµ- ày\Î0XåÍXÕ D:ÖPgؾwd„€m*’6Fy±^%ñê.Êy}¾%øð™SŸeS Ì&—÷§tÝÜDYÔ¨ÕaPÐF¤6⨽Ëiß¼˜rÜWùÜe#ÿXö‘QÊ}E•B Këͯ%g,ïi’Q­×Ëh¾‚A¿ŒÔ2½žËI½Mm.´–mŒ‡íL[ºRPn×y²)Ó¶ u6äOŸI>ø΃ I¶Ë˜UWò¬ýËï«¿ÀÉ òhó—Óê”ØÊÇçÍõ]KÐÕ)š+m ÿ–!_†ACW[tÉz×…2€•×å£QUpzT†æQNÙú(?ú¼üå—Ÿ~9-¤,0 :Q‡»¶- )V ™ªG›’ – % t&Ñe'”Ê®^{’e½Çd÷`R§é¥,™”Y"œAKʧÉ"%³/3”údI9›ßÞʉµËs8Ç4Užœ]þüüÅËN;$§­ŒÝýÉÿPKLÙã™*D¼PKÖV 7*org/w3c/flute/parser/SelectorListImpl.javaÅ”ooÓ0Æ_/Ÿâ^L¢Ýª¤ñg-C„ihe«ÒNÕ„öÂK®‰Áµƒí´Tlß³—¦Ehð’H‘|ös¾spgªÚh^”:Y'''0WZä0ç9ÂïH!Ò–×ËžKè|fư¬¬ Zk ‘Ær[[µ€f¥TB›^»—Ìr%™€]~JÔôJ-”^’à{M±uSqmU3ÓƒOÈ\K¾Bm¸ÝtCˆ…ð.Ù™A½Â<„YÉ TZš-†97Vó;Ë¡–9j°´åüÅÙ3Sµ°k¦=N"- ™­‰p¢U…Ún`Ì3”ÿnË¥ót&%¥Ñ˜YàÖ\¸C -jÑÃ<™]\]Ï ¾¼yœ¦ñåìfDJ[*ZÅJgãù²œÌ‰O3I(TÖÏçé٥Ēq2»¥ác2»<ŸNáãU 1Lât–œ]ãÔÙL®ÓÉÕônW±ÿøøvk[‹‡àPKdæÖåïPKÖV 7#org/w3c/flute/parser/Selectors.javaÅTQoÓ0~^~Å=T¢Ýª¤e€XËaÚ´Šn«ÒNÕ„öà%×ÄàÚÁvÚU°ÿÎÙK“½DŠä³¿ï»ïîœD‡™*wšç……nÚƒáÉÉ ,•,y†°ÄBH£´åÕºïÝ+f K‹Ê µ&ÒXn+‹ V°À´J¨|×oàšY®$¡ã'„AM/ $ÐJé5~T[·WVÕ;}ø‚\Á­äÔ†Û]/„X¯â,3¨7˜…°(¸R«\³5Ð2ãÆjþ@Æ2¨d†,¥\Ÿ½20W+»eÚÛ™H‹B`j+r8ÓªDmw0å)Jƒ—åÒi:‘‚h´f¸…-¨A«JôÀ°œ,.on_ßÁ2N’øzq7&¤-⥓qùºœÄÉŸf’¬P[¯Î“³K¢ÄŸ'ÓÉ┆‹Éâú|>‡‹›b˜ÅÉbrv;'3»Mf7óóЭçè‹Þ…µå(жÛm¸=•Σv¼Ñs&" ‘ÀZi¤YÆ…qBN«3ÉF$蚥´ ¿± ëo`áõ`0ˆ¯£á¾½}?:B)° = ç%tˆ%K¿³œnŠÎ){®õ1,™¦!Žƒ€J'#ÍijLH-ÜgœRëÇÿ‘LtèÝ~òwFIè$¸án5ò^;þUÔz 0+¸à%MoŠpéì¢õVSA·¼-Ö×(m»éüÀÏ zö{_ïÁ4œS¸mÞÞ=–K þI+­Iqü,QV‚§ œn®»Ëéö>ö(Ó_A·ëCøƒüúuøñt¯ÖóH'H¥TZ‚¬„OÁA½Ñüê¹µ«§?»ØÿÍË›£¢ÌmÑõ’5»iá ÒFñ X–5¶›bö¹û5NO[¡ðiã/F«è·ø9~üqà¯ÅàÚà¾æÍw†šºï|—Ò_¸K> ú­ Zbï¹qmÇjûGG÷/lí{ñüPK¼8ÞÊâáPKÖV 7/org/w3c/flute/parser/ThrowedParseException.javamPÑŠÛ0|÷WÌC.!Hç†âRèŽ^èµ &%ôQµ7–ZEr%ÙÎQîß+‰Ð–# ÂËîìÌxø¢À7Í›/»oõöÃÃåz½ÆÁ:Ýâ Z¾cc·.¨á”ñŸ„÷¢‘ƒ§<¶Æ†@°Gì©‘ÆjÛ=-ÿ.ðYeЈtu‹/1LD­;Eį@!î†`/“%>’²øjÔHΫð4géðNkÔª“Q¾&On¤–A†ÐWœOÓĦ³®ãÿ|óGê„æñ6϶m…½tv¢v'œ§ûsC}2É~ˆQ,G”¬ÌIðÛ7üvòuõª¬V+ôšddr¸?÷˜E.^ô¢ù)ºø÷®‹º ;ê˜ë­{[|‘%ßgÿÖ`VÓ¨RWe‘Y^Š!Hë€TZõ=á‘ðt(dFÇȯ;™61˜ Nÿ-~ˆõ-¥q¶•j#ÈCÀÐt]äåù{qóRg~ÑO¤òŒrû.9HÍsñ\üPKßû1z€PKÖV 7org/w3c/flute/parser/Token.javaVMoã6½ûWÌÑ1\¥ÀÞ’Ó6FÛô-ºA{¦¥‘Í E $eÇXìï’’eÇ[4@ɾy3ïqèûýÄ–½ŠÜЧ‡_ÔA===ÐÆ‘u‘¸Ñ‘â^2ÚrE/î•mõAô7û ¥Õ÷´º_ôª~U;&çwÕñC]µfˆ\õÊö‹Åýjµ m8Ô^o9”IÛ~¼`RˆžUW-kÑ[£kª !ç¤/‹QB!à|´ØyÇ@*RsûªmC®ÍÄ|Eô"/vè¶ìµÝe˜p ‘;ÂBÑ}‡Úž(wáÏD~M hŠ¢ÚΨ¸ ì-PÑylÖ61h5b«ªzr6DecH=«Rè=þ–QC"ûxQÜ–wÚþ.)sz{rfèìTfÊÑ» £(9!§‘ê½òªF1ë¢ Ä¶™€ñü?`3 „˜A_õöVUS ëyë‘Àúœý²ö0€ é.ù)w;Ó§Yä%ÎGòܲg[ËÞaù-âÓÝ`”§¥uö»Ðs­•¹+l½ëξeM¶$z.%ël±Ô[ÛÊŽ5éYsl§¬ÓîUHç ¡M^ èÓÉA–”ÅI‹ÒS«Ù4g—±d…ùŒ--„ü€FYsÊGadI™à`ÞRöŒ ¶ÿrþ¨Rfä7îH-x«âˆ~n¯ÚáÀÁÉx/0½wºä#+ ¿VwV ¥xRuÍ8çE±é\»º<õ^ƒU’qlD ‚·ÐpÕÆ4 @×a`a”¡½ç/pÇHž‰gmaRøµŽÂPï¯è\©q!DùgÏvÓaH V´¼x˜¼:Uv6Ø4m®É÷€2loËö¹Ï3zpÐn¸j-‚¼vا•,X"“ç\ãlFlÔf6a.Á–ǽ;œáP·ÆÜU瓎`Z]+žÊ*œ´ñ–2Ò\æÖq-n©åQǽ?ä»ÁØÎåO0wãI†L,LŠ¿×¥”ð Ïk¾ôù_,º”KN†Ó·&Wtùay‡¥/D œD-CèëMh…f ·ýÌu\ËÍÕp«+úÙù ·FÂÉ tÄ-´–§ S£K5¦OÌwAɆm¾s3"f’’3êò¥vPfHÙµ¿âÒ*º~Ò]!TÓä1“4AcÓL1â¡™Urdùü¦€Äã½:€ÜŒS[Ê­VÏ›—bçÑc’¾§G¶¢åó“Nw¦ÏtƒëbC£_™HFÂУßOùKÀùÞÐÃØ.Q °XÞ=ζ—ò³9%Ai0ð}S´’ã`ᤄöN!„›—aÊëô­£à©¾÷ÃP ‹§>K‡)*ö× Í“á7a¨ÊðïŒ'ð¯ÕAãœ>æäâÎÝšÙ1S_ž?§i‰F»]¶dÞ±o²ð×Å¿PK9ñì×3k PKÖV 7'org/w3c/flute/parser/TokenMgrError.javaµWÛnÛF}÷W ôbÊVdç‚“ެ.œ8°  +r(±¡vÙÝ¥d·ñ¿÷ì…’(»vôP>ˆ"9{æìÜ÷`~eÉZXÎèÃÝà71Ãá€NIe‰³Â’†ÊBrŸ®Ô7–Ÿ&z¤µÒý?!L_Y›BIzÝ?¤½ƒJ¤ßÄ„IéIñ:íçem¹_ mXíìTõ¸,RJKaLøÖ²Ì ù§vˆè`ÏýÒ묢4”Cp.t¡jCš…QÒÐbzGB†u¤òÀ×ÞUL)^/´ZÈ~À:Ø È ôß©(‰Ãò4­5gKYü+,(çŽÒÒÙè÷ÓáñÙÍèââü‚ÞÑáÑä±$a-Ï*K ·Ï™È@BQ Æ–IáTÉ `À–);Ò¢ÑcQ°DŠúI—WÇW§ÃÐ],ɼÜ$s¥ ¸ÖiŸ 9ñ<`•BÎEYdTÆÝ;p~RÛéç¯Çg§'7Íîö¾ÚTx–SN‰ÀÇ¢(ñ_Õ»ìÕ-`‡R© Opo±ë³óó/7'£«Ñðjtý¯7õŸÊ [²l)p{ëðûà=±S,£b¥ ¾]6Râ„Ö±MŠnwùy%èt ÃtHƒõwîµ’¶5=ݽïnJ‡=õEU¡Ò$ëëq§{´¢}Ñn‡(ŸG”Û!æÏ#æÛ!êçõvˆç¯;ÛAîþäîv×?yýƒç¢.í&`‘S’ ÞQ;9‡·¯éûwä½ÇÃÏÜm'D¸š4BçW‡öQ-»*jUø =zùÓ¢m¨v¦oêq(-‰Y¦/½ 7=Z=wÞ—°Ü#4ÛzÒéåϱ‘hµl—{ È÷б6è²ÛБflŒT\Õr5Œ‹)ª*fžewˆu:â´Ú”k¥El6@.׉Ø&è êýŒ}ÁP|‡ktþñ’ä®ÁĸxÀ'`m\Ó-AWë1¤`n¹tMë[MÜ5ˆÅ´@Øø9¨5Ö¬üë3Ìtž€îHÖ³1G øVùÄÊ¡*ë™ÄÊ4üÙfíqs8­•漸…¼ðs¦"vãÂOrÇ£ï<ÁxNB_‚ ‘ËÅ?£èUûY0­U³âo^™v9ù5ñÏTVäwÎÓ€ÿ¦ª5>è²1 ã,éC)+U²›Kƒ¯{~\(£×z«áÁy¡·>K8‹öÈ•Éz±ßÖzˆûª„DH:íA6õ^E>¯§ÖÊïûÔé5î{L(ºb}Ä«LU²? 6¥“&˜¡Î[ü¡˜t\-y0rôýuž'ÍFºN‡+÷îŽu¸¹)¢¿»·Ý¹ÏëZ;‡р¨YYl‰ühMh‚Ç ]îÃb¬²»å1"øÞÏËØ¹SµnM3ÒG޳ª„K]q§o¼1´º¹øñqZ ôqîj†ÐœÖ/P P>PSÖ °½‹Ôc 4ÊÑtÑâ•5…f•1Ôq=A»I0”¹}Al¢V稅¨]ãz°JiK}\Ôi!äZÍZæp5ÓÔ(1a‹q$Õ0çñDúÞTáð×ÊŸp Œ!>aû)Ø1ÙŒjh©°t]¢åËHpˆc Õuj µÍ 1/ÅܽÊUYªEë)´Ž úûÿ–ˆ”£ßCÚ†#ÆŠºçœD‘e§[ЪÊ£gtý¿äqîÎËI«Œ-µ¯4¯imil©ŠÙÝkTÄÝÞïü PKmÖ°ÄsPKÖV 74org/w3c/flute/parser/selectors/AndConditionImpl.java•”]oÚ0†¯Ë¯8•ÖV(i»NÕh7-£­ A¨W•I‰7cg¶CSÿûŽ] …–J‹˜ø=ožóá„G 8‚¶ªš¥…ƒìNa¤´ÈaÄs„ŽI!Ò–×Ó¦ 8¸cư¬¬ Zk –Ær[[5³R*¡ŠEsµ]f¹’L@Ž.>! júJM”ž’àwMÿ­»ÕV-ï4árCÉg¨ ·‹Ã"!¼‹C6dfPÏ0 -¹J«B³)Ð2çÆj>&°j™£K}l00P;gÚãÄÒ¢˜ÙšûZU¨í:o~˜”„ýgÜ­Zž~ßo²šz¢ú%¼¢¶vn]hŸàë±àd‚NÁ«bøîá%æ”ð·ÑºÖ7&\û‚qs×`¦^<áâ)Ú§á.:¼™E $Î_Ñ,U¡ÿ]rokv±4wsR°¼,`3¾¼JkÏ˶lH÷*Agùè¿·S$7‹dNòŒÞ²ð'Æ.*ÿò¹ÌTŽ_Wf—¡ÿø:KJ4U@ £«Ô*[×þW¡·l½ä×Þ£paX,¬\¦ZYÁ±ÜwlK£’è—ÆÿCu7iíƒü¶+¾Ç£(ãpv!àíjËÍv4|e-8.ì¨õå¨f^†­DÓ{È"l~ÈÍ4½Îm_½‹DL{u¼w®}v6Ù©A« ©Ô¼ ÕµGˆ@-è+,áBfP¯8¯ÿÉ ÃÀ7 Ÿú£÷~è?ŒN©XUv¾rêŽ@*éüíÙas 7ô;Ï Þ±itŠug41i:ëÕ‰Ýa‚ï\Ò3› Ù( QM·Þ4ï•YM‡Ã*!ÀæÐ­ Þ«ÇœõN!BD2À'Jdë­ÚÎ7œÍŠo§¶Öîvßaª²CeF;Eµ'Ìaµý÷ŒÂÎÐTë˜H}Ö³… ØxµIþÐjðcð™ê|ÆÓÔ>õÌÍñHÛ`™ùã2ÿ¸¸èðúÙ쨿y¨ü¿q9U§÷È-bÑ9¹Õn=¯¥á¦óìÒ‹3åt•™Ö² ;™6ÝgKtQ( )YR }ÆJ„ÛØ6håe^–0{ÙQaN¿v…?'\Õ4•+¦ê0÷"{‚SÜC›ä4²Å³šÅúŽ—£dX•ò‘Üú}fGu<ÿ7⼬ƒ6¬EÑÄ[^bî%–Ù¡43õ -tGçÚ×L^Ô>cÜtšff·y4 [yÿ4AìÅ¿w¢`¾PKë—nÊ PKÖV 7Eorg/w3c/flute/parser/selectors/BeginHyphenAttributeConditionImpl.java½VaoâFý|üŠQ ;äªV"9T‡rÅ*ç cŠò)ÚØ ÞvÙõí®!¨ºÿÞY ¸KOU#%±wgÞ¼™7ž]÷²—ЕÙJ±Yj _ÀÍõõ5L¤â LXBaBŸÑBh© ËçMëÐøD´&qškjŒ_hÃLn(È)D4N…är¶jVä jýC´¡  4šJ5GƒÏ9¾»äåF®Wšð;eÆ‚-¨Ò̬.ð8/P,e`šªMˆR¦!Sr¦Èð1aÚ(öŒÄÈEB 9yß­kÉ©YUÐñ…¡œÓØäÈp¨dF•YÁ€ÅThúuX&,¦IÑ Ÿ‰f`É8‡g X iΛ€Æ0ñ£þÃ8/x„‰†^=Þ¢¥I%îÒÆ2dóŒ3G~Ф‚eýÔ »}tñîý=‚TðÑ‚ÞhBð`腑߼РÇáðaÔsìóˆIo‚Ô˜¬íºËåÒY¾w¤š¹[yÝîJs©( fãÚY¬s?iÃ=1Ñ_e)žY—!fEö‘¼ó'YæZÎm§÷ú'·õ3´~l·ZíÖ5dœ¦GAï%ƒsÄuk‰ÿ"3ì 5CV±3åêdD¡¸Ž¦V©ôm­†ÅAª•]¬µƒ­è¹=eºcQs/‹´~)šK 8é‚Ù§vAþ¼Ø$9j¤†)ã,C™ú–?5%÷ü™³bŽ_Å·‹SÈKçT`ïZÀßµàÏ7Ä ¸Œ ÈœÞî® \ÐX1:ý½áùÚ´øS¤gð#W”ª€ Ë#-µµ­[ü_gõÍ|¯©6÷Ø\`F,¶6Ó ‘süvlK£’ó—ÚÿÎz·”Í5Ñ·&T¦äìBÀ‡#âT–"ší(û®Ø,ÀqcGÃ/G•ôŽCg8Ïfã Dnvp˜UVÌà»X&´Så{çïΦPèºX:µŸÉŒšÊ#B †Môöx®T;ÎÈë>Ý÷~óƒ§þã°ß ž¼( ýûqÔ{ê>¿ú‘ÿœR3,Àt92Ë¥;©¢Óg‡S) ݰ׽z™ó«¢¦î‰¹ F¶fgªÊ ¬öK:6}[N Ù!®¸WA³NY¢`<¬«l íÊ ç꙳Î)Dˆ‰<©âˆXm¥w¾âl_PÁd»´µv·qTZ÷ ÊìtØžJ‡­÷ßkDWÛºC¢ÌY§èbÀ1mlñ7€…ß/ôÕg<†‹·³Ž}dS< 7Xvý¸Ìß/.:¼Qß#ÁŽúÛ—õqðo\NuÅ陦y"¯N†Úí§ã½4ØŒ¡½Fzuìœî¢²ÒFåt§Òvm‰Îsm % j¤/xµ‰ñ†TL¹ Zy‹ÂƒšáÔ¶·Dçö€l®ñ§„ë*€DSµdºJs/³g)9Å@˜Ú(£qÑ<{©Xoø8J†ëV>R[ÿ`Î쨎·…8¯û  +™×ñz8³·‡ËF(ÍlCÝѹòµ‹ÕMÑ׺Qo×a+ï6‰½ü÷ެÀ?PKrá8„ PKÖV 75org/w3c/flute/parser/selectors/ChildSelectorImpl.javaS]OÛ0}¦¿â> P•@‘†Ô²iYèD´UTñ„Lr›xsíÌvÚUÿ}×nÖ•}D‚:ö¹Ççœ{žtàbU¯4/+ Gù1ôNOOaª´(`Ê „)>B¥-oæ]WptÃŒayÕ´Ö@"å¶±jæ•TB•«n{·Ìr%™€]}JÔô( 4SzN€o ½[·5Vmvºð¹‚{ɨ ·«ã"!<‹“lˆÌ ^`@VqµV¥fs eÁÕü‰„ÐÈ5Xºrz¿10Q3»dÚËI¤E!0· )kU£¶+ñ¥Á¿Óré8IEe´f¸…%ž( Y#º@`˜&ÙõÝ}ÑíL£4n³‡!m¥è(SÈçµàDNú4“$…b½¦ñ5•D“Q’=€Òð)Én‡“ |ºK!‚q”fI|?ŠRG3¾OÇw“aàÖô¦·† ²¶î‡ár¹ –çÒeøÒÞp„%!PK`®4RÃ,ãÂ8"Çu˜}ˆ+.Š ºÄ”NHlð…-XwgAÏOxzö. wÖ?ïõ{o¡X¯†á÷‰'ìÔ,ÿÊJš]’Š<˜ Ê3¨™¦ffÃm…AÒZ\nL@£\¡!7ų2øôß8¾À:á‰7ûÁœ’p˜â‚»Uß[<ô‡¬¡Îi€1¥ÁkjþáÚ¹D»vØ< žC.è[ÙÌ7ç(i‚÷½ÀNèiß×ÅCƒõÑŽhÈ݃u•—$¨Å’fŸË‚çôQÉÒ™]Õþ{½ÌUï·<—¡Ý”‡þwcÄT.»[‘1“Ô²ÜhÙª &Qü_'£«ÇÉp4Œ³»t­ùyO_¬‘Y4À@âr?¥×tìŽÚÖùt_ÍÆ ÝÄHþ¹ Ö`xצzà·=˜v7®e»ÿmõïRïÞøT7¤Û¶Úº‰VåÉ ­·{;™þÚò6¾×n6Þóܼ›ëçÎÎÎí;!ß|7) Ç .¸õ<ùcÿÕ$Š—\ðŠt"Ü:þh×ÜëGÁ3È\Tà ˆs”Ô/iÂ?­ÐgBd &j¼ò+þÇtÚ—™E $. ¹XÛÐÿox½dt²ì”ü`©©?õo÷yü{M$©Û-´8Ag´? Ñõ«]U~ë_g*Ç~ø:ôó`K±ÝÐ4¥«@Ûx¤tâéQ¥k-¡yL¢ÁÇÁ0šL>îFïâ4¾mÉ~N4ñ¾f½1×K× J³·G/{?MÂäfÐ}š‹®ds4á¹íŽ&#õý uj4Mâëõ]¶®‚À¶¢@ÖPm‚VýuEFÓápS à3è5µè7cÁû¯!BÆ$Ðy˜•Àä RÁœÝ„ËwK;ëp÷…(›F!UFÛ0”ó3Qd-ÄÿUûQÚªŒ‰1Óö¨/ÜèL°®è[@_û¦û‰y?;ê»!ŸÑI»Årë‡åý~QÉá+u=ì ¿›lΞoqy­^Q¬sÕ}5Ô~î!¯¥k¤on u‘­®q¯Èî°Ùqœ×ÆBÉèrÃ'º33ºzý9¶E[_Ït!ð‚ûוÕî\îlðgL˜&€"S½ä¦ÉðYRJ ¤@”Õ¤ÂÌ÷ͳ¬<ÖWì‹5ÃM(küâhÙœn¥­.Ÿ·@VªnÓ{Gán©5–‹°6s­ 'äNί[º|zX %4Ẍà|L¹‹§<,ÛŠF9tX¶‹@kÌ—R®n0‰`7^Y¢ßÚt.dAÍèÎr{iÝ£Vôg”Ñÿ‘Àƒ¡—èˆÚp̨Ã:‘.6ÆÉaÚ]‡ÏÕ*àÇzb>X¡$q5QàrüóÁK4âõDì-æè„J¥m&E£mñDN³bãá®$ž(”X‘p)!+GŠ$qÙ :AãX1ÖËxÁ…†,Z±‰†ù¶ãºœØÏ¢Ðä~:U[/Ú£Ö¡Z±X£ŸíªZ1æõLŠ¥Útósµ““%díªj±åØÌ½õò¥ˆ¢ˆþW õd ‚ŽãÇN[z²+µì…3l¶>v{£Ã§~¿7µÿØ ó…V£rqˆ´tÙòQ@Ä^ƒ§ a§ØÅ$ìÌg¨Hý:9èûQÒ‚~÷DÒž^ˆ‰½æ[´¨ †‰³¥¬Wé™7~ÿªeHÞ4ì0=Ò…M³Ù…·û”®íàlewTÉöÊ»ÔHTÏë É'm¥êà8ÎUžG9Þ˜ñ‘.íqÇBR3Lê’gÂsYGy¶Ìm%ÒÆ/…­ yt2¾§Á]ÀÛ)Â;ç¾xÎJr:˜¹Œ…` s {–Î]‚¼Ì]=iÂ%CJb(éU©-µ,«QÞ$`fh«€xtbZò½Y´>À<ÄàÅÞ?UÚ—MIÚú M˜n'ÊÂeatÌh$â(J·ÚÎ" O»½sÒ¤ì,Ô†8çkÊêq ÆóY†’¥$8S(·t,.囟l{³±qƽØz‰~‡ìHs©ÄrççQØÉërÎÈ]Çß!í8 ;[ dI áãÕ"iTC|˜Ì)عVOèÆÓaŒåÆ\š8YÌ N«~Í Á <ßkëש­e=kžö8éMŽ(´Ö~Aµµë{KnV»D9À×RWf&þ¢ò‚ýœ"‰©ˆ–ê&ëÆòXÊÕúÊËἓ)F×lÌÿž]_-»ÊÂzÖûÍ8õ`}:"Ó*ʼnV)ʳŒî:Í ‘)L¶-cpLòEo¿gÚn¦ñÌ -J99–ÞYªe\ØÉ œ,£ò Ó0mîpT(ú¢\ý»hÉç-»Λ‡"ïÎJbßzRšJ$ó‹˜ÌÛæ(>/ì"lÛ.À›QVð˜–mòŠUNó*y»³c«–Ù}îÕ·x3œþµ; ¾\s¡7ÂÍ¿1x^ô3à¡:â»ÚJ¼ÐôåºÑÍ©à{Œž×ß1“ ¾5$¾ñÿÄo­‡/ÕPK;±åHç¶ PKÖV 7;org/w3c/flute/parser/selectors/ConditionalSelectorImpl.java…TkoÚ0ý\~ÅýP©¡¤í:U£-cLÆ…T¨Ÿ&7¹$ތ٠Mûï»6–B™%ÀŽçžsð´§ÐVÕ\ó¢´pœÀÅÙÙŒ”9ŒxŽ0Â'BH£´åõ¤écư¬¬ Zk –Ær[[5†³R*¡Šys½=f¹’L@Žî|BÔô”+=!À¯šÖÖ=Šj«–Ošð¹‚ɧ¨ ·ó“"!<‹“lˆÌ žb@Zr•V…f iÎÕü‰„åPË5XúËÑ»ö‘¡ÛÓ^N,- ™­Iá@« µC—g( î§åÒq:’’ŽÑœYàf\xB ƒÆµha§÷ý‡¢Þ#Œ¢$‰zéã5!m©h§(SÈ'•àDNú4“$…lýÖIÚ÷t$úwãô”†/qÚë ‡ð¥Ÿ@ƒ(IãöC7JÍà!ô‡À͇è‹^¥µU+ g³Y0{(]„Ïñ†],˜"‰ÒHYÆ…qDŽë0Î[®r¾tˆÎ7¥c’ü`SÖœÂypî›(<» Ï?ÀÅyëýUëò *%±kèü®àØÂFŲŸ¬ ¾ÑiÉ‚± WƒŠiŠ40KnsÝh%$pËŒ ¨ƒJ®ßÂþà|ÇÿÂÖÿI²ÂSïÊGß›JÂa‚Sîf-ï¡ßd5E¬%¼¢.é"Ü;#Ð.L¨ŸÏ t©ÞòÖ÷NPÚøÓhÍÀ¼ªÈAÖ§ÁìE5ní+rã"Iím± {à ”Ñ…”…oP;¯ü]¿ÉTŽw+þ›Ð/—ÇCÿ»¬Í”ÎÉí ›Ãñ É> j-aµ £ö÷v¿÷9Nã~/ê~vºvÚOêÿúï-©mÌ¢goy¸KØÐã½F646¼\Ûèj‚å°ôâ6ÂíV(–mÆrû2˜=…'Þ=ãSYÃêÚ+ÌMu—noCÆä‘u/)¶Ìq‡ËHƒ›°Zçêu¼°ð•U.ä'1ïêÈ¿{«z6Æ*¯¶Z¼•ÜWô–Êç¨Hàz±¡mËqöPKaG!PKÖV 7:org/w3c/flute/parser/selectors/DescendantSelectorImpl.javaSïoÚ0ý\þŠûPim…’ŽJ«D»i¥j4JQ’ õÓä&GâÍØ™íÀÐÔÿ}géèè6Kÿ¸{~ïÝ9<éÀ T½Ò¼¬,åÇÐ;==…©Ò¢€)/¦øHÒ(my3ﺄ£[f ˫Ơµbi,·EP3È0¯¤ª\uÛ3Ë•d tù Å ¦ ¤ ™Òs øÞÐÚº­¨±j³Ó…ÏÈÜK¾@m¸] áQeC`õ‹²Š¨µ*5›M n¬æD¬€F¨ÁÒ•Ó³Á©šÙ%ÓžN,- ¹mˆáD«µ]Áˆç( þ–K‡é@*J£9³À-,¹ðˆ@ÍÑ †iœÝÜÝg`%I4Î.(ÒVŠNqÒÁ8†|^ NàÄO3ITÈÖÛa2¸¡”èS<гP®ãl\¡!¤‚¨¥èlS:&ÆÁW¶`ݼ z¾‡ÂÓó°w½·ý³^¿÷jkþ¨áÀÂNÍòo¬¤¶Ñ%QɃ™ Sƒšiªh`6Øæ¢Ó!Gˆ_—Pÿ¹x-ôßÎu|ë„'^ñGßwJÂa‚ îf}/ñв†Ê§&¼¦!Ü8•h× ›GÁsÈ=˜W|óåÆ9J»/~v:@£]¯yD ë£æ`^ q1^Œ'IêZ‹%=. žÓ;“¥ï;»ªý¾ÌU¶—¡_nÒCÿÝÈ2•s²Ä–mFGÇÄù€ h´lii4ør5LÃñuñ—t8²»d­àé’Ì¢—¯·ÑþÈ£ÖœµoÝ¿{æl|&_¸ ÖYð¾µýÀoïfÑñKë×ÚÜ‹÷Rhâ}2ÞÿÍ5ÛÆ¶Û¼ÈöFr>’9šo÷vÜÿ½KZ÷ݼ&þ7ï*v•ßÙÙ¹}¿O_PK;¹ðÚûuPKÖV 7>org/w3c/flute/parser/selectors/DirectAdjacentSelectorImpl.javaS]oÛ8|Ž~Å>¸$0¤Ä®€ÝN縈zŽcH Œ<Œ´–ØÒ¤JRö‡þ÷.i[µÛ4­€ÄüØ™]F\ÀH5Í«ÚÂYqýËËK˜+-J˜óaŽÏ!Ò–·ËžK8»cư¢n Zk ‘ÆrÛZµ€‹Z*¡ªM¯»€)³\I& D—ŸR jú”´PzIŸ[Ú[w·VíNzð/r’¯Pn7ç!ÄBxGÙ˜A½Â2„¼æ­*Í–@Ë’«ù3+¡•%j°Tr~=úÃ@¦vÍ´§“H‹B`a[b8ÓªAm70áJƒ¯Ãré0HMi´f¸…5žÈ E+z@Á0OòÛû‡âé#Ìã4§ùã"m­èW(ŒcÈ—àNü4“D…l½§£[J‰ÿI&IþJÃû$ŸŽ³ Þß§Ã,Nódô0‰S3{Hg÷Ù8të ½è½ ¨­mQ´^¯Ãõu¨t}ko4ÁЉ¨%°T©a–qaÃ:MÊÜpMfÅåGF€6CgÒ ±?²ë­à*ìû9Š.ßDý7п\÷ý?¡XS ãÿ8%À(hXñ‰U4:º":E¸dlØ0M] ÍÛ ƒ€\!Ž]\aLH3füYpYíY ÷Ëg;~ ¢ /ùo?xJÂiŠ+îV¯ïÔ_²–ú§f5¼¡˜ Ü:‰h·òZ¢W@!èżbœï9.é”FóXü@_·ß~,‡Û›#æ4Ÿ‡U†Ûl/Æ}K[‹½.K^ÐC“•<»iü~[¨ÿÚ¾üv—ùß,S;'+ì´ä„pvN”OÈ€VËŽu˜Å£§›$ò§øæC<Oó§l<¡ý}º•ñå¦#Ì¢×pƒ†•ìØ¹—hýÜç³Î%ï_‚ú¶Ž¾j£Ó´sž¬â&ôùðn߇xœC·ß÷b«ÓýÑÆ)ýƒ…W‡i]êM©3¾…ôp\åýà ÷ö|_²“yм£ªóÕ5楂ƻöÝueçü¨ú˾} ¾PKE¶*µ±PKÖV 77org/w3c/flute/parser/selectors/ElementSelectorImpl.javaµUkoâFý\~ÅU©$;ÙÝjU`Q]Ê*ÖƒŒʧhb_ð´ÃŒwf ‹ªü÷½c!Àn¥>,ó¸s|î9÷þu ®¡§ŠµæóÜB=½‚77770UZd0åŸ(B¥-/ w ~ÏŒai^´Ö@(å¶´j ¦¹TBÍ×ýDÌr%™€ Ýù˜bPÓPRÐLé|.inÝRPZµ]iÀ'ä &’/Qn×WBT(޲!0ƒz‰™IÎ ZÍ5[ 3n¬æOD,ƒRf¨ÁÒ+§o{?«™]1]Ñ ¥E!0µ%1iU ¶kð¥ÁïÃré0HNÇhÌ,p +.%°PÉ0˸0Èa]†Y ú(ífJ‡D×ûƒ-Yc ·ÞmU@þÍ;ÿöxsÛúù}ëÝ{(愬¡ÿ¥€KBòkKÿdsª='©7¤¨W0Mvzf‹mÚµÉAäöq©1ŸwÄ¢ý­¸—€š]%ñkUJJÂeŒKîF­ŠøeµÉJrDŒr.xA¦îw´Þå“à)¤‚zàœ•}ÕêÉ6üU«=cª9¡R&"¶Àö᪤Câà$Û›øŠ·{¨W52‹H\{ý6Я~·\Ï„Õ9\9Ø>–*¾.KA•û²¿!ùü¿3:Ì¿q"Õ1Mï0>©÷*rAaGÒ?WßÇ™’úÛâœ..3žÒDT\‡ÚuQ]vTeØÝeÑñ«é¹|MîJsŽûŒB¨»d~ º*µ„݆7zýAÿ¾%Ñð÷þã˜f½dj\˜Íe´Yê0È5Î>\œö{ûq¿×ü²ÍJ/ÿÇÌ6£±Ó㢻WpDJv|Öuù:7ÞÁ®G½ý‹îFh2lÅþS2 tɧ90¹~ñÍëøÅY ·•@F¿ÒðÔüÓrý·JEIsàŠgÄ´½èVutiY'ѰRêŸÁKÓüLCÕì¢ë†|Fÿ;,·~ÎŒÿăÖÐñKñ7v v½ôÊ‹“{®}PK3)m‰nPKÖV 73org/w3c/flute/parser/selectors/IdConditionImpl.javaµVaoÛ6ý<ÿŠCÀI`KI:l…“ÓÜê*†,Ïȧ‚‘Î7ZTIÊŽ1ì¿ïHÛ²“8E[`l“ÔÝ»w÷ޤü³œÁ@V+ÅóÂÀIz —ççç0•Jd0åÂÈ¢ÔR^Ï;ÖáäÓš¥E­Ñ a© 7µA3H0-J)d¾ê4 b†Ë’ ÈÐúÇdƒŠ¾€%ͤš“Á—šæÆ.µ‘›•|D.aRò*ÍÍêÔƒ@‡b)kÓ¨˜y\C¥d®Øh˜qm bÔe† …œ¾´5ŒåÌ,™rtÂÒ ˜ššŽ”¬P™ yŠ¥Æ¯ÃòÒbZ‚ÜhÌ pK.< PfµèÃ4Lnï& Ñ=Lƒ8¢äþŠ,M!é).°´0–!ŸW‚8ñS¬$*TÖO7ñà–\‚?Âa˜ÜƒTð!L¢›ñ>ÜÅÀ(ˆ“p0±…MâÑÝøÆ³ã1º¤· AaLÕóýåré-ßxRåþN^ˆ9>$0— I0øÐÈb‡YÂŒ2n% ‰ª÷[°Î.¼KÛ<—þù¯þÅopñKïümïò-T BUpóXÁ1¡ø­Š¥³œúEåÄ!õf‚ªéUL‘”žF«…TúªÕ¢R±Æ.ÕÚ£Æó³Q !rõšéžEË?sIüîZI–pã‚ÛQÏ‘?vYMŠ(€QÁ¯HÔ!­åfͽ~<…TÐx^ 'α¤¾|Éþiµ€>czPæ°`¢Æ+·â~;û¡©ÔÀ Äå$kcë»ÿ ©gtNö#RøŸ õ²ç¦ÎûÝ>‰R Jjrƒ9íNÐ)mKB´mjV•Ûñש̰ß¾öÝÜÛòk@7uaeÊÑ4 8zTãZ•Ð<ñÆÁàsøþóà.z&á]´eúœeìõz3®—® gïŽ^ö{ûñÍ û8Ý’ÍQû?g¦#õÝ 5h4‰ÃkŸõmª¶|À¶r@Úðl‚Výu9¢Ép¸©ðôƒZô›±àý×!e%ИÀÊ4¤¼¯8Û ©•í–vÖþ.î E6]B’DÛ0”óEÊZˆÿ«öQÒÊ”‰Sæ¨/ìè(0¶è[@Wûƒ/u÷ ìnvÔ·C>£Óu‹e×Ëû㢒Ã7êz ØA;Ù9ßãòZ7¼£ÒXg²ûj¨ý>:ÜCNKÛHßÝ@ë"Uã^‘íI³ã8¯µ‚-Ðæ†tO¦tݺCl‹¶¾’éà9w¯2­í‰ÜÙàϘÐMI¦jÉu“ᓤ¤H(«q…©ë›'Y9¬oØk†›.>PÖðÅѲ'8]F[]ž·@V²nÓ»Fn/§5–°6³­ 'äNί]ŠS'3§ÓÉì"tëúC?*kë~m·Ûpû&TºŒþ´7aÉDÔX+Ô0˸0NÈiµ’¢#&K )¸kjB°á7¶a ôžŸ¨{õÞÁI¯ÿö¬zµÀŠt5\ü¬¡E:QP³ü;+ibtIy¸TϰfšštÝPÚ ‚€ŠAh¿Ü˜F/|Â0ø—×# :ö'øèçHIh¥¸ánÕ÷Ü-od µCL+.xM!\9t´÷ØÍRðrAàe|çpÒ>3¯ zf48²A¶Áýާr]CÌ¢·/Å÷n‘ï9^8µe8¢¬°,Ípè6áý>»Û½óÿÏ9bIcm±¤ûÂI:§‹Hqn0í®öwüüwø@xÝSšÊõ¦D{ˆÈH¨íø^Qa-á` gñðv¿Ü'ãÏI–LƬÏ9Sj<™;SCóô·"íKBù]¹ž¤}\Š»à7PKyé µ¿PKÖV 7?org/w3c/flute/parser/selectors/OneOfAttributeConditionImpl.java½Vmoâ8þ¼üŠQ¯´‚¤íÞ‹–vÑe9ªFÇ¡~ªÜÄ$¾3qÖv è´ÿýƨöV§«Ô6±gžyfžÉØîe .¡+Š¥di¦¡_ÀÍÕÕL„ä LXBaBŸÑ"WBjVΚơñ™(Eâ¬TTk~®4Ó¥¦ ¦Ñ8Ëé²Ym@@49áP㢠•ø 4G£©34øRâ»6K^©Åz¥ ¿S&`œ³9•Šéå…çÅPV¦¨œÓÄ(c )RIf€ SZ²g$–@™'T‚Æ“÷ݺ‚‘˜ê‘–ŽŸkÊ9u‰ ‡RTê%ôYLsE߆e¹Á4 ºá3ÑÀ4,çðL 4-yÐ&~ô0Gà0ñÂÐ ¢Ç[´Ô™À]:§¹1 Ù¬à Á‘Ÿ$9RÁ²~î…Ýtñ>ù}?z!áÞ‚Þh÷ƒ<zaäwÇ}/40Ãq8ŒzŽyQ›ô&!È´.Ú®»X,œÅ{GÈÔÝÊëöiJ¸ ( Ì„¤(˜&Œ+d°Îý¤ ƒœ¦ž^fäõ‘¶ó'™“æ®ÓH7îÕÏîõ/pýcûêCû§Ppša ½—ÎÑ­$þ‹¤Ø;2E>±3åêD¢¬Ž¢F!Õm­†eA’•]¬”ƒMè¹=eºcQs/mB¿Ú¶9œ‡tÎÌSÛ’?·›¤Du$À0cœ(pŸÂƒáOõŠ{ùÌY 1Çïá­²XIéŒæØ¯‡ðw­ø3Â<.bÂ2£·»«9.(¬‡þÞÆœðrmjÿØÄÌ~Ø’MÈéâH`CmmëÚÿë|ÞȤñšdsÇæb±‘™jä%Çîß±]­Ø~­ý|wË×<¨tsMúx*«dœ]øxDʲÂE³5ßÙM Ž;º}=ªž—ãxÑ4ŹÅ0£"r3B/ ;kïb‘ÐN•ïkßM‰*Ðu™Tf>Š”êÊ#B †Iôvt)s¨vœ‘×}½§Áý“E¡ÿiõžºƒà7?òÁ)C £VCqµtG “túñìpîD¡öº­—oÙjº?$ºŒLµÎ:U}7@Xç;—tLâ¦@6‚C\±®‚Uq‚q¿¿® °)´+ƒ’wªgÎ:§!&9àYg@òåVtç gó‚Ú%Û¥­µ»{ ÏºûP `§·öô9lºÿ^ƒ jõMÓ‰ÔgÛ¿€ãX›âo­ßŸ«Ö†É°ÇðqAã JÂÞdDf<‰Æ£¸ïÙqL]ÒÛ„ 0¦ìøþr¹ô–7žT¹¿“×МpP˜KEQ0C×Èb†YÆšV™ìqlô̘Õ6DÎÞ_dAZ ¸ò®m]û—oü«·põ[çò]çæ-”œ¯ ÿ\Â)Âù’¤“GåH&õfËê•D¡¦ž¦V©ôm£5A†µ]ªµ‡èf#EMäö˜éžEÿpÙüîzJ 8è‚ÙQÇ‘?uI…Ò(€qÁ8+QÝ…{ËŸš5÷ꉳR[‡£5qbÒ9Ø©¯ÉÂ?à'Æ"‡á½u+îÇÑ´Ü£ŠC5tyÉÆÚØúîÃýçÈãƒmƒy¿ÏæßƒœýohŽ‹!tŠ;m›U郻Tf´[¾óÝÜÛ­A7dua…Ë©©=:sô°ê•P?ñâ ÷8Žû“£ÇÞ ˆãÇÞhø!LÂÑpËùk¾‘ƒÐë»^º#P(:{òzS$‘õ{íç9o 2§Úÿ53ía<ÄñI×­`óÖ@“(¼óI×&m d«¤5ã:hÙ]f8 656ƒNmPñn=æ¬{ R"Ê´"VP“ò¾ál'¨[¶[ÚYû»¸¯´Ùô Š3܆Áœ_h#*Îÿ¯Ú“ö@¦„‰2']n‡€Ç„±EߺÚÿ¼Ðí/xú»ÙI×Ù à-–]?,ïÏ‹Šß©ë`ýídsýˆË±n8£t‡Jûh¨ý>:ÜCNKÛH?Ü@ë"Uѽ"Û3gÇq^iYP›}ÆË4Å;Ùg[´õ½wË™{/‘ieéÖF¸®H4UK¦ë _$õ$%§³ŠKšº¾y‘•åúÛbMpÓξ:YöôÆ{j+Ë×Ђ•¬šø>’Û{ke#¬Ílgú£síkÏëWkÜôš6F³ÓPJ`­4RÂ,ãÂ8 ‡u•C˜lJ \£´:唎ˆ´÷7Û°þ®¼«¶ŒüËWþÕïðâjøúÍðÕ¨V„¯!üXÃ)áù½šÿ°UŽ^›Â[ ÒÕ«™¦¤zæ€m®{=…(ã c<*Aï‹ëçâ¾ôü‹ö*´¥$œ¦¸án6l‰Ÿ¶NÖP^4À¬â‚×”ÚáÆqG»çÝ<^@!¨ž¤Mek5ðÈ ÿöz@#£Z’+ª`"ak¼Þ›[’nP{jd 0¸} ãN9úí÷@ìYJg<'&p–JÝ;zàí×´œÿSûÿ˜` ©,®¨Á¸,yAK¸J¶»º}F…*qÜÑùíò)Ú¦rÉ[á‘rNgŽâ/¤|£%t/ &÷³,œ¿›Þ‡qx&ù}F“I>MD6ma̾m÷¦ƒJãòíÉ÷‘§~N×b IãÿZÚA’9ENÆ­… ø4O£‘ÏÆîÆNIÀ½üÐÕ±w<±ï%Iæq|ø3» `è9,*`rÇS½‘_?)â!äbÒųoT”J?[¡$Ä®lfLÛ“q[A@ m4`«Ðÿƒ—fðêvu2vS¾¤×²Ãrö§’ðS´ï°¾RF~#þ# q×Eßäà»ÞúÔû PKlÀ¶{mPKÖV 77org/w3c/flute/parser/selectors/SelectorFactoryImpl.javaÍXmoÛ6þÿŠ[`NáHi ¬@’õ\5æ:†,#è§‚‘h‹›,i$Ç(úßw¤^,É’å¢IIòøÜÝsÇÓQæË¼„Am8[zºÎ œŸÁmÈ}n™Ká–Þ¡D B.Y¼ê© ÝODâx± R B2K álêxAè‡ËM/_€ ‘, ˆ.Uû-”¡€(´ù þ‹ñ©¦ú± Ó™üMYó€ÝS.˜ÜœÐ÷}¢L&(¿§®¶ÇD<\r²ºLHÎîÐ0âÀ¥$ª¼}=øCÀ,\È5áÚœQ ©ïSGÆhᔇårcæÐ@Ðý°,P˜ ÄÃm8&˜„5ó}¸£€-b¿( ·#ûãÍ܆þä3Üö-«?±?_¢¤ôB\¥÷4P0ÊB¶Š|†àh'š‚´~Zƒ¸¥ÿ×h<²?CÈáÃÈž g3øpcA¦}Ë æã¾¥`¦skz3j<£ÚéÌ!ð¤Œ.Ls½^ë×FÈ—æ6¼æ˜.‰o†V!§0I˜/Â:¹¨È ù¢~oFh®ñ¹'½{xeœë2ÏÞ˜çoàüÕÅëó‹ó?!ò©‡È†#’Ù‰ˆó/YbÎð%Úá 5"Â1œ†HUˆËNé@ãr9G“ϨXqÙ$‡Î¹,I¿lK£ìm”˜i­‚3£v±¡OW4­rptƒò÷D’ViLQ‡ Á‚¥:`Úõ`uä”H*€€³Í$ÈÔÈIJ¿ï0ƒ±Ndë¸mG4ÉáŠÐ¹ :s]]öë}G3ú È%Œ¸«UnŽƒP‚ˆ#¬—)‚©~ëqÊ[ÍG“P³Ò-Ÿ„\]¯s¤ØÂmý8ΑR(=®EÙÔõ€®ëlQìæj  —Ú‰oÍD¢ƒ ’€/µæðxo–~|Ò+4&|÷ƒÍõç\Ÿ41¦§ +Ýâ?Ƭ?ø2¹±¿ÌæÓéeßZÖ!¤ñ=8œµ=â?‰6 -x¼éËäÇjEÙfÀÇ'¶ú&L©­N7ÿ–þ¤¼Ó¤¶·Ò؅й5Òü^ð8]¼}±Û!Ù–i §+ÿTo3wåéd6Áñ‹ë(SP÷ ’+“\«^Néj425N’¥ÿ~»&öé8tˆ?%\¾¸öÕ°b*u¦(®<9דùx|eê!°4‰R¹ ZžZRM»ã麙 Wft]—ËUÿŸ.“+=XšÈ•Ùî [ú`Yʉ¤“šD–¬VK…wWE…~o•ñ·À­i ’>´Vá$u\ì!5ÇjPÇý.Ô6umí(Õé”oe÷ɯªàhþÕ]õ#1¾ó×P?HæJ7‡çA”_nðrßn‹ƒ$|Ie’ãzø½q:DùÓlï½KOº½RY ÷Ó&\©x±uÂUò¦yœCU‡ö‹ŽSbÊ3;I‚Ænxp;”ˆçMGewKsÐÜùTÕWú„²šgÛ.Lµ™5 éÅ7]Û²ÚÒ< ‘¥î~{ Aìû'Ygñ#©rô ´¦I©uL·*Ë@kº¹ùw£T«fá*–:Ë’áNXÓ°…Ô…`WCC]¸c)^Gžð¢´û¹,M™Ý…n.‘¸½ýF¢ŸÊUjëíþRæ®Ê$’‰¶"âµÚc¾ûh‘LÐttJ¸Ï8~eh{èª_ Ô®ƒVÒQŠU‚Ó&—qÜ ÄýËFûÑkC"–Ãéc× âçÇ®üå§ô9;;tÚÖ~jj=á©oϪQ°7Í‚wTŽÚvºrK˜ûc««xªFUðWX¾µüSÖðz§u:%ŽU](ÖóoÿPKôîRÍPKÖV 7 org/w3c/flute/util/Encoding.javamS]k1|öýŠ%zNƒ®Žû›@C 4mZ‚“Ç¢Èë;µ²t•VvLðïê|>Ç&‚³;3;ûáâ4ƒSøêêµ×eE« /..àÉy3ƒ'=CxÂgFØà<é¸Høü§ Aª*$ pciŠ„àæð€ª²Î¸r}Ö%à—$í¬4ÀrS ç/)ZFÍ_0â_D@J¡«H®œÁÔ­^¢šÖ‘ˆWÆÀ4Y,Ð/q& "ªÇE±Z­Äj$œ/‹½ïâKi æ&zÿf6†k«ÜLÛRü‘Ky¶„¡6ÍŸ>ŸÎa8ŸÆ£s¨ VLöpýRCŸéEVKõW–ܰ/¹”sÃí‹HÚL²L/j® IUh'nléž<ÊÅä g‘Äãôö0˜4Äw5²m ,Wœ6–¿4ý; ý).uú5n÷›¤ŒT9pWi£ëáá[2´5ŸV  o®k^3àW{½”¼½]8Àë&kRMíôÒ‘XvÀó¦ a»1^U+¤w;dÚ’ƒïÜË»iÑêÛÒ[[8§€‡”Ð%R¢wvÚðNÝe½6öÛcˆ†à²ËÁôv~ë¼ãL²žžCÞá/ÁFc©äƒÇ½íD½Ézm°åLÃí\ZÃû=íëO¬ßeØ¥ÅÕRžle=òëv»ÇWÑ&t7Úl.õÆçî¢W˜Ÿì„EÝ)ž &Bonæ,Ç¢‚±vÊÐû'gùü(=g.à[Ö”$UA~ý¢°nÖƒ£fî×p!Ð{6ÊÇal~ØÕú÷NÆ \43û YÛ_Ö¾u8î·åî‰ÿ«^ªÆ8ïu»ÆMöPKmðk×wüPKÖV 7&org/w3c/flute/util/encoding.properties}•Ýn£0…ïy ^ÀUø‰±WêEÂ&»dKƒD‘zgQB[6mRûóøë@à ŒY_Dd>Îøœ‰ UsfU͸}]·ö* £ÈZݧ‘zôn|æHÁˆÒ½â>¿©êß_)P\>m´B X–NA–²±è ~5öx ­Ö±Ç(>ÆuÍÄ×XUÝY,¢ ±”ÊéR^.™£CŠ`š•l¾åmurF6Ä€´]Ç‘30LÆl‹F_ß¡1„)P»® I]2†Ѳ9ÚÂ5:ÖÒ7L…@.m ¦¼‹e©i%iì!¥²YØ¥ñŒ~5Ä` !‹Gá`סGÔ»> Š¡YÉfa—Å7ÚÕƒ)„,>…C7 Rvù!9„²˜”›0^ééù»\ÿ_Å{,„æuþTÆ ]õ·aA©£²Ð)`H‚Ô¤ÜÜí”tMY‚ëÌð¥.Ë£ùý„b¾õ=0„,‚œN1ŒÈ¤¯@J3d³ðµ|ªË?F»ÙýÞ߆!l*/v%–ÊÁ®O7•Hi†lvOÚÒhWC ¦²,)D¯'B¥Ú~RËʶLŒÛë’DúZ=·j¡—uª¿Yqª~ä§Ÿ•=©M§ÁgÝÚd!Û%£tIí-ÑÉñ°}owùG~*›àæo[žåAe÷Ñ£ χR%yqÔ…í¹~Ï[õ|®•é¦ëêe<ÌKÁúPK$ö¦åáPKÕV 7,¾i¶’µCOPYRIGHT.htmlPKÕV 7Ï®vƤÎdoc/allclasses-frame.htmlPKÕV 7r”®l¢ l. doc/help-doc.htmlPKÕV 7 ä;ïí'êŸdoc/index-all.htmlPKÕV 7Ä!Se…<<doc/index.htmlPKÕV 7æD °:(ÝAdoc/org/w3c/flute/parser/CharStream.htmlPKÕV 7bm¯b04Odoc/org/w3c/flute/parser/Generic_CharStream.htmlPKÕV 70Lf½2!"+A_doc/org/w3c/flute/parser/JumpException.htmlPKÕV 7Ù¾sÏ µ;)Ìgdoc/org/w3c/flute/parser/LocatorImpl.htmlPKÕV 7ñÛÒ€Ô‡(+òqdoc/org/w3c/flute/parser/MediaListImpl.htmlPKÕV 7“×2,{doc/org/w3c/flute/parser/ParseException.htmlPKÕV 7K‘þºmj$|{doc/org/w3c/flute/parser/Parser.htmlPKÕV 7p…{eRš-;˜doc/org/w3c/flute/parser/ParserConstants.htmlPKÕV 7"„ï<¹ T0û¨doc/org/w3c/flute/parser/ParserTokenManager.htmlPKÕV 7W'xø [B#¶doc/org/w3c/flute/parser/Token.htmlPKÕV 7rÞ° t/+uÃdoc/org/w3c/flute/parser/TokenMgrError.htmlPKÕV 7TO2—}q+~Îdoc/org/w3c/flute/parser/package-frame.htmlPKÕV 7){Ï2ÞT-TÑdoc/org/w3c/flute/parser/package-summary.htmlPKÕV 7Ïöµ¯Q*Ødoc/org/w3c/flute/parser/package-tree.htmlPKÕV 7‡éLÏ +/8”ßdoc/org/w3c/flute/parser/selectors/AndConditionImpl.htmlPKÕV 7)fåa þ9>Éédoc/org/w3c/flute/parser/selectors/AttributeConditionImpl.htmlPKÕV 7ªðänj ¨:I–õdoc/org/w3c/flute/parser/selectors/BeginHyphenAttributeConditionImpl.htmlPKÕV 7ô ¤ý Ã/9wdoc/org/w3c/flute/parser/selectors/ChildSelectorImpl.htmlPKÕV 7c!¹!W 9:Û doc/org/w3c/flute/parser/selectors/ClassConditionImpl.htmlPKÕV 7?§Øx<šdoc/org/w3c/flute/parser/selectors/ConditionFactoryImpl.htmlPKÕV 7Ðäsî æ0?ƒ&doc/org/w3c/flute/parser/selectors/ConditionalSelectorImpl.htmlPKÕV 7£¯É¢ù 0> 1doc/org/w3c/flute/parser/selectors/DescendantSelectorImpl.htmlPKÕV 74xIÀ/ V4Bo;doc/org/w3c/flute/parser/selectors/DirectAdjacentSelectorImpl.htmlPKÕV 7Ù)ãEE I1;Fdoc/org/w3c/flute/parser/selectors/ElementSelectorImpl.htmlPKÕV 7ëUщS ã87¼Pdoc/org/w3c/flute/parser/selectors/IdConditionImpl.htmlPKÕV 7(·yw„ c+9t\doc/org/w3c/flute/parser/selectors/LangConditionImpl.htmlPKÕV 7!š“$i E:C_fdoc/org/w3c/flute/parser/selectors/OneOfAttributeConditionImpl.htmlPKÕV 7}¶0ú^ “9@9rdoc/org/w3c/flute/parser/selectors/PseudoClassConditionImpl.htmlPKÕV 7: BN ¡1A~doc/org/w3c/flute/parser/selectors/PseudoElementSelectorImpl.htmlPKÕV 7ÎCƒOm;ˆdoc/org/w3c/flute/parser/selectors/SelectorFactoryImpl.htmlPKÕV 7TôÐorg/w3c/flute/parser/selectors/DirectAdjacentSelectorImpl.javaPKÖV 73)m‰n7Ôorg/w3c/flute/parser/selectors/ElementSelectorImpl.javaPKÖV 7pêöú)P 3mØorg/w3c/flute/parser/selectors/IdConditionImpl.javaPKÖV 7yé µ¿5÷Üorg/w3c/flute/parser/selectors/LangConditionImpl.javaPKÖV 7æÇÌ}å ?àorg/w3c/flute/parser/selectors/OneOfAttributeConditionImpl.javaPKÖV 77÷ëQ7t <åorg/w3c/flute/parser/selectors/PseudoClassConditionImpl.javaPKÖV 7lÀ¶{m=¤éorg/w3c/flute/parser/selectors/PseudoElementSelectorImpl.javaPKÖV 7ôîRÍ7|íorg/w3c/flute/parser/selectors/SelectorFactoryImpl.javaPKÖV 7mðk×wü ®óorg/w3c/flute/util/Encoding.javaPKÖV 7$ö¦åá&söorg/w3c/flute/util/encoding.propertiesPKSSŽãøcss2xslfo/lib_src/sac_src.zip0000644000175000017500000043527411434532534017325 0ustar mithrandimithrandiPKW 7COPYRIGHT.html­WÛrÛ8}çWôò%v•$ÚÉnmâ‘5EKtÌŠnCQãñ#EBÖ¡€ ÕÖü˼î_îiPÛ±'™Kª’úô§OCí¿¬rzº”ª¸tÏ[g.‰"U™,—®,Uóýû}hž»?vœö?z£n|7hi`4ž^õÃ.¹MÏ»}×õ¼^Ü£_nâAŸ€B±NŠR &¹çC×!üq—Ƭ/1ã r;eȰ£ 5P(æ±iáàˆió{EÁÝG\û|zZó? ¾ô‚øZŒ?-ÀôL€_è»EŠkAþ>!f´¯ÄøE5®kñmEvósx  Ÿ"î_Å‚S?m-îƒý`.sææ± ÷}‘A¦ô*Ú0ƒÒžÜ²0BÿÐÖ™Õ†ZÐ4 ÐûÞ³Ps­V|‹K—;iÇf0Ór ™žÖ´=nn;ZnÂÉñÞæ{„{õt c?GCÂê8ýö‚¹þï ×nëŽÆwQøñ&¦›Q¿Dgàâ›EÁ8 &{„ "xäã0˜4(ø…—íçp0î‡AW¹a·?í…Ãt5YXœ~8cøŒGGÖ4º¦Auoðê_…ý0¾cœë02ä5žýáýÒ4íû‘3žFãÑ$à]ñ㟀¦ü~m™cýiâ·!Ô‘ ¶ë‘qqî”+êY|öc72:”Ïqä÷‚}² Žà#¢z­uL_•îèì* ~è_õƒC.½0 º1—hÿ4ÝÐïß颾ÁOS„ÁzþÀÿˆ"ùQ8áZŽPKäÉ(/§ìŸåܘ0•J¾9O¤½[`ä&<×0?J´Ú ÁÕ¯ò¬«ƒ›ý«Çþìê8ÿPKBÊÁ¾³PKW 7doc/allclasses-frame.html­˜kâ6†¿ó+¼–*µZÃά*­¤„%j¸(Éh4Ÿ*“œ‚«`#Û 3ýõªÂÀVž]K\„c?ï{. qüñ"*Ÿ– š–³ -ÆY!Ü'äñ."$.ãã{o0D¥¤\1ͧ !É#¼Ñz÷…Ãáàî£^¦e–ŒzaÓ ¨¡Jêùä4ØëùY:ÿåI†¬ôkj 12I°†M*¥0šæÉä|†×v˜fw8r ¢çñÙ"ðaô™áOó)öøã£( ‹"ÀI·0Z3¾ž®ÍÌñè̲OÆ#Ÿ˜ÅæHnÊpœ%h¼Èã¤`ô˜Æå4ÀÃÁàŒŠ‡Ù,ÌŸlPen>b4_<æárt4q.jØuýðª)Þá®2ÑE+j-Ùj¯!¼îªî™Âb¤™nÚh× ÿ¢ ÆQ»¸m€Ê$Ék·“¨\ƒpeÂé$[©tt õIÚž¢ü®›¨(’— v×>:kç;Ù%• \i_Âl l¨¤U›é˜jZ@•ÒA!nrmk!¶+Æi»ÀekÜ Zûqéâµ'ÔdðÕ¥…ò½Nhã²O®©ö~4pí¸8HK'1¨ xM¹v˜˜k¨­Qí·mSÊëœX¹$ZúH0‹¦ä ÑÖ‡”BºKÆ9ÎÒAÊw{]ˆ½¬àg.ïg ÑŒòµËsã‚gx/¬¢ÍgÚ…ƒÿh¶ú¢¢nZïD²ÔÚjöìôÎæŠùN/Ï÷HK'ݽ‰ ý#ÈRuͤ:©ßüýÞièÖÞ6r´ _ü»·qÙ7¨¶å¢¥Ú BÊ•–ûʬuØ%ÿË·ôX„Ñ jF3¦\\AÎq¶Ü%ä½±Ÿ¦»»ñ{C|§W58ÃÙ:`«¦m#—¥¸$ZûØî—ÒKàÇ͹OJóƒt;nÒmÑÍ^˜§fäø¤ãPK4tž4gPKW 7doc/allclasses-noframe.html¥—kÚ8†¿ó+\K+µªˆ¡3£JU@ I(QÃEIF£ù´2޼26ŠÍ0³¿~m * tåx¥Âñ{¿ç8—~Hæqõ¼HÁ¤šæ`ñ8ʳÀ.BOw1BI•Oܽ>¨,ÓL ÌJgÀµÖÛoí÷û`Èf…ª­õ†ß#.¥¢A­k8섺ÝÝ/ðŠv»æ¯iÒ(9žß©  Ö´Ë7ð7~Áµ$àãrÇx úÁ}ðåÏ^ÿLÍg&_@ÿÞßÌñðÄi¾ôzà¼Êª<v"ÎA̱RTuBtìtÂ<›ýEšƒTúSµ¦TC`“0€š¾jD”‚`R¤ãóÁaôfK; áÐÑD'Í“g0úÏóy1€û5ÓvF8žÏ* Ø?t?÷!ˆó¨,pÜà P\3±K¡íÌÑðlÉ! CdÅöLaU4ÊS0šIj=ž²¤š `¿×û‚òq:Šç´¡ªÂ~%`6*¢Åð¸ˆst¦éæÈ £“U[¼ý±î‘ÂEZ7l¹Ó4–¢>T=°……@3Í&4mþ„&€› @l’#6a³áu€eÆTtrô[r\–é+¡Ûk&±É¹É;׸!¸QÔ‡s)t­qƒ‰ÉV‚5.)§D˦e2oÆpͧÜ,™ÀFà[ʜپDOÎÛ̼ùâNò¶TÌ}ëzÁ­©Ðÿ#ÁrGjB¡¢ÆB{¾àJ–d·1+ž`QsÚ{©vd¦œZ‘§ÕwjWfÓÈÆÏä¹Ô‘–‰íN—r×êz <“8r,V¾{ôBëh(§¯Œ`þ(˜nKû¥teI‚Ûo‹“Ê‘1£+¬Ù‹÷SøJß’ë¹÷ßË©‡gk[ÖQäHXS¾¥:‘n>-~·õƒ“/Ä.¶äÏ÷fß2ÞˆàšÒFª”yÑÌ„ÒÍŽX­gUÿ3–ãzÊ(žÒšáœ©¶Wè¹Ô•æg´­§Ót¿—wê–LŸ<žI]ilÉMÙ}Óy©vfn¶Ü÷t)~G<6V¦+´í':tKèÐ^Ù> ÙNÎŽ»ÔPK¨pØ8#PKW 7doc/constant-values.htmlå]ms›Hþ®_1‡ë.É]Iر÷önc© –¸E@rìý¢Â¶¹`¡l%µµÿýzx¯ÊØPΕØCÏ ÝOÏt73sùAåÍ[MDSs&#m>–%1}–ý|γ¬` qÆÅàô ™¾µœÐñ֖˲¢Â æ1 7¿°ìv»lÏžÿÀš:û>¹¬ëy=X…+fÔ»üK¿¯Ø[Íz°û}¸Ämâ?"'Ä™hb¯mß íºû†þk½X+o‰Þß=;î .§g·F3ø¯x/èìþýÿ~úñ¢‰>žžþ„¢ÆMÉ”ÅQ÷ÖAh­CtåØÐȵå>ÛAï’M²{½KYR~Eº(£!„ß\;x´íAŽ!Ú_Cv šêâU¾Ä ¢FÍ “AÂÞ¥Áë’f¢ðÛÆNjc1‚¥ïlB(pÿ¼^bèÐÖY¯¼­é„®ýþCï÷‚ŸåÛëp2??áDˆs‡L­̧Þ F|;|c6†±w9V…[4žðª¬êCfûè„6¹žµ‚Ëüm?1øaúƒ “ÓM¤^!SÕÂ]9=Íå€:™×ÖËå/BoÃŒ¢6 ÷’å¢1X'ÁgÓÏ•C‰DÐÐ+ÃuÖ_&©mrcYDcUDàÿ”AŸ%Áœ™³ÓÓ¿2 dYÖ8A” âkCãøè óÙŒÓo‡ îo¦Ž °€2Êð|‡Ë‰?WWЀÌÆQ¬—±åó¶ëž1µB.î?}o[–¶ÂoÅÓ‹çE&'KeÈ,Aé¶Ï ëä:‚6*"2Ž{Q¿÷bû/޽íÏOO–ÿm€G$p¥*f±ö•·¡öåx¤&u.Ù1ˆ‡KFRþm}l>Á¨ÞÀOãý4kùlArŸvîÁ»Vüˆ;TP }Û&Ô„r?Δ‘•½ñí%6–}× BV„¬J i±¿ö-×%aEÂ…ÛàâÑv7}0¡$LL¡ì~ØÈ„°ÑBlQ’ê;aqÀ"]ý›Ñ¥8ÃuâßQͨ¹]*[éŠpS é7°F}¸îÅjºx§‚"Þ˜™)›oºAY¥1’(´ü;2‰Å®t0‘FŒJ(°“5±L¼Wÿ%ò[M)*ÚßÞw+0 Vþ8÷ïc'7BÛPìZ3Ÿºõwýþ]Æ tØ%6vÐ_{÷¾õ”êñˆs]ÄÇ™)_ï>|‚ÿ€ÿ,ùÃÌ_*jšÌAøÊ桽]3½¢BK1õQe/›´Stë¢"Ô;õÄ­C†çEÅqbzÖ;A q†¹Ø•Ô“ÎsÁ `}Ê ˜¹ñj‡€x,Ùz²4ÚÅ%B°¸dFIbð÷D|\t'\VlŸÓ=Û$œ7HÈ™~rfÆ´î\{j[+gýÀ{®ç3…áïÚ÷aqý >'TμÔh±w©Eaoñ*J–2Áx¾«‘" ‹F9Ž!¬Ör°sxÎCŽ‚YÈ`A¯«(üO‡rÓ98v¹·–6rÖ¨Ô3Ê*aõŘäÀÈó_´T÷º·ÍØ.õ‹ŒÝWÇ/8EXðª"H¦¤*žS±ÞEE¼ }xó|ç:ËØúÀ0Óô½> ùÑóC ¸xÅöûH\† Ó“*¤ÈäÖµn)¹éi±T[ˆ›¦.ç¦H=îu‚4dëࢌʼn¤,¦·ÚTTŽG!ߗФ±ªþÕ‰ª¢Ú´k¦"D ‘÷wƒ; õÈWŨ%£vÞ üõnYªxeé-Nù§Nà–9eB;àeª4bÐÿÙ èŠ8áLéšz¿['G=X;Q€ªˆ õêx }òìÏ'VÌÏ)F¾]ðSI¦Þ ÔKÒ”Cî…ϺÓ^ß: 5”iÈ WBGVJ§}½»þ¼;[Sˆ-N¦özIšrˆÕÐÍ€fˆsA=ŽÇß&YšóÈÇDí¤Ý÷§‘©›K6 ñëÒÞT§“£5“ú©ä\Öf“ó|EA¯j.Œ¹¦©º) Q×iè²epO$©%Þ~—u`Ü*&wC5øyŠ×‡†*Ã=W Mä¥+‰ò_‘£†øçSŽÏ. ÉrùÔZ¯\ÛÍJ_©j[ºÌalÃs]j¯£â ×Z? ŒÐœDŸ­Cú$/Ì.MÜI™\ýÿþ*Û_¥åÎ×Nøš¾š«ÖV?Ís–®"R`JË€žìxOSäOmÍ.•±Å[R¤™hŠÔ"œ— xM޵µVA[ã@‹«¹ÂSòWyEŽ:*y|ÖÖÒNþƱ(À¨×€ñ´µÐSV NtQ¤÷”û]šá¶vITë§wKò­Cm=ð•¡g´bŒ9ÿ’{É®¬´xC-ª7 ª7ä¨vexiwyEO÷jwÑÖœ[ç‰Î G-Ìû¹ r×U =uó7Z!N˜Ï’äO…m-8•á•xˆ¢Þ„ù,IoWNRø)µèF¼§)r7×Uô+)0¦$z;oÊ~îâðÛ0ª ›â„Þ)£ŒýÜÅá·ý–AþU’Uªý\N€Â%¹Anë2Ô3I–éžÍKP¼&ÞÚzë©mCÄ[<¨†;¡D ïÞ]=’¨š¨sf´Ól6ãhż,E•vð÷ûo4êad(Sþ"A#äj'™ "”r;\«€StD(þd#Þ2ý\.wp™¼ƒw5Õ´ãþþ-—û·LÞ¿»Ú‘ñ6“”¹A=ä‰UÚÁw/6¯R—e(Sþªi3äsÙ”4ù–~Ü3Ajɵ¢Qš|Æ&¢B:ø¾ôFÔ hˆÚ©ð²UÚÁ?vÒ¼)Éýñc"E•vø×GËÈ{xg"Gïci^‚â5y(Ó•Y×$žÚy®˜÷4EŽmWq¢&݈2½àFÌgIrCÑÕó¦Jô®½'ÌgIòÞÛ™a@ñÝ{ÊRTiä¡GW6™î}QùmQ¯ÜuÞÕT¬.rÔæ˜÷4En–»Šœu‘7©ßCY¢B"ïÒ]Ívë“qÔ µˆgüç¯ÈÝbWQÝËñù•ø×.Âw6¦.)“Å5'Ï©},ÊP¦cÞÕb°1ãEj]4h~¦,E•FìuŠÌ ßGçz'<Š2”)ä½½«•ÊV_äoêôµý×¼³ÿ±6ö;¾7õ Ûµ—¡÷ªOJ¤uÚzG?ã +Sn (|¯ á$ÑZÔ“)jÉ_M)`Ï œÉá ÇïG …½ò|§ÀÁ7£5}Ñ’ne”D¨Ò¿ÐRÄ\Íð×¼`ÔKÒ˜uð}j%=$ŸïãdÚÕP'HSÎÁ7 ” ˆ/*]…jÔÊÑqøý±EHÑü'ü‡Ãk¥”ë¡Q˜}¹‡{­ àêH|‚ÿ€ÿ,9F6æ RŠš&s¾²yho×Ì^ž¹©_›4•sñC$*B“‡]|'ªp‹o45gò¨÷?PKÔ,ËS_ ˜‰PKW 7doc/deprecated-list.htmlíXmoÛ6þ®_qe±5ù ÓNR h$zsbT– ™M–} ›‰µÈ’!1Vƒ¡ÿ}GJ~MÒ¥E†a€[æËñäÝÁÆ;7tØÕЃs6ðaøÅöûÒËc‡R—¹õÄI«ÝVÄY™ˆ$Ïâ”R/ @¦BÌ?QZUU«:nåÅeŠYzBÓ›Gø3^Ä“| 7I:Në¤utÝîBžÁ¿A¾€Î ~>áçãoàx ŽÚí ”³>󽮿òyÁÇJ¥Ÿ”B3h3¡i†ß>Cäù`’R<¦¼œr.H"L"øWAÇeIà<òz›-5ªÔ˜d$‡Ñ7Í9QÈ@<Îy³Z:PŽ‹d.Pàö!KÒ J²I^±D¤üàPûK|æqÁ3ÑBof²!ä¬IvÀ“Sí:P’&iMfØ¡{ö™úad’jšN¦4'ØÝ4xJ”ë’lsùÀˆYƒ°,B`]ØV´œ­É´pt€Þfñâ&.®E>']¥g j)‰š¦÷å}2×7ä ñe„ã€ãÉ]¬hH“ì¾$ÍjfÙ¾v¹âo¸ì»ìÜ$vû‚ëûCËuûÁÕýÑÐrT…G_+º2‰»±ø‰sGKFý?0æèØ×j„ÃÈ»¨[Í@àýÎV~,aþ”Ý-­™w\˜¤‰ëv·a ÕüY¸ [pV*&«ó¦§˜^R„ð}}ÿ84Æ^üInêTfš¨ûêԹʙUD¤ÙÁ‡@<°c x©gùmÏVw×îZi N=¹Äõáð5~Ã/¥*ë­2­„Ëæ…?¨õ­ÕhÛºs—™h7—6z¶“·¸Ï§î&yc%•;^À<Ù8?Â×f´kدAª)º–Œvk…u¥`‡Œ…ƒm‹ÏÖ 7¹ùìUåB#ú¿­jüû¢a_4싆}Ѱ/öEÃ]4¬’aY6<—Ç7ë4 ÿ\†ê¿kþPK’6ƒè ,PKW 7doc/help-doc.htmlíYmÚHþί¨õêng¤Ïd²Ò)$^3( pàd.÷%jLƒ½1n«Ý@ØÓþ÷«ª¶a˜Ivµ«ÓIƒ&3¸]]]õT×SÕúÝqÇû4éÁw?„ɇöpЧ꺷×íz]ûâuíú<-â44¡ŠE亽‘N`LòÆuw»]mw[SzåzS70ëèµ)•ÊÚÂ,œf¥þCµ:’»‰XÉjI'ý鵺ö%¼“±ÔÂÈÌ÷ð‹ØŠ…òáb¾ £ÜÔ^×^}¾¾¹Ã=þ©-ܼƟ7øóó? ÓóàÕõõÏÀʽ7ì5+­Éîd”Tên6R©Ô‡ƒÑ{˜ö†ÐpR³dHi Ž‘_ë§©wÓ^¿,QãQVÓpf4ŒNUê³Ît0ñÀì™Í&ËS_‡‰Aå&ö -Ø…ñBí¼ÐDòâ²òŸ à'ZƦ†nnÖôÅÐÛ†“[í¼­ü†–Ûh-ׂU©·ÇÝOÐ~×ÇÓ†³ B#&Rbå•Þ:ì3ÁÛÈ?0óZSÆ}ðƵ>¶[Óü­…¯…£÷èf,¶s¡?•8MÖoën‹%,>?¦_¤Z’ƒÌ‰Žއ+ÁþGaü%u²Ù^«=ìA{<íöÐþk]ï®áÜ\_ÿÍÁP‡“V·;½Ã!û<›´:üŒÂ³÷÷­é§†C»Ê›Ò¯. (3jÜpù±‡Ÿ~ [³YÉm[莌¢笓Ÿ—¡NV»SoÙ{dâõ‰‰·Ç& ‘ÐÞŽq–ÚÙ3CË"Ýï4œ6N¿ÚJ½ 定nÖk¡÷5Ê;´¾?ydzû*68»Þn޳9u·î‘${ù÷xž&o1QºÀž'×›ÿ f|¶Î_³F'iúg¬ðU£¥üH=”û3áÌ YÈDKŸ(±…©ùSºÅ”¿Â ¤ùµ*¢è{LðﰢϟsVLå Éæ>±$ËàªÄœ¥EOt™/\NhþÒµô‘¥£W9ÎN˜Ž,³4ë½{šcóLVw ¡SJ~äÉ«²ÙàßH=U|®X 'ÓÞGû-õþåÀåfþ¡NãgcFè•4 '£÷v³?E>œYìZ÷#s â[Å’õ”–ÑžWôЉÖ"÷âŸpyaKY£º/ÁÖÌ¢Xî4"Å?–á¶ô‰ dZÕR‹u‘»íf+Š c_ævýtù5þ†ÿ\—«^Qië£qþµ„ÝïTúj*Ç‘<Ù…y%:­¥™žãâÝuÏ—î¬xcKEÊ;½‘×£/w7ÍÊÚ„)PkÑÍ„A c½qø+‘ÉÕÝ|Z!}ÑJ’(ômŸhµBÇ×a¼‚²¥ðåeDŠMÍJ¦à+­eš¨xA²F $`ÀÖ)„1?”zô÷ ’¶À»?T²TQ¤vi­~wÛ¬ =ÕÛÃqçý??Œ=jçê²U~³"tà†$ý#3–ÉÃŽ¨%Ždn.‰x‰VÛíDÃ$ˆ›'qmK±·3¾ËVDã5Há5° ³r_Ä8)UˆLlb€Ïd+)²®'Œ!!•¼L¾D wUÉm†¥(­çQé¡ù|Œ°†˜@˜Üˆ²G¡Á¨Ù-ÌN‡y|Ó«§<ö/wm©6¨­”eú¦þ:ýá Yì™.B#p_]Òpž9øµ÷Õ— „}ÒZiÌ(žÿžçJŸE‚]»:xu±Lé¬Á/Øãl aÔµ‹1 Ø­£Kìm X§U*³=Oâ&ÀV…¹é§4ÀÓRj(hÓØÅÜà ¥È_ð1u²i!Ñ­ZËõ\êò„® H$E“âPP¦ÒËnˆ Ùfîp&Âz“c8~õñ«Á:‰$eÙ_ R瑨Ys.Ÿ]ØÌñ ™‘ÅÚ>³ŽÓx?”xÚ+ tÐQ£7¾Á=W¾—&P…`¡ÖNï2h§³£Ùäl€wÇ3zŒ¿‹aš “Æ"x‘5Ö<^ħœÃ”œfDx”$òHuH¦%ÒAˆ¹4È®æX€zžÔigdÔ©ôBÒ r"I¤Ðù‹­óÕB湉,ŒÌ'­‘ZÑb°Òj“`PSÀ0àn ñ„˧nJ2’—úëP« 6nw!ò—öƒýå™ÔC¯5³¬x¾±>Qu hB±L³WDRä²å2Y^,5=&»2Ñ•(°È´BJæY¥$˜Ê™f÷×FÓ7¡9U˜.ë…&µ6µHÄ«Úxþ ¦aÝåa«ÿ°Öˆ•ÉÛýõ¼†"ù¡Ê•ÕæµŽ½¿B/Bÿ 3P …ÏAvH“Hìí¦8†³Œxí‘zª!裿Á|ÏÅ®2 UºD'K{]G{›4y,Ÿ¤ýÇJõù­÷­3Ô©Ž|Ó‘HÊ d…˜š6+[ s‰`4Ö UzbYÜðHR˜BØn/ؽMŠp¬ø‚+BGIMQ¸¦Ö‚)6ã{3"ŸÇr…›tóVáVÆ58¶=…µØ£a8qº¨~ÁrÃ2Ìù›©ùl‘Ñž‡ðôÔ—MBÌ©—èì¨KÊ’èꨡð¼ŒOkæã %Qøù†GË­;ƒµ×ãÒË÷JX2¿HØ«MÞiÆ(EÚ†j“ž)ÿÅîE1-#†“k;¯Õ§þ>uG ì·ÇK¦6Õdp€­!/Ê·¤|0@þ€'Ò*çú-R:ÕuK¸&ýU“O°%Œ™!`kDTÓWzmW¶õ){Ãzˆú¾¢7q1bÓжz'-%u1Ål[£fv ƒ?«aŒûum…ð1§E,®–ÕbWqìh³ãøBne¤©i·æD„»³y]³Õ VŒßS§Š!µ’x¦´±<±Éw¥²#…ˆ÷…SGÜvN°tòeñ…ävÜÉ{µ<ß­–|Ydʇj¾>¤[ŒÄ':)è¨D¥V!¬å«âvûVŒx!ô‚D#ijùÝŸ1!ùü6=½Á=Üß¶Çž7¾?>ž½Á+cÔú».q3ÑÿÛ{\kÿËUîËUîËUîËUîËUîËUîÿú*·(¾nsóËÜsu¼|›K§ q÷-dÿÛü¿PKÖP •" ´PKW 7doc/index-all.htmlå]{sÛ8’ÿ_Ÿ«Ô^œÛÈJffëªflWÉeëV¦TÇ\ݹ( –¸¡H-IYñmÍ~ök·uW›u7ÞÖü¥kÚ¶‹ÏWÞª}ÕºøS§£âÃT_ãNIä?¥7`‰è[ØÑ=¼B‹gôwýI_ÙKt¶Øæ ½?ÿåü§‡wïß ÛBwðWµŸÐû_àϯðç¯ÿúІ~z÷V®´±rÕY+üµuÑå­ÖÅx¤þ Í”1ºl»Þ³‰Ý Æ^ö/Ûþêu—®ÛF·3e(æ8§TZÍe{NÈÀQëbÞŸ¦òžw˜—&Ív—ޱó ÃãÞZ¨ÐÁ°VöA3<Ÿ½iý³…àg§;ØòÎÇý–üâ‘ÔË6mrû·ÖÐlV=yQ—ÁÔº¸ž >£ë›þd<™]¶ÃÃm€Ä´õ<Нù­M&À^ú?h®õfš ‘6™"µ÷áº7óSp= Þ–þ´ÐÏÞµ¯hzÑíÑ œWîc×ò!ÎÁèèÆZ§Ì›†õÅmóÒZïz¬ ëÉl @ûßµÑÇÑ@»½l¿÷îÏmøˆãñ´7ŒÔ ±çù´×§Ïy~w×›}¾lyÒfäŸ, zùsˆË+~†C¨`Ü›Ï/Ûªþt­;}lšïÛR& Çõûç6ÑÞHßÅšøs´‰A#Qo<ºQ/ÛKøÈØi£ü™BK³ 26œHM¿ý„':î~»ÕçsÒã õɪEKm˃Ò×W^æ¢{ 쑜”˳îî7è%ƒíI}ßT_~¾Îßó2ï蛺ëVñ†ªžƒqH5ÈW%œ~CVxçà%Q†Óp½,MEr4hHd šá'h/›ò^š^M•–ðÖJ Ø`s×õ˜…÷[È{œë.U]ÚŸé/¦=xotŒõÆ‹vN4›|dŠåêB¹#eØ¿´$­.ÔAqœ`î'ŸùèwÐ<xn±NgÊö'¨Ê'-àÃof¡`ä 1$‘§;kì]¶¹v¿¾Î@Î~=ø‘æD«è覙V:AÇk:1\BsA÷ÂÆãÊ./¡î7ˆ ˜ÁHypÓ:{4 µ$ª»Ë~tômÐw¯¯z¦‰ú,Ño×ë7¿AÀßn—ŽzÁH{¡Nü_ðrVõ…Õ´¢Ÿ2&†þHKy=ÑÁ[Qò¡›ÞÂØüÐ{h_õè7ˆ} öãÄq¢D%Nq'Þñ&Nq'Ž8Žï€x'ª@TãÄ 'qâˆÓ8qÄyœøˆñv& O‘Çü‹ÛŸ ùš G>'}Ku1'ÀÊ=ü¼$Æb×՗ݹ±3g=Ç&^z¶CÅãUOýü N “þôjÍ=°–èIw }abdXðŒ„G}‰¼ìé%±<Ïáç¹Þca}Py¬J@)Z” Ý`Àuçq–{žç‹½‡û¶µ¢3‚‹3¤$-û ‰£™¬L(f® æªõOtîÏfôK?߉ý Þk¥è>«ö û9΢`ÅÒ*ÃFÖ ¬›Ñ¢rdžAW¹¾²+!}‰„L¶ö¶M¬[ɤ¾ÉºãævPOÕJàÅ¥Óç-«Œû×xmX·Ï» ¶^ò{ÍòiP{AØDÊg;ÿ‡:¢LúlÊ@½ä­q qiªñ|Ieƒ–+à ó Ì£uŽá¸1ÌU€GœQ?!9äÍíÎ ôuèHa ± Áœ0S…r§žyIÒhá¨zhŒ6`+*t}fçeëõ±¼Íêð¬ñ•uõäÜ*Ùá#4£¥+«8^Ñ X½/Œ}ÀS%Ý?6Ÿ;!´±ÌMëè¬ýtõv—ØZéB®bˆ’TÛðqjpT¢$õV×—¢îä;ו|€£ohø·p™o\B1ñÑ‘î¸Õ/ýRfÃËΰ1㢠%“Ý”,Ö¸µAdq*ì}82§2$SÌϦèºÌ ”ÝÄ“Ǘ\ÂJ{Á³xe[ИÇËVÇ?‹ùLWHBÀ¢ &“˜ùŒµ6_6©.íy‡ÓÑŠ¥6,rª©¬œ ãOÆ)½XW³÷®ˆcPyl§¶v=Ä…º&Úÿ"‚˜½PCÐD»€£ Æû©c/±ë˜0âŽ\ÇÖòFÇëjâÌí– ‚€§Êv§.Þ¯ìRËÒÒ*º8½£¼T¶FÍ )7—×ÑLYfèæœËÁwfÛ^ª3A2±(YȆWµÚ¯á¯QމZ"s£¤‹OÀ&;t9H9t9Èsè2¹xœÓË,YA9?³r ’µ¦œ¯Y$â>^¥`¨Ô׌ m ÁoƒÑVH¾·Ñ=´µ]žåÑw;“û¢A²ô@ªû¤lKL‡I>^A•6ZÆ<ÚίˆÛBw%=DK£¤ô%OŸ‰ b9Å$Vºœ˜”hJ¢Ùû‰BŽyë$bÑ’¬lD´œék*®aArƒÈ;жa¹ÝãÇÙ¤žª Œ|zb;²v{onï%fטYLl¢+é­Àsf b–œŒR$n`ÀÄgL!¥ñØ<+ˆV ÊÎÃ%`ºÃ+CO®3÷ú4a z5Àe$5È-a¥4ˆ$0_機ÿ¥¦1͆ò¤—CD$Î ?†T:{3{ÏNŒi¯è”\ŸÆã(ÒÌÉÄÊ@¬jÌ=qöÁÁKŽ¢<¥Ì€†)ÖÜ0—5—ÀüQ÷tSɼP¢ùè[¶ÕÉúnR¾ÀMsÐWkìõÀúw[‘¦T§*^` Ê1÷öŽÅf`,îiÖ¥Á °¹~ö0 8X߆¨ˆ499ÏÇ_œáD±P$àü{”ë´´!i µ±=:'%Ë^’‡àÜmŒDBYú,K2È aß^a úT •dq„þÀfZ$ Mˆ@Ž@²Óþ”ks¿µÔýv ‘Z&UŸ¿×ˆtЖ"‹65f[_ébáaƒÌRÂè0ËåÞqðêr~ØòxгâË3*W^$¦QYGŠ@bBqMëÏAÙbÑͺá;ýË€ŠnáGIÕïUz91[D|%®ð‘…<­Kí²ŽU G°o š¼!K>XVJb@\=$80rõT8†å½Ç^¾†že@1Ùâ+ó÷mtAT·X’>B "Ä!öT0/î#),ÁOμ–˜ä9û—G£âÓý²ãžÿu|ø6HœnBFXŽVT^NÆø+tCóÞ2¼8^C¨dT@)™TÝ8kJÖ±<,&…Ã¥‹iÈ!ñÜ]ÈúÊž¼,ÿ\A±@-A­!0!¥Þ³ÌÛI­c=2‘ÂýlTdŠ8%Õk² Š,â·%Äa{$á Þ‚ýgšÈ†LÎÁpOΛRÂl†ä* ‰Å§W¨ƒ_"ÖR;zÅGfF¦f†¦­{ts/Ø/"­îŠå‘´=‘Æážßf£ê[‘ÿµîXÐJ_“ú·ó€bÄL˜(D©u‡Â7k3‰ƒx<(@PCîÙSu\'^™•o± ”s²›µ××ø„S–°G²Œ­µ·˜æÏÕyXÅßšÕ½J('gš¶”ɾáò.rµL6×´oŒBü­9̲¢àOì3!S-:©M$ÔQdÚFÊfšÜ¦®JŽ ÇרDZW$Mhç·[,†Ôw_‹Aªb%2åNŠ´ÂŒÚ"©2|^âV‘¸Zj¡ müx)¿Lq¦ô;_·f‡X/n÷•ªu(§ ¬^ûÊ$¿’]5èúU‹ dÎ*-·ó½nÒ§öù•}'Ro 2ƒct§vô%zßð³UëØäƽõ ¬0_©à3ñÇ:­ˆC;³h ´½4è%¢žÍíÜp7‘¬°AÌ–ùhÖ"Sh^Ú ”•ùŒöÖË>俆ƒbEcÔ‹àqB}×VØÓ 3¯ïË·qìõ‡°‡Q\c“.îî ÛÝÏF!2QꬷW^GvÛW–Ït‹¬`Él楊4UûMñ®•Â͆tÎsL²€ fŸ@PŽ'ÔqY!,] *I¾Ìxê “ì<‚T!…”ê&Õ߃Gì~z"‰Îˆ`@.é+°ki#Ù1-êÒ)d ›$”üÁiu”MX=#† o,”_š{ºVoïÈMÞ6ÐÎLã ŸØÛ­þæÔF=ã"¢ òÈRtŒ\ÝXøö¬›]´D¢Géþ&޾°÷dbh,7ô\…¿öDÎ#¹ûÝÎvø}çìL;âs £äô0ž&`Pªƒ)¥Y1K—{ ò|~W£w2èa~2ì½+ÕÓÒÄ:ö¹0¼Ñ¥õõ±m 9&ö‡d(‘д —2Ù¼JÔ’®¹/qR¹úA-¹'–ó˜rèÐ¥V¾&\d=8÷šgXM‹ H”. O¨³¸d¹ ø˜Ã`4†—B”Þ4×Á|¾G\ý¿9@/ææŸETâ1Þ¾ Ò–ät–¬PBŽ,œÌýK8TBRs–L˜nõœ=¬‚T¸æ±ÝÃx´ÑŸ0»uœ·7ø¼´åÛ¶c¬ âãï'¼å5?ê¦TÕFf2²ãŒ±íý±î&"Ÿ~õõ˜ï”QaR*êÌ<ÛÔ åLJÉŒ²_™rˆwâI³/›K¦¦;ðoˆ’ÿü#¸efZr#›Óc»}åÑÿÅ}”X¶#4Â¥€4{¬ëv­ Ð™¦cÓû¨¥]±…ý‚ÓúTÍÏâýlì½¹bjŸöS⥮»Š-ä/×¾åÉÂ26  B©¦¿•xréÈjä YHi4Ø,ž'–)I¼À?¸”èú]–@Ù fDlÊÌeÎhþ)Ü·¬ŠéhþŸŸ¿)êÙ 8²/ñý=A|ÿd"u›À«¡„û‡Lß½(;j Šh¹¸ÃKVn¿»‹KÈpšcKqC?fqVmk~‹=QM2fا£¥£å9F_@¢É+D¡þæ‰Faê!b™1gvàìð•O….RJ…wpW¤R~ÇŽÝ’u¥~Ô÷&uØ÷Û–W‰ŠüÊãØˆ9$1lêKä>òˆ„°«È3‚9 aŸÏ°¾ÂNNo 0ñEâùk˦ñ@zÞlo¦ Rí —¿N%ƒ`O0žXÝüNcsVxÄ<‰¸…£å_µúž¦Jª’;‡"Ùæa©®ô"›™Y¤2 Íq/‰R }3OŽp¾Å]жº·ÜKv2ž£zåâegg´¯äÎÄ¿ã¸"qPÍ7u Û1¼çÓwAD³¿Èm¥yÐG>mÛñ¦ò¯3|¾ÎqÆ…sKÎËxÏl¿/+Bb™&ÀÄÚ›É%-]SÏ ÍZ<ˆ­š¿»¡ó×z2 æâä(1Ú}¾`vž(²".Nw2â/VoØèÎ0]û_…mFgdyƒ:{ýÏ×t5ãõ¯óœº ‘˜“…<бõ-ã­<ÇP‘Oµã¹ªž]¿ èѱ·™v‘¥k¾bϰ‡', ÇnÚ *ñ‹J³6r•Bìœ)Ëó”yô<Ï<ºèNyOd³­Œ[Õv_VÓ?æBÕ<ôÔÁC¢FÚh¢úìE©¢ÍIxÕ%X%ŽAƒ\”#ï` KÓ¹ë1>?¨“ò0WÆJ_›Ìpb)ÕTÉé=-³-˜ÔXÏÔ}5ï1ʹ¦ 0ÀCõœW±Í÷¦û•ïÏ÷º3âx›10›¤·Ï£ë{M‘õ™dZÃzŽneŽW%ÁæZ¹©·Ÿ§·Šz¨S†÷góYêÕ £Øæy‡­NÒFgû¶-–)ô$È {RMõ=­š¨OKQXGò4JuQïù% z^XƒõUÝ)š" ê­Í®m’3<('SiËm6]&œÛÑx ‘•¹Q⡳Û&÷›ìbâ±C ì0¶¨EàŸÅȯßúãÞ|.Qg1zôóš5]ŠÏ/L“»;èFiúG–Ú(ÑbšÇÞÒ `Ý#CˆËGo,(™Xg|¨_R Jº™õж¬WMTȆ¤_ÅSÖ³„ëLü  ŽY“{@b6Þ«ýD±”Z`A ,>tÙ{R…›m;†L*0MÆ¥,åf¦(ì±ÖôèqÆÿ ¯‹Ú4eÖÜ Z#¡c%iuV±’y;Ò…á9ºóŒVATºðooIvÑiƶrÁ;X‹) ÔZ||Ǧ•{Q~ÉÍ@$zƒÿì‘ù€D|R24J†ˆúp6ð´ÑItÆà9¿n–•h…‹Þ$˜Ý¡çuy$ÐàÊ%ßs,Œõ=¶HQcKC{ì'ȼÄäÜô‰:xÀ1ÛÊoeÁG9b‡JSõÅãä…í å.Dä®ÖýzFgqOþœ—8ã”WÎû§÷O äýk ÞVR#¬#_·½ˆ0z3ë F½qþ\k¾E“híè«þV™i¿ÌÓ§Z³>tØøñÌÙ¿ýßÌ òæéS­™'û3Æ ô;Yqxl „am°“ù^™äd{$Ûë5w«lb#ûâ¹\<Ôþm<ÔZ8ä‹ÀFÆktS…0z{®5 Bÿ(Ð1R`ДaW€?×rDnOú{IùýÛh<‰Ž ¥Ö<Çdž/Y‰:÷Ô‰BŒ’¦Åûü°2E' w£ñ8¶Y’j-%r=¹-3s œÏ"Q4­ÖphÆÖ7%·×[%ÝEUnzÚèƒlK?™Ô¸n£{âžZêÖk-0Òw;Ó`÷#eZÂO.Jà$$)Í[Œ`q)zF+ãñ;‚—d¸±xz9'y5Åh¢=Ìï§ÓÉLSÊL@/žr½ïukÔˆiavɽ Á»,àFÊø¸Ÿ8è•=UKÐ xú›ˆ~€8æ;C¥¨{Äå°ÁÔEÆ:ƒÛù-¡ŸÒÈM*•ô‡0Ø%­jäKŒ ƒ‘µG'3Œ¥ y@XÉ’‹yú"ˆ„rœ¨ÊÃdxÔï)=KÔ%óàOÌ‘ ª¼‚XÂä•ÄË©Eœ4ÉQ«_[èbGn‘#=ê²Í©í«Bè¿X-ÿºl¿×þï*ðIÆŸ¹?‹ìc$ö SÙïJT!ƒžåË÷aèÒ"â ðhŸ§r9N¤ý0ÈÅLoñ{Þ²˜'SeÖƒqœº¼ôBÄ"äZ›ŠoËp­|š&yb­9þŸ2ß(I†oê½×~uYŠaMÂp½W‹NÌ:ÊïXòÇõþÀ¥>ðXòÇõþÀeø½©÷ó$Ë”\k®;¥¸ž $ýÈulQ* ðщ‹ZO°MCR­…`Š%¶<}]hò5õÃ)y¨5¯ò-ŠÝ²ÄÅtôI ÀS­!ˆ¹8ù”ñqšNF‚·}ª5)RPÜÅc:™û'I’ÚQ–Ø0-)n)ø7È dóŠ’k-:1G! wçàGã«fñL¨ÆŽ\°¸Îï=MúÊ|>RoFê\›Ý;hš%só¶¸äQ½²ìÊúç\¹LRÊ“ÖGýû~LÃú‚v.Þ¯ì‚ç 9¾ãvRàäé’1‚Ôkæ7€á×>b%ÎqÄÜ]æíZÎÙu¦ôBˆ<Ôšoëf!#ŸžFIxtG¨µfQæ£ß\÷'cA1ø„ZcD}Û<±-©g“IÚ)—dRãÔ¡cÛÅ·Ä|´šåžUæ4,\ÄòúÐ߇3‘XkzüæBœß_“mƱ=m%ךûè]Ën‹‹Ã™îÇ* è/h'Z¶³ÕÍ®e[ØO*âj5ÿ¬j½O«T_ç*r Àb·ë€1L¯IHv¥7Q1þ„1¯’Õ”OiJ6™Ô(%Kç5þZ\ËÞ«£>°?ë©Â2£H¬uwë‘ÛtH?AŽn\m”÷–{u>Uú£á(æ–£×´ßÐ h±ããA')$ ‚â‹ø Vøé¡}~<¸½cäW0Dz5ÑÐËêáN© Ì ?Â|Ó¼,G)÷ëÊBøgÆa˜¸f¡š’hGöð™E¯˜¸¯ fhE÷Üq‰ÀHL´sì'Ã?­¯/`8Õ—Â]2¶³Â$rÀÒ6IqHhEbP¿E~`e*fd(&WHÐ+%tö¼±ìì°DoÌ#> [à„@ **Ú1£¥K~•âMI´#‡@R¨ ó/.Ë~цÄ[!WU7YEòQˆzžïJ_{×ÏžÓ›nƒK}Y6Jc¡–£ÙÄä:]/?ç×Ë/ ©üòÞB×ÌËPêû·Ç ï?–d“\ƒ\”â÷‚J wNØ÷Áù¸’Ï/™ÈYŸ€è™.܉;’À%–À/ÏWPz¦ #‰ÏDŽŠñXæž¼†!;âý”ìÖÊ ?J“¿3*˜ª0Z¤DÔs¦_—ˆykߟ|è#_·SÈ &M´ÄıD$G“$Êâs·<òƒŽ\¸êß%¾÷ óœ x:§6œì±KNqš´ÉT«S”\¹ê ;Äì<µÖ.ëu4Ø~z—cÉ5îo4W£\lò”èq±ô¡x¹x¾úHW–N&"yWºˆ°ä‹-\™Íx?¥cAkŒ93Zé9]×ÓÀ”9}9P4û‹\ ô /s¡3²,6ý'‡îØL.¹î§0œCÛò@qà3³öƒõh“CôäÀŸ—Å$06>%tµp‰Œ€$ÌÄÄR6 –‡sª¯“š>í:é°Äp‡´Ô‰3SSß Hµ(bRä¤ÿ ˜Ò‹¹ELe·`}L¹ëcž[°ÄùûÜJN._ÌçÔR v’ØÇð³'“+û‰6füb¹“_A÷§q´Y›^=ôîåG öØ@ĉ •8qÄaœxÄ›8qÄQœ8â8N¼â]œ¨QÉ-î“8‘ÜQ>É…kó8‘ÈßGJlµ¨^²4×z3 M†èz¢i“;××½O&Ò ±¥?-tçaa{ž½Š³€½ûÅØu¢Y} ˜C‚$c;$ñ8%wzÓ ´ÞõXVÌÊì²ý®>ŽÚ- 'ñîÏmÔWÆãio0©7@bÏói¯OŸ!óüþî®7û|Ùn“ªˆ0hÔŸ<êåÏèú†ú—Aóø¡â³{ÙVõ§kÝécÓ|ßNcõº{:ö!Îs¢É‘V¾‹µòçh+‚v¢Þxt£‚íKöOœ6úÀŸ={dz 2¶ÁOØ)Ÿ°ódàCÇÝo·º¿ãvu1œ¨Z´4±ÄÞSÝ0áe˜& 9)—|_£« ´'õ}S}ù†"þž—yGŸÌ'ªxCU^; ¤ä«N¿!+…{IÎ tÌ`_ñxSA‘ ÒYƒfø ÚÄ˦¼—æW¬ „¼µÈUó•½ÌÂû-ä=Îu—jŒ.íÏô—S ¼7:ÆzãE;'šM>2Ýru¡Ü‘2ì_Z’Vª¡€½ÃÆð°„¹Ÿ|æ£ßAùtà¹ÅZ8)øûOU>i~3 ½@Ó _Ȭug=°X¨ ô†3ЈáÉciN´ŠŽnšiÕ¨t¼¦y6šj4– @Œ¿z]b¢»KÇØy¬¹ {á?ãñìo³——P÷ôO}(¼õöà¦uö:h4Š.-`·cÙŽ¾ úî5YD}–è·ëõ›ß Æ?ào·K‡¿.kü¦Nü_ðrVõ…Õ´¢Ÿ2&†þ`$QyUÂ@~‰u6޳œYIð‚ëÉà3yÑ­v¶ÓÿPK7ƒ½&"#-PKW 7doc/index.htmluSÑnâ0|ÏWl-Uj¥&¦@ÕS"¥®H@—êt&YÀ×`G¶!åïÏNR´Br¯Ç;;³›„W£×aúg‘ÀK:›Ââíy:ñ)ýÝR:JG Ð:÷0Vl‡ ¥ÉœÙS>QZUUPõ©64]Ò­Ù}ºno¹ÉIä…W¾?ÇjÁ6èû6t”î•Ä£„Ÿ(P1ƒ9¬Žð—X.3fö™ËÜ÷íz²ëá†I ÝN硦J'é4‰¼ÿù#™íw( 3ÜæÞ¼ ÃMù­ÒönHÛÂãeôNN‘»aâ? Ý@UC@œå¹(®×ëÞú¬Å÷¢c‰s²>ˆA%¸7#3Aêôév ¼ž¸÷¸Û…[Ê“þQe…?D—8ıKð Ý>¢¹î,òÐÑíÊfè´÷¡÷~zrzŒ¢]Á¯= Óðs?¿ý T½?9ù 1æŽæèªÔ‘ ‰ýÛÁ£(œ1­;}1}Öé_©ŽŒ ùJ_ðã:Šg‰€F¦á¨†3` 0¯ç%I/q½^òC‚ã;×Ãe§kÆß‘¥êh $ä1ÀÉc" jÙ@ðW"+-õb ôzbþ³¡î1 ¦à@°i3ãl,mâ ò¸Ä)'jÄ‹ý%‚»Uè1}Ö~8‹ÖŽO|tÜùOÁgéÆ8$=0åjA/}:ê£>v~ëpYTªÈ]ÓéMå3^ŽLÝ´Âzî,€‚ÈÁmQæGª.wæ û Û‘-™È1'`leO¹³2'„îíOI´$ÆžöE™Qp«$_üe·@‡ÒáØÐŽ Ý¿w™%?ü’ioGê*𖢂þ'ú¤)Îx œžœü Wu}"+Šf\B¿·'òˆÝ±}}u%[ŸaÇ¢_ D ¥1g»¨ð¹¸ºlÛÁp†n<ÂAp*4rzçÇ ‰£uu´5}K*žTT<+«ˆ(‰d]»4‚‡i„ è&½g¦e$JKÅiåæ/mô€ã¯»Éj±pãÇñ0’ ˜?eNQH€S(™iŸ¾8„¡RJ6â¿„·Éò#LLeÝ–®÷…¦–oPg»|ƒ6ìÓ¤…@¡´ï¡ŒäŽ7I R÷:~cÜfðн†Š12ÃË{4£w?!mÔRò.¯­ä-üµëAµ4JüÚÍq°ìB¢n£ÐhŸÖGd¹JdÉ„](jz²Yt¿QTùÁŽ’¬šk_¼'¦Í¸ÈzUFÓ“emA:O!ZRt³µWP_¼^Ój r_ö9ÕEùŸå\1ÕŸƒ9ßT]ŸÚN̆þke÷½aåΣ;P½À ï{6,FÃûÜÝå=ެÛÕò-›f÷˜è‘熻ÀGÇ‚T¼ÏÐÆÑqªC‡ïp=_öma²ŠÃ‘9î ¾‹æ1¾4¿4µÔQ÷ë"膠J"N—i6qc"H½¤¯óH_t¥Šî^À2Lºÿ^¹»$zé|uPÈFïJœ­Ÿ 73_ï' ɀ鵥¥ñQlú±BdFº†MÕ¤0S²ƒ˜šM¾D^>ÜïëÕÛ( °¾º3í%öX„§žÌï_Ó}/ša‰Ä+˜Qìùl®ü°X%ÍÝh þº |Ï'èÁ Và>XQê ì‡0ç³]÷w)ç;7HrÖÆk?ùéæé 5VêVvýÊ3“{'M»ÛÒã–-Žþ/ö8†xÛ$(†bÞâ<.³,µµ±©¾û–m¿ñ÷5u`Z}qRľ•>[ö÷rð[Ñ }³×>?$ò=} ù*Lóçö÷6n€ÅA÷ÇgR§†hcb£ô…K55Ò÷.µ^_ß eîÉ^9zk²U çÚNÈ”ü™É¸ ¿uVK‡…xŒâ<„ªú=F«Ã @ C‡qåtn¡#èÝò^´ñ­}¨C+ˆ{‡”ûáùá Úx`¢áèCvöÁªÿ͉¡é8æUù¤EãáÜÛˆhÑê|nJú§=¢Ëõ;¥ûvJ÷í”îÛ)Ýüçí”îÛ)Ý·SºÒÛ)ÝŸè”nŽúju3ØÙ ‹uAý72*ˆÿãßÿPKñpšz v8PKW 7%doc/org/w3c/css/sac/CSSException.htmlí\moÛ8þî_ÁU±· .–’¦ RÛ€-)‰±~ƒ¤¶ÛûbÈ2mk+K^‰Ž›»Ûÿ~CRï¦ßR;H°1ÒÄ’ÈáÌÃá3ÑÔÚOZ_µ¾ttou;hð©Õi«Hª*Ê—kUQ4Kã>È—WÈ m?r‰ø¶§(zOBҌެV+yu-áT± eFæÞÅ ‚Ëc2–•ÚOÕj¯öW«pHeÒ?zSãÑöqhê¿^ð€®>ÀÏ üüú/¤êzyù+b­¶ÕÑÕ4õï^P}+5%>[©uu«‰zÍ®^—¾áÇUŽ# ©ýž¥÷¬º&€%ŽìD‘ÙŽœ—‚ÏŽ"‰ é´{¿!Cï º‘GG3Œ‰„(’u‰àïDº7ôÛº$ËJú“µ–Y ¦V]2éi&ÙTöÀBäqcIÈ Ý“¥ï0]V®?V–K<|v^ùoÁga‡Ø'2@·œÓ/„^­Ky¤•¿ > Oá“P©µúÚWÔºSû¾Q—V3—` ÷{ ‡ùÑ>REù´Õ“2­¦a¡þ-²ú€÷s«i$Wù´$ ûöÃȇ$XH &®Ö”&kÁñz}sÕ\;bÂyçÝ©Í0ð\ÿÌïm5[µú†¦ƒþ—úÒÖ¬ûºtuyù3L°Þé ššÖîÝÁ)~lš*;†Ææ§n·i|­KÔ[-ƒþÒÀ+h›^ý:ÃåŸÛ[Ðišf]êÙ-;T±ç]IB#‡7ŒH¬ÊÖ®é[Pñ²¤âuQE„@IÔì´ïzuɹơ„>ÇÇ ZÖDÛSqê<)üyw pøàâU5ZÎçvø(Óµ –ÜÂz)Jº |’j­F?îSSZ`*mÉ,þ‡?Ša!j? ÛÂv¾Q9@ïr€6·ì#ÒÆÀ PÜwଠŒ«R²ÈzTûIˆñ>Æ[Ðîó÷‘1^„Ø¡Ü]õ܈죖–v9µrÀ[ø{Õö¼}ÔjÓÆ§Öh†½E(z…î¡ív}ÆU #öEãÔSAèNg¤È Èèá¬Ö¨é]Ú‡ÿf=™¸ŒËá`ÍÐ÷‰fûß@{U8®p †þ™·çÇñi1Ë@ÞA—ÆL‚®k`‡N£Ç* , #×G¥`Í ëé¿Çpràšx 6O²j›%êÙᓺǶVãÖ€`ê‰|xÞ$©×GÛ…íH@{>ðÇœñX^¯ƒìsć4cX…€ˆçŸý"4–ÃGU?˜„ö<å V£éyHå9ÿÒÿ‚ŠÂR€4í¨õúÉ× ¸8ÈÎDVŠ3ΗHâÒ…¥°6ó×™#ï Ǻ§›–®ñïÿ+Í廉‹½ñ0ORã¶­w´lÙ®5w’ƒ¥C‚0ëɨi[zÍ1™¹Q ¥½ïkB_?Ü\ òãvçFlØÛõ³+鳯YIûMV•(/I¹ÊIcìÅ,Uïiâ5ÎRaOb”:e™-ƒiMØ?:Õîßï<Ž4,‘SläÙ0ó^”_ø‡S!Àš ]¹²gûS¹?ú;„®‘v÷™†Z\$!Ž‚eèàhh†aéÊSw"÷ÃF(7Ñý”ÔÈ$Z3HE푇ٺ?¢àl¯…ÒÏÑ„KŸ¸s,ãã¥lÛöQŽcSSÓè¾U³jÏ¦Ì ¢Ú4 ŸØ0à í‚jšÆMpÙ„ñmÏýE¾¦h̹¨LžæBNDÐo~°ò‘¹Åü— ;mì\ëÈW^NW¶4…Ë‘ç:|KŒhº[BŒ¶á(GhóDrÉà÷E(LŒQÓ‹‚.iƒéQ *$ž“ œ3Cßm›I©a¦]Ð-t‰MLŒãz?'ûxéÇq ¸úË;a8ÍØq­uÆ1 e•‚ŶýáÕ¶ýìõÎýl.iUá“KZ-ê’÷Ø»þT ¼ ”Š{ß÷…ñO!hfC5'eš2ÔBÈÝ”j±A`•pKÆšXþs)\±-·Ú×ôFDlâ:< D³ $5…/ÇÃo컘ŠëèÙT‡½¾54? }\c¨ø•è4÷.Š ´Â¹Ÿ+ù´ßí "3Œ‚­•Ñ ˆ!? (Z.`4ÝNý ð7¿ö¬æïðÙñI·fÿXc ¤‰\ÏÃSÛCÞÀŠ¡-°ãÂRþ{€ÿ©gtµ —sýÒÉãO™Ð8 éDh駘ˤ0Þ©œçŸŸT«ol`ò”˜…iù+¢g5Óÿ¨$ýÔ?sv.•²î5gçÇó5Ä6Á²‘W¥„ûe€ È 7á"hÊ­ÄÏ‚Z¹dFÙÏG˜æÎ85ë¥€ÉØo|ì"7Ò ÆÏŠY# _†‘_\¹ôÜdA-f§S–P½(nÍʢ㠵±Õ sl89Îf+hŽ£Èž¾œ),¼›; ñüT»-DCæEŸ=öNåØ+ŠÎ]¦ú Ú==Cê8ÅDz 1?þzŠpb² ýˆm’x¶H9 Mà Ï ±Žµ€ðN|!ãÊŸb ŒÜ¸´"æÃf)#T—î§/¿ô<@£påF?B§ÇNŽ'œ‹.ñLÄG§ž^QOb &|5¤ŒVgÞ¶—*ñn4Œkªx<œ„Á|Èê€CAù¹˜¹t/–yй­“s#e`Z@Ôˆ¸˜)0‚sôFü‰ëymß$¶óÍ m_ Ê„ö2âß:Ã+“±S°“ùÖ®ï&Íॅk»ODEa$(¹úÑfžß³xÍÓÎ-8Êœã?—¶ñ™¦£\ ™Íhø» …;wò˜ümzÞZÙ.ÉÿÞ=;¬d½VNJÐü^ÞÎ trÇíEæPW[ ÐS|S• •™+,`å­®Ý_7*нÀoÏÅw>xÕ M\àXîDoƒûRõò·´ÆæzÖï…°Š•í“êƒí-q´û^ˆ,ÄBÅ Žïg&,w—$¯$ª $.„UP#?XAïuhwÖÈŸa0OÅ8_ö‚›¯ƒ€j¾›ν àÏŠl޽ -? ¯—ˆrK9øre¾|(c– ¶kŽWzˆ¡ìv‚;Ã4Ë-úØæÒ÷(ÑŠØU9†¢›‹&'Ó?_o;® ‚ÒÚ¾Vl©üîi`R˜=†IëuÜí(Uc1aÿbé ,-UM*±îSiýqwØ\/CƒÅŸÈ¦ÏóFY\`y®ÃÊBì+ª²(žJŠ çiÓR;Ñ- çç*Œk©±¸¾ø é>./ÊôÅâÄšûæ«kÎ[öAêÍù"ÒJ"ö"p>¹ÜŸbI©3m‘˜îè/h*ÊPnùR¶pÆæ¹ãÌ~Àà×E¡rš\hø#WôáÉ« ë™Z’œ¥MDðí_ê,‚¶ÒÛ#~±‚¸Å2ÂàÆìÈžV9ÜiðPÁ£œÉ³œFù‘®ìÐVß²úÝⓣ—›F!Á|¯÷›â¦¯ö'®ÿÛ[Noo9½½åôö–ÓÛ[NIÍüí-§"oo9½½åôö–ÓQßrJ³Ìµ’4W”°æ_t‚èkÿt þ_2üPK=´§L˜ BPKW 7*doc/org/w3c/css/sac/CSSParseException.htmlí\msÚHþί˜•koã:ƒì8[u•U€ä˜Z .IN6÷Å5ˆ´+L|wû߯çEïƒpg*ÁHšéééîyæ™IÍŸ´QÏúr­£Këj€®oºƒ~)uUý|ÞSUÍÒÄ…wÓ3dØ êøvUU*H™Sº|¯ª«Õª±:oøÁLµ uNî;Õõý4&t¢´kÍŸêõ!Y]ã©×áÉdôŽ&.¢Ä#¦d‚Æ÷è|‡'¾ÞŒ#Ç ³Æ»ÆÛÛÓ³cä{è þý;töþ½‡¿þõt ½==ýqáVßèíZÏ4¯qý›M–LéZS•—jÍ+Ýê açJo)_ÉýÊ&¡‚z£¡¥­–ý€îØ ; !¶%QÈvq*LÒ ?ü úµ”Þ»$œBÄlÚR(ùFU¢ KC¿h)†šüKK7x ®[K1Ùi.Ùìýk Ñû%‘’˜]B;p– L#Ïæº¬oâ¯,‡ºäÍqíß5Ÿ%ˆG`ÄhÁ~Pvµ¥”:¢|¨ývM±FUá“Z³;Ò¾ îÇÞh02ZÊjîP¢€ý]Oà0Û䦭ðb+þ Óê] kt †þÔíñUá¥Øü¾ãà–úK¥ÍeÀÕ¦Úá%„ю¯βž)‡doL8à¼3ÃÜ®ã}§ˆÚV§;ÐQwdh:誠Ï}ͺl)g§§?ƒ«õÁຣiýáG8%ŽÍëNCaóæêªc|i),x-ƒ}i¬Ì°užÚåH‡ÏÅtL³¥ ñ]=âºgJe'o§NÒÀ_{[Ò7§âiAÅ󼊒¨3è¶N}’ÇÜ´¼ˆ¶¥â,‚ógcÖ¿#ÁCVõ0Z,ppß`Czr#'/éÂ÷(HjvÛ#Y§©v¡«¬$ïñß¼q¸üCR{‚nKle˜²ƒ:×¢ÊÚ\ðO•6¹…dÝ5ò2Ðn!F¦Õ½öŸ„lÓy Ê=‡²12!Ë€Ø Êë®ÒmÔÒ’*Ï­àùVÇ®»Z}Vø¹5šwYœÞF¡K(»Y•c•ÊÁ„ÿÐtI(œÙœæ‘£ÏÕÚMýŠÕß¼&—`q:(uômܳÿO€½:פ†•p|æY6Cª0Ϫ0=%3“°G õ|¾Eއ S³Ò†þIè"Œ[E6=Ô·âËÒn±YÕ¡M¡kƒ¡-ENkÝö…ó@¢B9q¥éy¸ám–øw€.Àäœé1—·Z û öІUfq½7¿Tö†÷ ëž? ð"Á n»ãº¨'.Æ:þrü¤ÿÿU•S€„v4‡£øçãîØÈNEÖònC$éÜP(¹ÿ¼Òýræ}‡—iéšøýŸ‚C¦q'á­ãÍ 3åävø‹[Þ•Û –™ò²öE_hi,—$Û¾<"²©ÜÊéOiƒ5-cC­¡s’V|9âÍ”ÆÆî–Ñ€T÷Ò,\ÿ-tŸŠw{Õãòë4/ `ÌÀŠR†Iž´êC­š²JÒ +£P)%ºÜDHëÀÂ"W©yù¾²¶bÔ°à|Ù ÝÐfTàæL ]»ÆFsÃÅÞ¬1ÿAlÊÆMÿê#2^~à$ô£À&¡*c°1s¦ ̰ÌX ZlÉ¥´S‰Öè)»„cÁ§+1”|ö&܈<ê,HU{hçÙ¦¯M ÀC•>OíJ·ªÑb¨uÙ â¡ÖÔØR]³b¨í/–.a³È볕ÆC«ïYÔÔ4áÇo˜ v±Hjª›\C±Ðe4v[¬§£ÉUª°‚¢ášuÉ€°<9AE6öPè@`ÝC=°„2¹J9?Iî’Ÿ¢ŠÙ8ͧïRét"ŒçUNpR>±)§q¶)sþ`&³ÐêÁ'³Ð²Ä\BÜÀ8êù®(ù|ÍÛUù;£*Œ’3Í‘)4Ï­ª*xDBF2½~­{V¢Ü@f4.Û¨"DIgëŒDäbg^}»E¾nµÆ{gø«\·z#Mä¬}dvz·Ã‘ukÞ\_ ;·ºaÀÀ«:Ít=yä¤Ä2¿ ­Îïi éñ“Eß Ík½×‡¡œéAᤰµ°ÖúÀ/ Šàê7=kd¬”d¤T.S%z©þaÅ£"´»uVdŽJ§ß¤„ؤôô¤4„ŒqøÁ±RŵÄÀ+IQ° aˆg䤊“nÓ ÙrNQ ²Jº,t¥ö2fkbÅ$®=ƒó:¬*ˆCŒdß9Á(îÉûÿU,Ì;(ªt¨è¤¨CöBŸCr脜Ìgx§WE¿"pÊgÀ-ük¿aR]! œªÂкô¹ã‘a´“J·'Ålßž(øb qàî}hx1Ÿ7Lx`ZY9tÎ!”œ°Ô ©žM< È–È‚n±N+&~ˆ‚]qÕ÷ʾ6í‡Å]ÿ¹áæú<:„/ ÜâœOïg Ïíeù À©døí1l­9Abü 7Âr%þÛqÝ´ÂÍ~o“Íå»V…-ŸxÏGÜÅQ^Jo–È& u6ä€ãÛ7~ÈõÇÙƒ)`«ÿÐnQÚõ§%h³Fj^žWÜÓÞTÙiqOˆÜJ_·‰¾û"]~¾Cn7{ãÖ~J†6³#Ÿ C¶LÂ%±¶Y§‘Ëh›ÇÖäù}í²Yû,­Ç6‡ý•—au¼m¶–çy>M@¹_5Aü4Ý,–[ÄÐ ØH‚0Ý$æÃvO°üÕ‘5/ßg÷µ‘ÖsccfëÉ“ÈçàÄï7 â;í[ïÁóBåANeÁSj[5É@´xÊYˆøŽ¨ã6ĉã¸!Y|CÉŒ¹½ô= ãuÉ´ÿϱ½A•Y¹< ìžoÿ1`à„ƒ“Gð‰ôÆ’ªnðÛ{â{jjko\y&\aÁŒ¼ÈuAË’ÃÀJEb¼å}ç°R‘ÊÜ>%Ü(ÐñîÓ–^l¶qÃçÇÀ«ö ägËíƒbéÂÎÑ.”dÜ,üÆ@ÃâßH‘ΖA˜¹‹ yqAv§{G’œÈBRhÊ圞Ÿu€áóuª²aËfÉóŒp7“HÍaÅÃéOÖP•cm¶~°a;—YÏ6½U>|]ã²ùg ^†!?6úNÀ²>ôø½ÆÇ$`ŒÉä‰L%ÉÒ—Z‘:<ïjÏxY:ÄLRòÙîtèÀYŽ”W$}"nÚfä~··C€úùÑQ¸"S'·ýK©ºêMÿ̹É=ÿ]ÓméÆ_iV‰wKSIùÙÜ[†y°}ôÆ_Šs¬*BcLbœ›€Ë" p¿OƒÐ(ðR ë Pè À VòbúÂÀJ‡‘3,†qÏžƒ¸›2¯ì/ï“ÙqÍ­Œñù2µ(>”sb~{½Ê—Ùýö’Kaª•^Ì«ræ>6Ö·t—ÇŸ™A#{Ü=„x‰]–Ñ€»®~ö’Ž+»è¿ìåÝX¼¥Ê‘ùZ6¸2_p3Ÿ~ïJ:Lù«:b‰<³ÃžXúâ=8èl—»!rj‡(yªù›ã ò¡ÚŠÇcãçcâîRúPmwdY£«üÓ¸•ïû”ú‹­^!#‹ì[d„þ¯/’y}‘Ìë‹d^_$“ü{}‘Ìë‹d^_$óú"™×ɼ؋dÒYz—LÌz«økö]2Ð{Ñ"kH¼ó¿PKžm ‘SPKW 7.doc/org/w3c/css/sac/CharacterDataSelector.htmlíZosâ6ϧP½Ók2=ìüÙÎt²˜c›àÖØŒíìÞÞÆ€¾56c‹ÐL¯ßýI¶±!$t{m†–éù'ýô“”Î7š­zŸG:xCz¦¡"¡-IŸnUIÒxÒ‡YTí©GzêôºvÖ¦#õÀU*É<þG4IW`zj'ضò§_(Ƽœoò kúìÕdƒŸÀ ¬í¥Lôª¡Ÿ¦%­¿«ÿ$Áøç=ûy(‘^%xJ¡½)9Æ,­hòµÜ¿´ý0<Æ,ƒ m‹8\µ«1h²‡í‘VI LØCWI0_*2 ÇþÄQ­Ûч´ ÿd-Yw[¬/;ŽÞ䏯¿öÚðÜÊ,l„à°æÒUR‚5WRI‚Éš`5ŽfŒxð¨ä€_¬¾°£Ú‚Í'·£äVñ0åñyj¼œ‘‹ã[­°ôyU+Š„åùxS$éÜD?™c" ÙzÚëöX€ ;jŽG#7Ø×¥e£Ã½¾@^À Xùà+x¼àDB–¡ïKÄéKÁ[6 „&Œ.¾kôæð”B*NÛQü˜øË{]% ‘Ê+s¿»ü½ÿ’ÄøGÁy:–ÿÜàWª‚¾·]¶ª©çó3ŸO•y¸3n‡@¶ìßñX[ºëéÿý_þÕ7t³Z×õœJÑ–\-1Yijq¶‚ ]`É[k´¯7WÊm˜w§6ÃÄÂývÕ/g\uΘe¦JRuKk¦¨I…‹Sk´%¶,HS`SQiÔÜÀG9” Öp"óh6(0 @iœ‡ÀÉiÝAi^>èÜõ '¥wtô¡Ž¦u¹ú?Ù¶ö(Ýîá‡u5Árâ7)«´äi×X¾YX^òˆ¬Ö“0˜n÷fˆÒ­æH …I8š¥ÿL:¬FÕ|º#%Lã;nà[røÎUÔ± ÏØ²5}ìꦮz¶ã^…ç"wb³XGbR<³­7jWé\€.Uϰ­#Ì8 ÿûØc‡°µ?Æ’&É’ ¥AÇsWAŽÁdð\…„úîŠîHo'DZLJ%t>´g¼>´Ç½}q["²*¼JDÖó'!`Ds5ãD¨î‡o*Àÿ=~Ê<¨åSÌò kmÀíüK^§ã Z`JfãÇ$^ŽÙ"<®ÔGPpj,ŸÇ]OvãÓ̓¢ÂD)!UÝ™?¼y2*|d!eÞ9ñ¦âŸo›”Šõ¹>!‹_³È¼‰^„žS S«ëª”Ö}3¢€°“”YšA㣘;ºvkNR¥é® \Lû«š*NSd8ÐÉXÑ~RT}WÛžÚ“TBûrÖXu’2K¿W<ãc]ÑNñIJFŽ­ê® H96(Ø;ÍŽ‘<ÍWÐì"5íÍ•')tl»1•»å'©i"rû˜ÅóŒ©ì]XkŒ…ï»hû# âÛ¯#K}?ùb,CfúK”åU‹å¡ƒ·ÜõokgvsÀ2Ê“GOÄÐæ¢K`Ç7/Ò]Ýžçër︥yÿ‘Ï»9&´ðâRèf?sÖpq™)oñ+7ðmŸ&ë$JY`4ÍA3Ð&Cù8û;pD>ìÎ$±|y÷¼ÂÙ , y£îî¾+ßxñƒ©]«Ÿ•‘²ÖfÏή€ÊÍ@™Ÿoý)qòúNjÌò—vv[‡K°Rv¶3¸í¶ œ¡‘ ³S:úÑÃBš#ÏÎS´î\É^`t2a)ûÔöòßg† §ùñŸSÛ3Þíyö°zØØx>‰ ‰—G݈g¢ÙKqnÿù^ü|/~¾?ß‹ŸïÅÏ÷âç{ñó½øù^üëß‹$sçj‰„$¢º•„„üžˆ@K@C[HB§#æïÍê[ÁJ‚C‡eG±õ1FÉʤ”¨~âYä­XpsÌžµÌÃ5öŸ·þh!x­ÜˆI”y·¤_:+ â[~83ÊVäÖiuû–zú—ŠeX¶$¬^B°„ºsøYdú‘âåö”²r°lcd ¶Æ ðO}ÙÎf¹½23îýÔ&I¸zŒÌvE™­àj{ñVíÂ:”ÊãÀ8‚qïÖeªð½àK,¤Oc¹oh¨oÙªøOôYWñPNON¾“k†1–UU7/aˆÿvƲÂ~Ãbçj4’íkI ÛÛôC…}BטÒùF/ï4x @ÀGL÷¾ïF ñýS¡QÈÉÅI®«ÒÖð– žT ž—!" ‘lè—¦$ÌÝ¢ú”þfªeKÔÓ=”«¿¸kÃ{Ý{dÝŽï–K7zèP§IàAeJƒ0H€R·ß³ÒgºbD¥+™ÄßÓxõ\SÝÛÊ}¡ÑåpÆü‘g °W›Ü ôÙ-LÙà«øn¸¾ªüIDÈ.ÂcX÷v(î‘9YEdFƒzÛ÷âdXjþÈ[ƒƒ¸E~o»¾¿ ,.~kD â¯Ú©w4„µãY¬Y0a_TºÒPy·‹¤m}æQ­×ÕFôþÉždä6°šj‚že8ú¯öÚð»•"l 'P9@¾¥9R„|+* 7rg¼T7qâ“ä*®˜,æçé1ªäkîß¶ö‰ãšÊTô,Yz|&oSû—yç–Ê ñ">¶™3ˆntKIHi¿7°!óä8jÖBCI° i¡Çi>Q±€ðàwsÄëIÚLj×,y±²Ž@1~pô¾Qfpݤ$náMä.ó¸×ïɾ>™a|ü¨ÿÿD‘•y©Ó5­ìëõ>“ÐÞl• ÏÝ2s£’ûÕ6ÀyãH³ý×µ©9XSù÷?ùŸ®å(kl—†65Õ’$‹p>I§ÐƒÂxh©[öùpU¨²uãb`s’¸ž¿W%Ðe…VµTL-S®M5Sm®LÓÚŽ(vå¡M=Ë€TÎ¥‡ºÃ3ø(j‚V€•(‘ÊÕ50ÐópÒà…PˆSz*=0©8ÛrÎÝŠDyŠ/èÞC]Uí½]X+ ¢6P™ò,¦¤ àênê{³ÍéÑ’§I,pXÑóxK•ù¸ j×qY¥!Höãð‚Ãz‘ß9²2‘Mu»ZÕ±n™°éKÕ6:µ%]‘­ Ð~@­—rµì§˜Wx ÈuRÚê<¸¤=;å½^=íÁ0óòÚêGezã¿v;>vf;òÌV(Ìx 3ìN}2$îÜ n•Ð#¡|¾;+E´ïiD£ •"dÈKUXC@Ê£ZAêxâ B³Û|r…Ë Ë.“zÓ!;›%íTÊV¦çnZWP/ÓBŒrI•¤àöUi¾šƒ÷«¹v[©Åä³ÃuI0î¯ãý ÞNÝüÅÔ1¶õþÖj<êûqêk—º9^‡š¹íS«öÃÀŒTeYÜ“ïöÕxT‡÷ã¢×¶„þj;ÂÍË*õòØ~ôMíRÆú§šåëãûñ±Lmb ¶ï´íóûò5®'ÊP7j6jšy^´ÜȪ<±''»ÆÂ~-ÚcËaTd£Ê£ifO^Žv¥ZÍ yŽ'€´ºÙšŒ+U?„\)زw,r?‹ìPäTWÿ¡*gÄ ?Uæ<+»>Ö|ÊDÿ¶rŠdÝsfÑ·nÛTʈt•ÀY}ÐßµDhnª¼»%É€¶ÿóá£c¡WÌꙣãN‹Ÿ¹&^öi“ä. b”,bÿf9´ƒe_Ų¡*­š¶2úÖ¶»mÆÝr:ááêq<ááëp>)nÌ|?¬Hº-Kc»æÏq¯~ðÏNþ¼åWωÕÞ[1íVžÙÒZÈónEsÖÍ:‡ÿʤ{úXÒUò§Z ÓIQìîð¼×jÈ/t¸;¶XÚ¶ûJ^@›‚ px8dxÒîœÚ{,a¥}‚ûÎE'Àu¼ÛPˆk›Ro¨ žnÈ Ð" Ïªl:ÂéÉÉÏÀ^e8I²¬j—p‹]GRŸ^CáñÇ«+ÉøÒPMƒü‘¤ŒÖ9ÛÌË>ÐÀP;‚f-{VÐÇ®{*py=s‚0 üU~´z3$žäH<Ë’ˆ‰¤¡z©u` èS|M§–‘KN³žþ4Vý%–^5Ãû»;+xh‘e #¹€Õ’méÂ÷"h©Ýëêq¶Øƒ¡’’tÄÿð&áâ,Cù ´-,û–È äŒX• Ô\Ð/ ¸î–Niè·ïZa˜êõYÇ—¼ å^‚iŒLñ"À6ÛM× £2dÉë*/MÈ-üµi¹n²TRø¥)šcwÑù\† ”ÝMHe•H… ý"3Ñ‹‚À¹™GYÉ€ ý3“jݶrEê°¿´&mn#óê 0ÐwÉÆê@ì5áºSÈ'`€n%šQÝ*öý»‰ãY‘¬›–Dâ¯U.(_”ÓÌluÊ'F›§d‚ªQ÷m¹cìbÈ©H…¦üÛÌR±æXÂZS¹ Ô ‰Vpƒ£Ž+Ô^÷ ´¦!þ|æ;ߌ¦£Ý-=b¥é îàŸ3;bÖC§m#f§¬ ”UÓázGo¹#……k9ŠÃ¦çÏën-õz]ÉuQŸ=Lh|{üZÿ ~E‘kC§­éÉ×-“Z±+h{Ód#Ën¶(“E”Y|¶ŸqÙëús6ך26™}ÿ3ÇÈ73»ÓëX! Ý UÊ›uëvl[Z¸ÃÑÜO5öñ@—¹(®>ŒmuxΧzŠ#ËqŸBtÒÂ6šsò1±ÏòfÌÒ¬I«h2ß MZð]Œ\¥L'ɸ™JíÁ;ø“ž%b8æ„J<0Ê¡u-}Ö‹¬vÒŠLü'ÙLú›ç¯<4¾Ÿ¬åUxNàŠÚ²Ü-% ¥( œÉ}„k‰ãbm2«ÿÚbY>¯*àT¯Ô94îE5{ÎÖ­ÐíÐònjõ™©X¡C ÏiY½…Ê:ùÉžA­®9ÕÙR—é§ë€®ÅdE,î'®coøö ÅFj8Î!ðÆ(0ÅØ?7ây?¸ œ‘>¦ó, ó\à=Ù›R?‹x§ù˜1V>Ê:ßçç?Û§í@oÇ»E‹ßO}žûŸDõXS¹Ý{<üØ7u£äæ=b1Ä›÷ù€é´{EIÿ޶ï_é7xš3AÇ Ýü½×GÇχl‰å‹ÞàþOVµwCQM4-‘þmÔq:*E¯wC|Ô-Æœ’ ‹´?sJ"æß%hOw„œdJø6È&3µ.'d“s{pÖmpb8äv{d@Sq‘Id4s<ËE¨$šÈ©I£ã0¤Ü­¿)åð´À}ŠNÏɶÄÑ,8&í²ðe*`Œ1’ÜЧ ¥ãÿOÍÇ¢‹‡ŠW6 7¸¤ÀDÀD{Q“ytlñnÍÅnq˜Û[@ .Ÿh;q˜x˜ g1’5 ¹ÉÚˆ’­X |óð yœeN]󶳸ŒæíoU`7¯zY¦WÙàz&(<)„“ò0à1°.øN|¯¤ ø ”…×1)¥&Îé[M{î¸ÓgÖOLåa°á&ô¼pøÌ® î~+ߨàí¼V1-xõKã&“Pn5tÈÅïô{€® ê^â€m«>#€ž–dÈðÃK5|ƒÇðºèQ·EÕº¦¨ZËÍGKaåÍ݃úÜBåG„ú,Vg>ÌÉ…C>îYùªåÍ-AÏrzç…“Ú™² ¹|Ù—@EžŸµ½‘‘=¾o²#ÔWÅSÙÑLYì|«˜ß ¢]P© ¿Çóû¸ |<á¯o¬, Ÿ7ÿ¯:áþÙf‡m==¦º0--¸¨,„/*€°P·šÌç-–ÛÜ‹¯2ÆÖöò·D·ø~þ–pWOKU`Ãy•4¼ ý²tÀµÆSú}NÞß?`4mA}㌗|³Å,ãeãT2Èx TÐ|erj⢖Á›¾'1#Ÿf³ù¼›ª¬È×:'Ò™7{fB~Újëáb²:_³×«èâbí*îl1{ýÙB)õ_Mâ(ù—G_D©¹TŠáù¢Ó9¹hó–÷!×I…à4?¥â NÇU£Ó¼¼„ÂÒ)&*WM²PŠeYBCv•ÔNKˆ— ¬Œ”@H¿Ë}wžó|ò¼‘ÇËæÝùžnšúUö¥{î!R?Šü»<\¸çHÅEØ£¤ý¯§I½ž&õzšÔëiRëŸ×Ó¤^O“z=Mêõ4©×Ó¤¾“Ó¤Ö&iá@©Ä&æY·é¥ r+鈑û7PK°}±Lû  WPKW 7)doc/org/w3c/css/sac/ConditionFactory.htmlí]moÚJþί˜ëêîM´'M¯´j °Ó %€ŒÛn÷Keð$xëØÈ6¡Ñîýï{fÆïo±Sƒ°ÏÛ3gÎyæÌø·&ùÛTDwòýM?÷GÃâš<ÿõfÀó‚,°„÷­«k$[ŠakŽfŠÎóâ˜CÜÒqVx~³Ù´67-Ózäe‰_:Oú{^7M·TGåºöoÍæo¦Ê#n6á+©“ü{KDŸ°-ÅÁ*š¿ ÿ(ÏŠj.ÐÅ|­é*ºn½o½û~u}‰LÝÃߨ|F×ïáõ^þ D½»ºúÑÊå¡<»i¨ì­²pLë¥ÑæÝ”Fû^”{hÜ»;Üü²1-ÕæÐ`2–űÜá ЛEkaÛ-[Y´â5!Íp°õ ,0G* ÇÿD’8BÎv^tl/1v8D¤ÚáüÓá¡"ÝIâm‡kµxÿänÑ^‡›‘Ó´æÙ@Ne伬°[‘Œ½°´•ÖÆ‚ÀBÍPͬ9:¾¸lü·àX)6œˆqýD>8$µÃÅûÂ}lü’a-‘6y6(v"|CýOƒÉh"u¸ÍRs0 ›Š _Ã-~$`Ù0v¼Íäž$£É-’'Sõ—~OòRÙ0y`(ÏsÅúî˜+®Kë€Ô6ߣ9˜ÌÞØ?´U3”¹™ÁyçµG…ÊA׌6ç––{ý‘ˆúIÿ‡¾ù®Ã]_]ýƒ-ŽFÓž ÇŸàû>›öô;dž}¾¿ïIß:Ñ^Y"ohÉ3îÜry#Âq{ Œz³Y‡+Ï}Å`]¿æR;ùýA³lÇ27ñÞ&ðF ^Å ÞD!" Qo4ü4îp Lô“C_ÜïT´4‹P8Q _üa•5Ÿ±õ¬áMÓ^?=)ÖK‹Ø:ôäl'ZÓ­i8PS»ß¸eÚ|ºJrÒÿ۫͘`”ÂØVÊâ!•p¦¬H 4·ôHC#ágä–Íh”ævºbÛ¡V÷ÚǸHçeÈWÅ8„uDÅ+ /—7uÍvŠÀü"UƒÞÂ?›Š®5$™«F´Äúª 4]ÐäÍÇÃS®â)™Ð£.— ,íqéD™I“¯ŒÕºmñž”aï´$­. Àøtèè;¯³á¿öšð½á"L¥p`¦%$3-ïÏNŠ>Ã:&3‹ÇøþÌ s0ŠÍÓ̺%ñ ƒÅää ¨$ (ÔSÂXü—…à—7[É1O£=ˆŠõˆçΦýî­Ó¡taÄ‚¬ÚÆ”_á+ ô¦<ø§=\0¢Óº/sY|_ecTtãâÔƒñ.—b»i˜–òä3_¿ÛÓu4`‰Æ?.?BíÁÏSÇÃwvÚã‰÷1C¶%›‚ºƒ*ÑQg†éRÄ£“:úî|ÿÉz,ÎdQ`ŸÿÇþÝÅQô ¸´3YŠœ ¼ª'ì,Mõ»;ur]pŠï&Bª¾–‡+€‡=}ؘŠEÓ³qŨÎsµâ΢;2QïT 龩ëÂÚDŠ —ÄMüpRE!µ’ wWë¹®-‚Õ"^E¢QER¢Ñžº°O‘¾0íq{â*V´3q‡NÓaLäÎ(€ØÈ©` ˆtv þÇU7Ï“¾Îóüo^õüCÓûŽÐô.+sßaEՌǩ›]%¼‹XÅ߉UÀ€ÝSèhÆ G&óOdÍ´UÉÜ„[̙ܽ®ÿ³Qº:L±[jb|šk†z¶ÕܘRœY5Å'.ƒ"+ç:„ç°7 ƒWÙ3T?ù"suÿ6Ž8HºäºÉšö~÷¢¾r µÅŠ.ßÒù2v†pòÒ»£3–´Ýû€Ê×FŠ/-‚&ko=DZ´ùÚÁ[ 7Yú@F‘h÷‚8k-]1[3H3ߢ䙹iêX1’Idt,%^† Y7Š>ç*U­Ù‘^Ò€B6¬ñgi˜SØÅìjî /´ «¥[{Vô5®Hå=™¿rÅïãG͸{Y-±Q™ ä¶±sØ—eìb$¿Î^7'òEK*`îl=´ºä-c.¾MDK¾bô÷ÐJGwŽJÃvÙÈŠ—=vÅZMhG M©ø2õIU¥­`8ŽJ/Ž“y†jµ¦¬ÏîÍiǵ~)dc Mˆ<ŒDšÌVƒdÙþœ¨„HÅG¥cL.¤?oG ‰Â‡QˆD³Ù<¾vd@=ôVޝ•hŸávò¨4ð8g¦‰'•­%3jß×*r÷õãv+ǃ¯M#óáXW‹»“Î!ì@,5=䨅´8žæ+pUí¿ s-H³çÁ®`°å—ÎëHÒÁ†šDÙHç%µ‰UÀá*rEmG^› j's=Í´ŽÊ$¦¦d¾•pSŠÆ$R¾¨!Ïýàë~&T°(Éd¶r3åùSŒpàØTs¿DJˆyå÷ï¨ð8!S¯Usûíù´ò»oÒÿ_Eû’»cïű¢4D*ñä…<±`¶×"ž¢!O±21U~ÌS¢‰ôˆ'/&®–O×yOEžïäFÐáýEî„eÕ¾»é6ÒByÈùöTn”Ý/ôÞH\_ÆÚxFyǯðšŠBt––¹± BœÍÄŸ ¼J¢d¬’Š0T†Q'Õ(7€SèfÅ8±MÈà‡zÒûTH¼1Äþ@­Fð& :,.k¢&t #z*Dt~^& hfv.Ü:kPÂÎÚ2‚ÖzÅÓÏdn™Ê’fníP´^—´è•f#ì%#øb˜²×«•i9Xm±€Xx§„C?³¸Ø(ÙìaM“Á5‘EN=©&ñ˜¦ÆDS#ž‰šî™fj@3å®Xe0JÊ%¬íxeÿ×üNIIþuרJ°Kmì7å"^9#­}¶YÀ(ÓZ>Y“,³u“a©{9Û™d5`Y¦f(»å”s”Þ*SW;&G}l9m7¬œ5{5DÙ;‹ÌúÝi¨ä3½;¨ÀŒ ‚ö¾vk çèGfU¬$²—æš]:ƒÅ»‘”<½ðBÚ³½Æm@ήÂ\`“»9ß"r#(ÍõµZ­Ëž<,äsa@`¨8.À¹ðÑóþòh-daÆÊ…6·.[ÙD™>¬'K•„9dmФl¤nG¨Ulè†6iRÒ÷Ü;öë;v ý/„íô–ª¯6¼zsN9Þö=JÜþi¯ü†‚¢á±–öS$åÔàgÒzú´¶…z¥SÏcüÛöƒ6éxGáÒS &PßP6±fÈýd‰õ•ðæ ’]-;Õ"´X† jÄ ÚÖ›¸ù¢Vó,c˜²¯r‚&ñj°w†QÄ¢¿·3‹ýEÅÆKÊI/` µ1…X¬{Ô²}çx©“Õäª"„³®7d… ×q†È[‘MŠ% å÷þ½ü—â7uO èOdyr}¼@ꓯæ¦ã˜O…~åf=Úç_1üçG`u~ÖùXþëü¬ó#°ÎÀ"æq~ÖùXû}–ï]&ž‚å¹·iŽjø)XÐy,iˆ=·÷ÿPKë:˜`Ð 5xPKW 7,doc/org/w3c/css/sac/ConditionalSelector.htmlíZëo£Æÿî¿bʪwµ6yl¥*‹‘0à˜Ö Èn÷~±°=‰¹‹‰µýß{f0à±ãÄ›½ÝÊ–_Ìãœß9gæ¢ÿyÞ<š¡“é½ÌÑyç]çbrv~Š¢àcFèü¼¯àýÓÏHÕ]tqvö¢Ä]ÃêrKÂyÖÁžeQҒļ³%tWA¦2Ò»Âgü¸Š’y* Õ2]Ýt»HÍ:³4í¤Þ¬Ã!†ü0ÃÉ­7á74Ì_‘­QWH³Ç§ Œ3Ýv… ÿž‰@K@[ïw…NG,ßëÑ:‚"ì i¦”Õ6Æ.ÊcœS"úIg‰g0àö>œdhå‡óhåúY€ON[´¼b/ÁaÖeÞ/ÉŸŒôvŽ8ÂûÖ_ ÆŒ°™uZRÏÒ>¡Þµj -»+¬~†°Dysx¬2}Oð2{v‹r\Åv‘ÕG®5…è)vÑËìU˜!ô¦^2É¢X) è•D…Ž`j{“~öãveÊåq A»çQU~ø9òÙ®Òê¨gÙšøÏôÑÐÜAW8?;ûL®‡cEÓ óšØ³3VTú ƒ›ÑH±?u²Œ]›|i°Nȳ{¹ÖË^ý>*ŽÓLï¡ç%*‚s+ääÖOÒ,‰VMi7ðÖ ž5 ^Ö!" ‘24®Í®0Ãd‰ èCþLUK‡h{'k¨TuÕF8yðñªÞ/—^òØ!›$éêSêGa”¤žlås$±¢’‘Tâÿ„Ó4~[S;[ìÍ>ïò 8c6åhúôÅCcã”ÏÝ”Ž¾jà¥i…ë•?K0ÞGxƽ†ªkdŽãψSo~šíK+§¼68ð[ø÷¶ûÀ2Èà×F´ÀAÜO½ ŒÝG¤¾J¤Î„þјëÊ]Aâß-²ºg@¶õ‘y5YÒGdû¦3)¹µl†ƒ A/ ã¿àöÚðÜÊrÝ doIŒ!ÞŠe€bÊ(ü|r!ø¢FŒf{ÚÖ?00L;…Z^Ä»ï‘ÀøøL¦þ›[‡P©°Á‹´·k½äg]!¡=¹oCÐ)q ÄW'ØFдÐnšO$+ Ä:øñoOXêÐííSÄÒ•2OY% ˜ Éc¦ CN<°4î’}>\ lcxu°9Î4m4Ädl[ªî8à)'ÉUo¶n³}FÅÑo4«Tdƒ;¿ó †¶eqM¹Ù~je›ÍvæÏóLek`md,¬Æ¸!ó÷LX+5öHXšµÓ7”±Œ(ô§R–gË]ÇJ…èß7ŠDz.N-úÚCå¤Ú*ªW¸E¸ïíñ·™¼¹ÃYÙwr*ÈÕç")99ÍA´XÈäÙ·³û$LQ¶ÀhV0BY„¦yqøŒ‘èNi]‚Òï7`î/[„½¶áë”Q”Šï¦µÈZ0x²àÒb&ÙUcâ!ò¼Â™$ê™t–+ î£ó¢y¼öâ“ÓÎÿ:>+?Ì"¸ññÞZ+ u[„OßÁ3\Õ)ñNéô¶v‹תmÚŽ,¬—Át@ûsx,küDÁòn”ór=Åñ=Dž=W(N^Ë»)ï€Èºó“)‰WBŸÉ€Úž¤°ÜgÒ¯Áª[j‡2c\(GP,|æ‡0ˆ¾¦Bö¶§ L lGÓÿ™€¾š7’…ó³³ï¡³uÓœ(šfX×Pğ݉¢²ghìތNJs+ 4z=‡^4ˆÚÆ’/7~ù Ãg8¦âº²`ùO?Qqž ­FNïƒ$%I¼®[ÛÀ[xVƒxY…ˆ€DŠi\[²0Ã4>ô9{f®eM´Ó*Ü_Ùø 'O^wÓLJ?yéXK†0vª’†h ©7èÛÙ;=i¦Ò–Ì⢻tõ ¥v¶•?ûJIe8þÊh†ìÓ†ÆÁO({w‹RÖôª¡Ÿ¦%­ßÔ~’`¼‹ñ´{~(Çȯ<£\Þ ƒ”ìK+^yopÀ[ø·®†»À2hã÷F´Ä᪠4½  ´}ĸJbdÂn4N]$ÁbIªÌ€û gµ~OÓwø•½ÉÄm°>4 ½È pÿíuṓ!l¥H`¦¥¤3­TLKCFâ|<çt_L»0£Ú$͇¶£昸“rïìAÃ)ðç܈‹CLQì ÂÒÿãUA½•wÆ›ÜøR@çýd‰,d“é ?t`ö)p ÔîŽzN°Mše£—¾’¯€0ãÁOpÂYÙ§ˆg,Eª²NÀ+atòc«Á0vg”JqÚâûÄ(ˆoÐW©¼2Çøãé'þ;üIË;Š\§gÙùíßî© doDvª½ÎÇe>Ž*ã¯Ñû—­½ŸM÷WÜ×–îzºÆïÿφ†nVK £u=§R´Iª0YÆói6s }ȉG¶Ö¯ûÃÕ Á6Ì«C€Í1ñƒp;®Óå™V=WÌz¦šœê–ÖžšfÉ),MœÚK›„–9i ,!*/õFp){‚¦€5ŠÈl€ô—Ô‡ ¤áT˜FWIš—Ç›û¸ÂIA@é <ÔÓ´þ~亡•ÑИç,æ¡àêñ. f›…¢ OÃ&&Ðx6Ý’`¾h“öè¤êOc¤„i|Åa½É‡\EfËFú«ža[rª­ébk³žÄZm 2rœ•ÀãC= »Œª‘W_|A1sÖ›øÎ‡Ë}€Ã ¼´$9i uùꪔ'©ð)åIžâöçA´Pã0N„êrë¢Â/ÿ¢üBç6ІC^IŠZè¡à˜’Õé4ˆ–˜Î5óé}?L×O[VÿÙRùOòN-‹dÞqïšêç^HQa ¢–”ÆaÝš?mÐ ê3ß¶¬‡ÙçÄëŠa|h¼qD*–V" ðßo¡.Ýócpãé ÍŠÃ4 ôkÚŽn'#ÝÚ®öµV‡a`TWY+xþ w^w.&gç§( ÐþŒð¿†÷¼ßü‚ÕAggo[ÜÑ]íµ0‰§$˜¹AbŸL“0juÅ´¯Õ©ŽŒ y¤JÂGò´ £Y, Å4Õp$~¦iwbwÚ©¯…¼ !Ñ;%]N׌ߥêHâäÉ'ñœD@T²’¿–ÐÐR’Ðéˆù{=ºÃF0€’`Óf¶²­XÚØAÉÓ’¤+QéÄÓÈ[&0àî!˜R •Ì•ã%>99mýÝBðZº ’ˆòaA$´WêÜo[Ÿ@:œ¥*rÕ´º}@ýkÅÔMKVs/!¨ÁÝ<i¾¥p¹2¥ì…lG¶dcŽAÜïú²•õreeJÜÇ[7š$áRè±5 ·+Êl—Ú«ø£·lÆ¡”Ú´{÷.“„ïc!íÈ}]E}ÓÂ*à?Ð{ ;CI8?;û®êúXÆX3®¡‰?ÛcYaÏ0ؾdëƒ$Ð=ìXôÃ.¡c ér-—W*¼X@—m[ ÷±ïF ñýs¡‘ÉÉÅI®ªÜÖð– žU ^–!" ‘¬k׆$€Ša‡ è]úÌDˆàÓ-”‹¿¸iÃG=zdÕŽ 7zêP‹N`?å•aÀJÝ~ÏLçtÅ>°JG2Žnãå[0L|¶¥;ýH]ËpÆ|ÊhìÕ„Æ"(»(tßãÕå?‰Ù…yÆ} =÷ÈŒ,#2¥½í{q² ,œOùÒàÀo‘¿Ú®ïïK£ƒ¿4¢9ñ—mpÔ»ÂØíxDæ«DæLØÌ]Wê "ï~ž”=²Ì÷Ü«õºêˆÎáŸl&[ní«á ÆèEÆ€­ýn¯ Ï­a£;´¢- ‘"D[QNÁyÁ׌e\&™»Ï/„`T ÔÜ´-õÇÄ…”Ig8 ™C7˜ù$Ú¡þî”äªÊ4ñ,nÛÍD7º'‰$¤‘´ßXzr5Ë¢žlZÏ0Ñö%?“°ðàË»;áùƒ$ÁÚ§ˆ§,y®²Š@.~pòc#Ë`ºSêIIÜ»È]ä~¯ß“})¼3Ãøãé[Xýü‰"K;òT§k˜ÙÏ ÒÝ“¬½^²UÖ;7ËÌŒJæWÓÿe£þÓhÅem¨¶£bþûþ5ÐT½ÜI­íX¥¦uNµ É<œMÒÀ)ô -š¸qÇîCŽ­éW‡›‘Äõü͸*Ž.K´ª©bª™rnª¸93MsS¨O¬Ê¤u>Ë€° UDiRwxEIÐ °â$R »ZîMêFy8]Ób ;ÙŽ³–$ÊP|E·êbÜÛɵU |Ÿ¶ÆC€™ä(&¡ ÞòáÖ÷¦ëʱ˜^ç Fƒg€ŽxC†ùò uªÑqYš6!HöãðŠƒzŽ_Ù²2Áª­Àv’ gb«ºª8¦{N1±š£èl×Ù0 ògÔz&}e¨éx;éòÕ‚&¹|Jž»˜t»§Þ§¼ã«543[¯^ÛUf¦wñ Îg[%t¾­r»ülåVHÏxÒ3ǽõɸ3/¸WBjár•wQòk?Q¿F£*E†È—r±·”û¶×ñÄ æ„Æ¸Ùä. c&Õƒ‡¼@ÿJ©ä®L8öÃm]>½L1ÊA”‘‚ùW™ùJ–Þ¯†ÛMÉãÎ W%¶¸]<Ï eãÃÄ€ùKllæÆþ\[§A–RÍ4šÈmpናiò*‡,oŽF*8Æ&Žšº$f`ÊGÖk´ê=‘jŒ ƒÁ!„4 ™ÈøWYQëÔ6ôDÖØ¤³Æ®ƒˆêµìh彩jÍ[¦¢Ú6xʉFÓÓ›f¶ËÈàØê 6sAV¨7wDÐ2ÍFUÖÛ"ã@uÜD¦ÞÎýyš©l ¬•Œ…—7tþŽ âÕÅ Kµ\ú†2–ƒþ¹”e¯`¹í8)cýûJ]ÈÎÙF÷89<'H÷P¹¤Í‚}·x¿áŒäÕ=Iäê0hÈ:NN…^Cs–Ÿœœ¦ˆZ¼ä¢xÞ§E’‡(ˆQ2'éÿ{PœÁûTë-–b>GÁ¥™_EÍe’©’›p¼¬Š‹‡»ÛK îŸþµwWÇâb½÷ÒçiI²WhÚ5TŽ{õz=+Øùy]=üUΊ¶2gÉ@bk$šlvì÷ŸŒ¯çÛâ+fÈ?w"°fxCð(2Þ^öZÑ„vtÇ,˜½}# Çzp¸×cxÒC6ÜÛžÒã8° 6ZL?ñ¦ÆâAUA~u¯Ü$½ª›~¦ì^0\¥r¬v4Iq/5žr7œWgÖVÕb×§Ü}ÓqÌQùx¼ñÞÆm˜$áb§«éÐoööǼÀq¼Àq¼Àq¼À‘¿8Ž8Ž8Ž8Ž8^úGž[ÖîpdÉmSšZ¼Ãè=fJˆß<ÿPK?±hOî÷.PKW 7(doc/org/w3c/css/sac/DocumentHandler.htmlí]ÿsÚ:ÿ¿BÏw/ypÒôÍܤÀ Á¤aŽn{½_2‹àWc{lÍܽÿýv%Ç€Iš”4xR öjµ’ö³»’Övõ­×Ô¿ô[äZ¿éþÇËN»I”²ª~>oªª¦kò»ÊéÑ=jû&7›ZªÚê*D™rî^¨êr¹¬,Ï+Žw§êuÊgÖ;ÕrŸU n(õRõ—r¹Ë–}zÇÊeø‰<ñ¿VC“Éf3rfÑ=ù“.¨áŒÉÑhnZ9«¼«¼½==;&ŽMnà_×Y³wðwüƒ4[:y{zúÌõ¶ÞiÕKš3žÏ˜Í¯©mXÌ+UÕàB©zÓÒ¤Û¸iÕ”¯ì~éx†¯f¯«·ºzMV@cÆ•±ïW|:®dÓæÌ›Ð1SW§Ýý´:¤¦øüÞbþ”1®ìÓšÂÙ7®…\ZW5¥RQ£¿˜º"(„t5eˆ§çasÐîë„ß»,à„ýâ=Óå@0™Ûc ²4mÃYê&·ØÑqé¿%‡K=¸b¢W8^­)™¦(ïKA¿ÈаJUŽH©zÙÓ¾ËÍ^§7¨)˩ə½o9Ô€ŸÉ ߣ¬r káA†zc “ÞÑ{}èèO—AxUŽQØý6]Œ¨wËW© pµª6…ì²7þWÓ-'èHЖ!œ'pÞ¼£¢,Óþê+Ai½qÙi‘ËÞ@kü§ ùÜÖôëšrvzú+ u«Óé74­Ýý§äïa¿Ñ¿xøñæ¦1øRSPuõ~h HÓ­Çýò¦ÇÕ0è4†ÃšÒ¥‹Kê5™e)¹¼˜žÏ=g™m튼)O3"ž§E$„$NûC·¦Œª§B>¿E× ­ à¨?Q÷'5ÖY0oa²eÙŸÏfÔ»¯ С%W€œ4§+ÇæÀ©zYïeªê%4)E‹ÿf|÷=@R{„l.E‹²ƒ8}Ydi®Ä‘'Í€-@  ìšJ ÔÛ´¨ï'jý®íçcE¯ÝSŒCRG æzlŒ†¼l™>/"–yjáÀn±oejYEÄj#ñSK4e–[+]D k Ý,*l•*Œ‰ø¢IÓ˜ϼ›ò´e ƒÞgiÕêÕÖ –‘Ÿ¢¤`À¬;XièÛ°ÃöÀì•áw)0ל@´~ý£ ~VÕ˜ÆË 62‹¹ãÉ^ ~äwÁ“Œ“–à´>I©d7…ý³‹-‹¡ƒ| ÝÖ¿õ´Ñ`…cñ ^ܤϡˆÔ»c¼¦¾ô²~5çÉAH~_d"‚u̺=²™ß–`þþ3'G2|¨Õ€÷1‘áJ§,=èË>ú-·½€Ü1Ræ—mgâÑYdö.ë Ë"My1”ñ·ã÷Àý/ø§ª"êˆ"j·~]Óµ;V¼c–¥ô KT†(J¡oeðÏs?pö²¯»­¡ÞÒä÷ÿe†óÍÄd–qxD¥~Õnu´ 9„ºC}°†ÃŒñ©“`ÁòuOËÕåÝÛ¢AäÝî\äKm0NMë1B‡ÖÉœ1a€– 1ƒ!MÇ´­®–Ñ1-Lg™Bq,:‡h ˜w¤ U¯ßÂG²—0r̘–  •CíÈe  Á;òBh8»Òôº;Yæ8ž±t·Ùb¨ÁX Tí×KúÔô üñ)#3 f..˧”“™ãsÒ„¶P×Ö"ô†3WÚÍ 8–-%¯›1X:d„–sâx3˜ç92¢>Hsß´ï[ÿ„˜<懂˜~)!HMÀ¼³%oð4;/JÎlÁ<DÏ/Ûdnµ¥-Œ—Å8ïôç®ëxÁV¿\Þ‘«5?ùXΰÕb{?ÇŠorò¹6>Án˘Ï=36óë7wŸ>@HK‘/¬Á&tnñn¸ ñqÐ~–ÙìÎØ®`ÛÐìˆ, "Ó4~jõŒ–€41OtM±h#¯ä•t=61¿¥õa‹b€ÌÖÐ ×s\æñû6«Ã¾AWZmLÖÈq,FmÐÃNáh1#•¨q•(›(±¤š h€¼(͵Ÿg©Éˆôs+˜[\pJѾ‚%§»3m·¯„N¼G$Æ9¹ú”:ñÜëO™Qxu«P¢ó ­CÅ”¯e%*£¯jÁBŒvñ©ˆ|· `oV¥2C5¿ª‘.º8•"~MËSÙ´H•Ý(™ ’0…DæKmÍ óžör»ûlC‰&_·ÙöTÜÜd¾E²±Õëóz)™€¿«ýr d‚™˜6µVÌ æE%K£8¢pI¥Õ÷?Cæ.…™_Ø ÆHÃò ÑhC!6BîÍPàr`ÖVyDö©Q?!¥B‚<&WT–aP@#Ì%ãe1º¾´[nª$U²0 R»? 6Ò Š òìÒ‰…É|˜ Þ×ä—E 1+æ!?暇 fWû°Ë„rÅ~df˜+&-ZŠ Ýš…æ-žñ©ç,ýbk'Íá°õmÌÜUˆ¯—'YFªuÚJ>p>[*=·¹4- $X8_™Xk ò5ñ´{ø³à7q<Ì…À £¤ñåÒ-šëÐH„¶L  4ºè-aåEi ž¯óD}¤LÐl< /Ÿ×ñ}s]zÔu±×¨4sÝ•®DÖF mNݤxšÏ HRy?k!’¢Ú€ì3a&j%¡#¨Ø±q˜Î}4bc ‘\V/A)ñBô„yžãcŒä1:žB¹D'˜8ªÐf@»!Ur¥QîäZ„F›3+Ó’ï+€âìÌiK<'ð>‰Õ¥ÖÉ«ÜU€ "’ ¢þø¨dqÛûã“R /¨“ù)îÂSÉEû´êšÛ§xÞ¶GäB™°£c½Òcö•ƒÒÈ€XQþ•”ˆµ X¡Ü–8‘ߦ½…ÅCv3f7­ß_QÌüòµÚ™Oþ°Mõä±~ƒ}CÙŸXÇ·ÙgÙ±± VÇŽÁêöÜ‚‰©ø*oz‹ˆ‚$–xU'潜6õ¸Þ>D– ,¿òó¥V½D2j½‡HRO±Jû‘nµÝä¥^½œ9T±®Ý€Ÿ Ö`¾&kÛ’Ú˜ŠÎäFh²0¤màÔ‹ùÜ´¥ärÓ €ä#o £È×nŠï>ç/æÛÑ›Wò¢¹_½ÒYûвÛÞÁªEóŠ嫼؂y÷’_i3Œñ„Ç¢Eœþy¸‚Û x'yxë t¬¸«\L²Cl ËË;š…¶¿¶‹Þß”·¹ ×1É¡zŸ1½ö®›2~×+ž[“ïúd²ÍfÏ×…V0'ylOÌÉÜgõßœÞóX†ìíЄ>¬ógò⃜r¬ë(ž ;FôĦ(Ø÷'§¼r³miúì81CŽÇ=ÍK^ØÌæønîÌó‡[ÀQ<ê»}Ÿaþ¼ÜAÛïÞ’ Þù,ÎøÞìÄb:Ì áYyùåu?ÏGû xÐÖø¡˜ ×t?ó`<[^@ïSTùZ¿Ï:¿ñ™ɱ–EÓ¯ó-iœ¹Ù’Æt?:gû…[ñLö÷nÑEÔ ¥&?˜GG×…ñÅ+;¨ß…ˆÉ—VþPK;ZôÔî 2sPKW 7(doc/org/w3c/css/sac/ElementSelector.htmlíZës£Èÿ®¿bŽ­ËÙ•üØ«JyU°E‚@x7›/*,-²YëJîOÏ ^òÊÖîf/‘Ê–Ä<ºÝ=ÓÑÈ?éŽæœhä-4¹Z¦†„¾$}¸Ô$I÷uÞñV<;G~ÄYHÂ$"I2l BVW’´ÙlÄÍ¥˜¤’ïJ ²ŒÞJQ’dXœ“¹ ôäŸú}o&Áî÷á‘Ò¤†ªóNtƒcœÏÑÝúGðÌ“:¹[‡Ñ‹oÅ‹éÙù)Jb4†;yDçoáï þ~ý3Ò ]œýŠqßô-Cé^â˜x8Â3’¤=YÊ;zòØðUd«cc |ÂO›$gÒÛ7l € ÌLœe™˜3±A…1Áé}0Ã¥e™ö_‘kXh dä)ÂÙc" ªÓ@ðg"\ãz ˆ¢TþmG‹lC7<ÚÌ({škN|DžV8§Dõ’ÍÒpE`Àý:žQ[ MÏ“’ŸœöþÕCðZ)@A‰kŠ]$´w 4DÞõ~½pF”¥Ä-Ò“‡Žþ o4ÇrܰY„  ý( æðXeøŽbå6/äùªë#çùÎý~¨ºE/·Q¡þ8x¼ Ò)IV‚Âh@¯,©lWÙ›ìS¸êWÆ¡\Ú´‡SCÆŸ2!Ÿí«CË@CÇÕ À& ¦îÂùÙÙÏ`jò&ª®›ö 4ñgo¢jì{·ã±ê~téú.}Óa}Ð1öàr«—7¼®¯€¥zÞ@°ƒÇaj8ŠÎ…N!§÷aš‘4Ù4¥má­AÂû0î[Ø¡ºFæx•âuäý(ÌÈ>°ôrÊ·~ îQ´,“þÖˆ8ZõÁKïhcŸÇ#1_%1g¾èÜuå® ¤îë|à^M‘1ÃßÙLFnë›á %èE!€gþÜ^ž{9ÂNwÙÄY%ˆ³’ž«QÏ#œr•Þ¾ º~Q#Bóíï9$®£B9/A`¤i’¾Ž½müͯ³/ÍTXáUú{n%ƒô“GÑ¡ríBØ)q Ô­ˆF.°‹˜í çé}!M ÒÁGx‡ÁhŸ"ž¨”Ê&¥DñÉ/òžQг~œÜ§Á²txCE"¤ñÎã/§ï€úoð/I,ß(sÙvН;TûBV@{K²W7:ßÅþ©í»–ñ/;Ÿ‡ù+®kÛð|CçßÿÍ?®Mê·@ëùn­i›L-1Y$ói12á‘£w.×—ÃÕ!­6­«C€Í1 Âh7®†‡+2¬fŽ˜[¦ž”¶Þ’æI)Ô#ncÒ6‘e @º …Cm’<º€·ª&hê×ð¹ V³t%Ù7¥¥ÓÊH÷‹åæ­W8-ÝOvE×’u]ÙË£5w÷>Þl‹GUþ´#l² —«¿ŠYm&7¸Î,ÍôÀ,Rhdµ¾‹ÂÙ¶þB ¢–aWÂPpC8žgÿô]J“º%=Œ‘eÉøë½ñTmjXÆŠÔ©íèÆÔƒ'Íw\Xî<—†wŽ”%6p ”)˜£­­{îiòUŸ;¡úÂoÖ|Ð̶|kôv{»õ>ÄQÅ=W ?W¹]~±r«¤g¼*é™ÜEx„ƒy?hIµp½Ê»¨¹·?R÷F#+E[’!¯åbÞ©tq©³i/0 uóé}š,§,ÔL›Geþ”ÓÈ]™r¼õ][?J¡„ •‚ *HeW6…ù.ŽŠ£uw%\L:7ÙÔÄâûâu›Rµ?67dgóKj‹‰FcÒ|Ó±»Ø=3à0Æ#ÓÒ›¼jm‡‘wÆ]mg×ÌlݤúQ­¯vÏA¬tÃÓ ãPSGÇaŒLˆLUý/ªf´¹íè=ˆåŽ(ôLØ9€™mܨ¾ù¾É¨Õ|“‰ëh†ç§œš4K½Ý¹ÍöyϸÕR‘ îÝ1t§Ó”íöƒØøP!w±i·sžg*;k#cáÕÅ-¿g‚x‘±GÂÒ¬š~G˘AÿRÊò¢`ùÜqR!úÏò‡3‹rãÑ#1 âÑ#PÝ<”殡E\îš»Ž4Þ<`b%³ ²¡’?9”ês‘9œœæz¼Fã _÷îb²Nã ‘î!9@‹ßº(×Üÿ¼Œ r]âLzcû}†l¤DP"ú•þCd)Pz(¹É8ëÿsDìIPè×òÐyÅLú@ádà a®;ñÿi]Ð%­ ½¼uÍ|iT›~¬Õ1'}Û£ð%.@öƒÙ6#Ê Y÷)M¸û_¨M¸»;'å/ü§UáýªMû†Ú‰Ò®÷‹‚ŸûµÃgóü­¡svœ(”!ºÅ¢;@§‡?d|>.>ë ù—N¶w8¯ªÐòèRéµ¼m”'.ÊOÒšÞ–¨µfqÿǦå'ZºòݽpY)ò,™cžµ,Yb_Q¸c<š1Zd¶@Aü„JNà WJ~8ûЉ#åïú®ÆêAYEÿµ¤¢Kù•,c_ÍW¦|]µÿ©ÅaFÜ&(`B$Këè•–ìüU ã|¿8àw›®iû«ÀÐñ}g\ÿ9¡ó‚Ë]BH²ÜëŽK>ôw{Í…ã?Þt9Þt9Þt9Þt9Þt9Þt9Þt9Þt9Þtùú7]ʤ²uÙ¥Èj»òÓêe`@ozSFüJþPK/:win0PKW 7%doc/org/w3c/css/sac/ErrorHandler.htmlí[ksâ8ýî_¡q×l'µçÑSµ•ª;j ¤ÀýÚ/]Š-Àc1–€ÎîÎß{%¿4éÇV¶*!`KW÷!s¯¬4~±‡]÷ã­C®Ý›>¹}Ûé÷ºÄ¬YÖû‹®eÙ®­o¼ªŸž7¦‘dÀ#Z–30‰9“rqiYëõº¾¾¨óxj¹#k&çá++ä\°º/}³e4~©Õl}K§¬Vƒ¯(ÿ8m[ß$oXÄb*™OîÈ?éŠúÜ#GwË ôÉYýUýüÓéÙ1á¹ß_‘³Wðs ?¿ýt—œŸžþF”p·çö–áÄ1¯iä‡,6VrÕhÜ8n› Ú7NÓ¼gkûÂ$ÝáÀunÓÀ¯î QÔ«¥ ’,žP™(¨ßüŒœ>išB>„LÌ“&Ao6MÉ>K „˜äzä\5ÍzÝÊ~òÖuÕB©Ö4ÇxYIwG½[—ȇK$¡G„ &ËÈÃ(uù|í2dGÇÆ¿ ¯Y$ëà¾å?H¼Û4‹v˜¯?À#zÏÒ0¡ý‘tÞt‡ýá¨i®gd&8=äÔ‡¯ÅÑ^£¢:tÍôEÆn{ä’áq‡·àâwö(½«C“:>¢«;’|a¶” ¸Û°Úª…ö× q,j…v$1d × \¦Tù ¢{a&½Ýv§ïÎpd; ÿ©IÞ÷l÷ºižžþ AvúýÛ¶m÷oà’þ>¾mwÕwh<~{sÓ}lš8cݾÙ03°Í y‘ûå…¯«+ÐoÇMs@WwYž™[ü4 b!c¾®Z»¡oIÅÓŠŠe %I»ß{3hšùi’wÉwåZÕÄÞSqœ<™û‹Ó•¯X¼ غ&–ó9긾Á’+X3eIW<’ ©Ñi “> «¦bKeñ_¢;±x ‹ÑþÝÔ»G y‚:·ºË´¹R¯mÚŒØ JúîTµq»!¢0êwµ_ÆŒíc¼ í~DŠsÄg‹˜yˆßµ0rµì¬ËVp‹}®Ñ0ÜG­6þÑÍX¸¨Dï£Ð5´}\Ka•¥ÀD}°5t%PÓ™,# ßkTk5œì£ßUO%.À*lzž0îý`¯ßDípI0,’£ k9!C¢³y’ÇÚ%)ÚgŒ ÜK*ܬWöÈy§UÒ>Jó ú4švyä«Ôæ‰ãœnyü,Ni¾ÊMåTEO™lš vZW#àLB¶{¢˜ ì’4’Ç…}!CíçàO09ÒiC³ ²‰ÎQ²ädƒGÂèèåVcaÅz LÔ">‰é<ƒ»N«†¤«o¦:¾<~ Òÿ€_ËRÙF–á4Ãôã¿>q(‹4Ê׫1]=¥U·ù‹­‘OHþRûzàŒ]ÇÖŸÿ£ÿ\õœ~ù ä¯cwTº”§Rs&gÜÿ”ð¥Ù‚ øzho«OW׆tº×¿üÅ|&iîÖ«‚oi~U͓ȔSRg`oOH“”ŠQ¥SžÆ*» C©SãúÞŠžÀበTý GŠËo¤4°± ²ÝÖby^^j˜å>8±µÑ¸m*J­'<&]Pša2Ó}DÝ0HcÑêMUwébƒè:bÌDrÌЉ·’σA5¦äZPMOH ÉnZËY @K¸Ä"³)¤P6ÑÈ€ûBÒn¯9ÃûJ(V4X ­.ê /L– 8¢çJ7k²`i&c-x, ,c­±Pj¬ida@£˜/§³Š®õ†µhi×ÅŠÊY V5 `Ô'|¢®Qk4Ž}öØy‰î.Ë: *zz=@¾ºÝË}Uèü`2a±ò*@«À‘¶Ø^pÉN .|Í Õ>#}qüˆƒG~_q!}35Ѓä"ˆ–`7È"æ«Àghïd‚ Ç\+L'*|ÄC€Ö*i¨ÂBŽq<ƒ¨ú$™Y~¬pÄKg å;XïÍ@ÿ‚©hL2£ ö¸ H}˜ä,™h þ >›ÐeX˜‰Ziœ@yÜ`ÒN#c´R&xXÛл½œ‡Ö ãö‡[ô™SŠ’R8é±hG¥0Ïé˜*YäÚóZó˜êàÃRÊUNç½ÇñŠd¹Ò ¿,œhàRWo ,ô§fi–H+!2hU«u¸¬àz£õŽDCùÛ®;í9ш¾{„ Ë«õX™|öXYñŲ¾»wáUÈÝ]œ ×°ÀÌC›å-€óûýÙÀùF©NÆZõR¦^ÊvåjÔ_G|$sOMÿµÂÅjë¡;´$^ñ +u¡Êò-Ýtß/A¯&Œ/ÔÌ?ªn•Áò/¯•c³¥ZjFï´ŽönCL9#׋i[6¾Ñ1¯2ä9N\bhZÖw¿î}Ä<XX+ƒIºö92ì®ÔÞ©c÷^ó!oþg›j¦‰‘0í^³"iûg›‰Ùõ­eNRokâ¯wÊܺöúq—™»ÒgGjQ÷ÆÛ‰;-áž%oŸ=ÆÛ¶Ò|m§ÑÈ ~ʼ.z£q}Ñ2²‰Ž_·#œÔ{¸±ÔËZI#ðP2iCôî‚*² 6%&#íPðÜ©?,´Ç¶@F’<´“=)xWà©>ëR5Îý‹† ØLªˆ ™Ü~ù|s3Má'À}›8fbÐ(Ò5®@/Hûë`š¨“`ú,ÂYýÜÐ{/Œ¼¿è¦°HFUT¼â8)îwà¦ÑІÞ‹¦F¶­§0*ÃlÜ}º£Þ}µq@Ó07ÈЂù€h)dLƒHî‡ÁÆO„ô&›<!¡ùœ~¢·Keq³S)“îÆi¶3’ýc4ˆ“"ÏUhÄ2¡3ÙpDq[Q ÷ýhAës …ŸŒž¸}°Á Åý„ôPlôü8â™Åö}‹'‘E!FÊ0Šœñ”ñ<±faXCa~ÄÔCŠŒ.ÊPÚÓGçôæOS2(Æ'>ÑR Rð/ ìŒ ÍÌ/RÁ‰zØÀoJ.9¸¥êIw RR Ù Lðxˆ'%øºvIŸÒÍÁ:eâçÀXí„K!,m&1S &$_$^ÒX“ Š"1Û+×LhÆC>ж°ý€ílßúè}ËCôô)ú¨ºõ”?zï ]wxS~f¿õ é—’Ï÷:Fš4ý¿=Iªõ?&=&=&=&=&=&=&=&=&ýÞ‡I³”rãP‡zF@gdº%¿OÆŒ™äbº¶ì¹®½­½y¼º¾$Ì!÷ð?dOäú-ü½ƒ¿ÿI:=¼¹ºú‘pàz_ôšJßq×Á„­=“*uM^Tê÷=½E†­û^CýD·æÍ|•tFC½7Ô*Ì&bÖL߯ù†YK!¦mø¾Š0ýá¿È¸7 Õ¶6õ—”*A:6Ô€þhÐ_%wãÞmC­Õ´è/n]ã-8V u‚—9äIgÜÐI°u©„„´ðMÏrh0_;&ÒŸl,gÆ6ºØôâRùBàåu‚n½Â/Þm¨‰)¨ï•?bNPêíQ÷WÒþÐ FㆺYZUÚ63fð39Ø{ÄSð¬¾ÈDou2º%úèˆûS»5ï ž„$wŒ§©á=ÌU›Ü­k-ÞBë;ÿ“åV툜Ç®¸n- NÛr>;Do½ÕôH{4îöÿ+•üÜïêw õúêê{`oo0xhu»ýá¸$~OZþO>Þß·Æ¿6TU}Œo] l3lÜÄtù®¯Û[0hM& uh<µ ¯CmûZ-œäãÜòüÀc›ìlsø¦P¼Ê x“F‘@’´ýÆj«©§’ŸäoNZÞ¤{ â(;ù“ÒÊž¨÷dÑMÕ_¯V†·­¡bÃLnA[Òn™¤z»9’}êZ¦Š-ùŒÿîL}÷=¨a÷¸¹†ù -Èè<ˆ.G`sË_EØŒé $û– ÊÛÀ¸´‰QO:ÿÀ£ôÉëÐî|HÊÈŒº5ÑpWmËA«u97r`·èUöA«ÏÑ’Ún,ô!ÝAÛÝøhÜViܘð/]aº¤)ð¬Å2H[2ý,¬Z³Þ»Ç>â÷äàb˜u¹‰¾ '0éÿf¯ ¿áø÷“h/~ËËÃÞ/r¶ÑœB”?k°]l&á-hÐP¥Ëi7oÇ`£'‚®-`T Á\Âi–ŽÈnX{|9 .>¬ù…ð°À¾$›Gn|ãAlçâ‡Â¹‚pó¸„úU‡Í=cY†v³eÛ¤#n†8þpù ÿ ÿšÆs Ô‡£ðk Y `Ç •4Ã…à†‚–Ðão /ýá»P°&z¯+¾ÿW|Üö{ƒô•8Ä0™^ymÌ{”ÎDmB 8ÑDZ–åz­h°d³¸D’w£.vÈIóñ3êBXÚ¼;÷ Ë>õ°}æ{Æ3ÙˆL²7ö†ÝâP†€í3â°‘“ˆt[š§:ÕïÞÀ[’Vhe‚t9ba.„$¡¾ã" °HMõ¯f΢6šþNÍ%½ÿLÆ´¨{Ôç}°%K X[Xsì*¤ È &*\ôw¤ ¨ @O>¶˜~Óž®Þt×SÛ2EJA¸óIuÂ&bŸd‘®kfÔTZÄ·œ…M‰…݉À™Ì™G Ò‚Š 5E!u·©/-_šÌ6¾ld¸. "bê€ꘆë¯mðÏ`­Ä-cÊ`ÃQÒƒYp'Ä‚qü*L¸¹$+c wM{=£Ðäã¸_éÀ‚üRc¥ —ù¾5µ·ÎK„ãRÓš[@[À‚Íê%trfŸ‘¹4<Ä`W¨Õ5·Îò¹@ äÃýæhíSÀõd '0Äi‚*Poe9”,ÙFÁ+rÆðùÕéϱ¿sô F'ÀË6¦6­`3%56‡, l<³ ä ìí{°öÄaï“EWI¨‚m£QDOj!JEè8H#%ÙŸãB25 tårb0—:‚G ûâP3”ì*±fà IÇ[Ð#Á…–SDì)µ™³ðCh q{Ç/Ä|Sˆ¿Ñ„YBAV s¡€Ë˜Bu?Q°äM s·Hz¾ú`™/J¨ ükžø–²>ÂiHÛ#ýIÚüdó\¸ÌMs®uI" óÇŽ>—ŒÙBŸ´+i¼Þ•äÞìMr‘l^‰HVGy¹ ýë0›yj:!~“ò^ÿ@ï…OŒ?™üSÁkÊï—…{|è1Û$†mÖ;£n mqŽê-4°¾¸à¢õÕ²Ûw‰ —jÚТÿk7/.ëC.D8ÏÏ{ÿz¬ ‘"ÝÀÈ̵ok/ƒÜ©X¬66S¯„.éFb‚‘Ý™psBÒu^€®Â¡›´‘Þ¡Àþ¿Rrÿ $A—µƒ˜‰fbÒkÏú’$öº Ö“™KÆÜ(–›»Èzecã¯ÈpÝsÔOj³v%àáÔ¿Ï$|‘ ‚àE¨|B–¸ÀKAÉfÏfHkÛ5ˆ1ÐF¦.œÃJ~ wýÉ`£ÖCÔ¤Ü>CÅOÉaÏGþNÚ¨Jd®ž“¹hòÅr#aAÏÇžÌ>$#Ÿ_†aê#󸤎À…œÿ†ÙpOg–!yÀ¿Ÿƒc¬=ÇçLXá 2dfZ|/Ræ,)W L¨‡hÓYÛv]ã_LAdoH͵‡[qØ®OÛ8–ÉMBÎ2þýÜ,㛃qs6A’¾ÓHøIê'fÍÎD^?e@x¿0^*h+°FmOÈ¢ÉWR—UÙ@*—ææÛüŸ²ÝÉ×y—iQ´UIûÑWq&­Ÿ“Gá |iö%xöórF`ÅlIdÅ<áÑ""­¿ž¦ˆèª˜éh«˜fc¢ @Tt›ûwŠÄ–eWG¹žPJZ¶ÏÞ‰ê€îÉm–æ²û‘l¶š¢œ/“аØÓòDøìM"|ö´<>»"á•òF ,D‘ˆÜù.ꢞ-ä»<]ZúÚ©Šk;Э­Ö>ùšXøÌ~¢³x«_*ʃ…iÀ(?VNÀBÒ‡T‰Ö.¼j×ù´ëtÒüÒtü0íJ rÝÚ»¯ºÁ’*)Ä—¸6îzìÉâå]Sn)<ôª‰µÆW5Ÿraï>Å>_\ëÃ"§y™ú®ÜJ‰,bA _þbÞ ë‡ ïSÎ<¼jú×âGÃ2Ç\´+kránqEÂW·Ê‚„cCÖ2™5>a‚š³;˜.£ñ åÓ÷ç i‡w™+ž&Äå´D­efÏ3o§* ™X¬ ôá’¬Ÿ„È i•˜)˜¶f ‰i8ܘY,ýäÑDÚ`q{… Cë"*©çJ+,5\PÞHôÍs,¬q¼Ø_d™¯¯DZ0ÇÞ*)*8,K†¼ Ëe/¦RT­¦f‹ •~Ù.3›‹òUY­é2Ë‘;Ÿqg玤ðèÂò¬ÔÄ;Œ5óK N„f¬x6’Û†r`—ÃJécc:b ù\VOß½€˜&Þð†¿?ö€„@¦Y7¼ù øÉä•¡÷‡I¹¦”oV0¦Œ¹´.·ñWjÖÞ-Êì]–Ahû±íË™¸ý¡±¤/rªÖ†ãîu‰:*RóêXA€%h%Ⲃ¬nñ!Ñ­P¹äfz¤ß^j”)艴&¾xŒ˜~8Üäñ.¿›lwð.r±#Þ¿ËΤõKÊqY ‡yTvI:g…¤CVrΨºæè)Œ´CêztðÀ3+¡gD-áYÒAZOíù œ[ú© ˜þ’­mžD!Ú彎rJÓCßÔJQf¡˜²ÃŸöçÿá‹ñ'=0 ¶ßª#K×Fš™¼üò,@ï³SÝ ”ZzžŒö—: cTûG¤¤Ë9Ø”ò”9¡ƒ}K4Âu¤!œ_£v£Ï:©Ì%/-9?Ä+íÔè‡×UìrGq«C*/ŠýÐÎú‰XN#É óƒ0Œ'†‰!&Ó¢(ÖQHç®5žôô¸ÓŒš6 Ã}Â…Oј 'ò¶ö6 ªÀÔ* ö&[±‰¶úDmòæ2KÔKMY<£ó9†c›%urHæ›>>~WüŒâQþƒF½‡¤ bzÖ4L¶òtý†¢¶—¶Ìur’‚VàAvègIÚ’ÒÕR×qL¥ùáf=Öì/hÓ_ Œœ*5~´tˆÏØ¿p[à8r”»üG®ñgneY/™LJŸàN¤,A*RR9>{œÔ \ä÷që!³À§ä“˜x•ï3œ™%_rµ+7¡DbÁÓùÊdçÌ,ŠfŠD5wïH›Y»Àtî—дJûY$«˜ÑÝ‚x°Í­qaKzÆÒ6¨´¨±ÈöÈ*Ç]G6Ù[Yl_v•2§ºÀ#©°ÆìÉò™·£Ô2/L wk043:-Fëé°Àˆ’ºA–7ŠO^÷:U~úâ•&ʈ4~Jžà1°U<ºPmâ;ß ÁS›rë`9ÑybÃ6FÏõézƪ1–!J¿Ü"8ü€CÂO8ĸOd@kdɪ&\Û=DÏ£ÇˆŠ´»LJ¢¢XrL?ôA¢ ãêÒÊé"¡–¥Ô»„Z6Ù[i],Ô»ê¥ê•À#ÎL0—‚<º†8½“Õ`¹xóƒ8=ëWÄñ2•p<&ÖNŽŸïi¿ÃŒ~9ùÚÝ _*8F)µ©ðÔÎ) ¶Êî¥Ü)›~µgw ü_ï|=¾óõøÎ×ã;£¿×ã;_ï|=¾óõøÎ¯öøÎ(„ËàÆEÑ`òO‹ÇÄ)þÿPKÙ}ã1QC`PKW 7&doc/org/w3c/css/sac/LangCondition.htmlíZmo£Fþî_±åÔ6QkÈËUªrÆ£b°`s×ô‹EìML€8¾¨íïì.`Þœ8q®j+[†Ýaæ™ÙÙÙ™Ýô¾Ñl_Ot4ÂcM®¦¡"¡+IŸÎUIÒ°Æ;Þ‹'§Ç^˜ø©…^ Iº% a‘¦Ë IZ¯×âú\Œâ; ;Ò"½ÞKA%Dœ§s¡ßé}ÓíZd=ñîH· ”'ýÑw¢K’ØKÉÝ<¢ß½oÍÐÑÍÊæèT|/žMONQ¢1üYÑ:}ß øþô3RuŒÎNN~BŒ96°©÷;¦Þ©Q8g€;=)kîôÆ:V¥ŒuYøL×QYw“Õý½?ŠtŠƒ&C˜5UNÃ(LSoз³wzÒT¥”Lãï›dù¦£¶¶¥7ûLcÉ àLø+/@3dŸ64y@Ù»[„2«^’”¤¾©þiLÈ.Êc ûãPö‘9YÆdFCx7ð“tXZñÊ×q‹|ézA° ,ƒmD ,»£w4Ú§ñH,VI,˜°‡®,ÄþÝ"­FäØŸxTë÷ô1}‡_Ù›ŒÝ&Ö—ƒ†¢g¹®ñ„½.s*3®1ôç­CŸ-ðÜÖ–îb]ã÷òŸ¡¡›ÕÈ^]ìTš6iÔ=IÑ|š­•Bòß‘­µ:ëËájLæÅ>Àæ$õü`;®ZlËs«zv˜L5Õ-­=ÍÒQ¨AœÚK›–i ” •—z£3¸”-A“¾Z|Èt€„E ©Ì?Ⱥ)'ÖBÎÍ]-I\„žä‚zêiZ§`ܻ֘„²"j}™ÁbæÉ.W7?ÛAׂ „H8O¶$“_±IÇrR5¦KR‚$ºà°^eÀw®¢NMźœ‚+k6l O‘[Ÿ¥‰ÿTáqúT¡tþl¡TʆTø”²!ìÝdD¼¹Oý$ˆb¡ZTUbÊ4¦ÐÅŒ"‡™ÀWRŸ–PÄ•’ÖÉÔ„®/óémÝOY|ŸÖ«ûMAüY§–+2븫›¦ú¹Th‚¨&¥éW׿›nƒúj·-Íaú9Ѻ¢Ÿ¯œ‹Š¥•§b£‰üñ5‡sÇØ1WXoÈhvì'i _Ött=éÖv±ÏQí‡ R]d­qO |[­!£Þ¼Ÿ£áÆ›yD=ö·Åú}ø[ú¥‚‘o¶ï'Ƕô©=ÜîiÛû÷•k^OÕ‘a6ƨ­ç dÑÝ×VQÕŽ=%9 Î[ñžØ.㢘um={Êrõ+Íní}|Ȳ›­‹q-ËáeÀ•ŠmgÇ$ñj`‡$§^Þü‡²œ1ƒþ\šó¢Õõ©Ÿ\õokuÛ²f#ÊÖòby½è¦PˆÜÃ]­ó…|°ÛZÞÜyxwGRÚzt,ô³Û<½8:΄vxŽîêt‡ JQ­Vløù<’;Öÿ"‘äŽvÈ$ËžW´àÇ%É\°Ò¶k¤›ô›%Z^£ñí‘fôªïS”dí-E`!"Úãc¾Ëò¯ §O…G!®Ü(\Š*ee{£ó~§3ô¡7qàÅlS£ôèÞFAÍ#Ï6´~[Xɶ À3•”]µmü¾u˪eó)ß}rêþ°Ù²ØÛãê^Wë¹ëM”¦ÑýNG¯éöô•ã?À`°‡ØÃìáöp{8€=À¾ål‘N6Î`ó|¶-3-ŸÁ‚ú¯‡TÿïпPK!É—›*PKW 7$doc/org/w3c/css/sac/LexicalUnit.htmlí]ms£8¶þî_¡u×ÜIvÚvº{¶êVíZÇĵŽí¤'³6El%aCÀ 8Nî¾üö{ô_ÀôN¥Ó ÐÛsIGâè¨ýeÜ×›¨èB¿¢ÉÕépÐGõF«õë—~«¥è {ðsóäÒ]ÃöLßtlÃjµÔQÕ|ñµÕZ­VÍÕ—¦ãÞ·t­õà?Y?·,ÇñpsîÏëÝZûƯ&Æ=n4à–¤IþS{ {ˆÎ±]ÃÇstûŠþn<sg†Žn—¦5GŸš?7?ßœ|:FŽ.áßÈyFŸ~†ß¯ðû§ÿE}UGŸONþ„hâú@ªÝÚ¿˜3ú²M¿ÖnñÀZûRÕ{hÔ»T;õGüºrܹWGýñHWGz§5€ŠÌš3ÏkzƬ)$‚LÛÇî1Ãu’Îp0ú ÒÔ!êÔ=ÿÕÂÞÆ~,;u¿ø-H£Ž.4õ¬So6[áoôv“¾AKÖ©OI0MyÚ×ù¯ ÌS"xx3×\øðÂÝÒž •iÏ•nú>:®ý³†àga¸Øö›Þò‰\øäi§.T£þKí߀Ë„d×bR¨µOÇÊoèô¼?޵N}õ`ú¸ˆ[Ž1‡[1³_H9™Ü:Ášê=MGã3¤'ð·Óžü¹€ÛDá ˆ†{ýNŸ§Ý3 Æ›°É1€u ÆhsZ[ô(< oðŸywÄ´…NÒ>FL3 U’• €XöÑÒºBC‘~{ Û¹s§°—;íö, õÙàŒ?ÿ©ÿþµZTÉ›öh\®5cVv”d-.pÖƒFkl)Á‘ ží_Ö#uª« »þWB”îLlÍoøXïž Ô¡±Ÿ¿íT×Ö¤ð„ýGHt⋱"åqöº( `†_奞cß0­} ¤°®Ì‰þ0ÐÇ’%i\…UGŠ\å*,ÌX´D¤Hí¥à ¥Ó‹X¤öÅgø#¢DÅD·ÂëJ8d0û¡Ù‚žNÒ¡PÈäIÑ»‹å­e΢‰ æÆ¢æ’—kíI·¦?˜‚_Yì´$Óš;ÇE}(ù³a-±×¬¡ö¢Û¾íj¸ñì¿í~… — ¹ ÿÃû–å@¿%ɺyËÅÂqÉ,îÈqk0C8·Bð1™ÝAf,ÒÈð‹ñ´€ùO>£™¦=-5ýC«Í®bà³v¡çM(Ž~ršÁ”{©·#”I´³MÊû§M“/['‚FчA£Ð[ _`cn’qÒrÜz|bò9Öþ~"íŒ ¤ähÊJSb½ÕºAŠfª9+1à êDPóõÇŠÚõ|˜®ÍXƒö€ í Oö6]ö:Ô`·Á;1¨}˜öú7=]×êÝàŠõšr50V’|{¾ïš·KEí™3Ç]ŽšÍæq»Eï›U@¹¯ŽôtÁ*Ç:º/ñ[ϱpèoì{ÿÃ>{ªÞã«€{sv5êëƒñˆ£ž-ûp±‰ƒî,ÉXSAä§rè§o޽W%ðõ\SU†8».¡{±ï-Ì1žãûJÁ ]öhr:¼-ä¥ýh;+ÍM˜zd®_|ÕK¬zY<¢¶ "ÏÁ¨Èø‹+5(ª×Þë·‚÷¥JðƼòƹ oÆ»J€{®õ”AcËoÊÛî]c^%ú^¨šþW†/½,Ý3ÿc‰íÙ+Gøâÿª„ï@9×^¯a¿"sŽmß¼3±‹ðË /|޵i?`—,qUðQÿ‚ã Wo5Ï6íja }Å  5»)iÔf³®žËGü¦x¤ÉRú=Lš+é_ñ0ê…·å|Õú.á¸úÝ¿U¯üT©‰ÅwªöÇ#Eœ¸n>:óS¥VÛÆUëécí¦?¾¼ì1¤ãaŃý±RÀª×“¬R<¨«¨çjÓóV‰»jaª'1-A ®Ä÷èÁa’¦ÃhÚ®M‡IšK i»R^FWÓª4¬x`Õv¬$a— ½þP-P¯†ú`2ü-‰,.Þ?V ÞÉ0Õ âaý©R°N¡2 \iXñÀ¶*¬>*I5‹†ìª,`H,ûzÁ+º/Ð vÉ>6ãWb±e2èó%rõV놋Y•´&ƒku€ —¥›‰(WÊNd2‚éå›q¹RßË& 8¬ˆßÝãa¥€_™€½.¾3_‡F¸cBÍFžy_ óÑzç-Œw*f»£©=Þo“«â¡u±aUã›°¦öõ„%_,¨t³uÏ*ÕOkç§´Rk~W‚æq~Š(@Õà±øõ÷ >üVê»ïT×£ó(áŸç‰!% lÈó]Ó¾¯¸W§ä#¯¦N£ñ°âö–·¿€žæ‘­^“úÈö(†è't› ´÷ɰZ¶cãàQu5D´Þ(XíCÊhKÛ$è"×°+²èq¥ 8´Ú xD!Ñ`SîÒ5×ïÉ œ°X‰-åÌÁU_k;î(GÌÁ;Ê“~þ‹¶”_Ò¢G{Ê™ðˆ’¦í§9¥CJIܽǾì\#¡:~ñŽë]YxÀë£ã"—™ü¥k{Ôÿ;‘K<(ydÁ”*ÛÎ}H\1¼[OÂõË1ÊêCï3’ü7â«‚ (yZ3æ'ã1~;ÚŸñÙÜÈx ‚ʆ܆<n¿ûþ0V<Ó.‘ÝÜ^]ä·T6Ü&Ëë»àx™ºÀ*„鯋ìDhx÷ìfÓžCn>éÎ úij!;SabŽ|Þw2Ê ž êªÅ*Ûë–'öŒÐB8{"´ô^ ²cm àâ¶—–LÄÌ;dدqï/î‰Aüº·\ÒQ@BÖ…aŠøâåY3kInä,ˆ›cÂŽ,óS:ÌPªâ.@Ü.~6¥—ná’'e·òÏò»oéo§M²ôEíFy£‰Ó÷ Ûü.ÛtyKåt­á}™‚4q1L´$æ¯ ðÌ9ëGãËž›×|¨gÁ„gÀÀ5 ó`¹Õ3`à‰ò»\Åù´Á1 B ¾n '@*ª®lo˜XéöÅ—nM¶YŒ„·'$Æ=U²µFtgÚ†…¨‚O\VÊ¢’²Ñ˜ÜÙ¥ÒýÈü?¾/I<ŒQÏòœ¯ôuxEJå™cC¶¶ßà.)}7øùoʪÛç‰ † ÈsZ ö—y©”ÂÆ,i7£ÆLkó€Æb¦1ûé]0cuÝ2¾a3f|kBÐxÔ4jwAWwØB“ø-È…6ò¹À c§ñûãûàÖ{o¹}öfü¸ÁvðxÔ4r­wAŽWwæ‘.[HG¶¼ä≘ì‡÷¡©èÞpÑÍÀ›á¢»ƒóÀE#¦áúÛ»ÀE+º7\d¯ßf´Èæ¿<`‘xi¬Úï‚©åÞPo…ê<'TçR¨ºïÕyP‘]¹[X¥æd•*eUç}h¥A«­XçÄê\ŠU÷}°:/+¾i3\|kRÄxÔ4hÿyÌxuóºݒâúáÊT'Ð6ï[o `XñüÈq7Zkã~µ2!Ç㤑 ½iå„(ÏP¶N•z.kõºQ­Hp<ó „™®K¥ÁlÙ3ˆ‚EHË™¯—(„¸‘E(1xä6« 3”<-KðLny¥N<=KeN\?g8y=-ï-¾žD(’D”¹ip½Ž×Ùhp½; ^4(…×ùiÀ÷J™À7¢f ±•©Í§BI.ÔüŠZÝ’"sç›IEëK—·yð=¢XU±¿Çª©x‚’”â‘J¸!FÛ•!³ƒ*Q CDçå‰èkVÊÑùlžˆÑvåÉÓ'¥ðD”qnƒyaëÌ-CƒÅØ•‹}OÄëL¨ùõÐþ:S æt&“Ú—šeló3s D±JhkÑ“œ‚§,Ü¢¥"8v:¡P2âÌK º#SʺE3 èûiéoØ”Y"†¦¡tbáeÉ…bš{^:éS>;Hý™eŽŠœ–Ûæ“?ËlȉgQSŽ=(¨1Ç7„y‰Á¥ÍR’Þ“3ÓI3Ý‹5Ó´ñ¼)œ7Óˆ9«‘° ½×dùhF’¬XFNk§îýíÑÉGD~CG†=çO?œœœðÐu øÈÊ;/c‚y¥| ŽèÍÀ– Šdb!?—÷ BIˆ@œyéc)åCx®eB„q63B<Íò@‰")Š4÷ ²‰9±!|(kÌØ“±Ã»Ö¯`Nݲ.añÒìžãuàFá ×lód#7rÐb'FQ !öå?¾RJ~–e&ði"¬?¹ù@‡"éÀÅ™— ¦RF'œf`…k;3Ô(‡‚ls›Ô0Oèr›æ=‹Q ‹‘¦D†cȯ+ÚéÜ#|ÌÁ¬|œyœÍ2ÚÇ"Jæ³Ùß«lâàæQO××­’G™DÂ"HDá·K„ ¨Ä!†nþ-1îköÄœºgÚd‹¹uI_tè~X“-bãALº¹?äÆÜË¿èÆügù´‹(ëc—1WÆèÏÖÇèTEŠz6©Ê[ã{ÄJxí–Y 7ÞYF­DÔ4¦…ûð.³o=E=kZÚØ—S^qoé\sõ«›ºÔ¥ýh;+;rizèH÷'Ãþ}¨2¸TG|ø<Û'®(Öz&̃™×ašYì®H¤¹­æ'oÉ-çGqe±žKDÝ:Ýñ®ß«2”ÇNrM8{‹¹ùOø{“{ùüü§ÜÃɽüÿº‡ãNþ³ú‡“{SN5™{åt3 Z†ìmæR0ù 0·;eÞ@ í¿¥(kú¹÷`Y5Sî„SÕÌÕòò9€ä`¦Ê$3‡“âì ®qÒ*Rêµõ;SZ®m€fð›Ô”Û šqOò)^½ø‹ÛêwŸ(z¡#OÜá]b+ÂñfÄÊ/ñd‰Zì0†—øâ6´ÄC$`R·èîvê­é!˜Í‘W"Ã5$˜l|DÑ÷zv-|Ÿeâ5]}¯ÆÖã?Òâ0ŽÎ úgî-éîévãf»µè–-fîF#”1s…±¿nšTóà -½˜\¨Kˆ0yâØ¡ t¯cé^•n°i=Lšï;/&u¾ýYh³d s1iǶ҆9ˆa‹É'¶3ÌGÜHY$øV¾Hl7^Qr¦›Â1“]¥-n0Šr¶Ô‚+Ô¨ùr;ÒbÒÌà B»ÄbrHgPlúq««8Y™brJgRlú@˜<ÿv_LꢉA˜ƒ`!I¥¯zH4 É¡a)#镟ë’¨ÛTŽí'†QEÄ$ eX 'ú$ŠD\¯SÝ…éázÑK@KÀO ÿµìyÐÂAC8h á !4„hÑ!ù1N¶ì;_qW½ këâžì\ŲGlÉÖæ¨/NmI.¨ç—lMf:-<פŎ ¤ÄŒmŠÉM–Qá5ŠvŠF• wzfj‰OIJe_á¶ïaµW(ެaíuê[-½Ó•¨Ô3Ç~Æ.ùªç;ëwÊÖè K¶|5™Æ!ýúqhí‡Ö^FkO~*–4÷Øp»Žw±H;΀׬ºCs‹š ucBïØD—7.¶>w°gÿè“Öé¦]‹;6 íXÉšú?–޽-™1KÙŒ¹V³)³ÙÒš2s2BT ѸÙq˜4¤  %7׈f”̾¢ ¥6nÓ©¶1{ôbòJØvÒD&–Y[eÌbOÖ&£Ãü¾ƒX(ͦ¦žápÀ²›LÊ€4"HÂôs“Üâ6+êHAã3f┞ÞCq&æX,4Õ{šNbŽu}| øvÚÓ+ …m<ßîÍ­ãûÎSÒn%âƒ÷h.ñWÉNáÌ,žÍ{¶Âh™ö£W—¾œl2|ù´Õð%nÌòE°ƒQáG°ƒϧ†ÛÇ–Eà”VõæÎta€pV›muN¥æqb&>½àlRjì“»l cöhÜã,Å™°(JsFd¥Ñð3ˆÇ]“)}òí[†ç ¹ZßÅx—Êëð^r92'‹ø3b#Ø ä.ÅRÂ(eÎ´çø¥aXÖ.Å—Ë.Ѷ¹3Û¥@ðîæòÄ­æÂx7#¬e[·­^’8ìod„õkÎ-Ž*ú¹?Š˜˜úe9„Ø „öܤ+DrÒ®5õ+C(€&SþÎŒLœ3æ+< oðŸyw´‚";«NÒ>Fÿ¬‘¦„_>Á8Õ\¹ˆeý(­+4Ôé7±×°;²Ö4“ÓnϲPŸ= Êøãñ/ú¿á_«Eµ+%\ÆÁåX3fiGIÖd¦«A£‰5¶”à¿HÏÇö¯ ë‘:ÕU…]ÿ+!Êìxh>Ö»ôPéˆýüuf€¼&nB&Á,¥<Î^f¿üU^êÀj9¡ƒÖ•9Ñ*™D¯äR•à@–i³6›ì´NÇÊo$£ ýTéÿPK4.ã5šéÚPKW 7 doc/org/w3c/css/sac/Locator.htmlíZ[oÛ8~ׯਘm‚­¥8é‹Ô6`[Jc¬c²ÚN÷¥ %&ÖTµ"e7Øÿ¾‡]mçÒi;‹‰#Qä¹óœïˆéýäÌÇþçk]úWStýa4Œ‘Ù±íOgcÛv|G=xkt‘Ÿá„E<¢ ŽmÛ™È\qžžÛöv»µ¶gÍnmß³W|¿µcJ±Bš£÷S§3#Ûk|K:¸4Åw訇è=IH†9 Ñòý†78¤:ZæQ¢®õÖ:ýrÒ=F4AWð;£Ô} ?çðóËßÐØõÑéÉÉ/H÷'þÔS`N3£gë£wåúC4^¹}ó+¹ÛÒ,d&Ïg¾;óû&HJVÀ˜Åp`i(J8Énp@LAc:™ýyîõMÆïbÂV„p öMN¾qÖ›èÒs/ú¦eÙåO5Û’3¤T}s!†%åÅØ›\ûˆß¥DSv`A¥&ÜäI l¶QÒ­ñ˜ÿ2|Rœ‘„[`´|-.¸xÚ7µ æ;ãw°ƒb XÙÊòFo4w>£Ñûñ|:÷úævqb‚•cŠC¸­3z'dT¾ê´ð‡žæÈŸ_ƒa?ކ^ñTù¢0w‚7Kœ}á45’<íÙC9C™êû¥Ú<¤uXÀ8‚ñèKõã(ùÊL½Úަ.Í=ÇùOLôiâø—}³{rò3¸ÖN¯‡Ž3™½‡!u¿¸Žå=L^|¸ºzŸû¦Qß_ă˜3ëŸUvyåÂçâL‡‹EßœáÍgcÇ]s¯’_n¢ŒñŒnÛÚîÈÛñ¤%âYSD„@H4œNÞÏúf@DXšè£¾—¦•SœG .â¦4=Ré†d›ˆl;,_¯qvg‰ š\ÀNiRº  J½Ñ`®×ôì¨*fJÿ’,Yú¶ ódKqðUdŽ'ˆs­–PÓ@ôÇaòF|øäÌ×É,_/IvtlZCªnGÇš½¡JŸ’êû¾=™+åF $+”H^h {YíÉ ÏÄk®ÖƆL2ëÿÔÓ(! 7TÏì„ý™\ š+ÆÉ­µà¢”>?>xí¸zf‰ùÛÝÚ‹šuû¦ÊI«õ@Aù‡ÊA³´Ö(8eAØa±¿Áÿd5èÞW )ù¡bPx£R¸ Ÿº®½Ë³QÄ“¸î]{°L7í¨}B1Yžœ­û gð´ðQ¨Î¯—Vi¼!‘<P§Vç#®Q|£E¨€Œ¦§šhw@j%;—ö‚‡C¥€&™è8¾A v\åù‰rƒ„È©Žš¤Ú¶#­.¯rªY¼™@÷¾žQwì‰]›¼>íË?=u¨Þ@ˆNŠU”RªNÝDK åá V8Ãô[à€N”ŸÅ뙲Gd-ÛÂzSU8þQ.ò›ºH·tº|¡H,AØђÆ*gï<(Süpð˜PØ¡º'š(çžphN| ¾Ð ‰&­zHUL<%$ ª“ÖÁ¥˜@ë‹Uó2 »OŸ†´ÿ½jíú"|êÃ÷ÏÞ7K{Þ/‰¼v)¬Þ,æ¾?¿j¾’Ú{:º¤œÓõ£HõÔ?í©’ÿå˜ôå˜ôå˜ôå˜ôå˜ôå˜ôå˜ôå˜ôå˜ô“–hr礴€³û€iý¤ˆÿŒÔ?lþPK0ÜÏ: .*PKW 7*doc/org/w3c/css/sac/NegativeCondition.htmlíZmo£8þž_á£ÚÛVw }[éÔ&‘Üîõ¾D4qn D@›­îö¿ßØÂ[Ú´iW·§D)ÛÌ<3?Ûmÿ¤˜2¾©h€‡:]ötMFBS?ŸÈ¢¨`…Wœ¶?rc7ðOUC@Â,Žg¢¸\.[Ë“VÞ‰ØgñÜ;½ ˆHkO…n£ýS³iåȹ#Í&Ÿ< £SøžÁ÷ÓoHV1:><ü„˜p¬a]í6 rçÄî‘Ê@7ÚbRÕhU,!Cªá y\á4lX5pG;ÀœIkE­È™´*¢ëÇ$¼u&D ÒtÍøYªŽ:B?z$š ˆúµ#Ääk,‚$ ,µßZ-1û®Z·X †¯#Ø´˜I¶eKa?.H"‰ú&š„î"†·÷þ„áYºþ4Xb7öÈþAãï‚Ï ‰·À‘÷szÓÚŽP1F8o|ßpUT©Èû¥Ñî™Ê5ê]ȦnZa9sc"@x3…ǼÊsŠ–÷d'ý KFfasξêIVZË{*íßy¸qÂq,„.“µmQb-¸Óö¢/k‡kl(GPîR£Àžë‰„äm,õtõLKQÿ¡€>k t„£ÃÃÐݪ®$EÑŒ (âÏöH’Ù34¶/‡Cɺî4€±E/ ÄmctNV~ÙSáÓïƒ]²mp°óÐsB™xÞ‘PkäøÖ £8 –ek+x KOŠHÒµ £#L P]%Ï̵¬‰²!pA™ûó1<ðÁ%Ëft?Ÿ;ác‹w°¤£§(©ø1Hj÷ºfòN[ì©´%³øgÿ&ZœÃ°T¶À¶p&_(¯¼Îˆ¿ò4}ö©Cc‘”¼»F)kzeω¢œÖ7µ? ÙÄx íÞ£ò12%‹L(7=7Š7¥d¯¼78à-òµéxÞ&°4Úø½͈·hOohmŸÆ#2®™°…SWB¡{7‹‹Ì€,ó3gµn[Òwø•½ÉÄ­°<T =N °µ?öšðÜHÖÒ ä 0×ÒR„¹VÔ‚ ä®HY>›naâE¥Ù™hK½âP¸oR§¼Ds:1ÚÄ#“—C0Ô?pBÖEi¼ÊwOEq Ñ ïHÜ’´×í[0åd8ªwF%X'Î0ÑÓŸISÀ˜çàǽÝçiC§²OT² e‚[<ÿc­Å0b'”@IÔôƒÛЙgt×ëJž‡d^™büxpÒ¿ÁŸ(²l#ËpÚ†™Þ®qî Uì•ÈF±ÛùhLGOaÔUºÿ¤¶û“IþŒûÚPm¬*üþþÓ×T½X™¬­BÑ*•š“xLÇÉ|)t!˜JmÀ¾®‰µ¦ŸmlJbÇõÖã*ñ[š_•3ĤgŠ)©j(õ i’’šÄ*½´Jc™"ÁÒ¡ðR{p —¼'hâWâˆÄHªA–‘Ie BöM¥)t}¤à4àìû 3 ŠÎhä¡¶¢t7b¶Êß„Òrˆh(Ìõ sQ pq㹓ՂQ¾¨3­I,ßµNûtTt¨M’¼(8ã°^åÄ=[’džz!aíJCX+ÖL¢N6u£Uß®-²f+Ì©i!øøpOB/a‚bô•—]PÌÆ]¥õ*ÆÓ!së/GO-FŽžZ<<»xÊeH2|rvn<2 ÎÔõïäÀ B¡¸Ð:.pÌ/”cèG‘è`È éP Ed<“³:»þŒÐùf:¾ ƒù˜ñý¸¼ò_-’¿“wJù#óŽ}SuP7õB„2Kµ$7ËÖ|·a×+Ï~ëRfŸ, †ñ¡ñÊ1)J~8VŠ(À__C@\:Æ–Ö»ÄjEGµb;M=õB3ƃëÑ@5Ö«}®ÕvX'•U– ·ÔÀ·Ü*:ÊÅÛiÑ*!¡½YDè’qQ–^,ÛN~ݳnNÙFi¨c³¿>ÒÖ×o«W¿ËM¯ôQ]Í袻²µªŠ[j²**¬·’=2m&EÒË:êj¶Ôe«—ŠYOõu|H²›µ“q)ËáË‚K›Ö†I⫃ ’œòrçÊr† úsi΋f×§vRÓ?”Öul›õè vSÞ"H¢¨¸(MóƒÞf)Bý&ÇÞ‰³’ý¡›Ns˜ýƒBƒ¯Ú¸õ¯»Z$¾ýÅ3‚&”MÒU¿ÿ‹|•Çó.a­Bü¸ åH¤e›ê¨[] ¦KA¾+S%ÉòöHž‡Kï¬YkfD\QQOÃéæÎ’…žba…!n­¹2¸Ì0y‹Ûƒ“n£H9´¤=²@D²£òbŸîבpâcP’]¥[O_ÉÎ ŒÖNL®ÊºB~_»#W³·–n®Yå¸[íÈõLŒÍaq+¯öhù&ˆã`¾ÑérÒô‡=`æøwgÌ»3æÝóîŒywƼ;cÞ1ïΘwgÌo}Æœ¥”•cæ4§­ËNóÇÌ €þ‡%UÄÿ!ö_PKþ°'S‹Ž+PKW 7)doc/org/w3c/css/sac/NegativeSelector.htmlíZ[sÚF~çWl•IcO ò%™é8ÀŒÐ £VHŒ$'M_ÖFimâióß{vWè¤MÚ˹î~çœ]·À–ê¾ihà 4ºéºŠ¤¦,¿½Te»Xt¼l#7öÂħ~z,k¦„¤¥‹+Y^.—­åe+Šïe×–gt¼”ƒ(JHkJ§R·Ñþ¡Ù4ÉräÝ“fMö¥)Xt¢k’Ø£dŠnŸÐŸÞ£7&èäöÁ¦è¼õ²u1>;?EQˆ†ðgFèü%¼¯àýê¤j.º8;{…8qWw ­Û0ɽGýGâ€Lh7ÚrÚÓh5WA¦2Ô:Ò{ò´Œâi"!Õ2]Ít;¨ÚLZ“$i%Þ¤U¦„ü’øÎ›‰3tó7dkêH } H2#„JˆYµ#QòÊ@HB[ëw¤VKÎß«Ñ->‚‹×‘ÖÌ);ª­\DŸ$¥Ä,“LbAaÀÝC8aÞ@K?œFK×§99müÕ@ðZx1 i Ìø0g?(ëíHe]¤×`Á‰ñ”…S힅ߡ޵j–Ý‘–3Ÿ DÞ×9¾f 7v²r\Åv‘ÕG®5S¿é)vÖ+Ü”9 ôo½xL£…Ôå4 ·-+|„°Ù³ä½¿h®C©2´#h÷™N`‡Àß'R:ÛUz††z–5ÿLBouì:ÒùÙÙsp¶f#cݼ†&ñ쌕?Ã`çf8Tìw‰­^×fVcv.Wvy¦Á«ß†â8`_ï±çÅ* ‚s©VÉñ'4Ž–em+òD<+‰xY!)†~mv¤ aëSBoÒgnZ>ï(8[@¹ù×—lôHâGŸ,›ÉÃ|îÅO-¶×A“>ì"¥~R Ôîu­tN[îªl$×øÇð6Y¼†M‰máMÞ3PÙCœ‘˜²‡4}þª“Æ& P:wS>øª—$k\¿¨þ4&då]÷5ü°¾F¦d“ Ãòfà't±p>åk ¸E>4½ ØE, þÚÍH°hLï"ÐÆn—GæX%s0á?°€® bÿ~F‹È€lë­@µn[²9â“ÏääVXE/2ý€½&<7R kሴ,@Êiå,:©Q8剆0J†÷yÜ…ŒJQZìm[{#„VÊ̳ #/NH¼'cSûÝ-2Î]”yà³l·mg"zñ=¡) ½n߆“ËP½ ʉÀ&j¦…¶üD’@˜ƒ/ÿîDd Ð>E"MÉó“e V “µ Æ0ü$I3Œîbož£]¯«REg&ã‹Ó×@ý#üÉ2O6ò§mZÙÏ ¶Ý“Ð^‘l½.6c¶y ›®âýËZï§1þJØÚÔWÃâ÷ß⫯kF±ÒXǵ M«LjNè,šŽÓp)u!X¸v½î/.†¬Z7®lJ¨ç›å*Á[–^•ÄÔ3ÅŒT3q}>šf¤PØ¥I«,–aê†Â¤öà>Ö-Áò¾D¤:@N ôKÊ[roF ³Ò»Ùzs$Î(¹b µ1îî„fåí½ ž­äQº?oÈËlüù"¨`ÉNÌ 3…Ç1w5·wIf‘ÅÃmàOVåbøT1"ìK @DÂiò¯ˆo°Å4*ºÒ!)A] ?Ç}ÏE›Úµâêo´±£šêZ6,vÕÂZîµVí¨¶Ì­ä–RV¼À˜t½§ðS\òåRšùf¯Œ^m¬lŸÞù$XCŸmÐù¶‚íò“ÛZV¦Âk-+s½Û€ ˆ7õÃ{5  .w`û‰ ªLrØ‹\òB VƒK9¸­iŒýpFX›Žïâh>æAf\>kÈëòodœRÊÊã<ÜVíÓÍŒ \ÄYÛŽee¾ B gâí¦\‹kgGË‚Zb_|ÞfTÌwcæ¯mÆÚæ}´ÂDeQH©®n™uì¶ 8Œñ@7p™W¡í0òÖp¨™n­Fu]23±Îì£^ÕžƒXaÍQ!×P@þ"§šŽÃé6+øWEÕªÜ6ôÄhlòYm×AÌjB݆Øv“‘m©šãRŽu–ŸÞlÜf»Œß̘Kþ©Rr¥p-Ö¬«Ý\v5àÚÛ#ˆ¥ç'ß‚Ù9M`¹déI înõôLv-§ŸxS£ø]{Xsœ—çÙåe¹:ìY®k ‹§‡µ—Ù·¥Ñ|§ûìtèw{¥-ä?Þjoµ·ÚÇ[íã­öñVûx«}¼Õ>Þjá[í<£¬\lg)m]rº~± Ø¿t2FâßoÿPKfJ0¢¯ü+PKW 7doc/org/w3c/css/sac/Parser.htmlí]msâ8þî_¡õÖÞºIf¶ê*T&î¤À3{{_¦Œ-‚wŒÍÊ6Lnoþûµ^lË/C’ “…Ê$`¤V«ÕýtKji?h£®þëm]ë7tû±3èw‘Z­×yÛ­×5]ã_¼«#®o¶çN½ÞªHÁò²^_¯×µõÛšGîêú¸>λºãy>®Y¥¶”ÆÕê¯o;\­ÂGJ“þéµ5þ%ú€]LŒ[hz~3V†å™¨2 mÇBçµwµ‹Ïgç'ÈsÑ üz+tþ~.áçç nOGgg?#F\ïëƒ^K¹5ˆ‰Ò¨‹ÏJ㦧·Ñ°}Ókª_ðýÚ#–¯¢îh¨÷†zSæ¡fÍôýšo˜5^Ùn€ÉÌ0±JI úáqo€šªÜ;ØŸc¨ˆJ°©økP‡ê*º÷®šj­V’Ò5V‚1ÕT'ô1£<éŽû·: î—XP¢RðMb/(0 ]“J­m×òÖº8¸r¢ü¡ x- ‚Ý " ôM@¿mª¼ê{åHÓ§-չؕFg¤ýŠ:º£ÁhÜT×s;À*ˆØñ >Êí¼§,òjF/4ÑÛc®>º±~ê´ÇÑ·| "a»ÆjjÏ·T[Œ|Û¨·Y .©ý/ö²*•C¢ xŽà¹}g°Þ;¶ûÅWEm½ÝôPg4ÖzÀÿ™Š~ékúuS=?;û ¶7ܶ5­?üøçÉm»Ë>CáÉÇ››öø×¦JõSÓ_h-3l¾Mäòc^WW@`ОLšêÐXu ÒÅŽs®vòóÌ&~@¼u¶·9~S,žeX|›f!`µýæjbª•*ú$>3Ѳ"ZIÆ©ÚÄâ—Õ[a²²ñºê‡‹…AîkÔš¡'W`'iJWž¥F§5uõt•–d=þ›;õ—ïÁµGð¶4Ì/6v`ç–WÙ›+ö*âfŒWÀ¨»¡QVÚí:†ïK­>iÿ‚q™ÎëPî9ÆAÖ / 6)ZWÛʰ¥ÅUž›9À-üµj8N¶ú´ðss4Çβ à\†¡k(»Ÿ:ê:öFãÐ% €Øwó h<ú…£Z«Ñ»¡uøoV“‘K0ër½ˆ:0éÿ`¯ ŸÁa!œ@H^•ºÅ:xÕúS$_á v°x„Ë$‚ûØÙ‚ÛE‡ÌM{ÜûÄyâBФ³ ·^Ät=×bowäbØû·žæ"®h4ö’ã6ŽX4Èšªð¦ÖÕÜOÌBÅòà¡À&ÃÚNæàøGìY…Ç Í&Ð>A<<‰ã’5Y8nåMa7ÁdMŠ Ø¯ºÞŒ‹ï:­¶ã .ÿ2âñÍÉ{ þ þÕë,܈CœÆp½Ý Ñ›Ú I%=ÖÜ#óI™]nÌß޹ðò—\ÖÃÞDïiüýÿøŸ«~o~AëD§%±ÔsÏú,¦Ú‚°÷z¤jéîìjC÷—aÌÂa;›ùÊ\`eCD12阴7ÔŠ#R“œcœ©”ıLHkÃ,!U©q}¿dIÐÈ/ ¢UCýA¸áAÌMI°¶5:óÑôÖ2œ:¶™Ì/‹\xiªv´œÒ¸m)ÃO•›yuÑÊÄ^,ŒÚ·ýèÙ ¿¦(¨±äº EÅS´ý±ZÔQ0·}4M“¿Dv€À>¼µ¯ c¹Yèí£ÀCß¿‡YÑÜp-‡R¤ [öl† #á#o†ð >R®EëÙ.À,8dpVÐŒx øðqÜ?„…wæÜ †IICèŒE­Q_¶¶tÂp|Oê‰þ‹‰W`cHƒL`8 !õ0 ª€Ú…wsäs /}å#˜8qR¬ÇØ:‘Ú•Û¤å}c Ÿ†r½T¡-˜— J,KKA ãžÕˆûL7ý |ª,=ß·§Î=Ìå‚9|ÈÏv—@Û÷Bbâæb0Ü”2›QÑÍ ú@{NgË~hšØ÷g¡ãÜŸ2Î`øhÛÀ ôVÞN‚U®œ n„>ðf†ÄO,øW'å" šÇ~Å ú9Á n ®K¦¢šÖ*åp5ÿ×\ivr¶Ý‘Öke4êì)µÿS¤”b¡GˆGön_®½Gã}:ª6¨é¶™ÚÒ®TQj–C>@)4ãþC`™p-i8ËNäá1ò\é ù]}4.ÙâX¿¹…å³ÎkÛ ú|ÛŒÿíƒ3~)¬ïÂK ëujæ×ذl÷®ë9QÓ«)¿øwêÁ8nëhÂYOñ©HaSlÈZ{k¹Å-A}ÔõŸ2^š­J0eáþ—Fj5Çpïj“€@‡bMJÇBå å‚è$ ü‚Iþñ@%€_åDmeŸqÅí´*'¢}…{JÎã~¿Ç8 8&ƒú è2¦ HÕœ3A{Âä›óÃåÒ#b‘:>EÀríe‡gêy6ܧÖ»[b{tßW²«›´Àh¥ÊÆCõ\à–‚µh'œÞÓi“èsã¢khe8!F\»{áa/%Ûþ ñ„ó¢§]œ–Tå3©–·Ä$¸ÿDEZN¿¤ ¯RÉxÿ¸’½°~­<Ûz¦‡N©ñ¦å^á0èÖ÷Ñ Û ^¡-‡r½g„¨¿Œ*Å…_™>Á\Ð.Ø xÂAoÓpÀò2jOÄH€‚mD›$¯+äUñœ–È_rI/¢ï¢û.Þg[|9Íp¦¼ü5ôbà™†ƒ¹—Û©ñ\ øû´+— qÖ^áÏ¡ßCLwo’mg²¡òY¨½6ˆ Æëœ†ÁhDóêMÞ>ó=ÂÌÃÝl9SyŸ…‰œ§÷3\>«£òøWb›4³Ÿm¨ñd‰‡öÓÒj™:vìâµ\ÅûiQÎÅAn§oÛNÓç›vÓ¢ÑÒD¶ÜýÆõÛ–"!ýظ1‘™A­Ž&eHeB,–î$½‚9ñÖþ†DÛl<™ô¾šx™ÏGÛ<'•ëp;d[öZëѸWœ Á“~m‚YzÇ’x+Ûœ˜íóf’JŠæ{dÏhFÂ=2 —R;s,KA0F—Âc§ š{kp›ä”×aÉL¬br†c™!Ô–ÓUƽsšê¬ øŽa mra[àéª[.ÿe8H逞ˆ!I€`Pãý`PµÑ?AMב÷Q‹¨èL)%!ñ'êHÄ%g„E'Q”WBŸîª²ì‚W¶ú4YÇÂ3#t!Í1œ(U5;ŽtVklÕ•Q²¸˜ÓÒØ9•ª3ºëéêù´ŽºÆÐMJñm÷¹Yâå&MÛ /Wø0fueq¸þ,›Àå±/à#OCÔ>¥icJ†4M­’3 °”¼†Ö¶ã )F¾í@Qʾs= £–Œ?´FdbS<7¨Ý‘$Õ‘UMÇ𱜳–E@™{¯Q*[OôB¡’GÂSž¿—îCà)uQ‚@[Iè-Ø¢é~ÎýX:OåY1˜Â9É?>ž1!­ŒïuYq.Þfʇ¯§­¹!Dø  ÷Y­,e~q›,ó¥n¡sOyî²¢S$Çô‚Ë6¦K¾ôBЮΤx9gWRH‚]ð'ò7ûù’Sϱ|f†Ãp*2ãX=)„î%ÁßNNè¯æƒø¸<‰zÑtä'ž„–Ý6vsÈ’Û܈,¹’/´œ]x™Õ€Ób6Ä‹-dØ^­?’*¥‘°p3š¹žÁ8˜Ë#zØ_tâ?øY‹Œ+ô;n¿ôËÝu‹öZ]–MƒËNF(âhªäŒN&8þÈŽ•|÷·BEåøDÂ9¥“V¡à¸$ÞÁ û [‰ðç^èXÈ„ÖØÁ mñw†Å—@ s¸nYâÌaª—'5„Fô‡ÔTt¶ƒ_êŽt¤„JÓèŠä+ §(s²DÙp´dDôåSe’¬¯”­À[Vp^Åpéâ•V¢C[ iƒ¦¥–“a¦¬hM`D¸¾òãDÉú“ÔBÛJšBýQRkz|D‡¤­6Q‘{ ©8Õð¬¤êÒÅÇNbI—羞ø@KYǵcúoòÁ‚dd¿UnS»W}<³;Åø›å+=&,(ç6g½b-§-EÎ;qu6;?3‡I†1ŠÓÄTæÕ}‹¾y#-)2U„úA4kÀ_ÝÇM[çn(Ói¹ŒÝ1Á-q§B§:$ô|7”¥¥âZ‹‚ÄÎ<k¾ç¬ A A0= Ì-é‘n‹E Øîá µ´dr=ú³ï؟ퟄZìcä2ûbùÄè-™Ê”.“©ò5s:D4Þ “˦w§!éˆ./.¥,·ÄÁ¨bkå'¥¶[(/s Vy(–¸£õ±£[GÓú¾L«ètyÎŒòÇÍsÖ”ý©eå«ñêiz¢sæèJ\Ü2`Ë#ç§40%‚vñMšã^· 5ÎÕS™+Rí‹òµ/Ôz]52º(¤Âïj´–NWî8äðƒÃ(t6×*¨CWæ=jC»"…ö (‚‘¯ìÒ¶xúB|¯ƒÎ!°ka+cr%à’ç7Ä?ÉÁœ"ü©§'“+áè@@ü }_xø$å÷¿/Üßù’b$ÈÜ:°<ÍE 1dx:D<8THØ  ®e8ÂÀw ¥®±Ù„ѽ69ã—ïH†=,›<0SÜÙó·ï õ{Aeà ÔãzÇá[eá=›7fFWf޳ÇV’{6;#]ݤ/è,¼1~ê·(ui¼(úÝÞÏù?^¼:þxuüñêøøçxuüñêøãÕñÇ«ãWÇ?ÕÕñqL™»=> j‹ÂSùöxh€þÏI´!þÿXýPKo„¿”3EkPKW 7,doc/org/w3c/css/sac/PositionalCondition.htmlí[ís¢Hÿî_ÑËÔÞ$u#˜d¦j+£V!`¤Á2sÙ/j¹A°uSwû¿ïÓÝ€¼™˜˜ÌìÞi„~y^»Ÿç×M§ý“lHöÝHA{¨¡ÑmOS%Ä5áë•$²-³Š|ëÙ¡ãGnì¾ã ‚¢sˆ[ÄñêZ¶Û-¿½âƒð^°Ma/½‚ægñŒë6Ú?5›:ÞŽœ{ÜlÂ#¡I~Qf•èû8tb!JÜVmMé6FA*«ø3zÛh Ie£=TléâPépßðÃ6g‡$C·Ýîp  (4å§QÄGΔ¯!†\?ÆáÜ™bŽÐÓTýWd*êpQüàáhqÌ!bÛãßchqh`*ýÇóBöݵæi *a‡³H1¥lI¦:²Qü°Â %bŸhº«Ì×þ”ʳuýY°µÝØÃgçÿ4|VNˆý˜c®—ä&&µ®Fîsã°cFØ Ì;vÏïPïF24ÃìpÛ…c<áÎ óL?y™?;éY¶hÚÈè#ÛÁ¿ôD3­eþJÝà;›‰Žã`Åu) ¨m "mÁÌö.ú殚¹v(ÑÇ‚råî½CMá¹þ·ˆKzÛbOSPÏ0eäoqè«*ÛƒwÑjý .W4m$ʲªß@{¶F¢DŸ¡±u;Šæ]‡#ÃØ6ÉE†qBÚè«]Þ)ðé÷€&ZV‡ÓMÏ %ìy\­’ã¹FqlËÚVä-ˆØ*‰xU!‰šz£w¸)&C”C_’gjZÚD>Pp2†2óçGm°ÁáÆÅÛf´^.ð'“4éà *Rê~ ”Ú½®‘ôi =P•´¤ÿßD«Ï05å#d[9Óo$ºD ´}\Æ*z#³Ð•„‚н_ÄÅÈ€Lã+‹jݶ2$}Ø•ö¤äv°œ*Š^¦ XêoöšðÜH$¬ '€ ß’)@¾FNáY" òY¾…Ì‹J šMhSùÂ$a¦Imò,Æa0ÅQäú÷ªÑyMS«…=<ƒçÊ£+ÿ²‹òdîJ½ñ";>6¢SðÇ.ɦ½nß„ô“ÉP½ejpÁ>‚º§ùl% ëÁ;?c ¢ÓÚ爗 ±lC0ŒçŸ½¯Õæï”„S5ý`:Ë,øõº¢ç!‰U¦2¾?ÿ Ôÿ€?A Ø#Ã;mÝHo÷˜÷™¬€öŽd£èx67Ó¹T˜ƒ•pU;’”Íl­+–­Èìþ¿ì§¯*Z±°­e›…¢°ZâxÌÆIö亀ކ\;dŸ/® P[Õ®l†cÇõöËUŠv)Ú*ãÅÄ3E€ªèr=‹)pµžxît·DB$<ש“šCtÀþ,Ú5ßBnøuT4©…1½(¸fb½ÈŒï,Q KµUCµ1 n™ÞÃØ“ YÙ ÂïkÙhàԴLÚ dÓ>‚ID(ŽÂòb Šéü«´ÞõtêÌ]ìåÂcK”‹Ç–TWO.©r¸I‚O7ÙÎÄÃìÌ K„\qùuYˆ5ÿ$±†¤:"9Ì *y$Õ„Š,Þä´ŽÆ®¿À$ïÌÆó0XŽiÜ—÷vKçïdª¤Ö±Ö“ªº©"”i‚ˆ&¹ YÖæ»M½^9 îAT?3ØcSã…óRÔåü„¬?¼$1ê¶mª½[[©ð¨VÇ©§Ü¨úxp7(ú~¶Oµ:Nê¤2ËRá‘Øf\…G¹ø8.jeH¨¯6"4Q¿)S/–G_WnD[ýRñ|µü8>†®Œþþ‘¶¿þX¾ÚÝX¨ZÅGu5¯À‹ìÖÖ²*VÉɬ°0_‹v=òØ4Žâe)·²QêëXHÐÍÞd\B9lyp+Ù†y ÈAl•pÈ)/{þF(gHE æ<+»>¶7”ªþsi}G7·©G™ó d..ÓÜÝ;,}ïÛŠxwã´îìœëæS|qvžˆÐ`++&ÙË®&Ž×¡¡xÑ*áCPy¦{­?ÖÜ“ ð°ã¿½Éí‡NÌMnßÂÔíi0ÃÝ8\uz‹Ü9µ³(Zk€õ gƒiaä,“²Ã„ÎæAØ@{˜ì}Hªá­—Þš*rü+õ‚©ãépwþÿä<L•s yü®Nœ.È«\ê0ò2€¼@| NÝF´0BÁ<ókƒù4-Iv_Ñ퓸8úÀHŒTëâyþüå‹÷ÿë;ÿO ¼ü8ÏJrѪPv(u«;'éÖ Ûͬ‚Šò¶b·”úìٛɀK…E=lI7Eÿ’¨åâ1Ô"SÉŸÚ›Ù)\Êùy…Ûƒ«n£HA{dÝ.$Ù,4bQ¶J¶å¾Ú«®ˆ|LŽ@Ú8Þ£%ÄðˆÍ>ÒCž jcëo×à ¾w†£ŸlKÂT r ÉUÞW˜ß"ÌÙ+óëìµK{%y)±Ù®aÍ~\¼E;=f£ƒìóLÛ¼ y™Qj߇ԼÙH_m˜åèµ{Ò3lÛ_¤Ôó™q,:é“4ýÛöaòŸÎûœÎûœÎûœÎûœÎûœÎûœÎûœÎûœÎû¼íyŸ `VŽü¤·«æürö0bÿ°ð'PKðv™ˆ.1PKW 76doc/org/w3c/css/sac/ProcessingInstructionSelector.htmlíZís¢Hÿî_ÑKjo“Úò2[µ•Qª0²«`Agæf¿XDÛÈ ‚'µ·ÿû=Ý ˆ†Ä›¹Ý;­¥_ž×îßó<]ÝùN³Tüi¬£ Ñø¾74T$´%éã*IÖxÇ;ñò áÈ b/ñÂÀõ%I7$,’du+I›ÍFÜ܈aô(a[Z$Kÿä‡aLÄY2äVç»vÛ$›±ûHÚmx¥4é—®h¼Ý‘€DnBfèáýÓ}rgá?¬=†®Äwâõäòê…Á¿>¡«wðw ?ýŒT£ëËËŸ#Ž <ÔåÖ8 §$޽àÑâ$ZO©àñÉ4 £VGJ‡µ:#+ÈTFzWøLž7a4‹¤Z&ÖMÜ@'Pm*NãXŒÝ©x,ò‚„DswJJyh˜¿"[¢®'Ï>‰„$¢öî ù’H@U@[ïwQ”ò¿íh‘`²v‡63ÊŽjcŒ’çI)Q›ÅÓÈ[%0`¾˜\hã³pƒ½Ä'ç­ß[>+7"A"‚×Kú#¡½]á bÂûÖ`3Ζ qßµ:=Kû„zwª5´ì®°Yx ÀO~èÎàµÈþ=•œ{»›}ƒ#«°5'|è)vÖ˽™¹&pŸÜh’„+Af4 ·#)l7àYüÙ[µ ãPª™íÚ½G—Å÷‚Ï±ÎÆJo¨£žek:È) ††]áêòò{Xúp8V4Í0ï ‰¿;cEeï0عûSW ‹Ûô¡ÁÚ¡cÌîÍÖ.g:|ú} 0T§+˜îSÏTâûWB­’“¹ÂMUÛyK"^VD¼)‹ˆ‰”¡qgv…)¡‹U@ÒwfZ6Dk(8]M¹ù‹ë7|"Ñ“G6íx½\ºÑ³H!4éî*Sê‡A”:=ÙJçt¤¨JG2ÿ<Ä«÷°]µ#d[¹ÓÏ{^!ΘOy…4}ö©“Æ&O P:wS6øª¾Ç®ÿQý“ˆ&Êc÷5üP\#3²ŠÈ”B~Û÷⤉XZ>åk ¸E¾´]ßo"–Am‰Ä_µ³›4€±‡å‘VI LØCW ‘÷¸HÊÈ€lë#G5¹£èþd3¹-VÃÁŽ¢×™ŽñÀ^Þ[©„µpyÄ`-%ˆÁÒ8ÌÒ5 fì'7K†øy†€Œ*œïn[ÿÀÅâvÊ ô)E‘™çóÕÛ˜½©ÿ—Ùç®Ê<ñ&ZÍ™ˆnôH’®FҞܷ!ôär ToˆƒÙÁ>Ò¦…S!u öÁ—7?ç©D· ´/Odò f‰üàü‡ZíaO)¨’¸„óÈ]æØ“ßG*ïÌdüáâ=Pÿþ%‰e yÖÓ1­ìçC¿’ÐÞ’l•—ߡَ*íÄ¥pS»ÒÀËmmêÖ5þû_ü«oèÃr d½¶KMÛôjI’E8›¤1T!oXZíâ}½¸$áÆðöÁf$q=¿\ÌËr®jÖ˜z¦œ¦ê¦VŸ¤¦i*Ô2veÒ6µe@šeFiRgp ¢%h2XÁ‹TH´‘ËÁýÙ9¥¬ÑKÃÙâsÖ+åÐßÒUˆ:š&7C»Ê^o‚t[yùï{2Å*o¹òÉ›˜•fr÷kÌïÌÌ?™EVëß›n«5DCÂa‹ÂŽ…‰Q$˜Åÿ]†t™å^x1ŠÙ´t“é‚ÄÈm¡Ž‹™wëkr[WÛ_–þYL¦í•'È«\[ W·#¹²È˜°Gq9„ ÅÃ[nŠ·¬š3ˆ˜“±m©ºã@u21èž¾W±a™ÓÒô‰£u[6ìAÞóõ#6ؑؼ­Á˜Û¹.¥½ÉÑ0Ý™)P–7gµR…fK;£·!ÊÜ#~'ÕoW‡êÍ›ëÍBR©Â§Tb÷Á'âÎÀÃjèC_®M¯Kü#…`š PÉ(˜ä¥ ²As.hO¼`Ah8žMæQ¸œ°p8©¢äÇ ßÈ8•Œ›ÇY?ìÚGÎŒ£\D)`EU™oŸÜ¥Ì`_ŠÈ´³ÃMI-¾/Þ¶eóSuÖ6¿æw˜¨4>©Z8xaÀqŒÆP«ò*µGÞt×jT×u$3S3¨}”á¯Ýž£Xiº£BV¤€üeN5Ç12 vቢý¢¨ú.·=½G±û|VÛu3S¿S°ñ¡Êh§ù(&Í¢nó0{Œ(Ž~¯Y¹!+Üë;bh[V­+wÛbƒ¡¦¯c³ÛÎñ<ÍTöÖJÆÂ+ {:¿a‚x!Ô a©Vv¡ŒeÄD)eyU°Æé>Æé>Æé>Æé>Æé>Æé>Æé>Æé>Æ·¸‘§™;W2²<·.c-^Éô†2eÄ/ÿPKan`>ò.PKW 7%doc/org/w3c/css/sac/SACMediaList.htmlíZÿo¢HÿÝ¿b–foÛÜ Úv“K $ XÍ)dwoï—†âT¹"u›»ýßïÍ ¶vw›»K$Š ¼yïóÞ›÷…iå7º¥9ŸÇê;£!èš’ôéB“$ÝÑùƒK±ÕFN솉Oü(tI2L sB–W’´ÙlÄÍ…Å3ɱ¥9Y—RE §d*¨ ùM³iâÍØáf†”'ý1::ˆnpˆc—à)º{DºkwyèônåSÔ/ÅóÛVû E!Á׌֨} Ÿ+ø¼ÿi†ƒÎ[­÷ˆ1wÎÐP“Ž6ÂSßú iÈRz·! §ƒÌÎÈP„ü¸‰âi" Í2ÃtTM<ÑK1q=±Èù!Áñ½ëa2Ìßm ‘"$ä1ÀÉc" jME ø ‘€‰€ú¶ÑSQ”òÏ–Zd š"LèmÆy¢Ùƒ±ƒÈã§œ¨E/ö—îW¡G½€6~86ŽO|zÖø«àXº1‰æ[-è¡OyAáºñ,Â¥PywDCîZúgԽѬ¡e+Âfî,€ÑƒÈ°(íšå®S²MœŽí «‡k &þØíØÙSîšÌð¡»¾sã[-•ñ€§²ÔaÜ^'Ƀ¿lèP¦ÜGpߟ¹Ì>$B:Ûét‡êZ¶nþ–€> t§¯íVë-8ÙÇ]˜7p‹'ãŽÆÆ@<ù0uìÏŠ@W¬cÓ“+ƒÒ˜ÊÅÖ.'½0v&E0Ýu×5m¡VÉÛ{?NHmªÚîà-AlU ^”!" Qg8¸1ÁÃtm èc:f¦e$úÀéâÉÍ_\®ÑÇkošÉj±pãG‘Æ7hÒƒ˜)sêE!NrWµÒ9²ÔU)%Óø§ð.Y^C0êßméz4‘¼Î˜Oyš;êÐØx €Ò¹{„2«n’¤þPýIŒñ!Ê;@÷~(®‘)^ÆØ£ù»@†9–žOymp·ð—¦‡ÀPâ×F4ÇÁ² )ú@} }Är•Ä’ »ÐyêJSAìÏæ¤œm}âYM•ÃÏl&c·M€Õr°£èy¦Àdð¤½&Œ)ÂÚtMTXZ%¨°Ò8Ž<œ$~8„$W¬´Mp€=ÅÜ@YîÏë/TbT©Ô<Îmã#È-–™ê%x¾Q´iüî”EçËüñM–|jMgÝx†‰"¤õ´«öl(@9„êPl öq2-ô4³gZ@~üûSÞ?( ð>C¼YÉ»”M  ÂÓwµÊBèz4“â¤F÷±»Èó^WíÒøÃ ã»³kàþ¾’ÄÚŽ¼Õ‘M+»Üc׊Þ[–²ÇyXfaT ¿Ï_Ôz>­öWÜÖ¦1q _ÿÍzcX¾ìıK·¶=Õ“y4½M § B+Ü·ôÚµúr¸:ôÕƒáÕ÷›bâúÁ~\•D—5ZÕV1õL¹75L½¾3M{Sx±+“¶ý,3Ò;ðæPš$÷ÏáT´í+é!Õºk0ÈóH1ü §Œ¾鎺\ݾ·}ç@°Ësè¤Ô yœNæW%øªI5HTY‰j·™ûv¨÷L@ܵ4Dz”€¸‡÷KÈ}[]²OõÏí§úý‹gûýBQ×à(uǽ p»S(RZD±P~78/EÃÏ4ÀY#M8ôR /å‡}uIµ£MQâ%=Sým%6Ù;‰féFZ aAÉWƒ^ådý°BY­'P;†8œ‘ùé™ æÇ]õô,•Ûà¡Àá|ÛÙÆd‡ "sŒ&E÷0ò´ ˜PÀ"äß´3­ƒbà†3qBbX8¯etPeq N“ÓËÜÚp+s8´ ¯d{jìÕ¹„’%öü{O“ù 4JHö¢)VÃUÈ»„V€9ªÀYaD‹Önà§sÄÚTŸö4»í$«,[ñúó\²*g«Êœ=é0OW;"ê“UVÆþ“¹ªýT®Òò}©*óÆVáRÀÕ•ûj£èP†î\mlË-hž MZuõ 0çE¨ù4)=ëù5¯ŒæB¼ì æ´¶Ê9'­‹³ý*üøhyV÷Ú&¨¦Éú»Û&¨k9Ž5*wOµÛzw!Ñâ ½”ô»¹Çñ÷÷Žû{Çý½ãþÞq︿wÜß;îï÷÷^m/ï-w¶ø²æ¶®M-nñúgn*ˆÿÂ?PKä*ÖöŸ!PKW 7!doc/org/w3c/css/sac/Selector.htmlíýs¢HöwÿŠ^¦ö&©=%³UWµ o,dfvîê*…Ò*;8©»ýßïu7¨`〉ÞÎËíׯû½~ýÝüAÑeóóPEwæ †:ýžŒ„º(~º–EQ1Vñ®qq‰ÌÐò"'v|ÏrEQÕ$Ìã8¸ÅårÙX^7üp&š†8î;Ñõý7ìØÚµæõº†—Ck†ëuøI`’ª¤°Jt‹=Z1¶Ñø ýf=Z¶?AgãǵÑeã]ãêþâòùÀŸæ?¢Ëwð¾÷ÏC²j¢«‹‹Ÿnö̾ڮ°‹'±ÖšbRRkTSBš4P[Âü´ôC;¬k¦ª™-ЇYL“(jDÖ¤‘B@ŽãpjM°@€ô{Ú/ÈPû¨%Dñ“‹£9Ʊ€È*¶„E  ;Cí¶„FC\½×­´E«%ŒH1…<’ÞÐDñS€Hd%¢Iè14˜>x²úhéx¶¿4ØÅgçµÿÔ¼+Ä^Ü€e{X/1©àÉ„÷µßa%Ød,‘-~­ÙѕϨs+ë}Ýh ˹cÚõ-~nŽôž ÉÈÕJ_hdJ†‰ô.2õ!,íÇŽd¤µŒé‚{ÖãØ ïc?ÚÔ6E‰¶`kõ&úâõv(”#(wf¿ëx_"!émJ¾Š:º¡¨€ÿ…€>õó®%\^\üÄUûý¡¤(=íŠØïÑP’éoh<ú0HÆç–@¸Ô4ȇAÚh­ëõº¼QáÕ퀾4µÍzìX¡Œ]÷RàNò~ê„QúËül·ðÍ x‘Cñ:‹"B€$’ú½[­%L0áK}L~Ó¥¥M”’ˆÆY-ÿ&«ú8|tð²=,VøÔ {fÒ…½’…Ôõ½ 5;m=éÓ;0UÒ’Îø/Þ8 ÞÃ&Tž[`M¾áQ!ëR›.}ñ°1ð# ”ô-”¶qe׊¢Q_tþqˆq™É›ÐîtØä!ž™]w(.ƒ–²êrhä@ná¯uËuË Õ#Ñ»AÄs„î ín|D*«D*Lè…‰®D„Îlg%2ôOLªµ›ê€ôaŸ´'·€yu°5Ñ«t£Þ?@ìÕáw-Á+NÀ0ÍJ£šUIòÛŽÕ_ñM*êWª”.Ê)d¶­ õ#Ç-Pº2•†O”b×"ŸO1ÐÔ_Í,+2¥TØkývqrŠ¢ÎpÜ-Úiw P;+<â¯E:ß"(šŽvú†a˜ƒŠƒÎôŒY ­À>GÌ4YÙ$ËVÃõÎÞr' ›uBd'Žêž? ­ÅJÒuÚ’ë"™U¦8¾=Ї?Q¤†ÆÊ¸ijzúµ`M+°× kYj³˜nœÌ†Û¢ú5—ê‰~¿ak­©#SUØ÷ÿæèøfê`×¾O” ÐîöÔ¾²ÞIs°gG¦Qa㹿,â;]á2qõ¹(`^÷ú7|¬m[Žû¤SE8çdbj“å­Ê„¤Y3VÕ¾›˜±à¬¹NkÓ—.R$p.2šwWð±¹JÄXÌÉ”d`ˆÃ½•ðI÷,êˆBü%ÅLôÏ_zhô0^I«è†p+j*J»” ”çV⇊[yQFr¥ýkI™GÀ÷ìÄ™ÜkøíîWpÖ³myñ>co÷®0´êb" ÷7׵ &®Ó#ÞgÔ|ß ÃC83r¼YÏg躯ûà°P„FΜÇÙ>(äºVt¸{-}¶'“x uTP‘”J†àð›¬Ï*ˆŠuO¢ÈHËZsØ®™s'Úhhã©ãáY(Jq¬¡fÐnŽÛ5ñá¸}ƒ4?F 9Q<Çhê»®º~¶êýCŒ¢‡ ðCrŽsæ‡hé@ó1®­‹ÏÉùŽ<±ˆ(Ã_-2IÖj®ÐćvWƒbK?è\Ù·Œ fê2‘À‰&Í áü‰S´Õz-êSÍ‘S·»üøË]ç×ßßkâ~¤öUÙÔ ØD¼b¶—ȺÐkLý2÷û¤›*Ý haÅ“9ajï y¾ú•—‰ýë+›=]ãÑ`GƒcQÃ÷Ü'4±Á`9¢ÜõúJž™²£m4™;®=÷}…Ø¥¹ÑÜ @=ÄKŒ=/}„™aôÁ@ÕLî>áUw‡ø B†SÙ#º¦ôˆL’ú[”Ø®9!ºCÖ>ÍÚûÓ¯¿¢Ždp¿%`ùìòs*ާ¶Á;qæØÇ©»‡ü)Šü†zpGH‡Db•zPà^Rþ.Éê6© jE/¢<ÖŽÈr¿æàOØÔW‰, ‹/ Šj«3ID"*@NÖ2¡&(¨ Ä ¯Ñx4uxH8Æø÷Ú×"Òv¬ƒ¼$A l4vÈ0Ùá cO@ª)8nÕQ\J£ÓPpšz+™½y2l•déaSX1õûmg:ÅtƒNCAN"‘Ý24tYzÚí}„(ô¢Ê´<*!ƒÕÑ×ÕÙ܉l­áHý è+‰–#¿òh:4Î[¦¶\ÇÃoQáÛ?“ÅÐu®þÙ.?&IBß?Åcª¿r °]~T‰EØ ¤CÖ?wÎÌâ“®%™ S–8fÎÇd¿£sæEýtÐ|`®žáUôÍ| ðÙ¹ÐÎ¥œ|vþr¼,y4Z3Ã$Õv&°}AÛaB22ˆSÚœ;o„{èÏÜM+¹ÀHaqüoFÒxü’_/wÄEŠx·¦+µžnñ)ÑæÔ›w×íZñ±©m œDê˜Ç’÷Ž¥!»B[Ú? ù)íoœÕÒØÚ ¶•Ms^ZBRJ“OPDCŒÿ } Bç\Zá_¤¦.s|I¾Ý]¾Y<õlòuxãZÞìlž7¨kŠ·Íâr) #ð©%7òiNBù”„çe°}ÍÍ H‰ØÖ¸¨Àú9¼¸þh¹8b›½(¼QÌr1FûH¡%qÛ~&n›å.NØŠËZœ8V¾âô.`ªâ8Ö Ñzÿ˜8#s>2~ sh²/yy–(—¾<Ó´yÝËR8k›ž™y´Ù—Μ“.™9G/¨Ìé]–ÈÕ^^ˆž“€ÄXa; éÌÀ!ྼPpÊ凂Ñ â&sqyˆ›ÝU¸ýËgUÌï*ÅL*ê¾0=ï9%ÆG¼§•ÀJ\Êï­”ryË|m”Kd®¢†r]KóM¥,æ’LÓ>e¶ÉSzoÁS˜ŸÈ—>… ‹UDP!Ò:ì{Ë[,ÉÒ?½8K?ãɽô(9÷üÞ!d`!–bëüCÉ›I¹˜lÁ£m«¬ƒ­.?çà; á&)Uc¸œÈý–`Ø åoË‚tûo5eÿìžß3nŸìØoó¹Oî£ëœ‡ÐÓ§Ð<«¬]ï覩²Ï¼sïmûqì/òœÂ½º)iúÝÞÞÄð½Àéõ§× œ^/pZ½_/pz½Àéõ§× œ^/pú?^à´2C·îpJí`žE»y‡ @®<%±khÿPKÎ\²´ WPKW 7(doc/org/w3c/css/sac/SelectorFactory.htmlí]ms›Hþ®_1KjoíºHØq¶ê*‘T% «NF*D’Ë}Ia[lh[qÝí¿žÞß„d! Ÿ)¿H03ýLO÷3ÍÐ@÷a:R¾ÍDt¥\OÐìóp2!®Íó_/F8ÆÝÂK2’§_«õ»â5©ÃþÒš´¹ˆÓÓA¦£ï‚ÌÇÿÚkÃ÷–0—N Z€y–Ì<̳|091]4ζ0ï¢ÔÔÌ\Z¿0,L9Vv= M¶²xIü—’ŽO þWfÂDÕ¹Ã^ó§ÏaÿR†ù&ÄP¾"RA@QcÒ•··!>ÀÿŒÛ1ôzÐö)bJš¬PŠiü–Û_pVp'vÛ–}ë¨Ëé†ýi¢;`üíô#´þüò< 4Âà¦+MƒªÝR´5ÙJ:sÄÀq—ü‹ÜÁ÷ç÷L×’8WD}þ/ûw9'É=ÀÎ9±+Š¢–Ø[Øúwªäú_M…\sÝ®ñôxòá)Àt쩆YŒ+EmAh•ý‘IF£¢$äÇ¢~4 '"rªRÁR ag ‰JÝ«wð'® ó¥ÂïÄÓ `RIÊ!ì&mQ9/”þêþÆ4´è\fªC$ZÝY¬*-‰ÑÀtí´Œ ôë#àÑTCd]ž~eÃGñ\ɼ„z™AûÊõm=©ßô9즖•)]P1«ûMPD–UÃ6bÆTЛʴºw> l)Ÿd· Ú°o; oŒ`C­ÕãGá4ÊŽdÅ>=&)êÊñ&Ïè¡vjñž¨ùF9Ïܸ1aŠÞMщª‡qÃCýU‹‡(îÂv¼?ÙÚƒr›½ˆŠaÊ%Á†ò¸ÂesCe[ß‹ßÑy/pöïz µÖâ~.3ÆFùžhâxü¼¦SUâ{)™™0ÿ-*O&]ž~D†ïÐ~¹°ÐÁ5Œ¥êi òúÅÀËWý2*K÷ÿåY•ÅÎÞÊ®~TÛRqDbY¬å«´Û±×ÑOÞJðvÌCzŸôm²§ÌW²"_®·T½E«hé5÷ž­ãõš|¼ûôœãòž²ûØêv£Ù/ןöwRàjQvó¹ÃeüD>¸¡è^²i*m{õùÌv<$P)×g;6`c‘äߣ ЗKîê+¼ºÜÇùöA&à4Ô=νÇãqù7<Ö>áæI}¹þò„\º¢)6?¹î¸V¯ @Ö±†Å¶I uÒ¢¼ÃíÜ4ÒCÒYS­oXîÉSaXjå')àu(ä…ýÞ¸Y@ywrîÆuܱEÞñ#»Û´x{þûPJmy·ºnIktÔR”F÷…-ÆB•P\*`ÉÂØ¿Ü–J|ÿÿà‚ÛÞwStR|þÍ1’S bxéYÜSëñQê±@5r•”,›þÊ]~OT˜†Ö†·@*”üç½jºÈ³C•éö²C.Lwĉx-JÊw p¼ 2Í}”rÎC‘ƒ§"Ë集¢G)§Š2½N>ƒ9÷u 7¶çÙËJoñ‹6ö¥ ÿë{A^ß òú^×÷‚„?¯ïy}/Èë{A^ß òú^§¿$Œ&3¯ ÂÙ¼À4þj@^ˆG±7þPK•j¢µË 7qPKW 7%doc/org/w3c/css/sac/SelectorList.htmlíZmo›HþίØRõšèj°“T:%€d[gƒ…i{½/†ũk»Ñ]ÿûÍî¿$vÛÜ‹dËÁ,ÌÎ>;³óÌì*Ê+Ýj;Ÿ‡ê:ƒ>~hõ{m$ÖdùÓe[–uGç/®¤z9‰¥ âÈ eÙ0E$N ™_Ëòjµ’V—RœÜËŽ-OÉ,¼’Ã8N±ä_ÔåU­fâÕнǵ4©Núc4uþÝâ'.Á>?¢?Ü¥ëÇ:/‚ÐG éJº¸«7ÎQ¡ü™ñ5®à{ ß÷¿ ¶á ‹zý=bÊžÓ74a„Cì‘8é)9{*(Ãi"³90Tñ?®âÄOEÔ¶LÇ0U„)ÀL<ÉKS)u=©¬ÁÉÄõ°Hõ{æ¯È6úHSòâtŠ1µ¦*ü…È DD]Û訢$ÉÅw--1 MGô1Ós7Á‘À|‹½!ô-(/ÍC¼¾‚Eø(t<™;BPZ–þµnÛVß²Uq5 ÁèaìúÐ,vCrשùœ¦í «ƒk&þØjÚù[îšÜð‘»»É‰ç¢ÆtÀ[En2 n¯×éC0¯•äP>xŽàypï2„AôŠYo§Ùê¨eÙºøë"úÔÓ®*6êõ7àd£ß6u½gÞÂ#Þ ›mÖáчÁ iVEºb›^tXTÆT/×vymÀ§Óýæh¤Š¦»l¹I‡aCÜ9É»I¤$‰W›³ÝÂ[X߀xY…ˆ€DÍ~ïÖTEÓµ)¢Y›™–‰è§‹§0y¹ÆKœ,¼ª¥‹ÙÌM%ß0“ÄLUS'ŽhRZš•õQäL•J²ÿÓù £þØæ®÷@‰ä8CÞå4öÙ…ÆÆK”õÝ3(“qÛ¡›¦¥QèüI‚ñ!“w@î%üP^#>ž'Ø£ü] a¥]^ðþRsÃðX=*üÒˆ¦8œ×€¢ÔÙ§ñÈŒ«dF&ìFçÔ•QAÜOI•m}⬦)Æ€öáWÖ“©[àf:ØšèE>Qïw ½´… áN:"2,MŽ2dX9ÏL—^³pÎپȸ{ÑFnæ‘m9$n£Ü8G!ÆEîs G"0ßœ*‚ÂS¹#¾É„O-梛Üc¢ŠY"mi2O¡Ý¶(×û4™zZÙ35  ‡L?Á䌪 ºÏ¯RŠòd•€EÂèìíÎÉBÌz”BqZ‹âIâÎ ÂkiÍ0Dmþ2Çøöü´…?YfõFQã(¦•ßî±ë‘CîµJ¡êqyüTânËó—;=Ÿ¥ùknkÓ9†Îïÿâ?žÑ¯> v䨕Gëbj†É4öﲌ)jPw-}çZ=®u¯ý=À|LÜ Ükƒáò k³FÌ»')mø” LJ¸‹]ÜÒŽÃ8«û—‹JàþLÖÕ€AG#½RfT¨l_ c£Úñª<âeG>õ74ÂöMmK7²ì KX‘Y{“Ÿ4.Ð*.ŠT÷Ò\G÷dzv.jEƒSNK;;ÏÆxÔr8ßvµ1Y$¾B£‹EKb(dñüošú(3Så}¸i_Æ™`ŸÙÀWÒÛ‹ð(_HP-½O 'º„·çØ &*õ%KÅ‹}¬E‹0Tdv õ[@‘)Šb‚\´tà ë#íÌwYáÅitƒsäIø9¬òàFŸ=D[áÖ»i0ÏåÿIl<Å‚:C¾so¬'\¡’òt•î¥&”¸…6Ø©hÂ:·Ó¬^áÔÃd²B@×%žQ¡ï)gW½¸çi7‡] š-Ð<жðþ#$A-ÂÇßÁûMóqø¬IwÖ˜;ªÅ¼\´7Ck]c¶,DZÕâtçqé8&$žtbš‰þoM9þÓ¹ééÜôtnz:7=›žÎMO禧sÓÓ¹é?7-ŠÊ­£Ó¼ªÝUŸ–Naút þPKÞGÔöëU"PKW 7(doc/org/w3c/css/sac/SiblingSelector.htmlí[íoâ8ÿÎ_áMµ·­n!}™•N@ IÚf”¤û‚Râ–ܤ JLÙênÿ÷{lÇ!o0P:݈qìçÝÏó³ãvÐ,Õý<ÖÑ;¢ñí`h¨HjËò§ U–5Wã7>tNÏ›xQ ޼P–uSBÒŒù¥,/—ËÎò¢'²kË3ò~Ã8NqÇ'¾Ôouh·M¼{¸Ý†KJ“~éŠÆo¢káÄ#ØG÷/èßÞ³çÇSt|¿Bu>tÎ'§g'(ŽÐþÌø}€÷%¼ùRuŸžþ‚q×p‡z¿å÷a=:8ÄS'­®œÝhuGº« Sé=é ~YƉŸJHµLW7ÝžZ€2ÓÎ4M;©7íT¡ "8yð¦X¢´††ùOdëCÔ“Ròât†1‘µiO"øw" ÝØúUOêtäü½êÝa=˜t=ɡ͌²£ÚÆØEäeŽ3JÔ.é4 æ:<,¢)õZ‘/Ý€„øø¤õŸ‚×ÜKpD:`ÄÅýAè] ^VEúØúìÂQ–2÷H«;°´Ïhp­ZCËîIËY@°ÖcχË"ÃTVîÞx!ÇUlYWȵÆ`è»b‹»ÜGÂü‘÷|ï%Ï¥>£w»²Âzp“¥_‚y»Ð ] A{ðè13€b_R)í*ƒ¡Ž–­é ÿ©„>š{Ó“ÎNOWëÃáXÑ4ü†&~팕]Cgçv4RìÏ=‰†®kÓ âƒö1{+»éðººCÅqz’é=¼DÅax&5*9y’”$ñ²ªmMÞ’ˆ§/Ê""B"eh\›=iŠixJè.»f¦e]´-§ñ“›¿±ñ3Nž¼l§‹§'/yéЉš\ÁÌ)SºŠ#”ºƒ¾•éÊP•ödÿ-ºOçaJj{È6÷¦_hFÙAœ1²ƒ4WìÕ$ŸA l즬ðUC/M \ßT’`¼ò.ôû~(Æˆç žÒDÞƒ”l#––ùÖÂAÞ¿·½0ÜF,ƒvþÖÍp8oC–ÞF è»Y™å*™%öCã©+KIð8#åÌ€lëÏjý®>¢cø'ÉÈ­`µÔ= 8Æ¿ íµáº•IؘN-@¥õQ†:+‹ª4ÌãF¤ú¼âBíE•ò̧µ­ßqy¸„evb<ÍC,„ØQSÿÍ- {I8áUæÛÈBD/yĤ'eEtп²¡êär ÔlŠ XGÌ´Ðfz_A) :ø Ž9nèõ€ö â8%(ËŒFÇ?5ê SvJ3(NÛQüxOy¾ô•0D*¿)düéä#Pÿþd™ÁâtMKü\cÚYíÉVÙé|:ŠéSšv5ç_4:?«ò—Ü֦Æÿ·âΣ‡‡þ$+…RÿÊЇÚj"dÝã:®½†Â&³¸@Pò¥5Æòîºh¹áe³Ô>&^î#´ °NæJfȬŠ-3—–Á¬njÍP6³°Ž±+ƒV˜i ,8Jƒº7çðQ´…Œ•Ô’épyªL]@í”–FWTš+âÔYÌq’ç­ô’,êjZ§\¼K\ÉC­¯1³3¡˜y„xó?]-¢È[Sæt…d‚#?]Fß^â!õå¸lJc¤„i|É…zùŽEh†­«îDÑ~UTXeN}×– !§Zšž‹ÒÙÔ¹+³¾+q™i¹Ì¥ðã™" ¾,‰”㯺dƒf6ûj½WQ.&M%ÓlZÈœmZx]|uáU@W*¼ èÊõîC|ƒ=ÂFCXÊ–iç¥ ôwšhe¤’ÃÌ`’— T)_¯+ÕŒ©/‹ 7@+¡ù•tÈֆ̑)¥ë”§´t'$wp9ßf1l‰dê¥ýH1?OL "õÅ/FÔŒz‹§.Í>Ÿ)7ÏÛ…J'A4ôðû“‡$~š°Â;©í¿ˆÝŠw µ g^w÷õhë‹JQ®¢Š²[U™wÊeƒ=bZDÛ눮B†kl¦rþüŠÔΘ¨´ )Õ5,³‰Ý†û1¾1†Z•W©m?òÖhD~“FM·ödfjµ2¬ñªßÙ‹•¦;PÈ4¥TøÖÜØÑÚ2»¹®îÁh¬óYã­½˜™úµâwUFµæ½˜ŒmKÕ2åÄ Ðûví4Û¦ç~¢8ú­f冬po¾¹CÛ²]Yoß‹«ÿÖȦÞÎóy ÖÖ þãK¦[:~Kø‡øÊi øW]&~GøoÄDÿ À÷~˜˜±Ý—9>>‘ú…KŽOÞº3Œ" Ï¶„‰Ñ4ŽÒÀÇ €#.n§\ʱ-â?×øïȾ¥sECæÜ*|KçÚ˜,’(e^dϲP*¤ùÜøê-ÞòÈwpi¹]x¶ºOòöÞ~ ÇëÀÿÃŽ—…Ã"®–P £Ø´-$÷ë»Lb›‰ïu—Iìëþ%AÆÙ†M& ¾bK­Ô]mÏUíÞ\ô[«ýzÕÛ00ÛEåH‰#/D FÐíÔÕÊõ϶4wÝפ¥›xi?{á§<@¾r>¦³RE͆#n“;F¤°{™m¹–·Û‹Øµ%kv.sðZ ªfèúU†\wª ò«…V Ö£KT©¯7ŨÒú;c¾¢Ï(4k´–"/n‹ù¸b¿ƒ š ¥—53J’½Hl\‹ ü™µN)z(j¾Üa,½[æÔɶù!êWq˜=²hl,n¶l[,ÏM¶-<¡©Úö]JHæ»âs•ºï6@º·2SÌ4Z«öXëuF{C' X>U·ãN6j|ÂØð¬P<,´«yoõ„q`¹.DwéÑdã!»û˜øi«svY×ïö¨—ÿpÚîpÚîpÚîpÚ.NÛNÛNÛNÛNÛýé§ír0Z;p'Ðp®-¸ô¿T(#þïDÿPK“Æùô½Ì4PKW 7'doc/org/w3c/css/sac/SimpleSelector.htmlíZmo›Hþî_±¥ºk¢;›¼U:%¶% 8áŠÁ‚MÚÜ‹àMÌ7ºë¿Ù]ÀæÅ©·•z²åØf_fžfgžeÓ}£˜2¾«èt4¾蚌„¶(~<–EQÁ ï8é";Aâ¥^8¾(ª†€„YšF§¢¸X,:‹ãN߉ØgéÜ?ý0LHgšN…~«û¦Ý6ÈbìÜ‘v.©Lú¥J ïDç$ ±“’)ºyB;Î4tÑÞ̓çOÑaç¤s498ÜGa€Fðg„èðÞ§ð~ÿ’UŒŽÞ#&kXWû-Û›G>±‰OÜ4Œ[]1kouG*–!ÔžpOža“½]Qb#¸ÇÞ&÷^Ô^‡rS A»wç0/ø^pŸÙl, t LKQÿ€>j ¾è ‡¿ÀVu},)ŠfœC¿¶Ç’Ì®a°}9IÖuO q‹-ú¡@tÐ1Fïxé—·*¼†C K¶Ý çqàÄ2ñýC¡ÑÈÉ­'i.ªÖÖð– T —!" ‘¤kçFOp N]e×̵lˆ²!p>…ûW6|$ñ£Gíäa>wâ§]å`ÉÖMYÒ0 RÔôÍlNW€©t$³ø×à&‰Î`A*[`‹÷ž¦“Àó)/@3d¯&4y@ÙÜ5JÙÐ+ûN’¬hý¦ö§1!›aÜ÷¸«12%QL\šÅÛ¾—¤›ÀRŠ)ßä-ò¹íøþ&°4:ø{#š?jC’ÞÐŒ}Èr•È’ û¡ðÔ•¥‚Ø»›¥åÌ€,ó#Ïjý®:¢sø'›ÉÄ-`µÔ =Ê °µ¿ íµáº•!lL'@ ÊÒò(B•mïrø]^œ¸Kòl_Ô\¨¾¨RŸùʶÔ+‰û(wN†ÀP?á¼;s_îWÙõ\„åÈøŽ¤=!«nƒþЂrPÀC¨°W.Ñëd&z^ÜWÈà‡_Þí¯ç½ÈÞGœ>¼aƒOü`ï]£¹°”\šÙHÒÂÛØ™yhЗ|ɼ3Çønÿ ¤?Qd4  ]ÃÌ®ñì Uì¥ÈVùžóe’‡ui9Ôîýqã½Ïªïi[6Vþû_þ5ÔT½ÜäÒÆV© Hè…©Ôâñå€`³š~º¥êJöÈÙK•eî->ÕPšé^Fø€è[•IK’ÈlDŠ”¼4©{q«ÆRZUYü™ @YAVd‰ò*bKE)tÇ¡àá"|7¯F'ÏœØqa²â¤Îk 6  ¸_C«Â`šm_¥¾>ýÊUŸÐìõÅ•©/Pjºy¬¥îM´Vç¾@í8!<¨œZ{‹¶'| †gÕ"–­ç*Õ¼ßhÍ£|Š"‡,É—˜qC=+XÖŠÕÉÄ f„2œéä6çÆ0&µÇ?ùã’äœÊN‚9jAÝ?ýÜ 4´3C5d%Ò«Æü …7¨’­u4›Yg…‹’Y²©¨¯¨ÂomIžHÆõÄ€ù[ÕU›@kj~AŠ­+‘)[Q2ÖL£IÝ3¶S|¡éJUW©m;ñæh¤¸Ñ¢¦®-•ŠFý#é5]õž­T)ª-G•YSCÇvŠ4 „L$åOIVëÚÖôn¥d¬»g][)3Ôs kWUEµæ­”Œ-SVm2åD£[—˵Ël“‘ÛA±ÕKÅ,YÑÞܹ•BË4oe½}+5XýÔ¨¦ÞÎó9ÏÈë k…±ð-ç%¿!aA|Kºa™“tþ/j÷ˆ[²+Þ,,ïH±ëÂOÙÛú•¦MC‘ñé Î 1VR¯êÕ®ÌYø‹®©È¸ñ‘IÃÃüé‡UÕ²|d2016Gåg-'k7aš†óײ¡?íùÇ¿;bÛ±íŽØvGl»#¶ÝÛîˆmwÄö³±„­vÊ–3Æ&î·zÊ è¿oQEüŸìþPK­a‰©hâ'PKW 7.doc/org/w3c/css/sac/helpers/ParserFactory.htmlímoÚFø;¿âæªk¢›¼TšŒ¶IÐÀFÆm×}‰û7Æfömýï{îÎü kZ­S,0öùžçž÷ÍŸtKs> tã úhø®ÓïiHª+ʇsMQtG.äÆ)rb&>õ£Šb˜’f”..eµZÉ«s9ЧŠc+3:.” Š"{Ô“ZµæOõºIVC<%õ:Ü2œìÇhëâ!º&!‰1%? Oø{‘‹ŽÆK?ðЩ|!ŸÝ6NQ¢|Íè^Àç>oEšá ³Fã-âÈžÓ7Zµ!Žw±K£ø¡ÖTÒáZs`8md¶†*Ý‘‡U{‰„4Ët ÓQ%àXqe7Iä»òŒ 'rrœ$ÃÖ!Ûè#UJèC@’!TBL¦ªDÉgª& ÝØFW•dYÙþld>‰“¨J#6Ì‘4»7t}XMâÆþ‚„É2t™:Ðʽhåø4 Gǵ¿jŽŽIHeãrÎ.({ªJ9>¤«ÚX†-¨•ÔšKÿˆ:ךշlUZÍ|J$an·—»b” %ªÙFNÛvÕEŽ5Y¿ï´íì©PR¦ßq|K£…Ôâ8àiSióBf¯’;Qßš‡RNF0Ž`ÜŸb.„Àï@'ÚiwúêX¶ný }èéÎ*6¯AÛF¿?lëzϼ†!q?¶5~“GýQ•˜í:6;é`"lŽ©žoäòÊ€£Ûýöh¤J&¾ïàX#Ap*U2y;ñã„ÆÑªÈm‰Þ‰‰çy"Q»ß»6UÉe“XBïÓ{.Z>E"áÌzÖâ/˜ltOâ{Ÿ¬êÉr>ÇñƒÌœ˜é‚ÿä‘u£²f§e¥0M¥ܲ™œéŸÃq²¸ÇÔ¿‚¼vïXT9€œ¡9€š.?ª¨±É=”ÂîX”Ïu53¶V}VþiLÈS˜w`Þ·ÐCÁL<²ˆ‰Ëây=ðúÊô5Èw ù\ÇAðÊzlòw Š¥š:Äë§Ðts÷“¤ð¸¥ðÀÂ/tÆÒ°ûÓÍG d[D„k5ƒgÉÑm‚a15”x=Ëõþ€X‡ûš phïÅ|qŸ›Æï)·kž2’ÿÕb(_QO U¥4uZ]BöHˆ¶ êÊѸƘˢ»P™Úí‘ô@Ž€r$R®ªîc$ü:³¯bJ½ÙÅ0Ø9/XHR£IŒçëPÑiµƒiâaFæ›ã+Xà |…'ëuÐ4­ìr·x\ Ðo°Öòº6œÙ\ÎVK6p^iiš¼Ìll亸þ[üt{F??²©<Ü(„d½dJ¾MŒÔ‚Jq䨇+AÍ EÞêÍKg%Ã>œ#Š×^ÿò0Ú=B±<ôlþ.Ê ¡%+sŠ…ZªÞ|eh˜zu]˜V†ÐØ M5ÉE„ô6ð9 æÍœ¶eÅꯥ|Ê Ô¸°7F”sg(‚6S­óG9ÀáT¶ÆŸˆK™Ù÷×hdk%»I-c—$`f|Ržú â-tàÛ¢ën¸<©Ë`bæ„©è¬kÒÖb9|Wt!ˆ—406I¬™ "M…¡S¬â*'pá'©¸SÊK¼XñÃ0·ÆÒìHØâ;ͱì+¬íªÒ ÷•ϧûÊýóGËý­T®Á±•Ê<È ÁžNµ(ˆb)ßœåöæ°¬ðÛÐF‚þ\êÎ…º]ÉŽ/mG«­e[MÍÒ fN;«uhÈÁÌX ª€™)©™)åôõ*7tt,mŠÅ€Në踩ðEkÂ}DùšseHIÓdÁĈG»Mlm1ÅüË€“þ¬v²¯äËX]È5¼åš.äˆG,LXMV‰FÝg é»ù!*D¾Ì΄ {.dÉg5ó9¾#b˜Ùøæî[¸hgf¯b` ´òé Mý{¢„„Q• IúF ‡‚@çñ÷këay{¬=¹MÓñn'q4¿åÙá¶ý¿—3š n–£å¸ì­µÑ'hÍb¤ù­œ¿:_4ÉŸK$'*v^œ NfZä‘FÔŸ©M h/Èmº…ä@PðRŸ¿ó> Ô\Á0âb9 sªá„®Ár¡ë­çHu¢dMá`а–\ì—¢Ò³ðý˜²$^Q-ü½•2ßQ%ê}ó«$œæ•4æèYä©î§+:ã¬5¶‹ÙdÓOw,DZùF¼rfQÍŸ´E“Nýawiý/5/5/5/5/5/5/5/5ÿÛšueWÚ«ÉJ˪"q{¯`ÿb ‰ÿuýPK`.©ÆU&PKW 7.doc/org/w3c/css/sac/helpers/package-frame.html}“kkÛ0†¿çWœ 66†%§MatvÀ¥ ó%8*!Ÿ†b‹Ä«cK­—ýúIŽG3h²¥sŽž÷=’s¦Û,)ÌYÁòÉ ‹õ]@HÈÂóÂÛc`-¯e©Ê¦æ!4A€öJéºww¸iw„ed¯Õ„TM#.T¦#çÆ²Ñ-ùNX–þ55͇záyE-Z®DÛü䯼hrø´})«Æx‚oØãÏÐÔë'i^a<ÑãAû¯P·¶}}q¶`Ž4ŒfÊq.%–<Ç{QE+GFNL™‰S=‹S×´…D¤ £ sÑ•päù³‚L…h‘|‡ŒFà"©N•{!㨋”ø¥ˆÎF0ÏèÌE“Ëñ–€û ËE+3mŠkÒ³A#ÇOà øA¥™‹º}©L„3Ó¨ ËßÂE_Æš<òV+ÍZ~¬T•˜5µ2qÞû¦]Z A$Z ’A %_Þž°é'ÅÛP.Ê+.e¿š^±È!ÞÔ!†Î´Ãó# ~š…T³ÛÖ‹Í]4¶íVOqìeN–™WIºÎ¼åôúæ‚e½†IÈaÏõV¿ ö\&-”8üõÄÏ.ŒYòVŠvÆsÕ¼é5r¡¬áŠÖ÷ù§à…úð™Oz¥¤·æÜiÓa3u¾PKµ„¼  —PKW 70doc/org/w3c/css/sac/helpers/package-summary.htmlíXmoÚHþί˜nÕk¢“mÈ‹tj0’±M@™mr¹/Ñ⋱‘½ÁNýï7ë—€!$´:E: Ë€×;;óÌÌÎì#š,פ7CºtЇá·v¿gQ4íúÔÔ4‹ZùÄ™ZoY˜øÂBhší ÷B,¾hZš¦jzªFñL£žv/æÁ™DQÂÕ©˜’V­ùAQžÙŒ+ ¥NùcV> —<ä1| ã'ø›-Ù4šÀÑøÑ¦ÐPÏÔ“Ûzã¢øq¢%4Îðþ‚÷ù`ÚNêõsÈ”ÓíÛ­‚ALu’$jÂ&ê=‘‹Ú LnPšÖòÔÔšm׺ö¥éö]O'é½/8Á4›âpÝð…Äœ'S//Qãàv€ºCŒôUÛðÊÙšK’ÿÂBô¢Õ("æ|ŸS”û‰èþjò§|ó‰ìÖJà'bdÖó’wÀ‡m‰WX샬'…ß”lµ öã}0uQöuHZÖ´¬]dVÞœŠbýÙ½¨Ö>xîuÞ·ZM{ ×äßÙÊLݪÅm6ü-_OJF½¿°±)8®w5 äxòÈóPÓG+·öFÿÀbõì+À÷Õ¸´ó”ÎûOº(TúÿKÈߨI96,žq¡“âj·:võQ‰ ‚r«†+Žn+s\x]ßl}Àƒü»£ü\ÖuÔ} 9x&iŒq £ϻ\Ʋ™È>Æ%Œîb6ç«ÜAf>YÂü||~àGÓ²ý™E4·|ÜàŸ´†êWZkÕìo”DyènÒ†BO•§ØŽõ2K)x rU©¼{Òª‡ ìæ—Rjó$o¼ÆP„M²8áq‡MD´*’œàeüpWÈI«²Xæ7w©h •Þ¹±MŠ«5‡­<ÇU »"°m—RwPÝ/RØq$D4ߋŢÿ["›ã?pÙ—=pÙ—=pÙ—=pÙwã²Ï帜˜MÇFMÏ·lÀ_Ãè®k×kµ_0ä…ãôMËêº×ð¨úfKŽAxpÓë™þ½Eо¸Xb2®q¾ŠËGŽv8æ```7œ7CÖ¢IRǯ:ù𳜳l±ííÞ ˆµ-ˆç›Ètº×®#HÊ0º-Ç2´RÄ:¸È«eø·’9›S6éBÍŸ§Ó½hbOƒ3mÏ 6•µ³”ƒ2½ÙðÊ9:i‚·BR:ýk:ÌgW°Ë¬oFO¢x|œ~1åG¢ÙkNî·ÒÊ[ÚòxÍ‚Oç`¤œ»ÇŽ”ÏF×Ýú!ÞZÿ1‰z¬&qΉ·µœò3` T&úU “äd]!ü€ÕW…}¦Ⱦ ‰È‚DdÅ7VQŸÊýÎâñ„onä{wEéjèvOÌ)®r¦T·ªrÛ5Ç׳ÊA÷O¨m*Œ•ᾚÝš‘h‘š©ö,‡t­BÛÒ·o Ç+Kµ®ýG°ŒFåì?‚ùNÚXÙ˜r—M©ÙhûPÅ6„6ÐíT¢•W»š\½­ì*@×€¿øñ¤h†ºOQA–,`Á (IzòiŸ¿°A"Qšh®¦Ù# §k a&IÁh^Áütz¾ÁÙ¾—”Aw½êvt¿Ó¨_iU6—~+ù«»ÍJ=›¤Äv­×)IIJ€w å-Û lqÓ9k(Kª„ÚCeë@{è•àOgÞR…%ج¬µ%ùŠi~)=¶¬Æ»Ývm«ˆ€•ºrá¥N¤‘N…x—ÆJL7BÈé–”5ŠY$ا\I«µ$LÇš7üB#þ¦ðßµCw)Oú!Ë)k‡Ϫ¾]1»ÂPœî³U¶ñµùUêèDB/®"$›ÌtÅK›^x½ÍÈ9¦¢’£¸F(J!€+)7ŸÚívÎî½Ãøås´’ëúÕŒ ┲„ƒŽûªÛMÉn†—¤ÛU_µ¦þˆüðp|&”p,I {ð7~À%+Ào‹mU— ïÜ8ïþêõŒ‚‰z¥ìôoÔñI>‚ ÊÁ»^ïhÄó8O¢AG%£r*œBGà¢ã¢öBÇD¹Ryð+Ùï/Á4Í£4÷àÅ@°ÁÅW•8Ô#“8ýÌ£xPÈ}MÄŠ vЃ’ö`¿×{ Av;™øó{ê¤ò¹~ A:½›û³ÁŠ\VtÙ–SIø\ÑbßÐ…ØüÑÚq:.–d}ô`8?1—’W‹­$£e³|õjÛÇaµ· o%ÍdI¨´lö™¤QZb*-ZþTÔDgÅv­²cZÖÄ ú\ÑÀj¢ƒ,–|¡hârθ½bOå ÄÓ¥Íeu¦gb’ǪÀõ-­¤ âw5ØÎ,¶JNJ–XVVFO4Ÿa[\²—’ò saeµ„LvÜžÚt÷Šª‰Ï™Ú¨µ{‰©|[èX‹fÿPßSæRV8©„Ò©œ‰h¯àçjk/Û{Ô^(>õå鉜‰X-j5í6­=W4r×›Úæýâ\ðHm÷öªEÓý jºÔ´Mkô4Îó'ºŒ˜n¶2c[^s›^lщÌ/bLôX¾Ñüwo‚,û¦ò3æœê\ÛgYóx°Å:{Át ݺëS‡ÿ7þPK»¿>i]PKW 7(doc/org/w3c/css/sac/package-summary.htmlíZmoâ¸þί8›Ñî¶Ú éËŒVš¤¡EË›Hffç~™Ä-Ù qähuµÿýÛ $@[ítX©(¥$ö9~Ϋc×êŒÚî—± ×î ã­~¯ FÕ4?_¶M³ãvtÃÛÚÙ9¸œDI ‘Ð4í¡ÆLˆø½i®V«Úê²Æø­éNÌ™˜‡oͱ„Ö|áÍJý§juHWcrK«U¼•<å?ÛêèF¸¢åDP¦÷ðYŸyp2]¡çµ·µ‹¯gç§À"àß-áü-^ïñz÷;´m.ÎÎÞbîöܾݬ ÄäÕ¼$©%Ä«ÔÍ´¡RØ®Ck`7Œoô~ŸŸÐ ]{è6Œ-Bˆ‰÷ ’²ßþ» #÷!Mf” ¤† wÂD*®'v·aÔjæúÚô®© KÃpäcÅÙiOzcÄ}LSNR ‰ÇƒX`‡›EäIÍÃ*ˆ|¶rÒ“ÓÊÿ*€Ÿ˜p‰ªl1—?„lÝÄøPùµ ’CšZÿ•zkÔù­«ö¨?š4ŒÕ,Ô@]‡Œøx›ðƒÄª-ÖÈ>à¸ÖÄ…QÜÑÕú©eM²Vm‘LÙYN ÿ*Xl4l­›–ê¡Uö&ùÄÕ\?Heqð9àóà–(5„Aô-1Rj×jõmh&ñŸð¹×q¯ÆùÙÙÏhX»ß[Nox…ô½3¶Úê;;kò¥aHGu'ò«ƒÞ û —½¼±ñÓí"ƒ¾å8 cH–-ÂÛ4 ϽB~½ x"8[mK»ƒ·ñl âe"‚«ß»6 ÍM¹ŸÒ{¥ZÕ¥s pé?kõç=–-)_tUMó9á÷5Ö(Iã¤È©Ë"œê­æ(¥©›-UöTÿM“ø`g[W}öa›Ð%ÂKiUõÁÇ:Fsã>6æ“úxPÆvH’äŸ!Óxš\ª‚Szˆ†]ì÷ í–²¼OcN=™Œ«aˆC`uÖ$ßf#zW%ax¬žìü½ÍhW1÷èû>ŽÇTÈT)Býèè„”8ng¢ï0}Ö¹ªY·’F+JÅn“Ö¶“üŽ ™N￘̪x_ÑÇû`Núú²õ“´aöÀRç9š8÷(%Qž˜™¿o%•Vshÿéf쵆¬–2%”‚ÿ˜#éñA~KEÃH§¦V³;Á\îd8ö ¼W˜]fÃ<ÎÀéÿ7'z6n4÷)èÙ=í¯8*%ŒN~Ý+/†Œ'³Mª»ádN7Ê·ÂÚº1Ãøëéäþ7þ™¦šÄ×…C}8Ê~> Úg…¼7,+E£o…C6Én— )Ÿb]b;û«’´.ÁT2¿¾hVÒùv‹FÙº=cŸ?Va\>YaäN?¹„ã’iH¯)ñƒè¶ÍBÆb5rQðîߤw«,‡5À ñ(8Ú &§ÆüÐÅROØ*?h&⻟•á sKL‚¶Yä«¥BºŒ ÖPƒh[ÙFs—ZgÖ&Ò勉՞N<„Þ!‚84¤ž`ü9’íep,±ù4ˆ*e´=äG#X)qŽT–r¼]òc¬K$ªûRR¥´Ç#’À‰¸¬ßhD¤Mpé“H”ñ¾]êc+­™®Iä‡ôy2IwrgAx‰…9A~bFÌY" í8@â8 <õ> æqH%ß÷XæIÚJ¾"J}dÉ`*QÝ0>§>°˜’$¯¨x‚%Ð%2HþØð“@‚¤’CÀÓ[\ÚaEŽwØ”aË*3…[“L)‡…â¬%T`C*8Ì©˜1¿ö–³µTe¼q‹ôH\Ñæœñ~˜§Û¥¥übÃ=F•J*˜i²ä¥×'²®-‘ „Gb¸>½Ãè ?Fx–(²‡sPwƒö[[oIÂ}y«1<3ÔR’]{Äe óÌp˜aˆöO™Át"ë•-„L§Á—–|Håëæe¹ÕÌñ‘øm†«L ݦ=‘ÆjªzŽ šâð¼y⨠¬q/{všÎ/c–í•òË=äÇbFÎ<šÈz£‡ _¨¯2nú(£²n¢ <'›QÌÀ¨˜qzÓØ¿Ë9±ÛÕ»yø&¡^5Œf¼SÕSé u“4_Ú?«= ~@úë—÷‡i-Ow$QÆøOØyCìÓ› ’¦ÆÂ6æ‰Wb ¼Ezdöz¶ëåèöÙB¾GΆuËÀ§zµE¦wDï“ãÚˆÈ|Êq¥ä±P’cCE¶döÆ¥’,5ØBhgÁ‹ÉÝc2€‰¾Ÿ±•ZAåx€ZOe ,úâk '˜†­TpIÅm”2ËÉ“§|2äñ†E὚Â×VòáÆ'ŠÖ̶Ò›J}|ôûj{åÇïô¢x!¶à-ZTí íµfŽd×”ÈÉ5”~€½ QÝô2B•húÁ¿ÞzöGc•e~¸Q«k4‡š0Os$Ù!©r¿Œ,EÂ]ìÈ#q²‰ ©ªEAúž¯áryÚ-ÕfdñlÕædUk亣AqsïÙª)‚Í:^•výמ°Òø_Y½²z=dõzÈêõÕë!«×CVßíÕº®Ø9g•³ÚW¢äÏYáòœ¹Hÿÿ?PK-‚Ï|0PKW 7%doc/org/w3c/css/sac/package-tree.htmlíZ[oÚH~çWL]í6yÀ&—j¥#lZ°‘í´Û}©3 ÓHvÕÿ¾g|Ã\BÀ©V ââË9g¾óÍœ ÍwºÕq¿Ž Ôs‡4ºkú$ÕåËUGQtWOn\Ë ä2D”Ó0À¾¢¦„¤)çóOвZ­äÕ•²ŵ•)Ÿù׊†‘'|"µjÍwõºIV#ü@êu86Ň¡éÉMtKÂ0'4~BßñOBÔŸ  ùZ¾üÖ¸8Ga€†ð2Ã%º¸†ç'x~üu ]6QlÜí»£U0€É“½(’#졎£õ( üéS­©¤‚µZsÐ7ÿD¶1@ªñ'ŸDSB¸„1ªÄÉ#WÀŠ„z¶ÑU%YVòçZZŽ%b“ªäˆËàw­étìþÈEüiNRK¹ÈctÎAà~x‚P´¢Á$\¹”ûäì¼öo ÁcŽ ¸ L,f​»ªô‚cÒMí'8— , ( ͵fÛÒ¿¢ömÇX¶*­¦” (õC<Ó"€)¦ELŒš=ãj¶‹¬.r­2µÏmÍÎî&ÄkpuÞx9ÆìçR+¶w›ŠK$¾~Ðy½ ‡R߸Žà:}À1-> ~DRªíjíÚ–­€¿!¡/}Ýí©ÒE£ñ›‹`0iºÞ7oáRrN|ÂÎÝp¨Ù_UI¬G×o:.@ÆT¯Ö¼¼7àÑí‚æ8ªdâe³ñý i¯“ßî)‹8 WÛÞîàÝ€ØØ‚xµ !‰´AÿÖT%¦Ÿ0 }NÏcjcýHàb=åôWp¸$lIɪ-f3Ìžd½àI×2ÝMKÝ0à`©ÙnY©NSiƒ«B2öø÷`Ío ®ôW`›cï‡H'À%*¿ͳÃÅÁ–Žrh„nüØ7‚M–0HªûÌ8± xæ2Rtë—\œü ™3≴[÷iÄ![ÏUª˜ý"8HH䱎}ÿX}!\5¢)ñçuHÇÇêìa*ªûÁ|ÁpÁ¼<’N-±Iƒm³i6εò Ñw =ûÑÙÜ'bý§÷i(;„QìÓ„Àù±¬™‹FòHy{p:#Ç©•â³ã8¹õ-ªåŒVn„YDJ"ÜÔ]gûçáw±Òû¢Ç½Ç96h®PÎÛ0˜Ð]/×VŸó4Ó{a"^ OãœÑñ‚“²8w <‹¯¦r6¦æ!+Oꎅ Ñ‚~À_1ÿê•á@J* rC·2„&ßÓ—¥—èŽ~eHGaöËUY¬{,l¥¸ÊT{OeóTª^·zÚ¬öp0ñ ;æ–ve( ÆBVbQµºh'ÔÃþ]@ù©±¾Ö¬]è‰ä|*²D«º¨Ç© ¥Ê09ZgH&òTŽFVT­ñ‰wúTfjÕ6=:‰<LpÀKÂÜ5P‘tìÓà¡,Ÿ›Ú¢ߥJƒ,*W;õ)fP¨Ó1Ç%ñîµQe9I[‚²xw-TWÿ’oÔ%‘niWÞQ–„¹­^]åa¡G¢"¸Dœ-â]¼’ ÚÚû5ºªšP®ÑÜÒ®¼r•©¬Õ-FÅïo›{ëζåºÖp󗯽{ãópvÔvg*ú¿ÝñLð¿mz¾mz¾mz¾mz¾mz¾mz¾mzþšMϼ‰ØÙ÷̶=÷õ#Å}O@üÉK ”üÅî?PK¾d…ÄOà'PKW 7doc/overview-frame.html­SmkÛ0þî_qll [v“2èì€ßÒ„ù G%äÓPl-ñêÚÁRãe¿~’ŒŽm”ÎB§ç¹{î|²¯‚Ô'›,„‰#Èî½héÒ1^O|ŒŒSô€t´á•¨Ú†Ö‡ ´âp‹qß÷F?1Ún‡IŽ÷ⱞâºm93JQ¢™f_ézÂúŒî˜®Ë£Š©¶Ð ÆK¸c ë¨`%lOð…iÙðfûTÕ%XÆÔ¸þdZo¡m ––´G°¦rÝÊuóüÀµiÞÀœ,IδôȺcÅzÍÆgfÇ!q!qãÐAìÔ·]ÉøiB„8èÂ@ -“‡8ˆ‹SÍøž1@õÊA‚}¸à’¼ÈÃùs„1x‡„Z)·Š&5Œµj¶—ðîü4JsõûJ ›¸^‚—æA(ý&‚õ2 Y¦ù Áê>ŽÝ|ã ÕL’«OIºÎÝlfÏeÀ«oÌAï,YOä®Všwô‘‘JÔlÞ6Bñ¼™•)¼Üˆê=‚á!ûÿñ<ùR°Ç1·ížE뺨)çŒëŸÄP³‚@ÐnÇ„ƒ´x32°ÑÌ­kðG´Ý‹pÍΤý¡æ£eÕìÎUgcHþƒíåú_´ªiî'…úϘÓŸÅýƒpɔϡP³`HæOâ_œ~ÏêëøËeç¿Êùý(È6¿n¶üðA:ÕÔªËñá~PKî!©H6PKW 7doc/overview-summary.htmlíXmoâ8þίðzu·­VÁPº:i› å]HPð¶×ûRp!× Ä%[ö¿ß8NhB_–=mu:‰Bbgžy<ž¡¾³<“^mtAG1œ¡‰°BÈUÏ$Ä¢–œ8mwºˆ¦Aœ…LQàUè?¶nÉItÎb–œÍÑôýl‚y2CGÓû0š£nû´}rÓé£$F#øºÉuOáó>Ÿ~C¦MÑI§ó Êé:v¿åmXº YÞRI9ÒRG6Õ‘«l ß±‡EÞQo ¤]º_ÍJ¢+*ã`3 Òž¬q¿Ð³*Ñ ÉÏûì.\+59T:1qãá"(üÂø.ÃåjªŽ Ï·lÀßÁèjhÑ w;_`ÛlÇë–5tÏaH¾OƺY¼ƒðäËh¤û×ñG}q³`¯…Œ«õyyoÃ5€GŸL4ì#HME]ü¬“7·ašñ4Éw½}‚·±³±×„ˆ€Dº3Ûà>ú5žfë3uñÝ”$1—2ªÑ¯âH%ø!„ûåBB­§F_cKDëKæpÌî ¼© 3 ²ìgX¨"7)ÙQxÊX[d6 íEó@'¹•"2~ 9[§l&2¤…ßе]ò€ °¯JEû@ á·@±dÑZÔ¸ˆ })ò)rñ`É´QÃ4\,yóT"ß»’¥¯Ú#±FÞ‹•…ºÇä³›ŠŸ8wR90þ )G÷–D8öíKùT¸ötëGó_ØÝRÉ$âAº`\ÃeZ7úòàDò§Ã&4à<=/Ùýj¤/is=ôºÂïTL@ ¹~ÂÛ#YÊ4 t#Y3·Å2O‰(>ú°E;Y‚eJœÜ¦Áj{¬¾EÈ”“®Çg ñ| )ªÞ¶Òª®W=Ö8üAõ ïQM«¹£;ÑXU¢ÝZZêioÛµž/Ýeñ†æKÆf£fu_«±½ïÖØÚ6áª`L#vÁ‚y/Ì$JRܬÇ'¸ü(âø*+FÖ8´5jê›!_Øó“¼n«ôì›ñ²Ðµæ½™èçHÌÈZZmFp¤ Å‰þ® R‚s «<|Tò¦øDÊci¶Îv)½Þ*ÔZê¸J<2LÑõØ¥Þ¨`϶†Ó„ódµWwXŠþoD‰ÿÐ#zÄCxè=â¡Gü¯{Ämñ}Ò&V]âsu¼Ù&ñ_’0$ÿ¹ûPKC¶0G‚7PKW 7doc/overview-tree.htmlíZ[oâ8~çWx2ÚVZ½ŒVj)PÐB‚’tfg_F&¸Å3!AŽvWóß÷عpoÓLªÕJE-MâóçØçnãnuÜ/#õÜánÛƒ~)UUý|ÑQUÝÕãËZý ¹ å4 °¯ª†© eÊùüJUW«UmuQ Ù½êÚê”ÏüKÕÈÔ&|¢´*wÕªIV#|OªU¸:ÅCÓãAtCÂ0'4~DßðOBŒÔŸ ³Úeíükýì…¯.ÑÙ%ü\ÁÏÇßQÇpÑy½þIånß­JÇÇQ„zÔ2oúXi¨É@¥ÒôÍ?m PS‰ø£O¢)!\AÂM…“®zQ¤ žmt7%jò©TÓTñl«4œŽÝ¹ˆ?ÎI‚D£sw‹ÀNC+L•K¹ONN+ÿT¼æ˜‘€×ÀÚÅL\p1ÚTvÈ+ו`@<‘˜R]Wi´-ý jßt¬e7•Õ”r¢€›üOàvsÂkEš.œÝL_Èq5ÛEV¹Ö™Ú§¶f§£±35x:k¼cö•‡s¥%uÀhCÕ¤Dì¦÷Ñw:¯nȡĞ#xNï±tƒOƒï‘’ ]­=0PÛ²uø×ô¹¯»½¦rV¯ÿ¢ÀÂ#M×ûæ <Šï‘Ö‘÷ ì܇šý¥©ˆ=æÚâMGà 1›k¿¼7àÕí‚‚æ8MÅÄË6fâûgÊA#¿ÞQq®v­Ýã»E±¾Cñb›"B@iƒþÙTGçaï;Ä2ÏëÌ!Ã&Ç ]ù:4ƒM–0I‚=2”÷¹Œ ×ý”Ié2NÈœO$ªO#žgõ Ræ:¦„ …‡*öý©ëàGÆ2ót±Fmý*¤HUÛ€îxN|«µ}ˆ·>Âk[®k ·¿ ÍËŠïÞ^zžw¨ŽoèÁâ¿~ÄDñÿQý PKS¹„![Å%PKW 7doc/package-listË/J×+7NÖK..Ö+NLæÊGåëe¤æ¤sPK7”Æ(PKW 7doc/packages.html­RQOã0 ~ï¯0y8Ý=4Ù`i—UÚÚ¥›z9xBÙjhO]25aeÿž¤ ^O'9Žc;ŸãÏágÙ*•k·ò>‡õïE¾LÄŒý¹HËdv Lèh ²SÚ6®1ZµŒ‰‚©ÛOëûžöÔtÏL–¬v»vÂZc,ÒÊU$‰øYدÕ3Ʊ?̰‰yv  jì”à 6Gø«ª2[ø¾yiÚ ÆtBÏGã`4ÜûU˜Œ'^¦^.¯ ÎG£KÀåRæ"‰"Î>¬ˆçËâJ‘ÃŒXwlÑÖˆŽ@è|F¾:¶µ–Àm)®?gÐÁ;ÀÌȯà&;½<â‹Uö‹›t•¯ÊéëÆ |Q~Õ<…Þ5ÂSg´ƒ½'jeaƒ¨¡ÃÖlCÿtÝ¢²qzºûMoìþç¿i>ï©Ñ¾Ò0’\wj‡pÀÎúQr6Oþcãa ö±}ÙíTw|/Y?}.KC]Î>hñ”*“@íð7ÞPKq7m|™PKW 7doc/resources/inherit.gifs÷t³°Lägàch``øÿÿ?ƒ3€D˜$Zú9î]'áR4+ëã• Ö÷¦-kõce°PKMüƒ99PKW 7doc/serialized-form.htmlíY[ÚF~÷¯˜LÔfW•mØÝHUÖ ùÆ‚6²¤éKdÌ,¸16Ën«ü÷žÛ`Ù%i¢´ø6g¾s™scОY®¼Û¨Œ†hüÆL„eU}wiªªXÅÀ•Òj£€†i³8KÃDUm#/E¦ ‹Vë%àÁ Ú]É'4“øO€ìet!ij9 IÚpà¼Fž=Dœ³‡„äsBFÜÌÈ=S£<ǨïÙ½:…"Þ ˜öùkÐMÒ|ӌˤœÍÈ#/ܮ҈ ­ãtš­ƒ˜%äì\úKBp,CJR¦€¶«¿a|À›Âãké(P0â,ÕÂt’f¸Ö{dܘîÐõ:x=Á`¦$ §ðXgx…êÜØê@~ {r{(pÇÈÑߺWÆÔáí´MûIH?°l‰»F5U…™žçã¥\£C•.ðÁûx 3$qú1Çåì@7†62\ϲAþFïVÐïàv«õ†…Ǻe œxU<ûcÝÏ@ì¿tï}s <~²ØhœÎåÖ.Ïm8z=ê¾ßÁNxg„Ô$IÒÆ•üpÓœÑl½«íž¼ [;"^6ED„DúppãtpËM(FoËgaZAb)8÷Ÿù³;Bïb²–óÕbÒ…G!Hßs 9»—¥ fkF×-çhªêqJ¡åÏé$_^C¼X_!ÏgùÃè#ÄÉçûð0“0Ï¿‡=«2JÈ1& €î[š³dJ–”D§8‹™n›—v³ôžr•þàwÈF2 Ú"97+¦êtü ˜˜Š2œ(Y¢2kñ /ÓòÂrZ’œÜÈf¸î¨AóJt€À0óã›ñ4/¸…™†^ß~"¤É%½Å%–ÆfÈ¥àDNù)VP*ÔÖÏÃppC.Þ¥?òã[ ®ý8F\Cð`â…±?˜Ž¼ÐÒL¦ád kGX½-rcÊžë®V+gõÁ‘*swãuG˜1áR! Ì0.´%²\‡~ÚÏ<ÖO~)·“uþ`KÖY™ó#¼?=}ïžþäž}„³zg§½Ós(æD¬`øPÂ!¹­’%²Œ$£2J#q­ÒÔ§VË=©CýR\pâ’[«WóÖ/YE}S“œ ^RëG76šú½¦¢›ôÞEÞà΋ãпœÆÃ»Á8¸òc<ƒûñõ.‡¿úÁÝÍíäf¼ÁÍ¿z2yQô*j §Wã=`jsu/xB:5¨æ,Á=Ã|0X¤zG µ€>õO= û±[S©Bo¿9º`+œÿ|ð­¨âÐ ‡ƒîÃBt ¶@í¾KM7ˆ²úõ I !š†þ…ËúVêÆþߨ6MH‘5AËþE"SìÓÑè­Màsè5€Jô[ðþsŒ°è¢Ir`Åš¤œœíC<ÝíÐî.®Û4ðq¡‹ 24Á6 Õ|tL‚ÿŸÛÄÝ‘L˜˜0eúšP’mû»%¬Ûü}ô…î~¡‹²~:è[“Ïé¶ÚrÙóý“üþù‘Ãáž`{ýí$‚ÖØ›\žüó1JU*»Ï†z*™ýr©gi5ó’V6ý4ªÂ'ý´»d—΢Òr¶D[>ЊIhS-™¨l¶]É<ãõ¶–IµÀÂtùçLè&€$¨ZqÝóUþ÷R ¤@T@TbRKä±ory”æž^ùß\ O¦H»`ÛìϵkYµi!gv7l¸l„ ÌêŽÈœ_{xÜìf n;m£Ýkï-w7®ßm¶Ò¿[ÿPK º"jÐ^ PKW 7!org/w3c/css/sac/CSSException.java­Wmo9þ ¿bå‰Ð.$§V!5¢œ.º6€(½O‘ÙX·‹½g{!Ñ)ÿýÆÞ7`!"Q-=~æ™™ÇcãŸ7á†2yV|hgнºº‚©âxˆð€3²Z*ÃÓ¥µo}cZ³ J5£áFhÃMjä¦DBÆrñÜ.à–.‹àÆd€Š> PÕ\ª%Yü›" ±Sש‘ùLþF.á^ð*ÍÍó™g7^Ç1Œ-eM€Õ C"c’žï¯×ko}éIµð+ÞþW\°Ø§½vû4"²2·¤°–½‰¸. ª9 ¹D s%—0¹þ=»uÃÉ„ ¥ðÈÐ'‹þô&ìÁp2=˜ØÐ½ŸlÅÚ+èz—pÑé\ø~÷tÿèu®z—!‰1"~ FO œ„ßLXð‹-,ÍExÖ%½ßlúçÎÉç‚÷éWÜþê9üS·ÈRIpñ˜' ÂW„¿¬ 4|:‹yAL¥Ü¢ ødP„”×T¾Äjá¿fh$J †01Š‹è~¶àxÙqžå•"ô#:Á€Ï9)·ðíw—цêÀÜUDuC)>ÞßNîFÛ?oF_Gã1Ù S÷wcKG¹JP9©Y¯BÐi’†ot{û}ú8¹¿»û>žæŽÐÝë–‘/±b1ÁÇVfë2C,ÊÈßÈ`òÏíôúG³¸(¾àœ¥±’©¶b¡“´™í¬eÎwÊ·å9¯åäqOÖ›œ¤â—k‘Ažô ²U€÷R©U‘ق>ŠŒ~†=½—EU ç~ì¤. Û]\±8Xö€ºJϧ¯¿{Ê2MØÈëÞ† ™¡6Å@àzë(o‡™Éms½uFgÚ®½üNТ+Xð†mžåMòÝ£¬¬rv8CMVºŸS*Ót-XsÙӈˆVo»y‡Ï SlI{m«8hv8°"½#6k…ý7§;«è#Áo )Ó–…,¤PòÍË4÷NÖ{ªA“aNÙ‹³º™caƒ«zÚ¾àä :.íòBkÃkµÎRÒØUìq•£I•ÐŽoˆ†ñ¸lSÅûÃDJ®Ù,¦™ÙOê^D´r ¯aL Œ¶½–DJÏ%¾»TÀ#”˜Ýš[!Õhú@.ó”-Ð|Ëì\Si³–†çÚÍØ=9oJXã0ÖhIµðz›°Õ¦ÜJ“È‚ˆÞ¬¹|ÝdÀÈ`Ïiì5vï×ßÙ^»wj5‹]ˆêÒ¨í­–òMavemÚ„ä‹/ù9© 9eï-'R{ãeo°WnŸüýáôO‰ÒƬx9ƒ×Žþ¦ŒëW-+ôÀ O’‘Zs9T§xl_O™ŠÉKóPKäò¹1¶ PKW 7&org/w3c/css/sac/CSSParseException.javaíXßOÛH~&ÅH媜íN…^UÄ¡kUU@Eï©ÚØ{[g×Ý]'E§þï7³öúG0Búp‘@ñþøvvæûfÆ™<ÁS8Öŵ‘iæ`'Þ…ý/^À•6yW2A¸Â)­PV'Ë9¯ßù[X+⬴蜅·Ê:éJ‡ gp‰q¦t®Óëq3gÂI­DwN ÐÐ#*Z5ÓfN+¾–èxè¨tºÃ;”>(¹@c¥»ÞxãQžÃ9›l ТY`Aæ\q0™,—Ëhù<Ò&´vON1ù„öòöËŒŒ¥+K6ÊkÅÖ»LZÊ¡™‰!Ös´03zG့v™cJV«ˆNhE€ß~›ÀñÅÅ{a,ž|‹±àûGŸÅBŒ°=‡g{{{“½g“ýß`ïÙÁÞïÏ…"ÇŒŒ4pò­€m™Œ )ÛšÒ•â(¶6"ÏŽF“§þ¤‹Â–¹ ï > >Ðmh,…QR¥QmÙËâÕ%߃Q°”äJ©â¼¤àÈ š oë˜TJŽ©1D*ÿÜ8Mt\ÎQ¹àL“1.Dî2]¦™_.Š"—±Çf®Á)°•é}o°Õ6“z`pÚ?gB%9E¬cÈ ö¦o£7^=èÞJ“U±+Ež_3‚Á¯¥4˜TèF/«›# Î:ɤƒX(°r^ä×´O$¼´²¢uYD Épâ ß+‘³¶ŸŽe¼œ¯Ú`\ç±¢]z`Ëiœ“Θ–äœÆ/lIu*ÉHºÚIS™“6øK# 2@Ó°i1»Ç¾„ß>Ç…äož“Û~R”3ð>#È¢@8ExôDWQ²œ’C¡²ífÔð›C•ØžÉðïèãÿF.˜¬Î0¯J#{ã>ȥ³r>Ess.Öy9WÝYÿÏË?”Í(6^ —z5 a[V‡JÀ)ó\›¨ÆPA-1¥gʘ–ppÐK¦P œ•9,3ÊZÄŽ>ÛLÌñm9\z©:¡öÖ,%€6ßµˆj.7ûé¨)e‚:ˆ=_“Þż¹ÎevSûa2ZÙ“W—ö{Âw=ýŒ±óÚwP-„E ^ëyo›'Tx6G¨g'U$+ò܈ÊNM‡ÚÒq€ví…¶lY Ù©—ì޶X6”z)oýAùùøÓÅ?g—G?œŸ‡I¢ÍÕ QŠîÃùÛfk˳þ¢Óf|§sLË»þêãÎ ¯ç{~o™ÙÐ3¸éª(‘@ZÏŠŽðÕP&üÉY9öRˆ¤ú6ÿ ]Ïׄ„Ìmyî‘dó˜*©Æ8¶¯|ÈKžäÎßÚ³žB™$Tp5‘Np¤®Û~XXÑÕx´µµå:¼#¶¾ªÆ-N«¿ŸIbkU€5å4×Ö!qL}_EѤšKåsˆįÎKÚoÐê|QÑŒüFòœ"b+À^˱á$ÏṬO÷ .6­Z¥ÇrW²k;ñôܧGR™®Ñ©ú‡¯ŽšÈ-¤O,ÈÅëÝ£^ <êøÚ€5jÝfä×v=­òúÏøF—ó¸Úç¬!-vz¬AùÝl´*Åý¸à|%ñ%áÖ¼ú(-RkR<—¡~,>ݪÓ\âžâãm{ ¼ƦTÞ­nì˜[þÀê¶~θMYÿ§’{kÿÊ ÒG¦z©%¢j…w§ ¶ÖÉAãÇöOC«)è/t W9K}°Á~•Ç¥¡ÿÁ TÁø_(¦TžTòT.½—FÁØÊ¹”¿œ*wBk»Ê 9£”DÔç—þ…¹˜æ8øšõ¤ê­†‚^‡44_ŸÚ¢‚{{¦5%ø#®l¼¢ü2)¡,È›“à™Î‘ÞC¿ì?Ê?m[9ä&fõJï¹êªÕŸîñØZyãô›Icƒ«·Bï(òA¡­ôûwñ—÷lÞ„Ó»Ýùnï7ñ«ŽÒù÷ÑPKQóÌ PKW 7*org/w3c/css/sac/CharacterDataSelector.javaQMoÛ0 ½ûWXMXIƒ ˆ{™ák°|¶‡l§@•[›"yí´öß'iwX ß#ŸØ$€ ܈1$û‡oÙúÓ}óår cU Y"ð£±$Ûó€ßr縨[‡DÖÚ‘¤–Ì µ6ÊTÏÓ×ì8I£¹O—yZ{&@íQ'cÏñ³E@êSqKæš™Âg”¾hÙ¡u’žÇaß+™¬j/Ÿ¡CÛaBMÔDŒ].—ð²­Øß¹Ù+®˜ïíÛGë2‚¤æ– B»âÄsT(ÈØð;ïø´ƒy¸œ`³%»ýóY4{-n¡QX{& éS#ÏÅ‚†‹¼òÛÛÊëŠP8z{î‚€MµÃèFÃ(ÃNöQ4ð†"o©6à¡–J6 Âá¾—@ê^¦{—ÇɱH¿ÇÝ~•ót“&Å>{—¬â"ö˜¤XïwÿÕ°ßnÓÝ¿Ü~ÅöQIR{·N\àÛÞ>êÒA.ÏÞ§×ô¯ 7ú3ñF­Õ¨F/TPz®ð aý;ÄW휬ÔTH½äÍø.øüPKÕ€jX­¿PKW 7(org/w3c/css/sac/CombinatorCondition.java•P_kÛ0÷§8Xš,gY¡q_Òm5ë’âf„=E¾ØÚÉ“ÎNËØwŸ$BB¡L`sÜýþݱQ#¸CX¬î¿•ŧÛ5Lf³lŒUld…°Á-,ŒvÆ’ìöÿ…;ÇEÓ9$rPhG’:B0;X£h´Q¦~Ÿ°ä$æ ¼\éhý”µGíŒÝ{ÄÏ)´æ™cg ŸQøªeÖIz¦8W JY7Þ¾D‡¶Ç*…†¨Í;éaš[³snv‡5WÌs}PT¹_j¿•š“±VÉ1ýÎ{>îa’Nám–e,›²ìÊ—ùåeþn­ÂÆëXøðÔÂÀ+±¤åâ¯ýî¶ö®"Î¥þ8×IÂFÑë} n4 Jìe¨ò¨?ˆCÞQc,À}#•l[„;„Û`çNñÞ<ÌóåÍãbµ¼)ÖÅjù̪|ñ)»­’¤&´;.ðµåŸuåÎZð+IÀ¿¸Ix#mê¬v@ ÂNZG NÇ;bXøÇúèzÖ«‘>Ò©s1¼þ§…à ÿ¿‘õÂäwòPK„ ©žìPKW 7org/w3c/css/sac/Condition.javaµWûoâ8þyù+F\¥m«.>î¶tYmJi‰Ž Â!tZUnbÀ×`çlÝão¿q³ۭBz äxìñ7ß<<±Ž p u-$O4úGP¹¼¼„aPÐ\Á•šÅÓ³áð3QŠø“XQ­8\i¦cMAŒÀ£þ„‹PŒ'k¸D3ÁI5û»¸†Jüå¸h$äüã»6Sv¬Åræ~¥L@Ÿ³•ŠéÅQ ì0L´È •)*g4(7a ")Æ’L‡SZ²@Ì*A㑃³ú[=1Òs"8×4 ©¯cDØ‘"¢R/ Å|Ê}Y-ãF§Q2Ám8&˜†9 Cx €âðp1 ¯Ùî{`»CØÝ®ízÃ+\©'¥tF¹Qc²i2TŽø$áiýÜèÖ›¸Å¾vZŽ7!áÖñÜF¯·í.ØÐ±»žSï·ì®QÓéw;í^£dÆ=š½2&ZGUËšÏç¥ùYIȱµq¯Õ¢cZ€.©¦ •Qdt8AÕDCÀŒCK9™A¥ôNËå²U>µ*çP¹¨^œW+§…t‚ú$4¾Fp€û­BDüG2ÆH‘c<Ý/ùJ•0”® ë89áSâgÁá KgÌŒª‰þƒDHb¤Kt&,d2Þ¢Ð4GPªBæ£[4•#âÓ Vø«P|’cÌsœ:Ö_/ÀxôЯÄ×áô\l„†€tŠÑ=´ºzÿ!K~ˆ Q+.eÅ+!@)"RWª!áãÑwby^×¹î{O~•™¼ž„Ÿ¦ ç%_¿ÚLç;åã"£æî2….N ü(yßIÂ}cNÀB ²>û¸ñÁJÞ×T™ÿ@ †1ÝÀöPÑáÑUáŸÂPK‰°}c“¶PKW 7%org/w3c/css/sac/ConditionFactory.javaíX[oâ8~.¿â¨ª´´B¡—]­ÚŽVÃ ŽŠ†¡¨ª>šä@¼kì¬í@ÑjÿûÐ Ó—mÔFŽ}®ßù|R=)Á ÔU2Õ|[(‡Çpvyy J‹x„ð€}’FiËÓQÅ)”¿3cX§­5ÐÆr›Z5€†±TB §•|ZÌr%™€~‡dPÓ? $¡Ò#ø;¥gë¦j©Uó™ |C®à^ò1jÃíô8€šÞŠ Ù1ƒzŒQ½˜H´j6FÜXÍûX©ŒPƒ%—õ_ tÕÀN˜öá4¤E!0´)EØÖ*Am§Ðä!JƒÛÍrél:#1©Ñ˜Yà&\è#@ƒTT€„á¡Ñ»½»ïA­õµN§Öê=^“¤­â¥3ã"ä£Dp2Nñi&)‚õûM§~K*µ/f£÷JÃ×F¯uÓíÂ×»Ô ]ëôõûf­ãÌ´ï;í»îMàÆ]ôIg AlmrU­N&“`r(=¬.Ê[mâ‰*PI`¤4RÁ,ãÂ8CÎÖQ#ºrlˆ¸+èWZ¥§ÁŸlÌ*c8 Îáüôô´zz^=û NϯN¿ºø1™Õpó”À™©–þņD=¤  4& F]—JÕïè³/·’pÔÁ1w£+oÿÈ/²”PÓí˜ žðM„[çíÌ|Ú<¤êXÔâZÈðO©tyoî¢] ‘Y4À$ýEfóõLìsÂ\ë«5­ŠgrÝŠœ×%)êTëiiÔç’Q€Røbâf ÞíÞä|@Ɖ•‹ezÊ‚I“„ŠJcn¢êî~\Ïýä¸@èÓ¯É(Ÿ*/}Ž•Šó\ŽK6Öjb~éz´©ý?½Ó?XÄ~K=rºù²n b î¯ÖÜË*ZkóK˜å½¥D>?‰và”Iz˜ò5ðÏRѹ8ký è4V”í4Á–“ùÒý«SüTõÃH3-0Ôù…§-õØÞÕKI1õMæÞ°zPF#”Ä ‹OÖKU ‚㢈 ¢qㆴ!IÙyH~^¨‰Šl¹>;Ó¦›¡3ï;¥Øs2n©Û^éØÎý¬²`¥LÇKYJþè+%Z]Æ‚ K›Ø›³ál²ó—] ΑŸU7šW-·³¢¶\ŠÙ³ p3;´M‚!¸——Ô_$0J‰qô–”+mÚÙ^‹T˜:n­²{ÌD:Ks6RóÒç®Ö)µ ȽRª–¹Y;j×Ê]š‘ÃE­*sâÌç—K“-eŒÊ1\Ññ€¼âœæ;߀ A§nÝ(:ßåF´ïë ÁH÷u˜8Õ”^w :[¡Õ½BÓ$«¨ü0—ÓŽ&_Ë¡’.ÏÃÆ´ŸÆô@ßgëÜI¼¼ KyÃ[Z•_ߨ¯–µ_¹Cû8¤‚ÄÓ$FùAȽò¹°¾-¿¸hn}0/ çÁvnl£æ’î+™ fÌ h(—2ô(°½÷a[Ýù^£W…ÞÞ¾ƒi¤žÇ•·½þeÿ?Á¶E÷>µhûž]‘ƒ7Ÿ'þ·.LJÆ\ly#^>¼·«ìùkÓê‰-¦uçvÏ1'ý¬¬ýWƒ%]¨ñÓsî‘×Ý)oîÎJZjR»ö\Ä,›u57àù4§[ôűØè¾ÁpNÖšÖÊt¶I\à[·AéßÒPK\ÊD&PKW 7(org/w3c/css/sac/ConditionalSelector.java}aoÚ0†¿çWœ4¤„âAµJP„†ZÑ(T íSeœ#ñfì̾@«iÿ}¶ T[»YIäܽ÷ÞsÇZ ´àB4a¼¸ûšM?ݬ Óëõ`m¬Êa-s„5n`l´3–d½‹ú[îeíÈÁT;’T‚Ù E©2Åcûœ€9'i4Wàí2/@ëß਽jkìÎ+~ÔH!4ªÉ#møŒÒÀ-÷h¤Çf GJA&‹Ò·ÏСÝcžBITõ;éá25¶`ÏÜl†WÌ׆òÆ4rù¶D…‚ŒM¿ñ=oï¡“vãØ»뾇N·éŸ+¨–ÞÇÂä¡‚†wbIÅÅw^øÙmỊT8—úå\' kÅ^"¸ÑÐÈp/íý1Ék*¸+¥’U…0C¸ -bÞ!‰îÍr4¾/æ§«éb>šÝ/'³ÉxµÈž@ê’¤&´[.ðµùuî`)w~–søg’€?‘8œ–ß*ÕV; ÁE1¸Ó’NšA5\½Lƒàú-ÁÃ@˜‡¯€ X̤V v,|ãý8É_ŒÒŸ‘‹æõ±Å©-‰8U¥$æÿžêÆ™>œBó_ÉoPKù=7É@PKW 7%org/w3c/css/sac/ContentCondition.javaeP]Oã0|ϯéú@«*¦Ç}(á媂Žè¸… Š§“I¶‰!Ø9{“‚ÿýìPÁíd­í™]1‹0ÃQ9Åjsu›g?/ ,’$ÁÖØ¶ÂVU„-Ýae´3–Uÿ8âKçdÙôŽ˜2íXqϳCAe£Mkêçù{kÉÊhÙÂÓå@ÖŸÀÒµ3öÑ#þöâðµìÙ~æøEÊàF«¬Süɪ4 Ť٧Jñ½ä|À"^ŒKljøü ÇIúõKzò]K'±8ê0ñ4"êdù k?¸­½d—ÎÅ~3§Q$f£Ðѵјä4¨pKGþÉX”=7ÆWjU×. A‚x¬;"¼Ûût½\ýYmÖÅùºù,+²ÍúÍFתÊÏcw²¤ÿF=ùwå>ØðÁÇh3ÄÌï‘{«¸!”oýñ¡&Æ|P¹f«tšøL²<šžF¯Ñ?PKo£ØÐ„HPKW 7'org/w3c/css/sac/DescendantSelector.javaPÁŽÚ0¼ç+žT Bq`Uµ¤—F!*¨”]*ÔÓÊë<·ÆNí—°«Uÿ½N t+q¨¥DÖ¼y3ãa£Fp#†ÞÝË—Ÿ[˜Ìf3Ø« ØÉa‡íŒ%ÙzþîUãÈÁR;’Ô‚ÙÃE¥2åóø2€5'i4WàårO@ë¿N P{ÖÞØƒgül:(iÈœ1|Fià«–-Z'éyv‹‰R˲òö9:´-!TDuÌØñx ·¡±%û››­°äŠùÝn}°,b˜£¨ ®iƒ ~ç-·0 '0¢ˆEïØä-L§qô>¾B­°ò2²§^ˆ5?xéŸnKo*Bá\è»ùlÔ[}ìs ƒ[ÙÝâ^ÐyC•±÷•T²®V‹Î©Ÿ;D8§{³IÒ‡y¶I³õk󨤩 íž ¼ÒàyÄ]´à%ú_ÿ¢îŒ|éÔXí€*„Ú§Õî\â‰Ã.{'ß‹d‰”hÎßÏØÍÐ7öÇãš…“ßýXô¼×Fÿ"ͯà7PK—À4°öPKW 7$org/w3c/css/sac/DocumentHandler.javaåYmoÛ6þÜüŠ[‘vàÉIº HÚm Ò –¦E^Ð--®2©‘”cØßII¶ëÄ’lÞf$¶Ä—»ãsÏRg vàD—3#G¹ƒNÚ…½ƒƒø¤M‘Á'™!|ÂPV'«1ï¼ÖŠ4¯,:gáTY']åô®0Í•.ôhÖk:à\8©•(€Ä]Ð4ôÏ’j3¦¿Uè¸é¸r:¶ôà”®•œ ±Òͺ O<. ¸`“- ´h&˜%;WöûÓé4™¾H´õ[»ûg8EŸæòôíÓì^ë´£rï„Ê 4ɯb"zØK¾ƒýÝÝÝþî~ïØß;Ü?8|ñ=”æ$ÃÀ››¶IJ«é1¢u›iL“ÔÚ„€y¹µÕßñz®riþ\Ž0RTÍP¤HMÂÁX['—— ʲ©‡‰&ŒI[vrÈsYÔÜPˆ Õ0@’ÈðaÆà„•)”‚€R#À ‰°=®•ȦHËòZKhù`p$-5Xº£.ë„¢ž©t¹·Md±h ò²£QDêŠÂ]®³$b|äFÖn_àDòÕ¡ÇvÛwŠŠÆø˜ËB–%ÂÂ;F— ­´Ü9+—¼¿o}ü—›?‹€__œÂDUÄšZ‰°Lsb˜ Ó L™@Â9#ÄàZLªU&=ÔãŠ<¤4¹J¸4gPbŒ¶d£XÉ- qP9 ñ¬Ö$¹–×(  mIz‰ÍÅ,©»,"×cNjå Ýo‚ÐËhvìëûßyÍÑÏPr¨]’4rÔåñÉçóŸÙÐáy{÷œHº„E&’]¼Z9¬©¦=‰h#© ÔŒ€u³Á戮^DëºL%EªTý=õ"IªbF_)ø‰ÁLCj ] ha$¹S…™ –U‘.1†ÊH¯×Íž·ŽŽ®>¼þ)1œâæüúì ¾ŽT…T #»\¼I±ô0ЊÞ47Çd)/±éîA©­•ZÒÔP 2NB-,æ¶O##‰d^òéDËŒk\SUVîRW†hýO´˜>.7zjÌ}¹2Pîr6ª,¸9‹*x°“9ÉP"ò#òGUа8!ÈÈ «LÌ2AEâ5Fm6$„crNå"i RN¬0P²'@ È­H|!;L%¿Ú&Ü*e0Õ”½Ä€(ÆhÓå,aö<š=‘dW´žûk„Ü8šÑ¢î"ÙjrÝ—X‚’êØ“©y ‰Í¼Á!ù…؇iAúÉLF +´9$MÍ„èÀÒûËn¯éZ–ýhtÄTÃMsnÉ'oœ÷ß²áã°hX'æz6ø¡^RDÿ/JO˜Š˜ê¾õ?l¶*Kª¥(³… €ß¢ˆ"ŽT†Ð&(GŠÜÕ›¬7ÃÿØ]5ÀÂßmÄT} å ¼Ju†?©ª(^õýe(Ûz(ᨠז/w¤+ “0·¼yNjL{݆rí©€I¯®‚hi]ØzöÀFU4yÇ—Y¡À“궤¾~'Â0[½%„iTÖKá'rí£2Þ‘ÎT*ºÙUA†¬ORmJ«%EߟdŒÛqµŠsÎoM\ç-Ø€míöPö‹¸d;-z\¿güΤ/?èªG yöŒçÇqs ÙˆZ÷$ZQK/6¤ZUO¼»Ì¢ÃÍWréðgfAv-éNÞrƒÁ¦>ãÝÚðY…Ï"|–T™G«ÓÇþté©Tù5R:ÝÐ}K4<­7% ùeh¾fÔwŠ…Z| MþƒÐ6œ{`—¢°äç8O„,ú‘bð#‰Z‚aÈñÇÙÞ+÷@‡Ÿo¨Y¸Œ§ñ©´Ø]PZ¬2ýÙOñsýý=EüCôâïÕÑë‹)Ÿiª†¹end$WãûmþÿFw­Ê“£–2ÃPsqmô4é¡‘ÿH9â-É{KâÖä‰vØ-¹b3Ê·e[/ ïá×M"ÿcb°Äpþ\—êçåÖ¿{irRÛÌüâssVì¦<›êGèúÂ×ÍB“cÿdÉæ§ÅUÜã‰ÝêÂÆè›-ïŠõ«!ŒWËý7¦¹tñd, »ÒðÛªlYV8d å³ÿJ(ˆ™ëúyÃ\V›¸¸¥žá ¡^\+é0=h] ¿¬—²æ}Ã[PKW ŽÏlXPKW 7$org/w3c/css/sac/ElementSelector.java­Smoã6 þž_Aô ¬-«éÝ hšó2jœë¶ƒ Ÿ ÕflmŠä“ä¤Á°ÿ>Êm²a¯Àp SùðÑCŠ] à æº=Q7.ÊKßÞÞÂZYÁZTk|¦eµq¢Û}ÂÅ·–—MgÑ9 ±²N¸Î!è X6JK]†§H¹Zq úüŒbÐШ(h£Í–¾t´wÞvN¿y†ð…†•;4V¸Ãe¡”=Чl Ì¢Ùa@Ñ ­Ñµá[ ³ÖñLÄ*èT…•\¿Ÿc!׷禧+‡Rbé:b¸4ºE㈕ŇÊcz†ÒÈæ„ƒ½žH M'‡@Á°Ž‹ûŪ€0}„u˜eaZ<ÞQ¤k4╇ñ Ŷ•‚À‰ŸáЍ¬Q6¿§”ð‡8‰‹GÐ>ÅEå9|ZdÂ2ÌŠx¾JÂÌÃ,WÙr‘G·sì/}¼4εÆöû}°hS³ßÛˬ¹d@-­6H s\Hë<Öy\M ’¸EårôšiüÄw|¸ƒqð-Ü\__³ë6þã“&ãh%6„j ziáœPØ ååϼ¦y15q(ƒÒÚ€ên0`W}ïûnkçî„·&=þyÈ;Í,!EKº'÷¾ºþÜÒìÞåáü)J¢‡(-žÒÅÑSN»y±È^™tÏR”ÔG‡fÃKüóå_ªŠÆwOî_ ÕÓõ˵댲¯óðêšrh n¾;û«äEƲh>zÙÊ‘â[´ì]åFiž’}6ë=¤Ñ h•ÅSÆg~œŸF|% öØ‚SÅv6-u…³t•$SÖ› þ! J®€ÞYÙW8U ¦¬½!²þÿ¦RNs¯j¨Ñ¥ÇXbvqy÷ÕÅH‹Q¢K.—ܸ³™ô&´d{Ž€½ÿ^ÙÑzìýîlæM±¡wÄòþ¿Óû«È|ÄúƒÈ0eüÅ{9¼ì^î_¿PKñœódèºPKW 7!org/w3c/css/sac/ErrorHandler.javaåWaÓFýž_1B'õî’ƒ«*ÝWDÕS!¸êøº±Çñg×ì®cÒªÿ½ov׉s !ªV-‚8³ofÞÌ{^ÏO'tJÏl»qzY:.NèÁÅÅÝZ×”t«K¦[^ Âxë‚îVüRy¯Šºó‚§kãƒ]`²ÝpQÛØåfºý^© ­Q î ØáŸ DUÖ­ñ¡câ ®º`ó“)ýÂÚÒ¯F¯Ùy6'39xÕ4ôFJöôìÖ\Ψ¡½œÏû¾Ÿõç3ë–ó]Ýó¼TÍgåøMbѲ–¢"°5R}¨µ'm»JL…]±§ÊÙ½½zG—rt”dÅK xkfœ#b€?º./é¹sÖý¬LÙ°›ý¦Öjº¦³‡‘ßùÙÅüáôàìÏ¿§¶áõ9zþ±¥#@Ì'­*Þ«¥”¹D7Ŭð~ÒM&óS$A–•×ŨZÐHÏÞ¾%–ÄT§Ì~&±1þqûäº"cTÛ6ºˆc!Ã\z –ô u¬Ø*: èß¹Lhñ|DÔf9%h…ˆÑ;Ä!0IÇKíñO"è Ê ¢×¡–XM«fHz|˜|ç 6æ1b¬8ÔãŽSÌG{…È[LœþK÷±˜^9pBíl·¬ï={ß›^,>ŸÂŒ®ÌÞ¬Ô6e^OL$µàTZ HoWû ˜žÞ•ž ž›jÄÑ)=,îè ¯µ+)VtTôäˆ^׺ÑmËôlŠqXQ·höœf,Iúc2AX2%ɃgL{t5´hÅx2³˜Ã1¾ø$ä­Î’Ôe·ò.`;K-ˆ>Ò”1Pª¤Ær‡pR^@¸Ùb©{÷ò8ËÇe²+0[ÆZ³± +³àZ­µíœhG4ªÞK2RE Î4ïõs³okÑ*G²ÚJʈ’š&3…XMðCKQ[Ú¬íû4ï-ÑM|…ƒ÷+èZ@¼Ö{-›)ÛäåšPF[–ì}¤ ´E— »a²&ÐpØÔSÔ¨V#yJ‹yœ{–À¦P­ï@6<@e€ƒ?[~v ³!Ù. ¢vBº2›ô~žL‡¶7‡Yz‡Þ“GúDÏqLwäš~Å›œòÚ¯­Þìñaü÷$Yß+úÑ—jãÀ]Tr#+PXçØ·PW[H÷âá{½縢¢ôŒý7ºógƒ¤¢ýÝÿÉ WJ¬E{­-¿™eÆ^¸qÿ¶B•WÀ7–‘T%„ÓìšÌ79Ñ„NÁW¾LsÃRÿ‡•Gt]}¥PF<®´äí4ÝuÂø‚Ë^™É3JºJ“¤«±ÿÝq>`³Fš/Òoh‰¿ÐRÆÿƒ1ÄNÿ>[0ÖÜÿfÖ0z)ŠAäó#›ø ƒøf®ÐsÓÜ—}áÒp¼nÍásJß»C‰Ôqe‚²vWÚ­Òäòm:/î©|$ Zù$z.ÇšŸÆK^V×`%ãjRñSㄬi6ƒ¿Bo…maW¶­L÷–í÷Tú’Áwô’ý¥(7«0¥ñ]H®5•ãè\øk3‡iy‡ÕÎK Uû7'éjÁ"üÔÚ?£_¢ƒ‚?-àÝwÅרøÏÉ_PKÆe竦CPKW 7 org/w3c/css/sac/InputSource.javaµYYo9~ÿ "“9Pºl°XŸ­aLŒqíAûFuSjNºÉ^’-°Èß*-ö!Yšì ˆó(ÖñÕWE*}sBÞ[Yo_†L²Sòîüüœ|‘ªÌÉž3ò…Ía…ÐRÞT¸~ò‰jM³¢ÑÌMî…6Ü4†¹ Ï,+„,år3m'ȯÔp)hI@Ü#,` þ¡$¬ZHUÁŠ7Œ0ƒC³ÆH?2%¿0.Éo‚¯˜ÒÜlNÜ8+Kòˆ*k¨™Z±¿<9áU &™p™¸cŒb´ºìÏ=2š3{Ò7V¯Ñ\,K&Â&¢­rÜO(¹}zò‰·âª¾yFd%„›Ð²”kíÒº.yf£JŒ„e´ÖMI Šöá„):—p (­s$‡¹ ‹œÿÁ23%ë‚g©èf³²¨PòÛãý~Í7 X[-þj©5Ÿ—²æ¦@I5Ëø‚³5‘9È=…m"O­eYAÍ ¦^Dr•Ö7±ÌÚTS@‘-@6`Å1ôz¢¹9aŒrR` çVŒµ3!äÑÄتGt !^Òy 7.âó­4SP–ç\Ááåæ’ðÒØ]}•QJÇYS\Ýžäö2Žj©$Ð[(#’`µï¨Ú9”êÚ:EÖL¸ˆ¡ˆL  {|à6ÅBìs&Œ‹Ö|c§`O/&31æú9+¥Xê 1á…ØFÅè öBz“ @±`‹<À˜MàO„›Ÿ¢p7hÏ€äðM¤ÚO+^?²×ödLê×v’6¦~.xÉëš‘F>bZ©¹œn栰ϧؾÿœøØµâ+L#Èh€1±ŸFñËÎd”ó6X!ýw YÑ]áØÁ­hÁð’( t@ÒÎéŠåœ^nͱăŸ7ä_LÉ·T-› â9´ Mi(€´&3R%~eØð“fŒü5Æbª7öÏÖìÁÔm×–Áü÷†ŸH1.6QT&§>.ßF͹Ù9J°u—Ü<)!ª{y¶R5MMw-K,aj]/¢!Ì€â÷&ßë ž^òÜNùÀƒj誜"üóò{7àë¡gQýY+kµMeäm¯Æ)ÒD­äŠÛJ2§0$`Ås>GýƒÂíúVÛº2>[{ïs³-HA‚÷FËej,t>Ü¢õÌ$M$Ør®T˜U_G‘ð?͇Qõ´Ðc„áž°IÙ¾È?z¾·!ðÝÖ{òVÊÚw‘¼SZãj5Zï§AÜ a—LH¿'R@‘ƒ¾$cý C2*,¼¸ âlÕ·‰Û…E.Ñue‡)êUXU–Ì. ‚ÖT Ž…mòr}VôŽå&H‹½#dß=C0†Þét„]#ÓñÅW­ é`;Ô×F³ À—îZbWm“i[ô§èt”bK® –mïY˜oå5Ø'Ú¡ˆºÀPkG sÉnŽdYB\ÚRÜqÇ)t9ÌÍ >“jl Ú•Ïë»?3f¡í‘± ]Ižjëñ.¦Q‚š_o;…ñüù/&àràøÐ¦šF‰@hàð3Âá(°üb˜/ÄÓzX<½j‡—ÌåþÆÀû|Š øÝñ‚ÏéÅyxŒïñâS_BŸÎüö˜K-cò búi> 4Ø^tº LU+¶©À‚Õ!ÿ lcÓ7š•‹ÿ yt¯2à¨B6¥Mg´ ‡ó‚Oñm¿ ×áØp0ÉPîlö.‘ËÌ5«²õ¦ÿH{‡ÂÚo6Gî"ýöBîo·OÆo[:ˆ¬¼\ö“Ã_ê1$¶¶qoê„ü0‚ˆs}×v•ê,Tþ¡¤ñRö´V#­“sW'Ä’Ø‚¶­ d1Ì {•w.wëÊPôBñ"4Ãú‚x÷Ô#ÚNüãìñéîy»5gp7U.M'h¾ö9þ!ùx#ìW,“$Hîv<ÀU»$ïwõö-É£ ¶7a‹Ö„uÁÄ€&|K¦ñIÂÉØñŽ3–ä­E³à”)>­ÄÐÁßw«:0ƒÃšPÂÛçª6q[ͯ{·öýI;B¥îY¯×þ\JãôÙ¢íˆÜÙï–±B»?£¶¥¶uWœJ‡¸e˜GGÚ ¯wQ55ݶôQ©Æ÷¦8 x=°óxìuøaÿ Ên›ý=°ï]ÆÈèí3ªsQ©õŸ^ÙÛWè–Ý,òû÷Æ=·L›}S®ÇŸ¨ÍŠcÂ'Äà.ydbà!;;¨ßaý.àÛgºýæи¥h,ÍW\KµqC c‘0@*(~Í“³àaÙC;‘+J è!¯_ ¿‘y~Lïnߦ*?œ¥îé/-¹øªû‘ð·÷¿þòê^¥³›Þ!¬dШ~|þôµéÌ=ÚlU­5krùv«qPì÷O=iÚl`ƒ.8J>úbfpÿ* 6&û`ýŒç6·‡o!ìt¹ŽŸL‡{´áÕ‡-má> K§JŒ™½¤ØÛÃâ–Îðk± º †£x—+áòîï 1ìªúÇ}ÂUÁqvËÖqîœëø1y¿ãܪµÌ8õÏ 8Þy] ¯ r°Lß«Ôþ7ƒdö2€¯³FÁåÇÀ 34}fØ}æñasŽ°Æƒoûµ%;Š»ü¹¯À¿¯.O~øÖ†¸ã¢o'ÿPKDÓŸ­|ÐPKW 7"org/w3c/css/sac/LangCondition.javaUP[kÛ0~÷¯ø`yhB°šuì¾,d£5K“âf„=Õ>±µ©’';-cÿ}²Z&ç|·sÄ,Á gÕ«íí÷²¸ºÞa‘eöÖé{Uöô€•5Þ:VýcÄßHïeÕöž˜= ãYqÏ{ÀŽªÖXm›çùKÉÊ©äÊ î¨2u°î1 ~õâ±´ìÙž*s|%eñͨœWü\†¢ g dHP¶®Óþö.@R¢Hgë]oæ4N¢Ä·v»‹¥Çp ­(ž'4˜p8ôàôââ>DI8‚tDàâ,N³©xþðÞKSÏŸd)á<‹¥œòŒˆÆà¢0 æµÅاóB@8 þH@>5Ž’)>ñ9#@¸22#5ø‰ÐŒÎH’R>?ª‹…F‚#(§˜’dFFu˜p_6õÇf=J‚Æ’w£C/làZ±üµ5º„y¢¾"4¯ÿÓ›yµœÖ/àìää¤qÒlœü€_/ß¼¹l6!É×'`>Åð±ç?xî9 Pš_÷Ó´ŽJùñà q,e¸šþxæ‚ CI€›…V¿3/ÌH*7s__ ¯2õ’‡ôª1¼¾;âàáù„àŠ0Œ) V€8!fqŒ$#8ŒõHqÕ°2qùXJš#OÞ·”CàÜøPñz¡¡wR݃יQñíRj絜ô2>Á}ô&4¤qLP•p'ôCx®›lR(ã${>©ª~=üÈ¿¤¦ÄçjÅ—†ü·H9:c*|'E‰úFëS·g:†Ûu>µº÷÷Æ«·pòã:Üw»Àõ:ƒþ+„;Uà¾ßîÞ²ï-œ)pÇ;Á :®Õëü› bcÄ~Çèß!ܹ÷íN»m¡½7 Ú?vA3?öÚ_´«]Ð:®û›v½ Ø­ûAeöv'j¦@»P©í„v+ÑNÕñû.h®Õi›¯8ë ˜§cJ¸ò£¹¦ ƒ;åW ù¿ú dZöéXR³§ê‰±0”‘JDx—ß„3?‹pú"q®yk:Rœzœâ…Y7aäñª¤åT›N aRÄ8—<ñpqL£óê$¤H‡„¸tF0°€Ore“éšž¿:Só^*L=âz~O{ç÷QòSƒÆ¿Â[ã½ìYÍŽä¨Æ"c˜F¡(£V8R¶oŽ–Ýº“Õ§§èïÝ[¦íZ÷¦‹yª±SÏsºwž÷V§³ày¦e=Ïx=~~}·ìb<6?SkŸ ýý–!)ªÙ¡‡ LDXŽïé'4ò|{¦¦c]ºÊzX¯×6j¬Ï,ï_šÂPB5kœ©Ycœ1_ܼÊse¢"ßl¸âqÛ›ªÊêy ãòô%ç´;À<ë|ºØ-×êÚBUjòÐÓL÷ϳ¿BT“EnßãU8Œ*uHN9 †‡'5?¥•Ác£bö¼Q£{Ø ’lu;]YÚœi² BR‘`ß§¸mÞ:f~f4é¥Â-H¼Ñ¾ÉÝ:FÛ2lÉN“T*ìþ ä–Üšj"q¸Ìr[ÎWÌr}³Õµå°©æ ½½³«S3ÇMB>g„ùó‚ÝÝ¿öMo=î/Õ8ÞTsÉ:ˇýÓüÉêt ªHñ\ôؼz%$O>‰ù֛ᚭ¶) —ŠöÔôbàbý¥dö]Dzo?ýlt25ÕDapDbÑT–|Àp]geûjÀ_Ë® ñ·”—_>™-w™U…¶4a_44#H<†5¼{çvá½ móƲÍöKj"ÛjuÛ¦cØyaÖ¼Ð{jš Ñ=ㄤâ<”*Ttè-’x9ßÁp}‰¶uØ`#G›Ò{?J“¾DeýÁ{ÑýrÌ~?¯DÎOô›ÈØ‹ÙÂÂû°gÕ”çj /)ÊP³¿ÂïYv¿d¦FúµØôHñ*ãzÀ˜>AJbT†h£çb”ÆRhØïvLј7xóoçñjy\Ï›zËL6Ï$JÙˆúÊù2€Ïcùž%÷ÁJ_}kËMÉ?¸‡Ê*áô$³„¥R,Ccä¯, *{}, ÃòHбP°Vxµ÷ÂmDª =G8iF£,ý2zÚ I”öÖü¢ÒPÔÀ¥°Ö©\‘¸MìXœ–5¡Wñµ5~–7ˆ÷OžÄ#Ëâ»|ÕR-yk•³¶^ÔÕ*uTmY´”0h• ¡&©å¶ò=†¾3C½ …² W¿jÄe¨T)º¡êèâx«Sæ½fì£:&{o:õîÔÑe‡I[vu4BD'E'»ehFM͆¥­ÔñÂ`½m¯RÜ4¾bàåðÂÆ:7Ï]u%Â?ç`åÅ$DdcÑÅ‘ÅJ”;¸xÓYõ{*†Ñ©W^©.–Š—­’Eî‚‹$$_Ã2 Ó˜Ï@^V\ñÿ>ø¿åƒ s¿çƒUÕèï1n­W# } ó<#Nn-PçK- «PP Ýæ‰y‘”ý… q²U3 ëÅmU¤øÏYÄIú,ÁâRº£äòž¬\”U%ãöÔA!Z^EÕ­ <•‹¼¿r•\¿‘þ›ÐS¹$l³ª!M¹7ù/á‰KÅo\Ik¯\P5¾zK|†§-®¢‹8ðÛÁPK6n>¤Â&PKW 7org/w3c/css/sac/Locator.java­•mOãFÇßó)F*R¥öчSÉN Z©Q)ª€}»±'ñ^í]ß>$UýîýÏú!œhOj$ Ø3ÿ™ùÍìl~vDgtmÛÓë*ÐIqJçôh]]Ò£.™y ã­ :6bò›ò^Uô‚§…ñA‡˜ìЏ¨Œ­íz7_Э ÚUäî`À?¢Dl`µ²®ÅÇÈÄA]Å`û'3ú•µ¥÷FoØyv§™8^Õ5ÝIÊ‚žÝ†ËŒªÚyžo·Ûlû]fÝ:ßçßðZÕ9|Åý¡B²(YKRIØÉ>TÚ“6ÝJL…mØÓÊÙ†î¯þ ¹¸N‚4¼†‚·&ƒa‹AþxQÎéÆ*X—}P5ÛÐyvžÐæ¯.òo_Ó«‹ù?οMmÍRsô󧖎ᵪøS­%Ã5 )²Âû ¼ßågI1ft„fØB—Y“¢ëû{â ›@[*<(mù¿–„PhÖgù¶}·XÁ@Jk•EjÝ ç~´Œ¾;ø,±Ø‹»jÛZwV3Òqàç--w¤T%1%¥'L•)EňD‹ÔSÖÇeð¾2Q§è;kI€RÍîkåðSÿ¢‡N ‡Êb$R§§Z…=5±Ë\ j—Ai“¢ŒÅc"”Ù‘ÅC·çØî(‹Hï&ä½®Øç™½ÍÛw{Ü·6Hd’½ck °ãáRÈÉó>§­ÆŒ/™6ªÖ%YSïD¥Œn€á Û¦3Ç8‹ÏÓëÌŸÒ‘$í¸`*Цu\ê"¨e½OJ¯¤§*nZü @juO…ìùÝð“z…H7Yž”c26 ÀǨP$}D^;Œ`/8£eLlvb."8›;òÁYÔ̦]Œä[ÂÝ¢Á‹Uª°न1ˆj’gÏ&úÐ9*fZJme7¤ù{ÖäÔ\Ÿv ";Ö\),)LÝÐ1)ýÙÔö|½H¤våÆ9íôgÏœ|e#/ÎElúQ™VB8J+E×Ò¯)ðËa‘ßñFË·yÚ:Ç饊Gô{¥kÝbpn˜~‘Åá[:q‰,&u8J>éWZ?ò9ÃÖ•¡Mù¿¿[¤=$ߋ蜔wÈ1ë½gŒÆÃ¾g©3˜;[ox/kLFß©aOèЯ‡Ah‚®'qç²;Zt%#$…5rʇ„@3lY26ø -]7,Ä÷´{£<ýí‰ÝwÒk;9}óo¸j U›%Jßbæøp˜ùÒQiº>d§ú½^kq7Ž—îíµ¨”S:òZîøSoœ¨tYLWìaçF”‡$|ßœ¿H‹.=3}@׶޹MžŸC‰áŽ7ÐïŒþÎ"iþŸ@§@¿‘ë—œ;®ÝÍÔ·© ˆkDul‘ÈØÐó϶à Ç/kžî -˜vJšð÷Ñ?PKÄ9Ž-8+ PKW 7&org/w3c/css/sac/NegativeCondition.javaePÁnÛ0 ½û+°š °š÷² Z£SxÙ‚ ÕfluªäI´ÓbØ¿Oö‚ä0(òñ½GŠI„ Ί1–ëÇyz{·Ál>Ÿck.±U%aKÏXZã­cÕ¾ø/Ò{YÔ­'fÔxVÜ2Áî°¡¢6VÛê}z, “¬¬‘.ráöL P;ë^âWK îS‹–í!3Å=)‹oFuä¼â÷qÜ7.´F®ª:ÈçäÉuTƨ™›Dˆý~ï/cë*qò-¨’Z„Þ¾}”– ²á@@¥ê Æ/²“Ó³øbØ‚8Ÿ‹‹˜'³«äêMuèqX½55²ø)«0¹«‚fÞÇa5×Q$&ƒÒçÁ¶5åÔ©>JþÑP”-×ÖµÒªi„»^‚x¨{"í}øºX>e«ÛÅ&ý¾zZ®³›t“®³>Úg­ (Ãäv² ÿ‡½1™ÒŸøð;ŠÎà´?“°KnñàšP×r¨ŠþâƒÚ‰©">~ÎÆ×ÑŸè/PKE/r2‡ZPKW 7%org/w3c/css/sac/NegativeSelector.javaePÑjÛ0}÷WXš¬%eƒ¤/ Á´aYZœlaOEµolmŠäI×NKÙ¿OÖÒŽmÂâÜsÏ9÷ŠQ‚.Š!–·w_óÕõÍ“Ùl†½uºÄ^•„==`i·ŽU{ŒüOÒ{YÔ­'f•ñ¬¸e‚=`GEm¬¶ÕÓøµ€deÔry ¯2u°î?Zq-Z¶gdŒ¤,>Ց󊟆i߸йªê`Ÿ“'×Q™¢fnæBœN§ôt™ZW‰?¹Åš*©EèíÛ«rŽM@8ÈnISÁÖ¥ßd'Ç&é4.A¼‰é;L¦óËð½G£©-ÙcƒAI#‹ï² ƒ»*Xiá}6s•$b>ÄÔÖ`S§ú×<êbQ¶\[ÜÕJ«¦!¬ 7½q¬{"¼¤{³],ï7Ùõb·ú’Ýo³u¶ÜÝæ¿S´ZP†ÉdAÿMzd2¥ÇVïðs’ œ˜µ?£°Lnñàšà#þe=gŽèïø>ûþ#Zÿ\ ¯’ŸÉ/PK± &ŒkPKW 7org/w3c/css/sac/Parser.javaíYmsÛ6þ\ÿŠ­/3‘2 »wÓ‰ÜÉÄMÓ©ïÜ&c'Í}…È•ˆ"X”¬ëô¿ß.@ðMŒã¼|«5c[$g»Ï³XÐóGGð^èroä:w0I§pòôéSx§ÊàÌÞá’FV'« Ÿü,¬i^YtÎÂEat•CÐ+xƒi^h¥×ûYó~NêB( ¸+€†~ ° Q+m64â ß:¯œ®ïÌà?(5¼-ä•n?Mxâ¹RpÅ.[´h¶˜%;W.æóÝn—ì¾I´YÏ[¿ç—¸jNsyú›œœ¥%KvÊ낽w¹´ ‡f%R„ToÐÂÊè \Ÿÿ<µcdƒkB°ºHhàœFDøÙ^ CŽ%¿‰­˜má$9ùNŸþ—W|ÕÑ;â`7ÈT©˜@ ¼æ<‘í[ÏØ0…,Ö¬&ñF¨²ÿG% z¦—Fo¹ {`iƒÉ>"u­œäJ†{HEÁx¶*}ià4Õ®xpur"*%cfz=¸Üðr½P0š༫cbC„ˆ¾÷BAB,¨–QúÙüFf”ÖtŸ ½°<§'bÎáßTÒ T³šçI3´ñ‹½lª!xrƒß:§t>“ÊRÀ} ñOW–«G†+Q)W;0­Ã #ÃhÕÀNÄiSjeöu]>ðÄ>û¿5I·Z’"Ñ…HLê€D']Xq×ÄÙG’¸®ÆT4jI…ÂËó{/VÃòDsÑÖL8Ä«‘f\#Lߎ:Xî=x«ª#T¶—V*ªâÉu¡Y/“°[?/fq‰¹àÔš¶´{ð8¹.´;âtŒ¼[ ß][;èíZõkÆG”âÏÂ^Ö_ —Ý’À h©I‘FìÍ3ÞÕþÅÑÜí SÐ'æA }?ûC'ƒëˆ?¥¾cdö5*ä=òGÁ¿÷“Á5 é]OÏÆ@¨«Ë$'#¢ oðnÜ»1ýT)¡Î~!!Œ¢5˜4Ñ}þ9J˜ÕeÏï+á„ò»á v¹Ló0»SÝŠÒG éo¢ šQùô[Û þ¨¨º“îEGNcö›F½CG…°óÍ€šÔw>Ë¡a ]uha1@4"–oshEÑ3\7áŶԪd¡áŒ“Cß “ÃΜÒH$¢^>^úþ:ù;s‰EÖt¢íŠˆëª=!øƒ]D¡®jm¨±e¢S·c©“§ãnJöý™‚Y7‚Yh¹èÌÛˆ5 F¨^ ¦Ô½â¾ºc6¶ÓÌ×fz'm7Ïq·bÓt¡¡Ù™Á ©ovÎÑÞþ:×I`:tgøÅ±m§ËÇŠŠ gáFzõgŒeïíÀΉ½Æ±]ÆH#µ3‘À©pžjûÍC#ç_²¯ÚiŒÍÁ¤­²OÖúôØa!“pHÔîó”l+t'­ý Ñ;wtîÿÃ{wíö ¯sD7ñKSÔ2'×ÎP@¦ýá‡ðÁó‘btXs†f;þÅ#"}5ÒSΠ÷Ò¡)Jw©LSúh‘j¥K߫Ҹ´r =IH_½¬ß('™§Lc ¢uì\¸¸‘á ¥øpEŠý ,'|îj1Zp >kê†?äryèlR9­ 4O˜wf Š0yw(ð‡jZ„Õj;Ê D+G>rÓJa-fZÜrûÅ“kP¾WìG)ö@™ŒOáΠ*æ<ŒÑrºME–A©K-ÒlÂÛ&<üó¡ï…þõp:TV,ý<ûW¡ªPþ;0÷¼¸#/nKöm%aWÊÑ$}¼>¯ÐU¦ð›UйX²Ã)‹SÀ;yÅïò©‚7/…‚˲yyWWqø±~!é[°“W~S[8>üçÆ›«ùÕËiÆÉñŒ7Ɉ×bœÞãô8_´ã&T¸¶Ç<¦G7ÇñtŇ€ o(Ü ª‚,âÐL>±i&mxñÍ+%€œºñ/’}§^Ù:6áœÌ<YûÚ¬—Áº”®Ñ…öø×ðêxò³ƒR~ë SGçNÞù㫆æ­, ÿÞëëújÂ3T‡ôRÆÿ'Ä;vLpGÑÖgÖF:Í•hœ?wVxŸÎ/•ÎË ñ·¬pïÛë:оøÜŒ6ÖÞ›U©ŒY… &뎿ÿæ…;žÞgúKez©µBQÄ,‡Àf‚ÿ:ú?PKS 5^ PKW 7(org/w3c/css/sac/PositionalCondition.java•“ßoÚ0ÇßóWœ4!ºöZUClZ£µ€(ÚSe’#ñfì̾@Ñ´ÿ}CÚJíÃf)Ñå~|ïs¶w#èB;íÀd6ÿ¾H¾Þ,a0aeÎ`¥2„®ab·ŽTµ ùwÒ{™•G"‰ñ¤¨"»%¦…±Úæ‡Þs¦’”5RË-8?µ á¬u[ÎøU! Õ®qEöäéÁ7TŒÚ¡óŠQ޵†…Ê n¿@n‡™€‚¨Åñ~¿ûº<~áŽo1—:æÚº¼•d#˜[Ö \œ–Sü;ÙÛÁ@œÃY¿ßûgñ࣋óÑà Jë8øòTB‹•⨔éO™óì.箩H½¼9—QwC¯OÜh-p§jkô[!(+*¬˜J«²D¸E¸©[ …¸G„g¼÷ãÉã|vŸ,“Ùt|û8™M?ûHR­µJAB·‘)¾7 à¡Éü‹&üŽ"àhëÕå¥ÊT ”' – ßäE“xU^Á0-ñéÀNj>Á-J.Ý8» ùܬ¾µ™òˆË—@+O¯U–oðÆ\±’$è7©qýöˬ#5ƒ¶;—o†¹JYñš\…Wq0A½‹ÖèøÂî}púÛË-6bt(ñÙSâ³k‡JþÚ¢!ß; Í“û!: úkìµµš·©F_²â”Ûýz€fÔŠ($o}ÃyŒÊ6ÿUP×;%ñËó½Å‡E’(xµM¥ž²ÕÿÀ\óþ‰þPK™XD?@PKW 72org/w3c/css/sac/ProcessingInstructionSelector.java’ooÚ0ÆßçSœ(/ ‚xPm´CCiÔFc%©Ð^!×9o&Îl¨¦}÷Ù)¥/ÖM³òÇò=÷ÜÝ/!}úpÉz,W_“èî>ƒÑd2µT"‡5ÏÖø¬´T†7»Vÿ…jMYÙh4FCTiÃMcä2de%…,žçÄÔpYQÖ.±TövN€•Um¥ÚYÅ;š7FžN𹄇ŠïQinžz¾Kœ  /J[>Aj¹¥1õ”Ãáà®|© òÚ7Y`A±¹.½åSX)ÉPk^®QÕ0×dŠ™‘ÊÿF÷t°‡‘?n‰w2~£ñôÊ^ XZG᱆®õ$^MÙwZX ª°õ™Ï´ö-¦kÏ#ý¶jVr šïl.Øñ, Ôn(” ·;N%$ ƒáq'.4²aÍ;³úÜ7ðׯoù§ñ>µ¬dÝ÷Üí¦í Ý6HSJ°*¹àu°@¸w³ iã^0\¤ó`³J–A˜¦Q|·‰â4K‚,ZÆ›xynÒpÙ2y&Ð< ÎlWÕ–2ü7bÀ£Á*×¶HÎÇ?=ìj¡¹Õ·ŸØ4ªÒ`JüOVq6\EUšÎÌ´oèÅÐþ¨Îëm’þIEܳݟæJrRëõì|Ù»öΚ¿´ËJª(³< §†ž­ß¶½µgúËû PKU’™PKW 7!org/w3c/css/sac/SACMediaList.java}QMo1½ï¯x‡’(Z'©JZ!¢шª´(âèîNv{±g7­ÿ{(\°dkl¿/Õ8ÃÃb„õ§Û/»Íûë{Ì‹öΛ{. {zÀÚÙà¼p{ìñ7:]Ôm ‘€ ÂÒ ÁpOEmqÕÓäÏ>jagµA”ÛEù8“ÈFÔÁùcD|o $éhÕŠ;ŸLðØá³åŽ|`y剸2;®êh¿£@¾£2G-Ò,•:Nùé"w¾R/¹Õ–*mTä&ú`S.q·ZßPÉzËAò¯ºÓ“³|†ùt:UÓ¹š½Â|¶œ¿^^ÌѪ£€Ç»Çƒ(¡²Fßtí«hWäEyìÊe–©qoò¶Oì,;ê8UË^Ð_êVjçÛš 7 aK¸N$Ïòíƒál…üAôO\üÈ2ÄÑ;¥1ŽmÖÛ© †l%uú©9à˜h0‘w«´öõ‹ *’mÏŽ.ÿ«žäÚ#´ô»ÐPÁ¦2Š”ô8‰ýÀUáJzc[c®T_‚Ÿ£ü–‹¡¬htÚ𙙟#¥ÇÿíN<Û ,t¦˜=6&ü™ýPKíN‚‘±½PKW 7org/w3c/css/sac/Selector.javaµWmSÛFþ~Åe&@©…IÒc˜¨²jì‘Di¦ÓaÎÒÚºFÖ©w';žNÿ{÷dËâ!Øm˜$ÝÞî³Ï¾Üžu¸‡àˆb&ù(Õ°@óôôn…̸å Â-H"WBj^ŽÌ†ýk¦‹ÓR¡Ö ¼\i®K †aœæ"£ÙÑr|¦¹ÈY šýÉ ¤_Àœ„†BŽI௒޵ùd—Z,¾Á/ÈÜä|‚Rq=;h€e•Y‘2…r‚I¢”+(¤I6zL¸Ò’Xež M&o_9/„b¨§LVp¼\c–a¬KBØ—¢@©gÐå1æ ŸVËs£Ó(Ii=3 \Ôg ˆ a™ í]õn"°ýpkíGÏHR§‚Vq‚¹Qcòq‘qRNø$Ë ÑzíÎm±òº^ô„„K/òÝ0„Ë^6ôí òœ›®5ý› ß ݆y±rºvR­‹–eM§ÓÆôUCÈ‘µ ¯ÕÅË, ÀXH¤€iÆ3e]{^Ò"…†,!² ;š@³Ñ<“ããcëø­Õ|''­ãw­×o È0%}ÜÏìÑ~k§`ñ'6¢L‘#²7b¥”Jg;;Öae¡b›SDäÅÆþ稀ª­©vqÑ\8fò“j[ƒ‹øB#Ú ƒC‘ebÊóÑri oTYä(q»O.¢dô-`0' k+”k€ŸEç*híbaBD±©yy_e§Èa/À 7O­9-{Õ*+)Êú)ÏxAyÒE¸2Ä ž“R2ßóºfþÞú©þX„ÒdÞó‰ö.Ö«ÿKþ a±È¾¨»{äÍÅ>µê÷vA¾ÅÕõùîbm÷¢^„…åߥÈð|·|Â4îþ±ZoLêæêýªùÝxæ%«ýVÆòÑþP4Š¥\Û"«µ•úã{Eùꬰ×\,Ö­êÿ‚1¥©KÄ@)b|$Š5„¶sçôüŽy=ßîÞ…n×u¢^ðâÅ9Ÿ­§«f¨éPW"òòä"ÁÆPaEÂc<Ë=‰ÊþÎïuÜ€šÏd’Z ÊðÿUÐëE_Â:y.,‘gs¢æÏÔG‡C”˜kJ16u[`̇¦Ÿ‰ütŸj@Scß¼ï~°#ïׇØ_m„>Ž Ö´nXW÷òžåœôãÚŸûìÎ-n‘Õääµë¯ ×ë\Öøy]9)“,¦Ôašm.r[íÍFÐâ„llNÇŽlÂ嘞ðä9ü¸FbTÊœ-œÆYƦM­Ý_ z+¹-À÷ƒžCǼç¸óü0 nÖ{ñv3¦ÅøË¼ÿ:×Ï,L§w½>Sß=¿Ý½r©4dtü¿„Ba™ˆº\·­ÔV¥ò£ò›Th?to:½e¡Þ‹Îé2:†úí3î~ý _s2Q—p-™œÑp¤h¤Kh1#¢c¤uJ:³á?RåÂåu–†·ÌŽ:®ß±ï³dÎÃçŸÐÓ0•¤B$ 1«î*åÍszŠt‡ÐÓeº¨íI¸ø¶48W^·óæsK„ü[åÏ4¥7ª\:eMí(F©@#™)ñúŠ2W–ˆ¸¬*_K4Ù2—¯A‰ä£¢'ÒCsp5JWU¨îb”ZµNí#átÒUcLUû„&…f"}0lGȉì|´Eåv¼€Bpgw~¶G¥Û\3 Ùy5¬èJÉiPI'ÆI=+ªkp;¦ÎzQ#i[ÕëZ@†.S(" ûdóŸPKt4®9ŸPKW 7$org/w3c/css/sac/SelectorFactory.javaÍX[oê8~.¿bÔ­´´¢I/G½lU–R-MQB}Z¹‰!>âÛ¢Õþ÷;!”miéÑA*5öø›o¾_û ÐàÉT°a¨ êïÃñÙÙô¹ˆè³€BŸ>¡E,¹P,Õô„ê=‘’øa*©RZ±TL¥Š€Gý0æNkÅ8D1“ªç»hCþÑhÀÅ ~¤ø[é®zªxÞSƒ¿(ãЋ٘ ÉÔtß‚zMY"˜¤bL ¼IH 2lL*ÁžXiP ]öO¿Kèòšaè´bE£ˆú*E†Á*ÔÚ̧±¤¯Ã²Xcj§a›(` &,Šà‰ 4H£ 1ô[ÞÝCσºóýºëÖïñ-UÈq”Ži¬a4C6J"†àÈO© ¬÷M·q‡Sê¶Ú-︀ۖç4»]¸}p¡ºëµ½vÝÕ0žÛyè6-ÝîRô, •JÎm{2™X“S‹‹¡=O¯Ý¦CÙ€)¦‹¤ÒX{­àµX\Üý=µ¾“1©áØ:…“££#ûè›}ò NŽÏÏÎOŽ!‰hˆ¨šÏ ì!Š]Iˆÿb½ˆ!rð-_J ê¢R±ŒŸk“mÞKÇL·Î þž$)Š&:!‹X‚º·)ÜiT™qI— ­éÌú1³§¨Ÿ–C‚+Àa£?¸H%ŠJ àó8`y=Ë|ž53›ý¿Nˆ.—Ù8N[2ÍM ¸—Ð… †” Sd¯û½¦Ï>M L£Ûm?Zœ‹E[ÁvÌÈ4I0å¸lr[›vcîg& ø&ú#Õ®®VZÎüÔ*;æónÀ>TvT(øD.½X/:ŠO‘8îGë%¡Õzë- U =Ó¨Ot\è³›F*8º}¨¯˜u¬.ºþd°1.[…{ûçVÒ 9ÖnQ 'wRңܽnq|¤þqêˆÆêMb2¢÷WÚs[FK¡ ƒ?v—÷}ϵÝfãðyšiöo:tº¶w¯  ™ƒUtri“+}Bi_kIæäjðÍy9Þa›û$ê¡v¯"Ý,ÑBj `Á¥ezåôÚíKÛ4åYÏíJhE-ø(=^EüÐl)¹±ui'W«Š¯ÿ”^3sQª¼Roµ‹7”x¸P 5È;ó$l^„ èó›;S–è€(bÑUJ-C}ÅI"ÏødQRÌC {W®Ž&¼¿±2¾ X"’¦º‰^ÁüÉZ5²>Cd;záuÚ§Rj† "Ý@8EÄŸL™æ¦Â¾Çù(Ü)ܶæ^ ¥+;™Ö¯ZU‹%¬ãÎïXûsÅËGÙV¹²]…ö³ 6ã°¥Z•4 ø»à̼8æJ³ß8ŽÖŸµe÷¥“iÑͯw@u ¿wSù“C>6—óV@%>ódEÚÊYÇÇ8ÛTòæ’DyýÏ!Í*Xö°fQ<±˜¼¼~Žô¦`S’y ZXdñ¾ØLÊ—ýyŒØ[ð=Øšøšt÷W”¼¡¾­vùÁJÏÚ\fÉž"½ZÞZïÉÞ4Év&¥x[Ö2“5’1©–^U¼%fF‚︖g „ ´™÷½–²ræíØœt¥¼%þHI$AñâeOÀG–¾ÔYÍvó¾éx;7Íí%=6$Ë Ì„YÏ£,Ò.CD("(^Š,¦{Þ]Zw ˜ëŠâ¿ÊÿPK;7­ÆPKW 7!org/w3c/css/sac/SelectorList.java}QËnÛ0¼ë+öàƒm¢ÝG;AÑ (РnQ¸ |¦©µ´-MªäJŠQôß»”åĹ„€’;3;;RÓ ¦ðÉ×Ç@eÅ06X,—KØú` ØR°Å \ô©9$üø›ŽQ›ª‰ÈáÎE&nÁïáMå¼õåqöT€ïšÉ;mAä6À _Rt‚ÚûpÄŸ9=Ý6쇗|Eòðà¨Å‰“<o­…M²E0bh±È¡b®WJu]—wosJõì[­±ÔV 7ÑGwÅ ~¢EÃ>¬)rþK·zÖÂ"_ô¨ùR½¹‚Å|5¿Z½{µÅJ|~¬a$*«µù­K:”ÒÎä&Æ\R¹Î25í›ÜWø¢c {mêà[É6 Fï"mRD)A-{(0`ÆÛD—BÒ“Zäâ :âÊK¶îÉ‘+…$x—¤N÷Êw"OñB(&!:È87E>ò±OW£ ¶”N«>‹Q_Ôô ð£"Ku°Fø’Ò@>%Ñì,™‹ñ^Lý7Ë@VJZSùcÜwÞ¢+¹J³õ^Ï‚ê€WiïÏÏ D^÷ÔñäúÕOŠšO÷ íIÒ%Wàã,åvc|\cíê@'?gAqæ<ƒ†V[˜ù`*%paî<;ãaœ¬öhqù/ËþPKe&a*ôpPKW 7$org/w3c/css/sac/SiblingSelector.java’ÁnÚ@†ï~ŠQÊ! d9D€*jh DÆÊ 9ö`okvÝÝ1E}÷Î.˜ˆ¨‡Z²dïÌÿÍ?3´°ª²×&5TÕ„XÅ€)+ªxôœÛÄàÚÁvÒUˆßMV D²ßsî¹çËq†1^é Ü|¹ÿV¬?Ün0ÏçØú`KlMIØÒ#n¼‹>$Óîþ'£Òu)¥ˆµ‹É¤6üÒµóÖWÇÉÀg•ŒwÊ‚å &PàÓ+³v>ì™ñ³%PêK«6ùSe‚d<¾:ÓQˆ&/D߸²…©j_P¤ÐQ)P§ÔäRq¸>Tò¯oyG•²’{ûöѺÌñ`ö¥²¤“â»êÔ¤ÃT̆äå\^]bz¿yÏf`jÍXDfÒ?TÅk‡Šj¡cœËÛ,“ãa̦6Æ% ;¥ |ñÎÁûB³³ƒ}ñä"Š“ÃE³\a¡}IK^¢4/þ1»­Ü‹¤Òšš…8,uÖcoP½žcï‰3<#b!›åiØ»![¶1*¨3ý_>ä0@Õ¦šeîkcMÓî·}üV}í£5úŸ-ÿô”È•ç¯ üI Ú7é˜ýΞPKj±#ž…PKW 7*org/w3c/css/sac/helpers/ParserFactory.java}TÑnÛ8|޾b8;0¤¸Mâ @UÃAŒsÃv`ä‘‘Ö¯4©#)»F‘ï’vâ¶W wwv¸;«ì2Á%†¦Ù[YÕ¢‹þÍÍ Vƪ+YVôÌÚëe»é…€Îáœ(êÖ‘÷cí¼ô­'˜5–TÔÚ(Sí{oL…—F …’Büœ}ÈòÒì´6vÃÿ¶üíÃQÞzs<éáo’ZnÉ:é÷ݹR%Pv æÈn©L±¬¥CcMeż-¥óV>3±­.ÉÂsÊÕûá_ ³ö;a#±ö¤¾e†3k²~‰,H;úX©f©9Œ÷ÂCzì¤Rx&pÖ­ê±/ï—ȧOXåóy>]>ݲ§¯ [iK:À†rÓ(ÉàÌÏ ÍT¸¬_Fóá=‡äŸÇ“ñò Æân¼œŽ Ü=Ì‘c–Ï—ãáã$Ÿ˜Ùã|ö°¥a¿ xé× ¡ö¾dÙn·KwïSc«ìÔÞlB•P¸%ØKÜ0/¤r(`]ŒËfÂrÉïDáݧÿˆ­èmÑOûxwuu•]½Ëú×è|¸\ß QT3¦Åè[ƒ ÆÈ’F_EÅj±3(Ò¹”å”Ö¤¸ôî6I¸Ìç?‡ÄlÏ.#›OQFãbN[vƒÈã"EË¥µÀ¬–J6Ü á>P! Ñ>+Y P,æ_ï„ï xÅWLω%Á"h¢sì*¦†£ cÖG¡KF—2(ÿí8=beoøG‡ü؈¯tØvºÉ™¯­Ù9 éñw†U<úVP0{ÉkÌâå®åEAÎì89ð²dœÂŸðê0m•šÉs`ÿ€ó…óo6.ÐÙ‚‡@W‡òMņð‹½ó´I+ò¯SÔ9ÿ½‡‡Úwo“3¹æÎ)ü#4Óèì5^švd×9Ÿl…âFÐê 9LjLS¼€KþÉo­FçPán'^,åø@àD¥›rÖCÍ êt#NìÕKò’üPK‚c>p÷3PKW 7BÊÁ¾³COPYRIGHT.htmlPKW 74tž4gÌdoc/allclasses-frame.htmlPKW 7¨pØ8#G doc/allclasses-noframe.htmlPKW 7Ô,ËS_ ˜‰­ doc/constant-values.htmlPKW 7’6ƒè ,Rdoc/deprecated-list.htmlPKW 7ÖP •" ´¢doc/help-doc.htmlPKW 77ƒ½&"#-(doc/index-all.htmlPKW 7Añ§î€iJdoc/index.htmlPKW 7ñpšz v8+“Ldoc/org/w3c/css/sac/AttributeCondition.htmlPKW 7=´§L˜ B%fVdoc/org/w3c/css/sac/CSSException.htmlPKW 7žm ‘S*Qadoc/org/w3c/css/sac/CSSParseException.htmlPKW 75M…Ò`,.¸ndoc/org/w3c/css/sac/CharacterDataSelector.htmlPKW 7F¶ŽŽÐX/,ævdoc/org/w3c/css/sac/CombinatorCondition.htmlPKW 7°}±Lû  W"doc/org/w3c/css/sac/Condition.htmlPKW 7ë:˜`Ð 5x)[Šdoc/org/w3c/css/sac/ConditionFactory.htmlPKW 7aÿ©’ ¢/,‚–doc/org/w3c/css/sac/ConditionalSelector.htmlPKW 7EˆŸ<˜Ï*)èždoc/org/w3c/css/sac/ContentCondition.htmlPKW 7?±hOî÷.+צdoc/org/w3c/css/sac/DescendantSelector.htmlPKW 7;ZôÔî 2s(¯doc/org/w3c/css/sac/DocumentHandler.htmlPKW 7/:win0(b½doc/org/w3c/css/sac/ElementSelector.htmlPKW 7/ ½ÄÙ h7%&Ædoc/org/w3c/css/sac/ErrorHandler.htmlPKW 7Ù}ã1QC`$RÑdoc/org/w3c/css/sac/InputSource.htmlPKW 7!É—›*&õàdoc/org/w3c/css/sac/LangCondition.htmlPKW 74.ã5šéÚ$àèdoc/org/w3c/css/sac/LexicalUnit.htmlPKW 70ÜÏ: .* Ìþdoc/org/w3c/css/sac/Locator.htmlPKW 7þ°'S‹Ž+*Tdoc/org/w3c/css/sac/NegativeCondition.htmlPKW 7fJ0¢¯ü+)7doc/org/w3c/css/sac/NegativeSelector.htmlPKW 7o„¿”3Ek=doc/org/w3c/css/sac/Parser.htmlPKW 7ðv™ˆ.1,½'doc/org/w3c/css/sac/PositionalCondition.htmlPKW 7an`>ò.6Ÿ0doc/org/w3c/css/sac/ProcessingInstructionSelector.htmlPKW 7ä*ÖöŸ!%A9doc/org/w3c/css/sac/SACMediaList.htmlPKW 7Î\²´ W!3@doc/org/w3c/css/sac/Selector.htmlPKW 7•j¢µË 7q(6Ldoc/org/w3c/css/sac/SelectorFactory.htmlPKW 7ÞGÔöëU"%WXdoc/org/w3c/css/sac/SelectorList.htmlPKW 7“Æùô½Ì4(•_doc/org/w3c/css/sac/SiblingSelector.htmlPKW 7­a‰©hâ''¨hdoc/org/w3c/css/sac/SimpleSelector.htmlPKW 7`.©ÆU&.epdoc/org/w3c/css/sac/helpers/ParserFactory.htmlPKW 7µ„¼  —.^xdoc/org/w3c/css/sac/helpers/package-frame.htmlPKW 7"¯UMÈ0Ãzdoc/org/w3c/css/sac/helpers/package-summary.htmlPKW 7´ èʹ±-édoc/org/w3c/css/sac/helpers/package-tree.htmlPKW 7»¿>i]&ý„doc/org/w3c/css/sac/package-frame.htmlPKW 7-‚Ï|0(ºˆdoc/org/w3c/css/sac/package-summary.htmlPKW 7¾d…ÄOà'%ßdoc/org/w3c/css/sac/package-tree.htmlPKW 7î!©H6—doc/overview-frame.htmlPKW 7C¶0G‚7Ô™doc/overview-summary.htmlPKW 7S¹„![Å%ždoc/overview-tree.htmlPKW 77”Æ(<¥doc/package-listPKW 7q7m|™˜¥doc/packages.htmlPKW 7Müƒ99S§doc/resources/inherit.gifPKW 7ejØphêÓ§doc/serialized-form.htmlPKW 7‚jƒ¹²­doc/stylesheet.cssPKW 7 º"jÐ^ '^¯org/w3c/css/sac/AttributeCondition.javaPKW 7äò¹1¶ !ƒ³org/w3c/css/sac/CSSException.javaPKW 7QóÌ &ç·org/w3c/css/sac/CSSParseException.javaPKW 7Õ€jX­¿*¾org/w3c/css/sac/CharacterDataSelector.javaPKW 7„ ©žì( Àorg/w3c/css/sac/CombinatorCondition.javaPKW 7‰°}c“¶Âorg/w3c/css/sac/Condition.javaPKW 7\ÊD&%߯org/w3c/css/sac/ConditionFactory.javaPKW 7ù=7É@(3Ìorg/w3c/css/sac/ConditionalSelector.javaPKW 7o£ØÐ„H%RÎorg/w3c/css/sac/ContentCondition.javaPKW 7—À4°ö')Ðorg/w3c/css/sac/DescendantSelector.javaPKW 7W ŽÏlX$.Òorg/w3c/css/sac/DocumentHandler.javaPKW 7ñœódèº$ìØorg/w3c/css/sac/ElementSelector.javaPKW 7Æe竦C!&Üorg/w3c/css/sac/ErrorHandler.javaPKW 7DÓŸ­|Ð âorg/w3c/css/sac/InputSource.javaPKW 7†<£[‚?"åêorg/w3c/css/sac/LangCondition.javaPKW 76n>¤Â& ·ìorg/w3c/css/sac/LexicalUnit.javaPKW 7Ä9Ž-8+ Çôorg/w3c/css/sac/Locator.javaPKW 7E/r2‡Z&Iùorg/w3c/css/sac/NegativeCondition.javaPKW 7± &Œk%$ûorg/w3c/css/sac/NegativeSelector.javaPKW 7S 5^ ýorg/w3c/css/sac/Parser.javaPKW 7™XD?@(org/w3c/css/sac/PositionalCondition.javaPKW 7U’™2org/w3c/css/sac/ProcessingInstructionSelector.javaPKW 7íN‚‘±½!} org/w3c/css/sac/SACMediaList.javaPKW 7t4®9Ÿ} org/w3c/css/sac/Selector.javaPKW 7;7­Æ$org/w3c/css/sac/SelectorFactory.javaPKW 7e&a*ôp!iorg/w3c/css/sac/SelectorList.javaPKW 7(Ðô 'í$¬org/w3c/css/sac/SiblingSelector.javaPKW 7j±#ž…#%org/w3c/css/sac/SimpleSelector.javaPKW 7‚c>p÷3*org/w3c/css/sac/helpers/ParserFactory.javaPKPPCc!css2xslfo/res/0000755000175000017500000000000011434532532014317 5ustar mithrandimithrandicss2xslfo/res/LICENCE0000644000175000017500000000014511434532532015304 0ustar mithrandimithrandiAll rights granted. This software is free and will remain free. To use at your own responsibility. css2xslfo/res/MANIFEST_css2fop.MF0000644000175000017500000000025311434532532017410 0ustar mithrandimithrandiManifest-Version: 1.0 Main-Class: be.re.css.CSSToFOP Implementation-Title: CSSToFOP Implementation-Version: 1.6.2 Implementation-Vendor: Pincette bvba Class-Path: fop.jar css2xslfo/res/MANIFEST_css2fopnew.MF0000644000175000017500000000026111434532532020121 0ustar mithrandimithrandiManifest-Version: 1.0 Main-Class: be.re.css.CSSToFOPNew Implementation-Title: CSSToFOPNew Implementation-Version: 1.6.2 Implementation-Vendor: Pincette bvba Class-Path: fop.jar css2xslfo/res/MANIFEST_css2xep.MF0000644000175000017500000000026711434532532017425 0ustar mithrandimithrandiManifest-Version: 1.0 Main-Class: be.re.css.CSSToXEP Implementation-Title: CSSToXEP Implementation-Version: 1.6.2 Implementation-Vendor: Pincette bvba Class-Path: saxon8.jar xep.jar css2xslfo/res/MANIFEST_css2xinc.MF0000644000175000017500000000030211434532532017560 0ustar mithrandimithrandiManifest-Version: 1.0 Main-Class: be.re.css.CSSToXinc Implementation-Title: CSSToXinc Implementation-Version: 1.6.2 Implementation-Vendor: Pincette bvba Class-Path: xinc.jar commons-logging.jar css2xslfo/res/MANIFEST_css2xsl.MF0000644000175000017500000000030411434532532017427 0ustar mithrandimithrandiManifest-Version: 1.0 Main-Class: be.re.css.CSSToXSLFormatter Implementation-Title: CSSToXSLFormatter Implementation-Version: 1.6.2 Implementation-Vendor: Pincette bvba Class-Path: XfoJavaCtl.jar css2xslfo/res/MANIFEST_css2xslfo.MF0000644000175000017500000000023311434532532017755 0ustar mithrandimithrandiManifest-Version: 1.0 Main-Class: be.re.css.CSSToXSLFO Implementation-Title: CSSToXSLFO Implementation-Version: 1.6.2 Implementation-Vendor: Pincette bvba css2xslfo/res/W3C_COPYRIGHT.html0000644000175000017500000000726511434532532017243 0ustar mithrandimithrandi W3C IPR SOFTWARE NOTICE

W3C IPR SOFTWARE NOTICE

Copyright © 2002 World Wide Web Consortium, (Massachusetts Institute of Technology, Institut National de Recherche en Informatique et en Automatique, Keio University). All Rights Reserved.

Note: The original version of the W3C Software Copyright Notice and License could be found at http://www.w3.org/Consortium/Legal/copyright-software-19980720

Copyright © 1994-2000 World Wide Web Consortium, (Massachusetts Institute of Technology, Institut National de Recherche en Informatique et en Automatique, Keio University). All Rights Reserved. http://www.w3.org/Consortium/Legal/

This W3C work (including software, documents, or other related items) is being provided by the copyright holders under the following license. By obtaining, using and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions:

Permission to use, copy, and modify this software and its documentation, with or without modification,  for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the software and documentation or portions thereof, including modifications, that you make:

  1. The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.
  2. Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, a short notice of the following form (hypertext is preferred, text is permitted) should be used within the body of any redistributed or derivative code: "Copyright © 2002 World Wide Web Consortium, (Massachusetts Institute of Technology, Institut National de Recherche en Informatique et en Automatique, Keio University). All Rights Reserved. http://www.w3.org/Consortium/Legal/"
  3. Notice of any changes or modifications to the W3C files, including the date changes were made. (We recommend you provide URIs to the location from which the code is derived.)

THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.

COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.

The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the software without specific, written prior permission. Title to copyright in this software and any associated documentation will at all times remain with copyright holders.

css2xslfo/res/release_notes.txt0000644000175000017500000003237011434532532017715 0ustar mithrandimithrandiRelease Notes CSSToXSLFO 1.6.2 23 August 2010 1. Requirements You need JRE 1.5 or a higher version to run the application. If you run css2xep.jar you also have to specify another XSLT processor, because XEP uses Saxon 6.5.x, with which it doesn't work. You can either prepend another XSLT processor to the boot classpath or you can simply copy saxon8.jar in the XEP lib directory. 2. Installation You can place the jar file where you want and launch the application as follows: > java -jar css2xslfo.jar options Consult the manual for details about running the application. 3. Changes 3.1 Changes Since Version 1.6.1 3051512: Recompile for FOP 1.0 Bug fixes 3.2 Changes Since Version 1.6 Bug fixes 2571787: Bug in ProjectorFilter 2588555: The value "transparent" is not recognized as a color 2758546: Relative URLs are always resolved to absolute URLs 3.3 Changes Since Version 1.5.2 Bug fixes 1722531: hard coded urls in css file are all set to lowercase 1911693: xml:lang or lang on document element is ignored 1984171: The XHTML catalog is no longer included 1997883: table element with a region property causes program to die New features - Add FOP command-line parsing for fopnew (feature request 1989920). With the new "-fop" option any FOP command-line option can be used. Note that the complete command-line syntax is not compatible with the previous version. The "-fc" has been removed, because there now is the FOP equivalent. - Add the "-config" command-line option to the Xinc variant. - Add the "-config" command-line option to the XSLFormatter variant. 3.4 Changes Since Version 1.5.1 Bug fixes 1807366: Floating point values are locale dependent 1811419: The text-align-last property is not treated as inherited 1824076: Splitting shorthand properties four ways uses a wrong order 1843554: Setting float to "none" still generates an fo:float 3.5 Changes Since Version 1.5 Bug fixes 1802080: A named page sequence with only tables is considered empty 3.6 Changes Since Version 1.4.2 Bug fixes 1716939: Regression because of invalid property bug (1691044) 1722531: hard coded urls in css file are all set to lowercase 1722541: underscores in class name 1723310: Relative URLs in a style sheet are not resolved 1731447: Inline properties are not applied to "graphic" and "leader" 1733555: The width and height properties are not applied to "graphic" 1737664: Floating point values shouldn't use exponential notation 1767912: Using as filter without calling parse or setParent fails 1768297: The text-align property is no longer applied to table cells 1770690: The page-break properties are no longer applied to table-row 1778499: The fopnew option -fc is broken New features - Support last pages, analogous to first pages (feature request 1720073). - Implement the "list-style-image" property (feature request 1721782). - Implement the background, border and padding page properties that are defined in CSS3 (feature request 1724392). This deviates from that specification in that the properties are applied to the region-body, because in XSL-FO they are not defined at the page master level. 3.7 Changes Since Version 1.4.1 Bug fixes 1701428: The border-width shorthand property is not split 1715203: Regression because of font-family bug (1679537) 3.8 Changes Since Version 1.4 Bug fixes 1679537: Font family names not quoted when they contain spaces 1681734: Only block-container should have absolute positioning 1684177: ID attribute on body is duplicated 1691044: Unexpected CSS attributes come out as bogus FO attributes 1691392: Named strings fail when contents is fragmented 3.9 Changes Since Version 1.3.3 Bug fixes 1594025: Css2FopNew user configuration file 1626094: Testing a style sheet URL is too slow New features - New Ant tasks (feature request 1554682). - New options "-config" and "-q" for css2xep.jar. 3.10 Changes Since Version 1.3.2 Bug fixes 1496388: Rules with document element don't work when in open document 1496389: xml:base treatment is not scoped 1553292: BASE element and xml:base not taken into account for links New features Use version 0.92beta instead of 0.91beta for the package for the new FOP branch. 3.11 Changes Since Version 1.3.1 Bug fixes 1359835: When display is "none" on regions, they are no longer shown 1462265: Regions which are not specific are not inherited 1482296: Overriding anonymous page context properties doesn't work 1482644: Drop width conversion for % values when parent has no width 3.12 Changes Since Version 1.3 Bug fixes 1455266: Regression with XSLTC because of prefix mapping events 3.13 Changes Since Version 1.2 Bug fixes 1356430: list-style and its singles are not treated correctly 1359835: When display is "none" on regions, they are no longer shown 1361765: No default for page counter reset 1425336: Invalid flow-name references New features - CSS3 namespaces. - Implement the "list-style-position" property. - Implement the ":first-letter" pseudo element. - Add the "wrapper" display type, which prevents an element from contributing formatting objects, but for which property inheritance works. - Add DeltaXML (http://www.deltaxml.com) to the User Agent style sheet. It takes care of the difference mark-up in the DeltaXML namespace. Note that the style sheet uses change bars, which work only for XEP4 (http://www.renderx.com) at the moment. - Add XLink to the User Agent style sheet. This merely consists of supporting the global XLink "href" attribute. - Relax the constraint that there should be no whitespace between a footnote reference and a footnote body. Whitespace between them is now gobbled. - Add the possibility for a footnote body to have a ":before" pseudo element with the display type "footnote-reference" instead of an explicit footnote reference element. The generated contents will go in the flow as well as in the footnote body. - Add support for xml:id. - Add the "foreign" display type. Elements having it end up in an fo:instream-foreign-object element. 3.14 Changes Since Version 1.1 Bug fixes 1348367: Fix table normalisation when display type is "none". 1348374: Fix link processing. 1348383: A CSS style sheet is not treated as case-insensitive. 1349014: Correct manual section about running with FOP. New features - The special Unicode spaces U+2000 through U+200A are post-processed using fo:leader elements (reminiscent of Jirka Kosek's DocBook style sheet). 3.15 Changes Since Version 1.0 Bug fixes 1281230: The presence of the anonymous @page rule is assumed. 1285991: Move fo:marker to the next allowed place in the XSL-FO tree. 1286078: Turn off hyphenation by default for User Agent page set-up. 1291094: A marker pseudo element shouldn't imply the other is one too. 1315758: Don't generate empty page sequences. New features - Add the "colspan" and "rowspan" properties for table cells. - Add the unit "pcw" (proportional column width) for table column widths. - Add the "table-omit-footer-at-break" and "table-omit-header-at-break" properties for tables. 3.16 Changes Since Version 1.0rc2 Incompatible changes - The "footnote" property no longer exists. It is replaced by the new display types "footnote-reference" and "footnote-body". This provides control over contents and style of both the footnote reference and body. The list style type "footnote" has also been added. It generates symbols such as the asterix, dagger, etc. - Regions have an incompatible restriction. They must now be the first children of the body region element. For XHTML the latter is the body element. - Move "counter-reset" for the "page" counter from the static regions to the @page rule. - Hyphenation is turned off by default instead of on. This puts it in line with XSL-FO. Enhancements - Add the "precedence" property for the top and bottom regions. - Implement the change bar extension. This works only with XEP at the moment. - Add the link extension, which covers internal and external links. - Make it work with Saxon 8.3 and later. - Make it work with JDK 1.5 without having to prepend an XSLT processor in the boot class path. - Remove the CSS rules for the XHTML elements "sup" and "sub" from the User Agent style sheet. Set the "line-height-shift-adjustment" property to "disregard-shifts" to compensate this. - Show a stack trace only in the main functions when -Dbe.re.stack is on. - Generalize the named pages feature. It is no longer bound to a sibling list below the XHTML "body" element or the document element for another XML vocabulary. - Enhance performance and reduce memory usage. - Add a Xinc package. - Add the XSL-FO "force-page-count" property. - Implement markers with the limitation that the value "auto" is not supported for the the "width" property. Check out section 12.6 of the CSS2 specification to learn how you can have much more control over lists through markers. - Implement the "column-span" property for multicolumn pages. - Introduce the display type "graphic". - Add the pseudo page "blank". Bug fixes - Fix the "string-set" property bug. It didn't cascade properly and it didn't work when placed in the XHTML "style" attribute. - Fix the CSSToXSLFOFilter constructor. It didn't check the absence of the user agent parameters. - Fix the absence of the "any" simple-page-master when there were @page rules without an anonymous @page rule. - Fix a page rule cascade bug. The page rules weren't split before sorting them. - Do the inheritance of text-align and vertical-align in tables only for XHTML tables and take into account the specificity of UA rules and universal selectors. - Fix the bug where properties on pseudo elements were also applied to the elements themselves. - Change the processing instruction xml:stylesheet into xml-stylesheet. The XML namespaces specification doesn't allow colons in PI targets. The new target follows the CSS2.1 convention. - Fix the combination of pseudo classes and pseudo elements. The specification ":first-child:before" didn't work. - Fix the application of the "content" property. It didn't cascade, but combined all matched property values. - Fix the specificity calculation in the case where several conditions are combined. - Set the "font-selection-strategy" property to "character-by-character", which corresponds to CSS. - Implement centering of blocks and tables when "margin-left" and "margin-right" are set to "auto". - Report missing command-line options in css2fop.jar. - Produce a descent error message when an URL is invalid when trying to parse a CSS style sheet. - The value "contents" for the "string-set" property also included the generated content for the element it was set on. - Fix the bug where the "userAgentParameters" argument to the constructor can't be "null". - Fix the treatment of the "clear" property. 3.17 Changes Since Version 1.0rc1 - Install an error handler on the filter chain for the validating mode, otherwise there are no error messages when Xalan 2.6.0 or higher are used. This is because Xalan's TraXFilter now correctly propagates error handler events instead of throwing an exception. - Also add the default unit "px" to the "width" and "height" of the XHTML "img" element if there is no specified unit. - Honor the "media" attribute of the XHTML "style" and "link" elements. - Fix a selector bug in the case unnamed element selectors are used elsewhere than at the final position. - Fix a named pages regression when using a more recent Xalan version. - Implement the multicolumn extension. 3.18 Changes Since Version 1.0b3 - Implement positioned elements (position, top, bottom, left and right properties). - Implement layered presentation (z-index property). - Use a block-container instead of a plain block when one of the following properties is specified on a block-level element: clip, height, min-height, min-width, overflow, width. This bug disabled those properties. - Add a FOP package variant with a FOP filter that removes some of the non-supported XSL-FO properties. - Implement the additional CSS3 List Module glyphs for the list-style-type property. 3.19 Changes Since Version 1.0b2 - Change the common -p option to accept a comma-separated list of URLs or filenames instead of just one. - The anonymous page block elements following a named page block element are now part of the same name page type of the latter. - Give lower precedence to the UA style sheet. - Fix a bug in the translation of XHTML attributes into CSS properties. - Fix a bug in the static region mapping onto pages. - Fix a bug in the load of the embedded XHTML catalog. - Document the footnote extension. - Document the orientation extension. - Complete the "Compliance With CSS2" section of the manual. 3.20 Changes Since Version 1.0b1 - Drop XSLTC because it produces wrong results. - Add the option "-v" to turn on XML validation explicitly. By default no validation is done. - Replace the deprecated XEP interface with the new interface. 4. Known Problems - The built-in XSLT-processors in JDK1.5.0 and JDK1.6.0 don't treat the "ancestor-or-self" axis as a reverse axis. This causes the "list-style-type" detection to fail for nested lists with different style types. As a workaround you should prepend Saxon or Xalan 2.7.0 to the boot classpath. 5. Contact Information Comments and bug reports can be sent to support@pincette.biz. Information about the application is available at http://www.re.be/css2xslfo/. css2xslfo/src/0000755000175000017500000000000012266721006014315 5ustar mithrandimithrandicss2xslfo/src/META-INF/0000755000175000017500000000000011434532504015454 5ustar mithrandimithrandicss2xslfo/src/META-INF/services/0000755000175000017500000000000011434532504017277 5ustar mithrandimithrandicss2xslfo/src/META-INF/services/org.w3c.css.sac.parser0000644000175000017500000000003411434532504023330 0ustar mithrandimithrandiorg.w3c.flute.parser.Parser css2xslfo/src/be/0000755000175000017500000000000011434532504014702 5ustar mithrandimithrandicss2xslfo/src/be/re/0000755000175000017500000000000011434532510015305 5ustar mithrandimithrandicss2xslfo/src/be/re/css/0000755000175000017500000000000011434532510016075 5ustar mithrandimithrandicss2xslfo/src/be/re/css/ant/0000755000175000017500000000000011434532510016657 5ustar mithrandimithrandicss2xslfo/src/be/re/css/ant/CSSToFOP.java0000644000175000017500000000266411434532506021037 0ustar mithrandimithrandipackage be.re.css.ant; import java.io.File; import java.io.FileOutputStream; import org.apache.fop.apps.Driver; import org.apache.fop.apps.Options; import org.apache.tools.ant.BuildException; /** * @author Werner Donn\u00e9 */ public class CSSToFOP extends TaskBase { private File configuration = null; private boolean quite = false; public void execute() throws BuildException { try { if (configuration != null) { new Options(configuration); } be.re.css.CSSToFOP.convert ( input.openStream(), new FileOutputStream(output), baseUrl != null ? baseUrl : input, userAgentStyleSheet, catalog != null ? catalog : CSSToFOP.class.getResource("/catalog"), parameters, preprocessors, output.toString().toLowerCase().endsWith(".pdf") ? Driver.RENDER_PDF : ( output.toString().toLowerCase().endsWith(".ps") ? Driver.RENDER_PS : ( output.toString().toLowerCase().endsWith(".svg") ? Driver.RENDER_SVG : -1 ) ), true, validate ); } catch (Exception e) { e.printStackTrace(); throw new BuildException(e); } } public void setConfig(File value) { configuration = value; } public void setQuite(boolean value) { quite = value; } } // CSSToFOP css2xslfo/src/be/re/css/ant/CSSToFOPNew.java0000644000175000017500000000231411434532506021501 0ustar mithrandimithrandipackage be.re.css.ant; import java.io.File; import java.io.FileOutputStream; import org.apache.tools.ant.BuildException; /** * @author Werner Donn\u00e9 */ public class CSSToFOPNew extends TaskBase { private File configuration = null; public void execute() throws BuildException { try { be.re.css.CSSToFOPNew.convert ( input.openStream(), new FileOutputStream(output), baseUrl != null ? baseUrl : input, userAgentStyleSheet, catalog != null ? catalog : CSSToFOPNew.class.getResource("/catalog"), parameters, preprocessors, output.toString().toLowerCase().endsWith(".pdf") ? "application/pdf" : ( output.toString().toLowerCase().endsWith(".ps") ? "application/postscript" : ( output.toString().toLowerCase().endsWith(".svg") ? "image/svg+xml" : null ) ), configuration, validate ); } catch (Exception e) { e.printStackTrace(); throw new BuildException(e); } } public void setConfig(File value) { value = configuration; } } // CSSToFOPNew css2xslfo/src/be/re/css/ant/CSSToXEP.java0000644000175000017500000000230411434532510021031 0ustar mithrandimithrandipackage be.re.css.ant; import java.io.FileOutputStream; import java.net.URL; import org.apache.tools.ant.BuildException; /** * @author Werner Donn\u00e9 */ public class CSSToXEP extends TaskBase { private URL configuration = null; private boolean quiet = false; public void execute() throws BuildException { try { be.re.css.CSSToXEP.convert ( input.openStream(), new FileOutputStream(output), baseUrl != null ? baseUrl : input, userAgentStyleSheet, catalog != null ? catalog : CSSToXEP.class.getResource("/catalog"), parameters, preprocessors, output.toString().toLowerCase().endsWith(".pdf") ? be.re.css.CSSToXEP.PDF : ( output.toString().toLowerCase().endsWith(".ps") ? be.re.css.CSSToXEP.POSTSCRIPT : -1 ), validate, quiet, configuration ); } catch (Exception e) { e.printStackTrace(); throw new BuildException(e); } } public void setConfig(String value) { configuration = createUrl(value); } public void setQuiet(boolean value) { quiet = value; } } // CSSToXEP css2xslfo/src/be/re/css/ant/CSSToXSLFO.java0000644000175000017500000000132211434532510021267 0ustar mithrandimithrandipackage be.re.css.ant; import java.io.FileOutputStream; import org.apache.tools.ant.BuildException; /** * @author Werner Donn\u00e9 */ public class CSSToXSLFO extends TaskBase { public void execute() throws BuildException { try { be.re.css.CSSToXSLFO.convert ( input.openStream(), new FileOutputStream(output), baseUrl != null ? baseUrl : input, userAgentStyleSheet, catalog != null ? catalog : CSSToXSLFO.class.getResource("/catalog"), parameters, preprocessors, validate, false ); } catch (Exception e) { e.printStackTrace(); throw new BuildException(e); } } } // CSSToXSLFO css2xslfo/src/be/re/css/ant/CSSToXSLFormatter.java0000644000175000017500000000213311434532510022727 0ustar mithrandimithrandipackage be.re.css.ant; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import jp.co.antenna.XfoJavaCtl.XfoObj; import org.apache.tools.ant.BuildException; /** * @author Werner Donn\u00e9 */ public class CSSToXSLFormatter extends TaskBase { public void execute() throws BuildException { File f = null; try { f = File.createTempFile("be.re.css.", "css2xslformatter"); f.deleteOnExit(); be.re.css.CSSToXSLFO.convert ( input.openStream(), new FileOutputStream(f), baseUrl != null ? baseUrl : input, userAgentStyleSheet, catalog != null ? catalog : CSSToXSLFormatter.class.getResource("/catalog"), parameters, preprocessors, validate, false ); new XfoObj().render(new FileInputStream(f), new FileOutputStream(output)); } catch (Exception e) { e.printStackTrace(); throw new BuildException(e); } finally { if (f != null) { f.delete(); } } } } // CSSToXSLFormatter css2xslfo/src/be/re/css/ant/CSSToXinc.java0000644000175000017500000000134011434532510021275 0ustar mithrandimithrandipackage be.re.css.ant; import java.io.FileOutputStream; import org.apache.tools.ant.BuildException; /** * @author Werner Donn\u00e9 */ public class CSSToXinc extends TaskBase { public void execute() throws BuildException { try { be.re.css.CSSToXinc.convert ( input.openStream(), new FileOutputStream(output), baseUrl != null ? baseUrl : input, userAgentStyleSheet, catalog != null ? catalog : CSSToXinc.class.getResource("/catalog"), parameters, preprocessors, be.re.css.CSSToXinc.PDF, validate ); } catch (Exception e) { e.printStackTrace(); throw new BuildException(e); } } } // CSSToXinc css2xslfo/src/be/re/css/ant/TaskBase.java0000644000175000017500000000424211434532510021221 0ustar mithrandimithrandipackage be.re.css.ant; import be.re.util.Array; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Map; import org.apache.tools.ant.Task; /** * The base class for all CSSToXSLFO tasks. * @author Werner Donn\u00e9 */ public abstract class TaskBase extends Task { protected URL baseUrl; protected URL catalog; protected URL input; protected File output; protected Map parameters = new HashMap(); protected URL[] preprocessors = new URL[0]; protected URL userAgentStyleSheet = null; protected boolean validate = false; public Parameter createParameter() { return new Parameter(); } public Preprocessor createPreprocessor() { return new Preprocessor(); } protected URL createUrl(String s) { try { return be.re.net.Util.isUrl(s) ? new URL(s) : be.re.net.Util.fileToUrl(new File(s)); } catch (MalformedURLException e) { throw new RuntimeException(e); } } public void setBaseurl(String value) { baseUrl = createUrl(value); } public void setCatalog(String value) { catalog = createUrl(value); } public void setInput(String value) { input = createUrl(value); } public void setOutput(File value) { output = value; } public void setUseragentstylesheet(String value) { userAgentStyleSheet = createUrl(value); } public void setValidate(boolean value) { validate = value; } public class Parameter { private String name = null; private String value = null; public void setName(String value) { name = value; if (this.value != null) { parameters.put(name, this.value); } } public void setValue(String value) { this.value = value; if (name != null) { parameters.put(name, this.value); } } } // Parameter public class Preprocessor { public void setStylesheet(String value) { preprocessors = (URL[]) Array.append(preprocessors, createUrl(value)); } } // Preprocessor } // TaskBase css2xslfo/src/be/re/css/res/0000755000175000017500000000000011434532510016666 5ustar mithrandimithrandicss2xslfo/src/be/re/css/res/space_correction.prop0000644000175000017500000000027011434532510023111 0ustar mithrandimithrandi#Should only have entries for U+2000 through U+200A. The rest is ignored. 2000=0.5em 2001=1em 2002=0.5em 2003=1em 2004=0.33em 2005=0.25em 2006=0.16em 2007= 2008= 2009=0.2em 200A=0.1em css2xslfo/src/be/re/css/style/0000755000175000017500000000000011434532510017235 5ustar mithrandimithrandicss2xslfo/src/be/re/css/style/css.xsl0000644000175000017500000010525111434532510020561 0ustar mithrandimithrandi 6pt 0 0 outside image disc after start end before after center before fixed preserve false preserve wrap 1em a i A I 1 1.5em 2em 1.5em 2.5em 1.5em 2em 2.5em 3.5em 2em 2.5em 3em 4em 1.5em 2em 2.5em css2xslfo/src/be/re/css/style/deltaxml.css0000644000175000017500000000161011434532510021557 0ustar mithrandimithrandi@namespace deltaxml url(http://www.deltaxml.com/ns/well-formed-delta-v1); @media print { deltaxml|PCDATAnew, deltaxml|PCDATAold { display: inline; } deltaxml|exchange, deltaxml|new, deltaxml|old { display: wrapper; } *[deltaxml|delta="add"], deltaxml|PCDATAnew, deltaxml|new { text-decoration: underline; } *[deltaxml|delta="delete"], deltaxml|PCDATAold, deltaxml|old { text-decoration: line-through; } *[deltaxml|delta="add"]:before, deltaxml|PCDATAnew:before, deltaxml|new, *[deltaxml|delta="delete"]:before, deltaxml|PCDATAold:before, deltaxml|old { change-bar-class: changed; change-bar-placement: alternate; change-bar-style: solid; change-bar-width: 0.2pt; } *[deltaxml|delta="add"]:after, deltaxml|PCDATAnew:after, *[deltaxml|delta="delete"]:after, deltaxml|PCDATAold:after { change-bar-class: changed; } } css2xslfo/src/be/re/css/style/fo_setup.xsl0000644000175000017500000003127511434532510021621 0ustar mithrandimithrandi 1 GB serif none en black 10mm portrait 10mm 25mm 25mm 10mm onesided a4 0.2pt 10pt 11pt 1188mm 840mm 594mm 420mm 297mm 210mm 250mm 11in 11in 14in Unknown paper-size, taking a4 297mm 840mm 594mm 420mm 297mm 210mm 148mm 176mm 7.25in 8.5in 8.5in 210mm Unknown orientation, taking portrait lr-tb region-before-even region-before-odd region-before-even start end css2xslfo/src/be/re/css/style/fop_filter.xsl0000644000175000017500000001103411434532510022115 0ustar mithrandimithrandi bold 0pt inherited-property-value(start-indent) inherited-property-value(start-indent) + inherited-property-value(end-indent) inherited-property-value(end-indent) + 0pt 0pt 0pt 0pt 0pt 2em fixed 100% css2xslfo/src/be/re/css/style/ua.css0000644000175000017500000000011011434532510020344 0ustar mithrandimithrandi@import "xhtml_print.css"; @import "deltaxml.css"; @import "xlink.css"; css2xslfo/src/be/re/css/style/util.xsl0000644000175000017500000000626711434532510020755 0ustar mithrandimithrandi Position for get-token must be greater than 0. css2xslfo/src/be/re/css/style/xhtml.css0000644000175000017500000000733311434532510021111 0ustar mithrandimithrandi@namespace url(http://www.w3.org/1999/xhtml); address, blockquote, body, dd, div, dl, dt, fieldset, form, frame, frameset, h1, h2, h3, h4, h5, h6, iframe, noframes, object, ol, p, ul, applet, center, dir, hr, menu, pre { display: block } li { display: list-item } head { display: none } table { display: table } tr { display: table-row } thead { display: table-header-group } tbody { display: table-row-group } tfoot { display: table-footer-group } col { display: table-column } colgroup { display: table-column-group } td, th { display: table-cell } caption { display: table-caption } th { font-weight: bolder; text-align: center } caption { text-align: center } body { padding: 8px; line-height: 1.33 } h1 { font-size: 2em; margin: .67em 0 } h2 { font-size: 1.5em; margin: .83em 0 } h3 { font-size: 1.17em; margin: 1em 0 } h4, p, blockquote, ul, fieldset, form, ol, dl, dir, menu { margin: 1.33em 0 } h5 { font-size: .83em; line-height: 1.17em; margin: 1.67em 0 } h6 { font-size: .67em; margin: 2.33em 0 } h1, h2, h3, h4, h5, h6, b, strong { font-weight: bolder } blockquote { margin-left: 40px; margin-right: 40px } i, cite, em, var, address { font-style: italic } pre, tt, code, kbd, samp { font-family: monospace } pre { white-space: pre } big { font-size: 1.17em } small, sub, sup { font-size: .83em } sub { vertical-align: sub } sup { vertical-align: super } s, strike, del { text-decoration: line-through } hr { border: 1px inset } ol, ul, dir, menu, dd { margin-left: 40px } ol { list-style-type: decimal } ol ul, ul ol, ul ul, ol ol { margin-top: 0; margin-bottom: 0 } u, ins { text-decoration: underline } center { text-align: center } br:before { content: "\a" } /* an example of style for html 4.0 s abbr/acronym elements */ abbr, acronym { font-variant: small-caps; letter-spacing: 0.1em } a[href] { text-decoration: underline } :focus { outline: thin dotted invert } /* begin bidirectionality settings (do not change) */ bdo[dir="ltr"] { direction: ltr; unicode-bidi: bidi-override } bdo[dir="rtl"] { direction: rtl; unicode-bidi: bidi-override } *[dir="ltr"] { direction: ltr; unicode-bidi: embed } *[dir="rtl"] { direction: rtl; unicode-bidi: embed } /* elements that are block-level in html4 */ address, blockquote, body, dd, div, dl, dt, fieldset, form, frame, frameset, h1, h2, h3, h4, h5, h6, iframe, noscript, noframes, object, ol, p, ul, applet, center, dir, hr, menu, pre, li, table, tr, thead, tbody, tfoot, col, colgroup, td, th, caption { unicode-bidi: embed } /* end bidi settings */ /*@page { margin: 10% }*/ @media print { h1, h2, h3, h4, h5, h6 { page-break-after: avoid; page-break-inside: avoid } blockquote, pre { page-break-inside: avoid } ul, ol, dl { page-break-before: avoid } } @media speech { h1, h2, h3, h4, h5, h6 { voice-family: paul, male; stress: 20; richness: 90 } h1 { pitch: x-low; pitch-range: 90 } h2 { pitch: x-low; pitch-range: 80 } h3 { pitch: low; pitch-range: 70 } h4 { pitch: medium; pitch-range: 60 } h5 { pitch: medium; pitch-range: 50 } h6 { pitch: medium; pitch-range: 40 } li, dt, dd { pitch: medium; richness: 60 } dt { stress: 80 } pre, code, tt { pitch: medium; pitch-range: 0; stress: 0; richness: 80 } em { pitch: medium; pitch-range: 60; stress: 60; richness: 50 } strong { pitch: medium; pitch-range: 60; stress: 90; richness: 90 } dfn { pitch: high; pitch-range: 60; stress: 60 } s, strike { richness: 0 } i { pitch: medium; pitch-range: 60; stress: 60; richness: 50 } b { pitch: medium; pitch-range: 60; stress: 90; richness: 90 } u { richness: 0 } a:link { voice-family: harry, male } a:visited { voice-family: betty, female } a:active { voice-family: betty, female; pitch-range: 80; pitch: x-high } } css2xslfo/src/be/re/css/style/xhtml_print.css0000644000175000017500000000506511434532510022325 0ustar mithrandimithrandi@import "xhtml.css"; @namespace url(http://www.w3.org/1999/xhtml); @media print { a[href] { color: blue; link: attr(href); text-decoration: none; } a[name] { anchor: name; } blockquote, dl, ol, p, ul { margin: 0.83em 0pt; } blockquote { margin-left: 3em; margin-right: 3em; } body { font-family: serif; padding: 0pt; region: body; } body:lang(da) { quotes: "\00BB" "\00AB"; } body:lang(de-DE), body:lang(de-AT) { quotes: "\201E" "\201C" "\201A" "\2018" } body, body:lang(en), body:lang(es) { quotes: "\201C" "\201D" "\2018" "\2019"; } body:lang(fr) { quotes: "\00AB " " \00BB" "\2039 " " \203A"; } body:lang(it) { quotes: "\00AB " " \00BB"; } body:lang(nl) { quotes: "\201D" "\201D" "\2019" "\2019"; } body:lang(no), bodylang:(pt), body:lang(de-CH) { quotes: "\00AB" "\00BB" "\2039" "\203A" } body:lang(sv) { quotes: "\00BB" "\00BB"; } caption { margin: 0.5em 0pt; } dt { page-break-after: avoid; } h1 { font-size: 1.6em; margin-bottom: 0.7em; margin-top: 1.4em; } h2 { font-size: 1.3em; margin-bottom: 0.6em; margin-top: 1.2em; } h3 { font-size: 1.1em; } h3, h4 { margin-bottom: 0.5em; margin-top: 1em; } h1, h2, h3, h4, h5, h6 { hyphenate: false; } hr { border: 0.1pt solid; } img { content-height: scale-to-fit; content-width: scale-to-fit; display: graphic; scaling: uniform; src: attr(src); } li { margin-bottom: 0.8em; margin-top: 0.8em; } li p, li blockquote, li dl, li ol, li ul { margin-bottom: 0.5em; margin-top: 0.5em; } li li { margin-bottom: 0.5em; margin-top: 0.5em; } li li p, li li blockquote, li li dl, li li ol, li li ul { margin-bottom: 0.3em; margin-top: 0.3em; } li li li { margin-bottom: 0.4em; margin-top: 0.4em; } li li li p, li li li blockquote, li li li dl, li li li ol, li li li ul { margin-bottom: 0.3em; margin-top: 0.3em; } li, p { text-align: justify; } pre { font-size: 0.85em; } ul { list-style-type: disc; } ol li ul, ul li ul { list-style-type: circle; } ol li ol li ul, ol li ul li ul, ul li ol li ul, ul li ul li ul { list-style-type: square; } q:after { content: close-quote; } q:before { content: open-quote; } script { display: none; } span.section-number { padding-right: 1em; } } css2xslfo/src/be/re/css/style/xlink.css0000644000175000017500000000017211434532510021074 0ustar mithrandimithrandi@namespace xlink url(http://www.w3.org/1999/xlink); @media print { *[xlink|href] { link: attr(xlink|href); } } css2xslfo/src/be/re/css/BlockContainerFilter.java0000644000175000017500000000764211434532504023017 0ustar mithrandimithrandipackage be.re.css; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.Stack; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * Checks properties to see if an element has to be wrapped in a * fo:block-container. * @author Werner Donn\u00e9 */ class BlockContainerFilter extends XMLFilterImpl { private final static Set containerProperties = new HashSet ( Arrays.asList ( new String[] { "bottom", "clip", "height", "left", "max-height", "max-width", "min-height", "min-width", "orientation", "overflow", "position", "right", "top", "width", "z-index" } ) ); private final static Set triggeringBlockProperties = new HashSet ( Arrays.asList ( new String[] { "clip", "height", "max-height", "max-width", "min-height", "min-width", "orientation", "overflow", "width", "z-index" } ) ); private Stack stack = new Stack(); BlockContainerFilter() { } BlockContainerFilter(XMLReader parent) { super(parent); } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { super.endElement(namespaceURI, localName, qName); if (stack.pop().equals(new Boolean(true))) { super.endElement(Constants.XSLFO, "block", "fo:block"); super. endElement(Constants.XSLFO, "block-container", "fo:block-container"); } } private static boolean isContainerAttribute(Attributes atts, int index) { String name = atts.getLocalName(index); return Constants.CSS.equals(atts.getURI(index)) && ( containerProperties.contains(name) || name.startsWith("background-") || name.startsWith("border-") || name.startsWith("margin-") || name.startsWith("padding-") || name.startsWith("page-break-") ); } private static AttributesImpl selectAttributes(Attributes atts, boolean container) { AttributesImpl result = new AttributesImpl(); for (int i = 0; i < atts.getLength(); ++i) { if (container == isContainerAttribute(atts, i)) { result.addAttribute ( atts.getURI(i), atts.getLocalName(i), atts.getQName(i), atts.getType(i), atts.getValue(i) ); } } return result; } private static boolean shouldWrap(Attributes atts) { boolean block = "block".equals(atts.getValue(Constants.CSS, "display")); for (int i = 0; i < atts.getLength(); ++i) { if ( Constants.CSS.equals(atts.getURI(i)) && ( ( block && triggeringBlockProperties.contains(atts.getLocalName(i)) ) || ( "position".equals(atts.getLocalName(i)) && ( "absolute".equals(atts.getValue(i)) || "fixed".equals(atts.getValue(i)) ) ) ) ) { return true; } } return false; } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { boolean wrap = shouldWrap(atts); if (wrap) { super.startElement ( Constants.XSLFO, "block-container", "fo:block-container", selectAttributes(atts, true) ); super.startElement ( Constants.XSLFO, "block", "fo:block", new AttributesImpl() ); } super.startElement ( namespaceURI, localName, qName, wrap ? selectAttributes(atts, false) : atts ); stack.push(new Boolean(wrap)); } } // BlockContainerFilter css2xslfo/src/be/re/css/CSSToFOP.java0000644000175000017500000002263711434532504020255 0ustar mithrandimithrandipackage be.re.css; import be.re.xml.sax.ProtectEventHandlerFilter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.UndeclaredThrowableException; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Map; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamSource; import org.apache.avalon.framework.logger.ConsoleLogger; import org.apache.avalon.framework.logger.Logger; import org.apache.avalon.framework.logger.NullLogger; import org.apache.fop.apps.Driver; import org.apache.fop.apps.Options; import org.apache.fop.messaging.MessageHandler; import org.xml.sax.InputSource; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; /** * Convenience class for the conversion from CSS to the FOP XSL-FO formatter. * @author Werner Donn\u00e9 */ public class CSSToFOP { public static void convert(URL in, OutputStream out, URL userAgentStyleSheet, int format) throws IOException, CSSToXSLFOException { convert ( in.openStream(), out, in, userAgentStyleSheet, null, new HashMap(), null, format, false, false ); } public static void convert(InputStream in, OutputStream out, int format) throws IOException, CSSToXSLFOException { convert(in, out, null, format); } public static void convert(InputStream in, OutputStream out, URL userAgentStyleSheet, int format) throws IOException, CSSToXSLFOException { convert ( in, out, null, userAgentStyleSheet, null, new HashMap(), null, format, false, false ); } public static void convert ( InputStream in, OutputStream out, URL baseUrl, URL userAgentStyleSheet, URL catalog, Map parameters, URL[] preprocessors, int format, boolean quiet, boolean validate ) throws IOException, CSSToXSLFOException { try { XMLReader parser = be.re.xml.sax.Util.getParser(catalog, validate); XMLFilter parent = new ProtectEventHandlerFilter(true, true, parser); if (preprocessors != null) { parent = Util.createPreprocessorFilter(preprocessors, parent); } XMLFilter filter = new CSSToXSLFOFilter ( baseUrl, userAgentStyleSheet, parameters, parent, System.getProperty("be.re.css.debug") != null ); InputSource source = new InputSource(in); if (baseUrl != null) { source.setSystemId(baseUrl.toString()); } Driver driver = new Driver(); MessageHandler.setScreenLogger ( quiet ? (Logger) new NullLogger() : (Logger) new ConsoleLogger(ConsoleLogger.LEVEL_INFO) ); driver.setLogger ( quiet ? (Logger) new NullLogger() : (Logger) new ConsoleLogger(ConsoleLogger.LEVEL_INFO) ); driver.setRenderer(format); if (out != null) { driver.setOutputStream(out); } TransformerHandler handler = be.re.xml.sax.Util.newSAXTransformerFactory().newTransformerHandler ( new StreamSource ( CSSToFOP.class.getResourceAsStream("style/fop_filter.xsl") ) ); handler.setResult(new SAXResult(driver.getContentHandler())); filter.setContentHandler(handler); filter.parse(source); } catch (Exception e) { throw new CSSToXSLFOException(e); } } public static void main(String[] args) throws Exception { URL baseUrl = null; URL catalog = null; File configFile = null; int format = -1; String output = null; Map parameters = new HashMap(); URL[] preprocessors = null; boolean quiet = false; URL url = null; URL userAgentStyleSheet = null; boolean validate = false; for (int i = 0; i < args.length; ++i) { if (args[i].equals("-h")) { usage(0); } if (args[i].equals("-baseurl")) { if (i == args.length - 1) { usage(1); } baseUrl = Util.createUrl(args[++i]); } else { if (args[i].equals("-uacss")) { if (i == args.length - 1) { usage(1); } userAgentStyleSheet = Util.createUrl(args[++i]); } else { if (args[i].equals("-q")) { quiet = true; } else { if (args[i].equals("-pdf")) { if (i == args.length - 1 || format != -1) { usage(1); } format = Driver.RENDER_PDF; output = args[++i]; } else { if (args[i].equals("-ps")) { if (i == args.length - 1 || format != -1) { usage(1); } format = Driver.RENDER_PS; output = args[++i]; } else { if (args[i].equals("-svg")) { if (i == args.length - 1 || format != -1) { usage(1); } format = Driver.RENDER_SVG; output = args[++i]; } else { if (args[i].equals("-c")) { if (i == args.length - 1) { usage(1); } catalog = Util.createUrl(args[++i]); } else { if (args[i].equals("-p")) { if (i == args.length - 1) { usage(1); } preprocessors = Util.createUrls(args[++i]); } else { if (args[i].equals("-v")) { validate = true; } else { if (args[i].equals("-fc")) { if (i == args.length - 1) { usage(1); } configFile = new File(args[++i]); } else { if (args[i].indexOf('=') != -1) { parameters.put ( args[i].substring(0, args[i].indexOf('=')), args[i].indexOf('=') == args[i].length() - 1 ? "" : args[i].substring(args[i].indexOf('=') + 1) ); } else { if (url != null) { usage(1); } url = Util.createUrl(args[i]); } } } } } } } } } } } } if (format == -1) { usage(1); } if (configFile != null) { new Options(configFile); } parameters.put ( "base-url", baseUrl != null ? baseUrl.toString() : (url != null ? url.toString() : "") ); try { convert ( url != null ? url.openStream() : System.in, output != null ? new FileOutputStream(output) : null, baseUrl != null ? baseUrl : url, userAgentStyleSheet, catalog != null ? catalog : CSSToFOP.class.getResource("/catalog"), parameters, preprocessors, format, quiet, validate ); } catch (Throwable e) { System.err.println(e.getMessage()); be.re.util.Util.printStackTrace(e); } } private static void usage(int code) { System.err.println("Usage: be.re.css.CSSToFOP"); System.err.println(" [-h]: show this help"); System.err.println(" [-baseurl url]: base URL "); System.err.println(" [-c url_or_filename]: catalog for entity resolution"); System.err.println(" [-config url_or_filename]: extra configuration"); System.err.println(" [-p url_or_filename_comma_list]: preprocessors"); System.err.println(" [-q]: quiet mode"); System.err.println(" [-uacss url_or_filename]: User Agent style sheet"); System.err.println(" [-v]: turn on validation"); System.err. println(" [url_or_filename]: the input document, uses stdin by default"); System.err.println(" [parameter=value ...] "); System.err. println(" (-pdf filename | -ps filename | -svg filename): output file"); System.err.println(); Util.printUserAgentParameters(System.err); System.exit(code); } } // CSSToFOP css2xslfo/src/be/re/css/CSSToFOPNew.java0000644000175000017500000002060011434532504020713 0ustar mithrandimithrandipackage be.re.css; import be.re.xml.sax.ProtectEventHandlerFilter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.HashMap; import java.util.Map; import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.FopFactory; import org.apache.fop.cli.CommandLineOptions; import org.xml.sax.InputSource; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; /** * Convenience class for the conversion from CSS to the new FOP XSL-FO * formatter. * @author Werner Donn\u00e9 */ public class CSSToFOPNew { public static void convert(URL in, OutputStream out, URL userAgentStyleSheet, String format) throws IOException, CSSToXSLFOException { convert ( in.openStream(), out, in, userAgentStyleSheet, null, new HashMap(), null, format, null, false, null ); } public static void convert(InputStream in, OutputStream out, String format) throws IOException, CSSToXSLFOException { convert(in, out, null, format); } public static void convert ( InputStream in, OutputStream out, URL userAgentStyleSheet, String format ) throws IOException, CSSToXSLFOException { convert ( in, out, null, userAgentStyleSheet, null, new HashMap(), null, format, null, false, null ); } public static void convert ( InputStream in, OutputStream out, URL baseUrl, URL userAgentStyleSheet, URL catalog, Map parameters, URL[] preprocessors, String format, File configFile, boolean validate ) throws IOException, CSSToXSLFOException { convert ( in, out, baseUrl, userAgentStyleSheet, catalog, parameters, preprocessors, format, configFile, validate, null ); } public static void convert ( InputStream in, OutputStream out, URL baseUrl, URL userAgentStyleSheet, URL catalog, Map parameters, URL[] preprocessors, String format, File configFile, boolean validate, FOUserAgent agent ) throws IOException, CSSToXSLFOException { try { XMLReader parser = be.re.xml.sax.Util.getParser(catalog, validate); XMLFilter parent = new ProtectEventHandlerFilter(true, true, parser); if (preprocessors != null) { parent = Util.createPreprocessorFilter(preprocessors, parent); } XMLFilter filter = new CSSToXSLFOFilter ( baseUrl, userAgentStyleSheet, parameters, parent, System.getProperty("be.re.css.debug") != null ); InputSource source = new InputSource(in); if (baseUrl != null) { source.setSystemId(baseUrl.toString()); } FopFactory factory = FopFactory.newInstance(); if (configFile != null) { factory.setUserConfig ( new DefaultConfigurationBuilder().buildFromFile(configFile) ); } if (agent == null) { agent = factory.newFOUserAgent(); } filter.setContentHandler ( factory.newFop(format, agent, out).getDefaultHandler() ); filter.parse(source); } catch (Exception e) { throw new CSSToXSLFOException(e); } } public static void main(String[] args) throws Exception { URL baseUrl = null; URL catalog = null; String[] fopOptions = null; Map parameters = new HashMap(); URL[] preprocessors = null; URL url = null; URL userAgentStyleSheet = null; boolean validate = false; for (int i = 0; i < args.length; ++i) { if (args[i].equals("-h")) { usage(0); } if (args[i].equals("-fop")) { fopOptions = new String[args.length - ++i]; for (int j = 0; i < args.length; ++i, ++j) { fopOptions[j] = args[i]; } } else { if (args[i].equals("-baseurl")) { if (i == args.length - 1) { usage(1); } baseUrl = Util.createUrl(args[++i]); } else { if (args[i].equals("-uacss")) { if (i == args.length - 1) { usage(1); } userAgentStyleSheet = Util.createUrl(args[++i]); } else { if (args[i].equals("-c")) { if (i == args.length - 1) { usage(1); } catalog = Util.createUrl(args[++i]); } else { if (args[i].equals("-p")) { if (i == args.length - 1) { usage(1); } preprocessors = Util.createUrls(args[++i]); } else { if (args[i].equals("-v")) { validate = true; } else { if (args[i].indexOf('=') != -1) { parameters.put ( args[i].substring(0, args[i].indexOf('=')), args[i].indexOf('=') == args[i].length() - 1 ? "" : args[i].substring(args[i].indexOf('=') + 1) ); } else { if (url != null) { usage(1); } url = Util.createUrl(args[i]); } } } } } } } } parameters.put ( "base-url", baseUrl != null ? baseUrl.toString() : (url != null ? url.toString() : "") ); FOUserAgent agent = null; FopCommandLine options = new FopCommandLine(); options. parse(setDummyInputFile(fopOptions != null ? fopOptions : new String[0])); agent = options.getFOUserAgent(); try { convert ( url != null ? url.openStream() : System.in, new FileOutputStream(options.getOutputFile()), baseUrl != null ? baseUrl : url, userAgentStyleSheet, catalog != null ? catalog : CSSToFOPNew.class.getResource("/catalog"), parameters, preprocessors, options.getOutputFormat(), null, validate, agent ); } catch (Throwable e) { System.err.println(e.getMessage()); be.re.util.Util.printStackTrace(e); } } private static String[] setDummyInputFile(String[] args) throws Exception { String[] result = new String[args.length + 2]; System.arraycopy(args, 0, result, 0, args.length); result[result.length - 2] = "-fo"; result[result.length - 1] = be.re.io.Util.createTempFile("css2fopnew.", null).getAbsolutePath(); return result; } private static void usage(int code) { System.err.println("Usage: be.re.css.CSSToFOPNew"); System.err.println(" [-h]: show this help"); System.err.println(" [-baseurl url]: base URL"); System.err.println(" [-c url_or_filename]: catalog for entity resolution"); System.err.println(" [-p url_or_filename_comma_list]: preprocessors"); System.err.println(" [-uacss url_or_filename]: User Agent style sheet"); System.err.println(" [-v]: turn on validation"); System.err. println(" [url_or_filename]: the input document, uses stdin by default"); System.err.println(" [parameter=value ...] "); System.err. println(" -fop options: the rest of the command-line is for FOP"); System.err.println(); Util.printUserAgentParameters(System.err); System.exit(code); } private static class FopCommandLine extends CommandLineOptions { public FOUserAgent getFOUserAgent() { return super.getFOUserAgent(); } public String getOutputFormat() throws FOPException { return super.getOutputFormat(); } } // FopCommandLine } // CSSToFOPNew css2xslfo/src/be/re/css/CSSToXEP.java0000644000175000017500000002236311434532504020261 0ustar mithrandimithrandipackage be.re.css; import be.re.xml.sax.ProtectEventHandlerFilter; import com.renderx.xep.FOTarget; import com.renderx.xep.FormatterImpl; import com.renderx.xep.lib.DefaultLogger; import com.renderx.xep.lib.Logger; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.UndeclaredThrowableException; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Map; import javax.xml.transform.sax.SAXSource; import javax.xml.transform.stream.StreamSource; import org.xml.sax.InputSource; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; /** * Convenience class for the conversion from CSS to the XEP XSL-FO formatter. * @author Werner Donn\u00e9 */ public class CSSToXEP { public static final int PDF = 0; public static final int POSTSCRIPT = 1; public static void convert(URL in, OutputStream out, URL userAgentStyleSheet, int format) throws IOException, CSSToXSLFOException { convert ( in.openStream(), out, in, userAgentStyleSheet, null, new HashMap(), null, format, false ); } public static void convert(InputStream in, OutputStream out, int format) throws IOException, CSSToXSLFOException { convert(in, out, null, format); } public static void convert(InputStream in, OutputStream out, URL userAgentStyleSheet, int format) throws IOException, CSSToXSLFOException { convert ( in, out, null, userAgentStyleSheet, null, new HashMap(), null, format, false ); } public static void convert ( InputStream in, OutputStream out, URL baseUrl, URL userAgentStyleSheet, URL catalog, Map parameters, URL[] preprocessors, int format, boolean validate ) throws IOException, CSSToXSLFOException { convert ( in, out, baseUrl, userAgentStyleSheet, catalog, parameters, preprocessors, format, validate, false, null ); } public static void convert ( InputStream in, OutputStream out, URL baseUrl, URL userAgentStyleSheet, URL catalog, Map parameters, URL[] preprocessors, int format, boolean validate, boolean quiet, URL configuration ) throws IOException, CSSToXSLFOException { if (format != PDF && format != POSTSCRIPT) { throw new IllegalArgumentException ( "be.re.css.CSSToXEP.convert takes only be.re.css.CSSToXEP.PDF " + "or be.re.css.CSSToXEP.POSTSCRIPT as format values." ); } try { XMLReader parser = be.re.xml.sax.Util.getParser(catalog, validate); XMLFilter parent = new ProtectEventHandlerFilter(true, true, parser); if (preprocessors != null) { parent = Util.createPreprocessorFilter(preprocessors, parent); } XMLFilter filter = new CSSToXSLFOFilter ( baseUrl, userAgentStyleSheet, parameters, parent, System.getProperty("be.re.css.debug") != null ); InputSource source = new InputSource(in); if (baseUrl != null) { source.setSystemId(baseUrl.toString()); } if (configuration != null) { new FormatterImpl ( new StreamSource(configuration.toString()) ).render ( new SAXSource(filter, source), new FOTarget(out, format == PDF ? "PDF" : "PostScript"), quiet ? Logger.NULL_LOGGER : new DefaultLogger() ); } else { new FormatterImpl().render ( new SAXSource(filter, source), new FOTarget(out, format == PDF ? "PDF" : "PostScript"), quiet ? Logger.NULL_LOGGER : new DefaultLogger() ); } } catch (Exception e) { throw new CSSToXSLFOException(e); } } public static void main(String[] args) throws Exception { URL baseUrl = null; URL catalog = null; URL configuration = null; String pdf = null; Map parameters = new HashMap(); String postScript = null; URL[] preprocessors = null; boolean quiet = false; URL url = null; URL userAgentStyleSheet = null; boolean validate = false; for (int i = 0; i < args.length; ++i) { if (args[i].equals("-h")) { usage(0); } if (args[i].equals("-baseurl")) { if (i == args.length - 1) { usage(1); } baseUrl = Util.createUrl(args[++i]); } else { if (args[i].equals("-uacss")) { if (i == args.length - 1) { usage(1); } userAgentStyleSheet = Util.createUrl(args[++i]); } else { if (args[i].equals("-pdf")) { if (i == args.length - 1) { usage(1); } pdf = args[++i]; } else { if (args[i].equals("-ps")) { if (i == args.length - 1) { usage(1); } postScript = args[++i]; } else { if (args[i].equals("-c")) { if (i == args.length - 1) { usage(1); } catalog = Util.createUrl(args[++i]); } else { if (args[i].equals("-p")) { if (i == args.length - 1) { usage(1); } preprocessors = Util.createUrls(args[++i]); } else { if (args[i].equals("-v")) { validate = true; } else { if (args[i].equals("-config")) { if (i == args.length - 1) { usage(1); } configuration = Util.createUrl(args[++i]); } else { if (args[i].equals("-q")) { quiet = true; } else { if (args[i].indexOf('=') != -1) { parameters.put ( args[i].substring(0, args[i].indexOf('=')), args[i].indexOf('=') == args[i].length() - 1 ? "" : args[i].substring(args[i].indexOf('=') + 1) ); } else { if (url != null) { usage(1); } url = Util.createUrl(args[i]); } } } } } } } } } } } if ( ( pdf == null && postScript == null ) || ( pdf != null && postScript != null ) ) { usage(1); } parameters.put ( "base-url", baseUrl != null ? baseUrl.toString() : (url != null ? url.toString() : "") ); try { convert ( url != null ? url.openStream() : System.in, new FileOutputStream(pdf != null ? pdf : postScript), baseUrl != null ? baseUrl : url, userAgentStyleSheet, catalog != null ? catalog : CSSToXEP.class.getResource("/catalog"), parameters, preprocessors, pdf != null ? PDF : POSTSCRIPT, validate, quiet, configuration ); } catch (Throwable e) { System.err.println(e.getMessage()); be.re.util.Util.printStackTrace(e); } } private static void usage(int code) { System.err.println("Usage: be.re.css.CSSToXEP"); System.err.println(" [-h]: show this help"); System.err.println(" [-baseurl url]: base URL "); System.err.println(" [-c url_or_filename]: catalog for entity resolution"); System.err.println(" [-config url_or_filename]: extra configuration"); System.err.println(" [-p url_or_filename_comma_list]: preprocessors"); System.err.println(" [-q]: quiet mode"); System.err.println(" [-uacss url_or_filename]: User Agent style sheet"); System.err.println(" [-v]: turn on validation"); System.err. println(" [url_or_filename]: the input document, uses stdin by default"); System.err.println(" [parameter=value ...] "); System.err.println(" (-pdf filename | -ps filename): output file"); System.err.println(); Util.printUserAgentParameters(System.err); System.exit(code); } } // CSSToXEP css2xslfo/src/be/re/css/CSSToXSLFO.java0000644000175000017500000001551511434532504020521 0ustar mithrandimithrandipackage be.re.css; import be.re.xml.sax.ProtectEventHandlerFilter; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.HashMap; import java.util.Map; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamResult; import org.xml.sax.InputSource; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; /** * Convenience class for the conversion from CSS to XSL-FO. * @author Werner Donn\u00e9 */ public class CSSToXSLFO { /** * Takes in an XML document and produces an XSL-FO document. */ public static void convert(URL in, OutputStream out, URL userAgentStyleSheet) throws IOException, CSSToXSLFOException { convert ( in.openStream(), out, in, userAgentStyleSheet, null, new HashMap(), null, false, false ); } public static void convert(InputStream in, OutputStream out) throws IOException, CSSToXSLFOException { convert(in, out, null); } public static void convert(InputStream in, OutputStream out, URL userAgentStyleSheet) throws IOException, CSSToXSLFOException { convert ( in, out, null, userAgentStyleSheet, null, new HashMap(), null, false, false ); } public static void convert ( InputStream in, OutputStream out, URL baseUrl, URL userAgentStyleSheet, URL catalog, Map userAgentParameters, URL[] preprocessors, boolean validate, boolean debug ) throws IOException, CSSToXSLFOException { try { XMLReader parser = be.re.xml.sax.Util.getParser(catalog, validate); XMLFilter parent = new ProtectEventHandlerFilter(true, true, parser); if (preprocessors != null) { parent = Util.createPreprocessorFilter(preprocessors, parent); } XMLFilter filter = new CSSToXSLFOFilter ( baseUrl, userAgentStyleSheet, userAgentParameters, parent, debug ); InputSource source = new InputSource(in); if (baseUrl != null) { source.setSystemId(baseUrl.toString()); } TransformerHandler handler = be.re.xml.sax.Util.newSAXTransformerFactory().newTransformerHandler(); handler.setResult(new StreamResult(out)); filter.setContentHandler(handler); filter.parse(source); } catch (Exception e) { throw new CSSToXSLFOException(e); } } public static void main(String[] args) throws Exception { URL baseUrl = null; URL catalog = null; boolean debug = false; String filename = null; Map parameters = new HashMap(); URL[] preprocessors = null; URL url = null; URL userAgentStyleSheet = null; boolean validate = false; for (int i = 0; i < args.length; ++i) { if (args[i].equals("-h")) { usage(0); } if (args[i].equals("-baseurl")) { if (i == args.length - 1) { usage(1); } baseUrl = Util.createUrl(args[++i]); } else { if (args[i].equals("-fo")) { if (i == args.length - 1) { usage(1); } filename = args[++i]; } else { if (args[i].equals("-uacss")) { if (i == args.length - 1) { usage(1); } userAgentStyleSheet = Util.createUrl(args[++i]); } else { if (args[i].equals("-debug")) { debug = true; } else { if (args[i].equals("-c")) { if (i == args.length - 1) { usage(1); } catalog = Util.createUrl(args[++i]); } else { if (args[i].equals("-p")) { if (i == args.length - 1) { usage(1); } preprocessors = Util.createUrls(args[++i]); } else { if (args[i].equals("-v")) { validate = true; } else { if (args[i].indexOf('=') != -1) { parameters.put ( args[i].substring(0, args[i].indexOf('=')), args[i].indexOf('=') == args[i].length() - 1 ? "" : args[i].substring(args[i].indexOf('=') + 1) ); } else { if (url != null) { usage(1); } url = Util.createUrl(args[i]); } } } } } } } } } parameters.put ( "base-url", baseUrl != null ? baseUrl.toString() : (url != null ? url.toString() : "") ); try { convert ( url != null ? url.openStream() : System.in, filename != null ? (OutputStream) new FileOutputStream(filename) : (OutputStream) System.out, baseUrl != null ? baseUrl : url, userAgentStyleSheet, catalog != null ? catalog : CSSToXSLFO.class.getResource("/catalog"), parameters, preprocessors, validate, debug ); } catch (Throwable e) { System.err.println(e.getMessage()); be.re.util.Util.printStackTrace(e); } } private static void usage(int code) { System.err.println("Usage: be.re.css.CSSToXSLFO"); System.err.println(" [-h]: show this help"); System.err.println(" [-baseurl url]: base URL "); System.err.println(" [-c url_or_filename]: catalog for entity resolution"); System.err.println(" [-config url_or_filename]: extra configuration"); System.err.println(" [-debug]: debug mode"); System.err.println(" [-fo filename]: output file, uses stdout by default"); System.err.println(" [-p url_or_filename_comma_list]: preprocessors"); System.err.println(" [-uacss url_or_filename]: User Agent style sheet"); System.err.println(" [-v]: turn on validation"); System.err. println(" [url_or_filename]: the input document, use stdin by default"); System.err.println(" [parameter=value ...] "); System.err.println(); Util.printUserAgentParameters(System.err); System.exit(code); } } // CSSToXSLFO css2xslfo/src/be/re/css/CSSToXSLFOException.java0000644000175000017500000000210011434532506022364 0ustar mithrandimithrandipackage be.re.css; import java.io.PrintStream; import java.io.PrintWriter; /** * General exception for the conversion from CSS to XSL-FO. * @author Werner Donne\u00e9 */ public class CSSToXSLFOException extends Exception { private Exception exception; private String message; public CSSToXSLFOException(Exception e) { this.exception = e; } public CSSToXSLFOException(String message) { this.message = message; } public Exception getException() { return exception; } public String getMessage() { return message != null ? message : (exception != null ? exception.getMessage() : null); } public void printStackTrace(PrintStream s) { super.printStackTrace(s); if (exception != null) { s.println("Caused by:"); exception.printStackTrace(s); } } public void printStackTrace(PrintWriter s) { super.printStackTrace(s); if (exception != null) { s.println("Caused by:"); exception.printStackTrace(s); } } } // CSSToXSLFOException css2xslfo/src/be/re/css/CSSToXSLFOFilter.java0000644000175000017500000001663311434532506021673 0ustar mithrandimithrandipackage be.re.css; import be.re.xml.sax.FilterOfFilters; import be.re.xml.sax.TransformerHandlerFilter; import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.Map; import javax.xml.transform.Source; import javax.xml.transform.Templates; import javax.xml.transform.URIResolver; import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.stream.StreamSource; import org.xml.sax.ContentHandler; import org.xml.sax.DTDHandler; import org.xml.sax.EntityResolver; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLFilterImpl; /** * A filter that accepts an XML document and produces an XSL-FO document. * @author Werner Donne\u00e9 */ public class CSSToXSLFOFilter extends XMLFilterImpl { private static SAXTransformerFactory factory; private XMLFilterImpl filter; private PageSetupFilter pageSetupFilter; private Util.PostProjectionFilter postProjectionFilter; private ProjectorFilter projectorFilter; private static Templates templates = loadStyleSheet(); private Map userAgentParameters; public CSSToXSLFOFilter() throws CSSToXSLFOException { this(null, null, new HashMap(), false); } public CSSToXSLFOFilter(URL baseUrl) throws CSSToXSLFOException { this(baseUrl, null, new HashMap(), false); } public CSSToXSLFOFilter(URL baseUrl, URL userAgentStyleSheet) throws CSSToXSLFOException { this(baseUrl, userAgentStyleSheet, new HashMap(), false); } public CSSToXSLFOFilter ( URL baseUrl, URL userAgentStyleSheet, Map userAgentParameters ) throws CSSToXSLFOException { this(baseUrl, userAgentStyleSheet, userAgentParameters, false); } public CSSToXSLFOFilter ( URL baseUrl, URL userAgentStyleSheet, Map userAgentParameters, boolean debug ) throws CSSToXSLFOException { this.userAgentParameters = userAgentParameters != null ? userAgentParameters : new HashMap(); try { Context context = new Context(); projectorFilter = new ProjectorFilter ( baseUrl, userAgentStyleSheet, userAgentParameters, context ); postProjectionFilter = Util.createPostProjectionFilter(baseUrl, userAgentParameters, debug); pageSetupFilter = new PageSetupFilter(context, baseUrl, userAgentParameters, debug); filter = new FilterOfFilters ( new XMLFilter[] { projectorFilter, new FOMarkerFilter(), postProjectionFilter.getFilter(), pageSetupFilter, new TransformerHandlerFilter ( be.re.xml.sax.Util. newTemplatesHandler(templates, userAgentParameters, factory) ), new SpaceCorrectionFilter() }, debug ); super.setContentHandler(filter); super.setDTDHandler(filter); super.setEntityResolver(filter); super.setErrorHandler(filter); } catch (Exception e) { throw new CSSToXSLFOException(e); } } public CSSToXSLFOFilter(XMLReader parent) throws CSSToXSLFOException { this(null, null, new HashMap(), parent, false); } public CSSToXSLFOFilter(URL baseUrl, XMLReader parent) throws CSSToXSLFOException { this(baseUrl, null, new HashMap(), parent, false); } public CSSToXSLFOFilter(URL baseUrl, URL userAgentStyleSheet, XMLReader parent) throws CSSToXSLFOException { this(baseUrl, userAgentStyleSheet, new HashMap(), parent, false); } public CSSToXSLFOFilter ( URL baseUrl, URL userAgentStyleSheet, Map userAgentParameters, XMLReader parent ) throws CSSToXSLFOException { this(baseUrl, userAgentStyleSheet, userAgentParameters, parent, false); } public CSSToXSLFOFilter ( URL baseUrl, URL userAgentStyleSheet, Map userAgentParameters, XMLReader parent, boolean debug ) throws CSSToXSLFOException { this(baseUrl, userAgentStyleSheet, userAgentParameters, debug); setParent(parent); } public URL getBaseUrl() { return projectorFilter.getBaseUrl(); } public ContentHandler getContentHandler() { return filter.getContentHandler(); } public DTDHandler getDTDHandler() { return filter.getDTDHandler(); } public EntityResolver getEntityResolver() { return filter.getEntityResolver(); } public ErrorHandler getErrorHandler() { return filter.getErrorHandler(); } public Map getParameters() { return userAgentParameters; } public URL getUserAgentStyleSheet() { return projectorFilter.getUserAgentStyleSheet(); } private static Templates loadStyleSheet() { try { factory = be.re.xml.sax.Util.newSAXTransformerFactory(); factory.setURIResolver ( new URIResolver() { public Source resolve(String href, String base) { try { return new StreamSource ( base != null && be.re.net.Util.isUrl(base) ? new URL(new URL(base), href).toString() : new URL ( CSSToXSLFOFilter.class.getResource("style/css.xsl"), href ).toString() ); } catch (Exception e) { return null; } } } ); return factory.newTemplates ( new StreamSource ( CSSToXSLFOFilter.class.getResource("style/css.xsl").toString() ) ); } catch (Exception e) { throw new RuntimeException(e); } } public void parse(InputSource input) throws IOException, SAXException { if (getBaseUrl() == null && input.getSystemId() != null) { setBaseUrl(new URL(input.getSystemId())); } filter.parse(input); } public void parse(String systemId) throws IOException, SAXException { if (getBaseUrl() == null && systemId != null) { setBaseUrl(new URL(systemId)); } filter.parse(systemId); } public void setBaseUrl(URL baseUrl) { projectorFilter.setBaseUrl(baseUrl); pageSetupFilter.setBaseUrl(baseUrl); postProjectionFilter.setBaseUrl(baseUrl); } public void setContentHandler(ContentHandler handler) { filter.setContentHandler(handler); } public void setDTDHandler(DTDHandler handler) { filter.setDTDHandler(handler); } public void setEntityResolver(EntityResolver resolver) { filter.setEntityResolver(resolver); } public void setErrorHandler(ErrorHandler handler) { filter.setErrorHandler(handler); } public void setParameters(Map userAgentParameters) { this.userAgentParameters = userAgentParameters; } public void setParent(XMLReader parent) { super.setParent(parent); // Some XMLFilterImpl functions seem to use parent directly instead of // getParent. filter.setParent(parent); parent.setContentHandler(filter); } public void setUserAgentStyleSheet(URL userAgentStyleSheet) { projectorFilter.setUserAgentStyleSheet(userAgentStyleSheet); } } // CSSToXSLFOFilter css2xslfo/src/be/re/css/CSSToXSLFormatter.java0000644000175000017500000001213511434532506022155 0ustar mithrandimithrandipackage be.re.css; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Map; import jp.co.antenna.XfoJavaCtl.XfoObj; /** * Convenience class for the conversion from CSS to the XSLFormatter XSL-FO * formatter. * @author Werner Donn\u00e9 */ public class CSSToXSLFormatter { public static void main(String[] args) throws Exception { URL baseUrl = null; URL catalog = null; URL configuration = null; String pdf = null; Map parameters = new HashMap(); URL[] preprocessors = null; URL url = null; URL userAgentStyleSheet = null; boolean validate = false; for (int i = 0; i < args.length; ++i) { if (args[i].equals("-h")) { usage(0); } if (args[i].equals("-baseurl")) { if (i == args.length - 1) { usage(1); } baseUrl = Util.createUrl(args[++i]); } else { if (args[i].equals("-uacss")) { if (i == args.length - 1) { usage(1); } userAgentStyleSheet = Util.createUrl(args[++i]); } else { if (args[i].equals("-pdf")) { if (i == args.length - 1) { usage(1); } pdf = args[++i]; } else { if (args[i].equals("-c")) { if (i == args.length - 1) { usage(1); } catalog = Util.createUrl(args[++i]); } else { if (args[i].equals("-p")) { if (i == args.length - 1) { usage(1); } preprocessors = Util.createUrls(args[++i]); } else { if (args[i].equals("-v")) { validate = true; } else { if (args[i].equals("-config")) { if (i == args.length - 1) { usage(1); } configuration = Util.createUrl(args[++i]); } else { if (args[i].indexOf('=') != -1) { parameters.put ( args[i].substring(0, args[i].indexOf('=')), args[i].indexOf('=') == args[i].length() - 1 ? "" : args[i].substring(args[i].indexOf('=') + 1) ); } else { if (url != null) { usage(1); } url = Util.createUrl(args[i]); } } } } } } } } } if (pdf == null) { usage(1); } parameters.put ( "base-url", baseUrl != null ? baseUrl.toString() : (url != null ? url.toString() : "") ); File f = File.createTempFile("be.re.css.", "css2xslformatter"); f.deleteOnExit(); try { CSSToXSLFO.convert ( url != null ? url.openStream() : System.in, new FileOutputStream(f), baseUrl != null ? baseUrl : url, userAgentStyleSheet, catalog != null ? catalog : CSSToXSLFormatter.class.getResource("/catalog"), parameters, preprocessors, validate, System.getProperty("be.re.css.debug") != null ); } catch (Throwable e) { System.err.println(e.getMessage()); be.re.util.Util.printStackTrace(e); } XfoObj o = new XfoObj(); if (configuration != null) { o.addOptionFileURI(configuration.toString()); } o.render(new FileInputStream(f), new FileOutputStream(pdf)); } private static void usage(int code) { System.err.println("Usage: be.re.css.CSSToXSLFormatter"); System.err.println(" [-h]: show this help"); System.err.println(" [-baseurl url]: base URL "); System.err.println(" [-c url_or_filename]: catalog for entity resolution"); System.err.println(" [-config url_or_filename]: extra configuration"); System.err.println(" [-p url_or_filename_comma_list]: preprocessors"); System.err.println(" [-uacss url_or_filename]: User Agent style sheet"); System.err.println(" [-v]: turn on validation"); System.err. println(" [url_or_filename]: the input document, uses stdin by default"); System.err.println(" [parameter=value ...] "); System.err.println(" -pdf filename: output file"); System.err.println(); Util.printUserAgentParameters(System.err); System.exit(code); } } // CSSToXSLFormatter css2xslfo/src/be/re/css/CSSToXinc.java0000644000175000017500000002002011434532506020514 0ustar mithrandimithrandipackage be.re.css; import be.re.xml.sax.ProtectEventHandlerFilter; import com.lunasil.xf.XincEngine; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.UndeclaredThrowableException; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Map; import org.xml.sax.InputSource; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; /** * Convenience class for the conversion from CSS to the Xinc XSL-FO formatter. * @author Werner Donn\u00e9 */ public class CSSToXinc { public static final int PDF = 0; public static void convert(URL in, OutputStream out, URL userAgentStyleSheet, int format) throws IOException, CSSToXSLFOException { convert ( in.openStream(), out, in, userAgentStyleSheet, null, new HashMap(), null, format, false ); } public static void convert(InputStream in, OutputStream out, int format) throws IOException, CSSToXSLFOException { convert(in, out, null, format); } public static void convert(InputStream in, OutputStream out, URL userAgentStyleSheet, int format) throws IOException, CSSToXSLFOException { convert ( in, out, null, userAgentStyleSheet, null, new HashMap(), null, format, false ); } public static void convert ( InputStream in, OutputStream out, URL baseUrl, URL userAgentStyleSheet, URL catalog, Map parameters, URL[] preprocessors, int format, boolean validate ) throws IOException, CSSToXSLFOException { convert ( in, out, baseUrl, userAgentStyleSheet, catalog, parameters, preprocessors, format, validate, null ); } public static void convert ( InputStream in, OutputStream out, URL baseUrl, URL userAgentStyleSheet, URL catalog, Map parameters, URL[] preprocessors, int format, boolean validate, URL configuration ) throws IOException, CSSToXSLFOException { if (format != PDF) { throw new IllegalArgumentException ( "be.re.css.CSSToXinc.convert takes only be.re.css.CSSToXinc.PDF " + "as a format value." ); } try { XMLReader parser = be.re.xml.sax.Util.getParser(catalog, validate); XMLFilter parent = new ProtectEventHandlerFilter(true, true, parser); if (preprocessors != null) { parent = Util.createPreprocessorFilter(preprocessors, parent); } XMLFilter filter = new CSSToXSLFOFilter ( baseUrl, userAgentStyleSheet, parameters, parent, System.getProperty("be.re.css.debug") != null ); InputSource source = new InputSource(in); if (baseUrl != null) { source.setSystemId(baseUrl.toString()); } XincEngine engine = new XincEngine(); if (configuration != null) { try { engine.setConfiguration ( be.re.xml.Util.newDocumentBuilderFactory(false). newDocumentBuilder().parse(configuration.toString()) ); } catch (IOException e) { throw e; } catch (Exception e) { throw new be.re.io.IOException(e); } } engine.setOutputStream(out); filter.setContentHandler(engine.createContentHandler()); filter.parse(source); } catch (Exception e) { throw new CSSToXSLFOException(e); } } public static void main(String[] args) throws Exception { URL baseUrl = null; URL catalog = null; URL configuration = null; String pdf = null; Map parameters = new HashMap(); URL[] preprocessors = null; URL url = null; URL userAgentStyleSheet = null; boolean validate = false; for (int i = 0; i < args.length; ++i) { if (args[i].equals("-h")) { usage(0); } if (args[i].equals("-baseurl")) { if (i == args.length - 1) { usage(1); } baseUrl = Util.createUrl(args[++i]); } else { if (args[i].equals("-uacss")) { if (i == args.length - 1) { usage(1); } userAgentStyleSheet = Util.createUrl(args[++i]); } else { if (args[i].equals("-pdf")) { if (i == args.length - 1) { usage(1); } pdf = args[++i]; } else { if (args[i].equals("-c")) { if (i == args.length - 1) { usage(1); } catalog = Util.createUrl(args[++i]); } else { if (args[i].equals("-p")) { if (i == args.length - 1) { usage(1); } preprocessors = Util.createUrls(args[++i]); } else { if (args[i].equals("-v")) { validate = true; } else { if (args[i].equals("-config")) { if (i == args.length - 1) { usage(1); } configuration = Util.createUrl(args[++i]); } else { if (args[i].indexOf('=') != -1) { parameters.put ( args[i].substring(0, args[i].indexOf('=')), args[i].indexOf('=') == args[i].length() - 1 ? "" : args[i].substring(args[i].indexOf('=') + 1) ); } else { if (url != null) { usage(1); } url = Util.createUrl(args[i]); } } } } } } } } } if (pdf == null) { usage(1); } parameters.put ( "base-url", baseUrl != null ? baseUrl.toString() : (url != null ? url.toString() : "") ); try { convert ( url != null ? url.openStream() : System.in, new FileOutputStream(pdf), baseUrl != null ? baseUrl : url, userAgentStyleSheet, catalog != null ? catalog : CSSToXinc.class.getResource("/catalog"), parameters, preprocessors, PDF, validate, configuration ); } catch (Throwable e) { System.err.println(e.getMessage()); be.re.util.Util.printStackTrace(e); } } private static void usage(int code) { System.err.println("Usage: be.re.css.CSSToXinc"); System.err.println(" [-h]: show this help"); System.err.println(" [-baseurl url]: base URL "); System.err.println(" [-c url_or_filename]: catalog for entity resolution"); System.err.println(" [-config url_or_filename]: extra configuration"); System.err.println(" [-p url_or_filename_comma_list]: preprocessors"); System.err.println(" [-uacss url_or_filename]: User Agent style sheet"); System.err.println(" [-v]: turn on validation"); System.err. println(" [url_or_filename]: the input document, use stdin by default"); System.err.println(" [parameter=value ...] "); System.err.println(" -pdf filename: output file"); System.err.println(); Util.printUserAgentParameters(System.err); System.exit(code); } } // CSSToXinc css2xslfo/src/be/re/css/CenterFilter.java0000644000175000017500000001032111434532506021330 0ustar mithrandimithrandipackage be.re.css; import java.util.Stack; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * Detects centering (right and left margins set to "auto") and wraps tables * and blocks in a three column table. * @author Werner Donn\u00e9 */ class CenterFilter extends XMLFilterImpl { private Stack stack = new Stack(); CenterFilter() { } CenterFilter(XMLReader parent) { super(parent); } private void column(String width) throws SAXException { AttributesImpl atts = displayType("table-column"); if (width != null) { atts.addAttribute(Constants.CSS, "width", "css:width", "CDATA", width); } super.startElement(Constants.CSS, "table-column", "css:table-column", atts); super.endElement(Constants.CSS, "table-column", "css:table-column"); } private static AttributesImpl displayType(String type) { AttributesImpl atts = new AttributesImpl(); atts.addAttribute ( Constants.CSS, "display", "css:display", "CDATA", type ); return atts; } private void emptyCell() throws SAXException { super.startElement ( Constants.CSS, "table-cell", "css:table-cell", displayType("table-cell") ); super.endElement(Constants.CSS, "table-cell", "css:table-cell"); } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { super.endElement(namespaceURI, localName, qName); if (((Boolean) stack.pop()).booleanValue()) { super.endElement(Constants.CSS, "table-cell", "css:table-cell"); emptyCell(); super.endElement(Constants.CSS, "table-row", "css:table-row"); super.endElement(Constants.CSS, "table-row-group", "css:table-row-group"); super.endElement(Constants.CSS, "table", "css:table"); } } private void generateTable(Attributes atts) throws SAXException { AttributesImpl tableAtts = displayType("table"); Util.copyAttribute(atts, tableAtts, Constants.CSS, "margin-bottom"); Util.copyAttribute(atts, tableAtts, Constants.CSS, "margin-top"); tableAtts.addAttribute ( Constants.CSS, "table-layout", "css:table-layout", "CDATA", "fixed" ); super.startElement(Constants.CSS, "table", "css:table", tableAtts); column("1*"); column(atts.getValue(Constants.CSS, "width")); column("1*"); super.startElement ( Constants.CSS, "table-row-group", "css:table-row-group", displayType("table-row-group") ); super.startElement ( Constants.CSS, "table-row", "css:table-row", displayType("table-row") ); emptyCell(); super.startElement ( Constants.CSS, "table-cell", "css:table-cell", displayType("table-cell") ); } private static boolean shouldCenter(Attributes atts) { return "auto".equals(atts.getValue(Constants.CSS, "margin-left")) && "auto".equals(atts.getValue(Constants.CSS, "margin-right")); } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { String display = atts.getValue(Constants.CSS, "display"); boolean extra = false; if ( ( "block".equals(display) || "table".equals(display) ) && shouldCenter(atts) ) { extra = true; generateTable(atts); atts = new AttributesImpl(atts); Util. removeAttribute((AttributesImpl) atts, Constants.CSS, "margin-bottom"); Util.removeAttribute((AttributesImpl) atts, Constants.CSS, "margin-top"); Util.removeAttribute((AttributesImpl) atts, Constants.CSS, "margin-left"); Util. removeAttribute((AttributesImpl) atts, Constants.CSS, "margin-right"); Util.setAttribute ( (AttributesImpl) atts, Constants.CSS, "width", "css:width", "100%" ); } stack.push(new Boolean(extra)); super.startElement(namespaceURI, localName, qName, atts); } } // CenterFilter css2xslfo/src/be/re/css/Compiled.java0000644000175000017500000003121511434532506020503 0ustar mithrandimithrandipackage be.re.css; import be.re.util.DigitalTree; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import org.w3c.css.sac.Condition; import org.w3c.css.sac.ConditionalSelector; import org.w3c.css.sac.DescendantSelector; import org.w3c.css.sac.ElementSelector; import org.w3c.css.sac.Selector; import org.w3c.css.sac.SiblingSelector; /** * Represents a CSS style sheet in compiled form. * @author Werner Donn\u00e9 */ public class Compiled { static final String ANY_ELEMENT = "*|*".intern(); private static final int END_STATE = 1; private static final String EPSILON = "EPSILON".intern(); private static final int ERROR_STATE = -1; static final String SIBLING = "SIBLING".intern(); private static final int START_STATE = 0; private int dfaStateCounter = 0; private int nfaStateCounter = 0; private NFAState[] nfa = new NFAState[]{new NFAState(), new NFAState()}; DFAState startState = null; private static final boolean trace = System.getProperty("be.re.css.trace") != null; /** * Adds the rule to the NFA being built using the Thompson construction. * The rule should be split, i.e. it should have exactly one property. */ void addRule(Rule rule) { NFAState[] states = constructNFA(rule.getSelector()); if (rule.getPseudoElementName() == null) { states[END_STATE].rules.add(rule); } else { states[END_STATE].pseudoRules.add(rule); } nfa[START_STATE].next.add(new Next(EPSILON, states[START_STATE])); states[END_STATE].next.add(new Next(EPSILON, nfa[END_STATE])); } private static Map collectNextSets(SortedSet set) { Map result = new HashMap(); for (Iterator i = set.iterator(); i.hasNext();) { for (Iterator j = ((NFAState) i.next()).next.iterator(); j.hasNext();) { Next next = (Next) j.next(); if (next.event != EPSILON) { SortedSet nextSet = (SortedSet) result.get(next.event); if (nextSet == null) { nextSet = new TreeSet(set.comparator()); result.put(next.event, nextSet); } nextSet.add(next.state); } } } for (Iterator i = result.values().iterator(); i.hasNext();) { TreeSet nextSet = (TreeSet) i.next(); SortedSet copy = (SortedSet) nextSet.clone(); for (Iterator j = copy.iterator(); j.hasNext();) { epsilonMove(nextSet, (NFAState) j.next()); } } return result; } private static NFAState[] constructAnd(NFAState[] first, NFAState[] second) { first[END_STATE].next.add(new Next(EPSILON, second[START_STATE])); return new NFAState[]{first[START_STATE], second[END_STATE]}; } private NFAState[] constructChild(DescendantSelector selector) { return selector.getSimpleSelector().getSelectorType() == Selector.SAC_PSEUDO_ELEMENT_SELECTOR ? constructNFA(selector.getAncestorSelector()) : constructAnd ( constructNFA(selector.getAncestorSelector()), constructNFA(selector.getSimpleSelector()) ); } private NFAState[] constructConditional(ConditionalSelector selector) { NFAState[] first = constructNFA(selector.getSimpleSelector()); NFAState end = new NFAState(); first[END_STATE].condition = selector.getCondition(); first[END_STATE].next.add(new Next(selector.getCondition(), end)); return new NFAState[]{first[START_STATE], end}; } private NFAState[] constructDescendant(DescendantSelector selector) { return constructAnd ( constructAnd ( constructNFA(selector.getAncestorSelector()), constructKleeneClosure(ANY_ELEMENT) ), constructNFA(selector.getSimpleSelector()) ); } private NFAState[] constructElement(ElementSelector selector) { NFAState start = new NFAState(); NFAState end = new NFAState(); start.next.add ( new Next ( ( ( selector.getNamespaceURI() != null ? selector.getNamespaceURI() : "*" ) + "|" + ( selector.getLocalName() != null ? selector.getLocalName().intern() : "*" ) ).intern(), end ) ); return new NFAState[]{start, end}; } private NFAState[] constructKleeneClosure(Object event) { NFAState start = new NFAState(); NFAState end = new NFAState(); NFAState from = new NFAState(); NFAState to = new NFAState(); from.next.add(new Next(event, to)); start.next.add(new Next(EPSILON, from)); start.next.add(new Next(EPSILON, end)); to.next.add(new Next(EPSILON, end)); end.next.add(new Next(EPSILON, from)); return new NFAState[]{start, end}; } /** * Applies the Thompson construction. */ private NFAState[] constructNFA(Selector selector) { switch (selector.getSelectorType()) { case Selector.SAC_CONDITIONAL_SELECTOR: return constructConditional((ConditionalSelector) selector); case Selector.SAC_CHILD_SELECTOR: return constructChild((DescendantSelector) selector); case Selector.SAC_DESCENDANT_SELECTOR: return constructDescendant((DescendantSelector) selector); case Selector.SAC_DIRECT_ADJACENT_SELECTOR: return constructSibling((SiblingSelector) selector); case Selector.SAC_ELEMENT_NODE_SELECTOR: return constructElement((ElementSelector) selector); default: return null; // Ignore non-CSS2 selector types. } } private NFAState[] constructSibling(SiblingSelector selector) { return constructAnd ( constructAnd ( constructNFA(selector.getSelector()), constructSiblingTransition() ), constructNFA(selector.getSiblingSelector()) ); } private NFAState[] constructSiblingTransition() { NFAState start = new NFAState(); NFAState end = new NFAState(); start.next.add(new Next(SIBLING, end)); return new NFAState[]{start, end}; } void dumpDFA(PrintWriter out) { if (trace) { out.println(); out.println("DFA START"); out.println(); dumpDFA(startState, new HashSet(), out); out.println("DFA END"); out.println(); out.flush(); } } private static void dumpDFA(DFAState state, Set seen, PrintWriter out) { if (seen.contains(new Integer(state.state))) { return; } out.println(String.valueOf(state.state) + ":"); List values = new ArrayList(); for (Iterator i = state.events.keySet().iterator(); i.hasNext();) { String event = (String) i.next(); DFAState nextState = (DFAState) state.events.get(event); out.println(" " + event + " -> " + String.valueOf(nextState.state)); values.add(nextState); } for ( Iterator i = state.candidateConditions.keySet().iterator(); i.hasNext(); ) { Condition event = (Condition) i.next(); DFAState nextState = (DFAState) state.candidateConditions.get(event); out.println ( " " + Util.conditionText(event) + " -> " + String.valueOf(nextState.state) ); values.add(nextState); } dumpRules(state.rules, out); dumpRules(state.pseudoRules, out); out.println(); seen.add(new Integer(state.state)); for (Iterator i = values.iterator(); i.hasNext();) { dumpDFA((DFAState) i.next(), seen, out); } } void dumpNFA(PrintWriter out) { if (trace) { out.println(); out.println("NFA START"); out.println(); dumpNFA(nfa[START_STATE], new HashSet(), out); out.println("NFA END"); out.println(); out.flush(); } } private static void dumpNFA(NFAState state, Set seen, PrintWriter out) { if (seen.contains(new Integer(state.state))) { return; } out.println(String.valueOf(state.state) + ":"); for (Iterator i = state.next.iterator(); i.hasNext();) { Next next = (Next) i.next(); out.println ( " " + ( next.event instanceof Condition ? Util.conditionText((Condition) next.event) : next.event.toString() ) + " -> " + String.valueOf(next.state.state) ); } dumpRules(state.rules, out); dumpRules(state.pseudoRules, out); out.println(); seen.add(new Integer(state.state)); for (Iterator i = state.next.iterator(); i.hasNext();) { dumpNFA(((Next) i.next()).state, seen, out); } } private static void dumpRules(List rules, PrintWriter out) { for (Iterator i = rules.iterator(); i.hasNext();) { Rule rule = (Rule) i.next(); out.println ( " " + (rule.getElementName() != null ? rule.getElementName() : "") + ( rule.getPseudoElementName() != null ? rule.getPseudoElementName() : "" ) + ": " + rule.getProperty().getName() + ": " + rule.getProperty().getValue() ); } } private static void epsilonMove(Set set, NFAState state) { for (Iterator i = state.next.iterator(); i.hasNext();) { Next next = (Next) i.next(); if (next.event == EPSILON && set.add(next.state)) { epsilonMove(set, next.state); } } } void generateDFA() { dumpNFA(new PrintWriter(System.out)); startState = generateDFA(nfa); dumpDFA(new PrintWriter(System.out)); } /** * Applies the subset construction. Returns the start state. */ private DFAState generateDFA(NFAState[] nfa) { SortedSet set = new TreeSet // Sorting of the NFA states makes the labels unique. ( new Comparator() { public int compare(Object o1, Object o2) { return ((NFAState) o1).state - ((NFAState) o2).state; } } ); Map states = new HashMap(); set.add(nfa[START_STATE]); epsilonMove(set, nfa[START_STATE]); DFAState result = new DFAState(); states.put(label(set), result); generateTransitions(result, set, states); return result; } private void generateTransitions(DFAState from, SortedSet set, Map states) { Map nextSets = collectNextSets(set); for (Iterator i = nextSets.keySet().iterator(); i.hasNext();) { Object event = i.next(); SortedSet nextSet = (SortedSet) nextSets.get(event); if (nextSet.size() > 0) { DFAState nextState; String s = label(nextSet); DFAState state = (DFAState) states.get(s); if (state == null) { nextState = new DFAState(); states.put(s, nextState); } else { nextState = state; } if (event instanceof Condition) { from.candidateConditions.put(event, nextState); } else { from.events.put((String) event, nextState); } for (Iterator j = nextSet.iterator(); j.hasNext();) { NFAState next = (NFAState) j.next(); nextState.rules.addAll(next.rules); nextState.pseudoRules.addAll(next.pseudoRules); } if (state == null) { generateTransitions(nextState, nextSet, states); } } } } private static String label(SortedSet set) { String result = ""; for (Iterator i = set.iterator(); i.hasNext();) { result += "#" + String.valueOf(((NFAState) i.next()).state); } return result; } /** * Contains all matching rules sorted from least to most specific. */ class DFAState { Map candidateConditions = new HashMap(); DigitalTree events = new DigitalTree(trace); List pseudoRules = new ArrayList(); List rules = new ArrayList(); int state; private DFAState() { state = dfaStateCounter++; } } // DFAState private static class Next { private Next(Object event, NFAState state) { this.event = event; this.state = state; } private Object event; private NFAState state; } // Next private class NFAState { private Condition condition; private List next = new ArrayList(); private List pseudoRules = new ArrayList(); private List rules = new ArrayList(); private int state; private NFAState() { state = nfaStateCounter++; } } // NFAState } // Compiled css2xslfo/src/be/re/css/Constants.java0000644000175000017500000000072611434532506020726 0ustar mithrandimithrandipackage be.re.css; public interface Constants { public static final String CSS = "http://www.w3.org/1998/CSS".intern(); public static final String SPECIF = "urn:be-re-css:specificity".intern(); public static final String XHTML = "http://www.w3.org/1999/xhtml".intern(); public static final String XML = "http://www.w3.org/XML/1998/namespace".intern(); public static final String XSLFO = "http://www.w3.org/1999/XSL/Format".intern(); } // Constants css2xslfo/src/be/re/css/Context.java0000644000175000017500000000033511434532506020372 0ustar mithrandimithrandipackage be.re.css; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; class Context { List pageRules = new ArrayList(); Map regions = new HashMap(); } // Context css2xslfo/src/be/re/css/DisplayNonePropagator.java0000644000175000017500000000400611434532506023231 0ustar mithrandimithrandipackage be.re.css; import java.util.Stack; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * Propagates a "none" display type down the tree, which makes it unnecessary * for subsequent filters to analyse the ancestor chain. Regions can't have * their display set to "none", so in that case the display property it set to * "block". * @author Werner Donn\u00e9 */ class DisplayNonePropagator extends XMLFilterImpl { private Stack stack = new Stack(); DisplayNonePropagator() { } DisplayNonePropagator(XMLReader parent) { super(parent); } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { super.endElement(namespaceURI, localName, qName); stack.pop(); } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { boolean displayNone = (stack.isEmpty() ? false : ((Boolean) stack.peek()).booleanValue()) || ( "none".equals(atts.getValue(Constants.CSS, "display")) && atts.getValue(Constants.CSS, "region") == null ); stack.push(new Boolean(displayNone)); if (displayNone) { atts = new AttributesImpl(atts); Util.setAttribute ( (AttributesImpl) atts, Constants.CSS, "display", "css:display", "none" ); } else { if ( atts.getValue(Constants.CSS, "region") != null && "none".equals(atts.getValue(Constants.CSS, "display")) ) { atts = new AttributesImpl(atts); Util.setAttribute ( (AttributesImpl) atts, Constants.CSS, "display", "css:display", "block" ); } } super.startElement(namespaceURI, localName, qName, atts); } } // DisplayNonePropagator css2xslfo/src/be/re/css/Element.java0000644000175000017500000000377711434532506020354 0ustar mithrandimithrandipackage be.re.css; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.helpers.AttributesImpl; class Element { static final String BLOCK = "block".intern(); static final String COMPACT = "compact".intern(); static final String GRAPHIC = "graphic".intern(); static final String INLINE = "inline".intern(); static final String INLINE_TABLE = "inline-table".intern(); static final String LEADER = "leader".intern(); static final String LIST_ITEM = "list-item".intern(); static final String MARKER = "marker".intern(); static final String NONE = "none".intern(); static final String RUN_IN = "run-in".intern(); static final String TABLE = "table".intern(); static final String TABLE_CELL = "table-cell".intern(); static final String TABLE_CAPTION = "table-caption".intern(); static final String TABLE_COLUMN = "table-column".intern(); static final String TABLE_COLUMN_GROUP = "table-column-group".intern(); static final String TABLE_FOOTER_GROUP = "table-footer-group".intern(); static final String TABLE_HEADER_GROUP = "table-header-group".intern(); static final String TABLE_ROW = "table-row".intern(); static final String TABLE_ROW_GROUP = "table-row-group".intern(); Attributes atts; List children; String display; // Interned. Object extra; String localName; String namespaceURI; String qName; Element(String namespaceURI, String localName, String qName, Attributes atts) { this.namespaceURI = namespaceURI; this.localName = localName; this.qName = qName; this.atts = new AttributesImpl(atts); // Copy because parser reuses them. this.display = atts.getValue(Constants.CSS, "display"); if (display != null) { display = display.intern(); } } void addChild(Element child) { if (children == null) { children = new ArrayList(10); } children.add(child); } boolean isDisplay(String knownDisplay) { return knownDisplay == display; } } // Element css2xslfo/src/be/re/css/FOMarkerFilter.java0000644000175000017500000000575711434532506021577 0ustar mithrandimithrandipackage be.re.css; import be.re.xml.Accumulator; import be.re.xml.DOMToContentHandler; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.Stack; import org.w3c.dom.Element; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLFilterImpl; /** * Moves FO-markers to the next allowed place. * @author Werner Donn\u00e9 */ class FOMarkerFilter extends XMLFilterImpl { private static final Set allowedPlaces = new HashSet ( Arrays.asList ( new String[] { "block", "inline", "list-item", "table", "table-cell", "table-footer-group", "table-header-group", "table-row-group" } ) ); private List foMarkers = new ArrayList(); private Stack stack = new Stack(); FOMarkerFilter() { } FOMarkerFilter(XMLReader parent) { super(parent); } private void accumulateFOMarker ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { Accumulator.preAccumulate ( namespaceURI, localName, qName, atts, this, new Accumulator.ProcessElement() { public void process(Element element, XMLFilter filter) throws SAXException { foMarkers.add(element); } } ); } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { stack.pop(); super.endElement(namespaceURI, localName, qName); } private void flushFOMarkers() throws SAXException { if (foMarkers.size() > 0) { for (Iterator i = foMarkers.iterator(); i.hasNext();) { Element element = (Element) i.next(); DOMToContentHandler. elementToContentHandler(element, getContentHandler()); } foMarkers.clear(); } } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { String parentDisplay = stack.isEmpty() ? null : (String) stack.peek(); if ( parentDisplay != null && Constants.CSS == namespaceURI && "fo-marker".equals(localName) && !allowedPlaces.contains(parentDisplay) ) { accumulateFOMarker(namespaceURI, localName, qName, atts); } else { super.startElement(namespaceURI, localName, qName, atts); String display = parentDisplay != null && parentDisplay.equals("none") ? "none" : atts.getValue(Constants.CSS, "display"); if ( ( Constants.CSS != namespaceURI || !"fo-marker".equals(localName) ) && allowedPlaces.contains(display) ) { flushFOMarkers(); } stack.push(display); } } } // FOMarkerFilter css2xslfo/src/be/re/css/FirstLetterFilter.java0000644000175000017500000002052211434532506022363 0ustar mithrandimithrandipackage be.re.css; import be.re.xml.Accumulator; import be.re.xml.DOMToContentHandler; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.Text; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLFilterImpl; class FirstLetterFilter extends XMLFilterImpl { FirstLetterFilter() { } FirstLetterFilter(XMLReader parent) { super(parent); } private static Element getFirstLetter(Node node) { return node == null ? null : ( Constants.CSS.equals(node.getNamespaceURI()) && "first-letter".equals(node.getLocalName()) ? (Element) node : getFirstLetter(node.getNextSibling()) ); } private static Text getFirstTextNode(Node node) { return node == null ? null : ( node instanceof Text && ((Text) node).getLength() > 0 ? (Text) node : ( node instanceof Element ? ( "inline".equals ( ((Element) node).getAttributeNS(Constants.CSS, "display") ) ? getFirstTextNode(node.getFirstChild()) : null ) : ( node.getNextSibling() != null ? getFirstTextNode(node.getNextSibling()) : getFirstTextNode(node.getParentNode().getNextSibling()) ) ) ); } private static Map getOriginalProperties(Element firstLetter) { NamedNodeMap attributes = firstLetter.getAttributes(); Map result = new HashMap(); for (int i = 0; i < attributes.getLength(); ++i) { if (Constants.CSS.equals(attributes.item(i).getNamespaceURI())) { result.put ( attributes.item(i).getLocalName(), attributes.item(i).getNodeValue() ); } } return result; } private static boolean isPunctuation(char c) { return Character.getType(c) == Character.END_PUNCTUATION || Character.getType(c) == Character.START_PUNCTUATION || Character.getType(c) == Character.INITIAL_QUOTE_PUNCTUATION || Character.getType(c) == Character.FINAL_QUOTE_PUNCTUATION || Character.getType(c) == Character.OTHER_PUNCTUATION; } private static void mergeProperties(Element firstLetter, Node text) { for ( Node n = text.getParentNode(); n.getParentNode() != null; n = n.getParentNode() ) { NamedNodeMap attributes = n.getAttributes(); for (int i = 0; i < attributes.getLength(); ++i) { if ( Constants.CSS.equals(attributes.item(i).getNamespaceURI()) && Util.isInherited(attributes.item(i).getLocalName()) && firstLetter.getAttributeNS ( Constants.CSS, attributes.item(i).getLocalName() ).equals("") ) { firstLetter.setAttributeNS ( Constants.CSS, "css:" + attributes.item(i).getLocalName(), attributes.item(i).getNodeValue() ); } } } } private static void removeOriginalProperties(Element element, Map properties) { for (Iterator i = properties.keySet().iterator(); i.hasNext();) { element.removeAttributeNS(Constants.CSS, (String) i.next()); } } private static void setOriginalProperties(Element element, Map properties) { for (Iterator i = properties.keySet().iterator(); i.hasNext();) { String localName = (String) i.next(); element.setAttributeNS ( Constants.CSS, "css:" + localName, (String) properties.get(localName) ); } } private static void splitText(Element firstLetter, Text text, int offset) { firstLetter.appendChild ( firstLetter.getOwnerDocument(). createTextNode(text.getData().substring(0, offset)) ); mergeProperties(firstLetter, text); text.getParentNode().insertBefore ( text.getOwnerDocument().createTextNode(text.getData().substring(offset)), text ); text.getParentNode().removeChild(text); } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { if ( "block".equals(atts.getValue(Constants.CSS, "display")) && "1".equals(atts.getValue(Constants.CSS, "has-first-letter")) ) { Accumulator.preAccumulate ( namespaceURI, localName, qName, atts, this, new Accumulator.ProcessElement() { public void process(Element element, XMLFilter filter) throws SAXException { DOMToContentHandler.elementToContentHandler ( transform(element), filter.getContentHandler() ); } } ); } else { super.startElement(namespaceURI, localName, qName, atts); } } private static Element transform(Element element) { element.removeAttributeNS(Constants.CSS, "has-first-letter"); Element firstLetter = getFirstLetter(element.getFirstChild()); if (firstLetter == null) { return element; } Map originalProperties = getOriginalProperties(firstLetter); firstLetter.setAttributeNS(Constants.CSS, "css:display", "inline"); Text text = getFirstTextNode(firstLetter.getNextSibling()); if (text == null) { return element; } if (isPunctuation(text.getData().charAt(0))) { if (text.getLength() > 1) { splitText(firstLetter, text, 2); } else { Text nextText = getFirstTextNode ( text.getNextSibling() != null ? text.getNextSibling() : text.getParentNode().getNextSibling() ); if (nextText == null) { splitText(firstLetter, text, 1); } else { Element second = (Element) firstLetter.cloneNode(true); element.insertBefore(second, firstLetter.getNextSibling()); splitText(firstLetter, text, 1); splitText(second, nextText, 1); } } } else { splitText(firstLetter, text, 1); } String floatValue = firstLetter.getAttributeNS(Constants.CSS, "float"); if (!"".equals(floatValue) && !"none".equalsIgnoreCase(floatValue)) { wrapInFloat ( firstLetter, floatValue, firstLetter.getAttributeNS(Constants.CSS, "clear"), originalProperties ); } return element; } private static void wrapInFloat ( Element firstLetter, String floatValue, String clearValue, Map originalProperties ) { Element block = firstLetter.getOwnerDocument(). createElementNS(Constants.CSS, "css:block"); Element floating = firstLetter.getOwnerDocument(). createElementNS(Constants.CSS, "css:float"); floating.appendChild(block); block.setAttributeNS(Constants.CSS, "css:display", "block"); floating.setAttributeNS(Constants.CSS, "css:float", floatValue); if (!"".equals(clearValue)) { floating.setAttributeNS(Constants.CSS, "css:clear", clearValue); } Map blockProperties = new HashMap(originalProperties); Map inlineProperties = new HashMap(originalProperties); blockProperties.remove("float"); blockProperties.remove("clear"); blockProperties.remove("vertical-align"); inlineProperties.remove("vertical-align"); setOriginalProperties(block, blockProperties); firstLetter.getParentNode().insertBefore(floating, firstLetter); removeOriginalProperties(firstLetter, inlineProperties); Element second = Constants.CSS.equals(firstLetter.getNextSibling().getNamespaceURI()) && "first-letter".equals(firstLetter.getNextSibling().getLocalName()) ? (Element) firstLetter.getNextSibling() : null; block.appendChild(firstLetter); if (second != null) { removeOriginalProperties(second, inlineProperties); block.appendChild(second); } } } // FirstLetterFilter css2xslfo/src/be/re/css/FootnoteFilter.java0000644000175000017500000001052711434532506021715 0ustar mithrandimithrandipackage be.re.css; import be.re.xml.Accumulator; import be.re.xml.DOMToContentHandler; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * Processes footnotes. * @author Werner Donn\u00e9 */ class FootnoteFilter extends XMLFilterImpl { private Element footnoteReference = null; FootnoteFilter() { } FootnoteFilter(XMLReader parent) { super(parent); } public void characters(char[] ch, int start, int length) throws SAXException { if (footnoteReference != null) { if (!Util.isWhitespace(ch, start, length)) { flushFootnoteReference(); super.characters(ch, start, length); } } else { super.characters(ch, start, length); } } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { flushFootnoteReference(); super.endElement(namespaceURI, localName, qName); } private void flushFootnoteReference() throws SAXException { if (footnoteReference != null && getContentHandler() != null) { footnoteReference.setAttributeNS(Constants.CSS, "css:display", "inline"); DOMToContentHandler. elementToContentHandler(footnoteReference, getContentHandler()); footnoteReference = null; } } private static Element getBeforePseudoElement(Node node) { return node == null ? null : ( node instanceof Element && Constants.CSS.equals(node.getNamespaceURI()) && "before".equals(node.getLocalName()) && "footnote-reference".equals ( ((Element) node).getAttributeNS(Constants.CSS, "display") ) ? (Element) node : getBeforePseudoElement(node.getNextSibling()) ); } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { String display = atts.getValue(Constants.CSS, "display"); if ("footnote-reference".equals(display)) { flushFootnoteReference(); Accumulator.preAccumulate ( namespaceURI, localName, qName, atts, this, new Accumulator.ProcessElement() { public void process(Element element, XMLFilter filter) throws SAXException { footnoteReference = element; } } ); } else { if ("footnote-body".equals(display)) { Accumulator.preAccumulate ( namespaceURI, localName, qName, atts, this, new Accumulator.ProcessElement() { public void process(Element element, XMLFilter filter) throws SAXException { transform(element); } } ); } else { flushFootnoteReference(); super.startElement(namespaceURI, localName, qName, atts); } } } private void transform(Element element) throws SAXException { Element before = getBeforePseudoElement(element.getFirstChild()); if (footnoteReference == null && before == null) { return; } if (footnoteReference == null) { footnoteReference = before; } super.startElement ( Constants.CSS, "footnote", "css:footnote", new AttributesImpl() ); super.startElement ( Constants.CSS, "footnote-reference", "css:footnote-reference", new AttributesImpl() ); flushFootnoteReference(); super.endElement ( Constants.CSS, "footnote-reference", "css:footnote-reference" ); super.startElement ( Constants.CSS, "footnote-body", "css:footnote-body", new AttributesImpl() ); element.setAttributeNS(Constants.CSS, "css:display", "block"); DOMToContentHandler.elementToContentHandler(element, getContentHandler()); super.endElement(Constants.CSS, "footnote-body", "css:footnote-body"); super.endElement(Constants.CSS, "footnote", "css:footnote"); } } // FootnoteFilter css2xslfo/src/be/re/css/ForeignFilter.java0000644000175000017500000000453111434532506021507 0ustar mithrandimithrandipackage be.re.css; import java.util.Stack; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * Places elements with the display type "foreign" in an * fo:instream-foreign-object element and removes attributes in the CSS * namespace below it. * @author Werner Donn\u00e9 */ class ForeignFilter extends XMLFilterImpl { private Stack stack = new Stack(); ForeignFilter() { } ForeignFilter(XMLReader parent) { super(parent); } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { boolean foreign = ((Boolean) stack.pop()).booleanValue(); boolean foreignParent = !stack.isEmpty() && ((Boolean) stack.peek()).booleanValue(); super.endElement(namespaceURI, localName, qName); if (!foreignParent && foreign) { super.endElement ( Constants.XSLFO, "instream-foreign-object", "fo:instream-foreign-object" ); } } private static Attributes removeCSS(Attributes atts) { AttributesImpl result = new AttributesImpl(); for (int i = 0; i < atts.getLength(); ++i) { if ( !Constants.CSS.equals(atts.getURI(i)) && !Constants.SPECIF.equals(atts.getURI(i)) ) { result.addAttribute ( atts.getURI(i), atts.getLocalName(i), atts.getQName(i), atts.getType(i), atts.getValue(i) ); } } return result; } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { boolean foreignParent = !stack.isEmpty() && ((Boolean) stack.peek()).booleanValue(); boolean foreign = foreignParent || "foreign".equals(atts.getValue(Constants.CSS, "display")); if (!foreignParent && foreign) { super.startElement ( Constants.XSLFO, "instream-foreign-object", "fo:instream-foreign-object", new AttributesImpl() ); } stack.push(new Boolean(foreign)); super.startElement ( namespaceURI, localName, qName, foreign ? removeCSS(atts) : atts ); } } // ForeignFilter css2xslfo/src/be/re/css/InternedElementSelector.java0000644000175000017500000000142611434532506023533 0ustar mithrandimithrandipackage be.re.css; import org.w3c.css.sac.ElementSelector; public class InternedElementSelector implements ElementSelector { private String localName; private String namespaceURI; private short selectorType; public InternedElementSelector(ElementSelector selector) { localName = selector.getLocalName() == null ? null : selector.getLocalName().intern(); namespaceURI = selector.getNamespaceURI() == null ? null : selector.getNamespaceURI().intern(); selectorType = selector.getSelectorType(); } public String getLocalName() { return localName; } public String getNamespaceURI() { return namespaceURI; } public short getSelectorType() { return selectorType; } } // InternedElementSelector css2xslfo/src/be/re/css/InvalidPropertyFilter.java0000644000175000017500000002341511434532506023253 0ustar mithrandimithrandipackage be.re.css; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * Removes invalid properties after projection, where shorthand properties have * already been split. * @author Werner Donn\u00e9 */ class InvalidPropertyFilter extends XMLFilterImpl { private final static Set after = new HashSet(Arrays.asList(new String[]{"change-bar-class", "content"})); private final static Set alwaysValid = new HashSet ( Arrays.asList ( new String[] { "background-attachment", "background-color", "background-image", "background-repeat", "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", "border-top-width", "border-right-width", "border-bottom-width", "border-left-width", "color", "counter-increment", "counter-reset", "direction", "display", "font", "font-family", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-variant", "font-weight", "letter-spacing", "line-height", "margin-top", "margin-right", "margin-bottom", "margin-left", "padding-top", "padding-right", "padding-bottom", "padding-left", "position", "quotes", "region", "string-set", "text-decoration", "text-shadow", "text-transform", "unicode-bidi", "visibility", "word-spacing", // Internal attributes. "has-first-letter", "has-markers", "list-label-width" } ) ); private final static Set before = new HashSet ( Arrays.asList ( new String[] { "change-bar-class", "change-bar-color", "change-bar-offset", "change-bar-placement", "change-bar-style", "change-bar-width", "content" } ) ); private final static Set blockLevel = new HashSet ( Arrays.asList ( new String[] { "anchor", "background-position", "clear", "clip", "hyphenate", "link", "orphans", "overflow", "page", "page-break-after", "page-break-before", "page-break-inside", "text-align", "text-align-last", "text-indent", "white-space", "widows" } ) ); private final static Set blockLevelNotTable = new HashSet(Arrays.asList(new String[]{"column-span"})); private final static Set blockOrTableOrTableCell = new HashSet(Arrays.asList(new String[]{"orientation"})); private final static Set graphic = new HashSet ( Arrays.asList ( new String[] { "background-position", "content-height", "content-type", "content-width", "height", "max-height", "max-width", "min-height", "min-width", "overflow", "scaling", "scaling-method", "src", "width" } ) ); private final static Set inline = new HashSet ( Arrays. asList(new String[]{"anchor", "hyphenate", "link", "vertical-align"}) ); private final static Set leader = new HashSet ( Arrays.asList ( new String[] { "leader-alignment", "leader-length", "leader-pattern", "leader-pattern-width", "rule-thickness" } ) ); private final static Set listItem = new HashSet ( Arrays.asList ( new String[] { "list-style", "list-style-image", "list-style-position", "list-style-type" } ) ); private final static Set marker = new HashSet(Arrays.asList(new String[]{"marker-offset"})); private final static Set notInlineOrTable = new HashSet ( Arrays.asList ( new String[]{"max-height", "max-width", "min-height", "min-width"} ) ); private final static Set notInlineOrTableColumnOrColumnGroup = new HashSet(Arrays.asList(new String[]{"height"})); private final static Set notInlineOrTableRowOrRowGroup = new HashSet(Arrays.asList(new String[]{"width"})); private final static Set notPositioned = new HashSet(Arrays.asList(new String[]{"float"})); private final static Set positioned = new HashSet ( Arrays.asList(new String[]{"bottom", "left", "right", "top", "z-index"}) ); private final static Set table = new HashSet ( Arrays.asList ( new String[] { "border-collapse", "border-spacing", "caption-side", "empty-cells", "table-layout", "table-omit-footer-at-break", "table-omit-header-at-break" } ) ); private final static Set tableCaption = new HashSet(Arrays.asList(new String[]{"caption-side"})); private final static Set tableCell = new HashSet ( Arrays.asList ( new String[]{"colspan", "empty-cells", "rowspan", "vertical-align"} ) ); InvalidPropertyFilter() { } InvalidPropertyFilter(XMLReader parent) { super(parent); } private static boolean isBlockLevel(String display) { return display == Element.BLOCK || display == Element.COMPACT || display == Element.LIST_ITEM || display == Element.RUN_IN || display == Element.TABLE || display == Element.TABLE_CELL || display == Element.TABLE_ROW || display == Element.MARKER; } private static boolean isInline(String display) { return display == Element.INLINE || display == Element.GRAPHIC || display == Element.LEADER; } private static boolean isPositioned(Attributes atts) { String value = atts.getValue(Constants.CSS, "position"); return value != null && !"static".equals(value); } private static boolean isValid ( Attributes atts, int index, String display, boolean isBefore, boolean isAfter, boolean isPositioned ) { String localName = atts.getLocalName(index); return !Constants.CSS.equals(atts.getURI(index)) || ( alwaysValid.contains(localName) || Util.isInherited(localName) || (isBlockLevel(display) && blockLevel.contains(localName)) || (display == Element.LIST_ITEM && listItem.contains(localName)) || ( (display == Element.TABLE || display == Element.INLINE_TABLE) && table.contains(localName) ) || ( display == Element.TABLE_CAPTION && tableCaption.contains(localName) ) || (display == Element.TABLE_CELL && tableCell.contains(localName)) || (isInline(display) && inline.contains(localName)) || ( !isInline(display) && display != Element.TABLE && notInlineOrTable.contains(localName) ) || ( !isInline(display) && display != Element.TABLE_COLUMN && display != Element.TABLE_COLUMN_GROUP && notInlineOrTableColumnOrColumnGroup.contains(localName) ) || ( !isInline(display) && display != Element.TABLE_ROW && display != Element.TABLE_ROW_GROUP && notInlineOrTableRowOrRowGroup.contains(localName) ) || ( display != Element.TABLE && isBlockLevel(display) && blockLevelNotTable.contains(localName) ) || (display == Element.MARKER && marker.contains(localName)) || (display == Element.GRAPHIC && graphic.contains(localName)) || (display == Element.LEADER && leader.contains(localName)) || ( ( display == Element.BLOCK || display == Element.TABLE || display == Element.TABLE_CELL ) && blockOrTableOrTableCell.contains(localName) ) || (isAfter && after.contains(localName)) || (isBefore && before.contains(localName)) || (isPositioned && positioned.contains(localName)) || (!isPositioned && notPositioned.contains(localName)) ); } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { String display = atts.getValue(Constants.CSS, "display"); if ( display == null || ( Constants.CSS.equals(namespaceURI) && !"after".equals(localName) && !"before".equals(localName) ) ) { super.startElement(namespaceURI, localName, qName, atts); return; } display = display.intern(); boolean after = Constants.CSS.equals(namespaceURI) && "after".equals(localName); boolean before = Constants.CSS.equals(namespaceURI) && "before".equals(localName); AttributesImpl newAtts = new AttributesImpl(); boolean positioned = isPositioned(atts); for (int i = 0; i < atts.getLength(); ++i) { if (isValid(atts, i, display, before, after, positioned)) { newAtts.addAttribute ( atts.getURI(i), atts.getLocalName(i), atts.getQName(i), atts.getType(i), atts.getValue(i) ); } } super.startElement(namespaceURI, localName, qName, newAtts); } } // InvalidPropertyFilter css2xslfo/src/be/re/css/LengthAdjustFilter.java0000644000175000017500000000607311434532506022515 0ustar mithrandimithrandipackage be.re.css; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.StringTokenizer; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * Length properties without a unit are given the unit "px". * @author Werner Donn\u00e9 */ class LengthAdjustFilter extends XMLFilterImpl { private static final Set ofLengthType = new HashSet ( Arrays.asList ( new String[] { "background-position", "border-bottom-width", "border-left-width", "border-right-width", "border-spacing", "border-top-width", "bottom", "font-size", "height", "img-height", "img-width", "left", "letter-spacing", "line-height", "margin-bottom", "margin-left", "margin-right", "margin-top", "marker-offset", "max-height", "max-width", "min-height", "min-width", "outline-width", "padding-bottom", "padding-left", "padding-right", "padding-top", "right", "size", "text-indent", "text-shadow", "top", "vertical-align", "width", "word-spacing" } ) ); LengthAdjustFilter() { } LengthAdjustFilter(XMLReader parent) { super(parent); } private static Attributes adjustAttributes(Attributes atts) { AttributesImpl result = null; for (int i = 0; i < atts.getLength(); ++i) { if ( Constants.CSS.equals(atts.getURI(i)) && ofLengthType.contains(atts.getLocalName(i)) ) { boolean changed = false; String newValue = ""; StringTokenizer tokenizer = new StringTokenizer(atts.getValue(i), " "); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); if (mustReplace(token)) { changed = true; newValue += (newValue.equals("") ? "" : " " ) + token + "px"; } else { newValue += (newValue.equals("") ? "" : " " ) + token; } } if (changed) { if (result == null) { result = new AttributesImpl(atts); } result.setValue(i, newValue); } } } return result != null ? (Attributes) result : atts; } private static boolean mustReplace(String s) { try { return Integer.parseInt(s) > 0; } catch (NumberFormatException e) { return false; } } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { super.startElement(namespaceURI, localName, qName, adjustAttributes(atts)); } } // LengthAdjustFilter css2xslfo/src/be/re/css/LinkFilter.java0000644000175000017500000001016511434532506021013 0ustar mithrandimithrandipackage be.re.css; import java.net.MalformedURLException; import java.net.URL; import java.util.Stack; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * Processes css:link and css:anchor properties. * @author Werner Donn\u00e9 */ class LinkFilter extends XMLFilterImpl { private static final int EXTERNAL_LINK = 0; private static final int INTERNAL_LINK = 1; private static final int NO_LINK = 2; private URL baseUrl; private Stack elements = new Stack(); LinkFilter(URL baseUrl) { this.baseUrl = baseUrl; } LinkFilter(URL baseUrl, XMLReader parent) { super(parent); this.baseUrl = baseUrl; } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { super.endElement(namespaceURI, localName, qName); int linkType = ((Element) elements.pop()).linkType; if (linkType != NO_LINK) { String name = (linkType == INTERNAL_LINK ? "internal-link" : "external-link"); super.endElement(Constants.CSS, name, "css:" + name); } } private void handleBaseUrl(Attributes atts) throws SAXException { String base = atts.getValue("xml:base"); try { ((Element) elements.peek()).baseUrl = base != null ? new URL(base) : ( elements.size() == 1 ? baseUrl : ((Element) elements.get(elements.size() - 2)).baseUrl ); } catch (MalformedURLException e) { throw new SAXException(e); } } private static boolean isUrl(URL baseUrl, String target) { try { new URL(baseUrl != null ? baseUrl : new URL("file:///nowhere"), target); return true; } catch (MalformedURLException e) { return false; } } private static Attributes resolveAnchor(Attributes atts) { if (atts.getIndex(Constants.CSS, "anchor") == -1) { return atts; } AttributesImpl result = new AttributesImpl(atts); int index = result.getIndex(Constants.CSS, "anchor"); if (result.getValue(index).equalsIgnoreCase("none")) { result.removeAttribute(index); } else { result.setValue(index, Util.getIndirectValue(result, "anchor")); } return result; } void setBaseUrl(URL url) { baseUrl = url; } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { Element element = new Element(); elements.push(element); handleBaseUrl(atts); String link = atts.getValue(Constants.CSS, "link"); if (link != null) { String target = Util.getIndirectValue(atts, "link"); String type = Util.getIndirectType(atts, "link"); atts = new AttributesImpl(atts); ((AttributesImpl) atts). removeAttribute(atts.getIndex(Constants.CSS, "link")); if (!link.equalsIgnoreCase("none") && target != null) { AttributesImpl linkAtts = new AttributesImpl(); element.linkType = target.startsWith("#") || "IDREF".equals(type) ? INTERNAL_LINK : (isUrl(element.baseUrl, target) ? EXTERNAL_LINK : NO_LINK); if (element.linkType != NO_LINK) { String name = element.linkType == INTERNAL_LINK ? "internal-link" : "external-link"; linkAtts.addAttribute ( "", "target", "target", "CDATA", element.linkType == INTERNAL_LINK ? target.substring(target.startsWith("#") ? 1 : 0) : target ); super.startElement(Constants.CSS, name, "css:" + name, linkAtts); } } else { element.linkType = NO_LINK; } } else { element.linkType = NO_LINK; } super.startElement(namespaceURI, localName, qName, resolveAnchor(atts)); } private static class Element { private URL baseUrl; private int linkType; } // Element } // LinkFilter css2xslfo/src/be/re/css/ListImageLabelFilter.java0000644000175000017500000000433611434532506022737 0ustar mithrandimithrandipackage be.re.css; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; import javax.imageio.ImageIO; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * Fetches images specified in list-style-image properties and * sets their width as the list-label-width property. * @author Werner Donn\u00e9 */ class ListImageLabelFilter extends XMLFilterImpl { ListImageLabelFilter() { } ListImageLabelFilter(XMLReader parent) { super(parent); } private static String decodeUrl(String url) { return url.startsWith("url(") && url.endsWith(")") ? url.substring(4, url.length() - 1) : url; } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { String url = atts.getValue(Constants.CSS, "list-style-image"); if (url != null) { if (url.equals("none")) { atts = new AttributesImpl(atts); Util.removeAttribute ( (AttributesImpl) atts, Constants.CSS, "list-style-image" ); if (atts.getValue(Constants.CSS, "list-style-type") == null) { ((AttributesImpl) atts).addAttribute ( Constants.CSS, "list-style-type", "css:list-style-type", "CDATA", "none" ); } } else { try { BufferedImage image = ImageIO.read(new URL(decodeUrl(url))); if (image != null) { atts = new AttributesImpl(atts); ((AttributesImpl) atts).addAttribute ( Constants.CSS, "list-label-width", "css:list-label-width", "CDATA", String.valueOf(image.getWidth() + 5) + "px" ); } } catch (IOException e) { throw new SAXException(e); } } } super.startElement(namespaceURI, localName, qName, atts); } } // ListImageLabelFilter css2xslfo/src/be/re/css/MarkerFilter.java0000644000175000017500000002177111434532506021344 0ustar mithrandimithrandipackage be.re.css; import be.re.xml.Accumulator; import be.re.xml.DOMToContentHandler; import be.re.xml.sax.FilterOfFilters; import org.w3c.dom.Attr; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NamedNodeMap; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLFilterImpl; /** * Creates table structures to implement the marker display type. * @author Werner Donn\u00e9 */ class MarkerFilter extends XMLFilterImpl { private static final String DEFAULT_WIDTH = "2em"; MarkerFilter() { } MarkerFilter(XMLReader parent) { super(parent); } private void accumulate ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { Accumulator.preAccumulate ( namespaceURI, localName, qName, atts, this, new Accumulator.ProcessElement() { public void process(Element element, XMLFilter filter) throws SAXException { DOMToContentHandler.elementToContentHandler ( transform(element), filter.getContentHandler() ); } } ); } private static void addBody(Element table, Element element, Element before, Element after) { Element body = table.getOwnerDocument(). createElementNS(Constants.CSS, "table-row-group"); body.setAttributeNS(Constants.CSS, "css:display", "table-row-group"); table.appendChild(body); Element row = table.getOwnerDocument().createElementNS(Constants.CSS, "table-row"); row.setAttributeNS(Constants.CSS, "css:display", "table-row"); body.appendChild(row); Element mainCell = table.getOwnerDocument().createElementNS(Constants.CSS, "table-cell"); mainCell.setAttributeNS(Constants.CSS, "css:display", "table-cell"); row.appendChild(mainCell); mainCell.appendChild(element); if (before != null) { Element cell = table.getOwnerDocument().createElementNS(Constants.CSS, "table-cell"); cell.setAttributeNS(Constants.CSS, "css:display", "table-cell"); cell.setAttributeNS(Constants.CSS, "css:vertical-align", "top"); row.insertBefore(cell, mainCell); addMarker(cell, before, "right"); } if (after != null) { Element cell = table.getOwnerDocument().createElementNS(Constants.CSS, "table-cell"); cell.setAttributeNS(Constants.CSS, "css:display", "table-cell"); cell.setAttributeNS(Constants.CSS, "css:vertical-align", "bottom"); row.appendChild(cell); addMarker(cell, after, "left"); } } private static void addColumn(Element table, String width) { Element column = table.getOwnerDocument().createElementNS(Constants.CSS, "table-column"); column.setAttributeNS(Constants.CSS, "css:display", "table-column"); column.setAttributeNS ( Constants.CSS, "css:width", width.equals("") ? "1*" : width ); table.appendChild(column); } private static void addMarker(Element cell, Element marker, String side) { cell.appendChild(marker); marker.removeAttributeNS(Constants.CSS, "width"); marker.setAttributeNS(Constants.CSS, "css:display", "block"); String markerOffset = marker.getAttributeNS(Constants.CSS, "marker-offset"); if (!markerOffset.equals("")) { cell.setAttributeNS(Constants.CSS, "css:padding-" + side, markerOffset); marker.removeAttributeNS(Constants.CSS, "marker-offset"); } } private static Element getAfterPseudoElement(Node node) { return node == null ? null : ( node instanceof Element && Constants.CSS.equals(node.getNamespaceURI()) && "after".equals(node.getLocalName()) && "marker".equals ( ((Element) node).getAttributeNS(Constants.CSS, "display") ) ? (Element) node : getAfterPseudoElement(node.getPreviousSibling()) ); } private static Element getBeforePseudoElement(Node node) { return node == null ? null : ( node instanceof Element && Constants.CSS.equals(node.getNamespaceURI()) && "before".equals(node.getLocalName()) && "marker".equals ( ((Element) node).getAttributeNS(Constants.CSS, "display") ) ? (Element) node : getBeforePseudoElement(node.getNextSibling()) ); } private static Element handleNestedMarkers(Element element) throws SAXException { Accumulator result = new Accumulator(); FilterOfFilters filter = new FilterOfFilters ( // The MarkerFilter needs a parent to insert its own accumulator. new XMLFilter[]{new XMLFilterImpl(), new MarkerFilter(), result} ); filter.startDocument(); DOMToContentHandler.elementToContentHandler(element, filter); filter.endDocument(); return (Element) element.getOwnerDocument(). importNode(result.getDocument().getDocumentElement(), true); } private static void moveInheritedProperties(Element element, Element table) { NamedNodeMap attributes = element.getAttributes(); for (int i = 0; i < attributes.getLength(); ++i) { Attr attribute = (Attr) attributes.item(i); if ( Constants.CSS.equals(attribute.getNamespaceURI()) && Util.isInherited(attribute.getLocalName()) ) { element.removeAttributeNode(attribute); table.setAttributeNodeNS(attribute); --i; } } } private static void moveMargin(Element element, Element table, String side) { Attr margin = element.getAttributeNodeNS(Constants.CSS, "margin-" + side); if (margin != null && !margin.getValue().equals("")) { element.removeAttributeNode(margin); table.setAttributeNodeNS(margin); } } private static void moveMargins(Element element, Element table, String beforeWidth) { String margin = element.getAttributeNS(Constants.CSS, "margin-left"); if (Util.isZeroLength(margin)) { margin = ""; } if (beforeWidth != null || !margin.equals("")) { table.setAttributeNS ( Constants.CSS, "css:margin-left", (beforeWidth != null ? ("-" + beforeWidth) : "") + (!margin.equals("") ? ("+" + margin) : "") ); } if (!margin.equals("")) { element.removeAttributeNS(Constants.CSS, "margin-left"); } moveMargin(element, table, "right"); moveMargin(element, table, "top"); moveMargin(element, table, "bottom"); } private static void removeMargins(Element marker) { marker.removeAttributeNS(Constants.CSS, "margin-left"); marker.removeAttributeNS(Constants.CSS, "margin-right"); marker.removeAttributeNS(Constants.CSS, "margin-top"); marker.removeAttributeNS(Constants.CSS, "margin-bottom"); } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { if ("1".equals(atts.getValue(Constants.CSS, "has-markers"))) { accumulate(namespaceURI, localName, qName, atts); } else { super.startElement(namespaceURI, localName, qName, atts); } } private static Element transform(Element element) throws SAXException { Element after = getAfterPseudoElement(element.getLastChild()); Element before = getBeforePseudoElement(element.getFirstChild()); String beforeWidth = null; Element table = element.getOwnerDocument().createElementNS(Constants.CSS, "table"); table.setAttributeNS(Constants.CSS, "css:display", "table"); table.setAttributeNS(Constants.CSS, "css:table-layout", "fixed"); if (before != null) { beforeWidth = before.getAttributeNS(Constants.CSS, "width"); if (beforeWidth.equals("") || beforeWidth.equals("auto")) { beforeWidth = DEFAULT_WIDTH; } addColumn(table, beforeWidth); if ("list-item".equals(element.getAttributeNS(Constants.CSS, "display"))) { element.setAttributeNS(Constants.CSS, "css:display", "block"); } element.removeChild(before); removeMargins(before); } addColumn(table, element.getAttributeNS(Constants.CSS, "width")); element.setAttributeNS(Constants.CSS, "css:width", "100%"); if (after != null) { String width = before.getAttributeNS(Constants.CSS, "width"); addColumn ( table, !width.equals("") && !width.equals("auto") ? width : DEFAULT_WIDTH ); element.removeChild(after); removeMargins(after); } moveMargins(element, table, beforeWidth); moveInheritedProperties(element, table); element.removeAttributeNS(Constants.CSS, "has-markers"); addBody(table, handleNestedMarkers(element), before, after); return table; } } // MarkerFilter css2xslfo/src/be/re/css/Matcher.java0000644000175000017500000003212311434532506020331 0ustar mithrandimithrandipackage be.re.css; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.SortedSet; import java.util.Set; import java.util.Stack; import java.util.TreeSet; import org.w3c.css.sac.AttributeCondition; import org.w3c.css.sac.CombinatorCondition; import org.w3c.css.sac.Condition; import org.w3c.css.sac.DocumentHandler; import org.w3c.css.sac.LangCondition; import org.w3c.css.sac.NegativeCondition; import org.w3c.css.sac.PositionalCondition; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; /** * Finds the matching rules as the document goes through it. * @author Werner Donn\u00e9 */ public class Matcher implements ContentHandler { private static final String DEFAULT_LANGUAGE = "en-GB"; private Stack elements = new Stack(); private Compiled.DFAState startState; private static final boolean trace = System.getProperty("be.re.css.trace") != null; public Matcher(Compiled styleSheet) { startState = styleSheet.startState; } public void characters(char[] ch, int start, int length) throws SAXException { } private static boolean checkAttributeCondition(Element e, AttributeCondition c, TestAttribute test) { if (c.getNamespaceURI() != null) { int index = DocumentHandler.SAC_NO_URI.equals(c.getNamespaceURI()) ? e.attributes.getIndex(c.getLocalName()) : e.attributes.getIndex(c.getNamespaceURI(), c.getLocalName()); return index != -1 && test.test(e.attributes, index, c); } for (int i = 0; i < e.attributes.getLength(); ++i) { if ( e.attributes.getLocalName(i).equals(c.getLocalName()) && test.test(e.attributes, i, c) ) { return true; } } return false; } private static boolean checkAttributeCondition(Element e, AttributeCondition c) { return checkAttributeCondition ( e, c, new TestAttribute() { public boolean test(Attributes atts, int i, AttributeCondition c) { return c.getValue() == null || c.getValue().equals(atts.getValue(i)); } } ); } private static boolean checkBeginHyphenAttributeCondition(Element e, AttributeCondition c) { return checkAttributeCondition ( e, c, new TestAttribute() { public boolean test(Attributes atts, int i, AttributeCondition c) { return atts.getValue(i).startsWith(c.getValue() + "-") || atts.getValue(i).equals(c.getValue()); } } ); } private static boolean checkClassCondition(Element e, AttributeCondition c) { String value; return (value = e.attributes.getValue("class")) != null && hasToken(value, c.getValue()); } private static boolean checkCondition(Element e, Condition c) { switch (c.getConditionType()) { case Condition.SAC_AND_CONDITION: return checkCondition(e, ((CombinatorCondition) c).getFirstCondition()) && checkCondition(e, ((CombinatorCondition) c).getSecondCondition()); case Condition.SAC_ATTRIBUTE_CONDITION: return checkAttributeCondition(e, (AttributeCondition) c); case Condition.SAC_BEGIN_HYPHEN_ATTRIBUTE_CONDITION: return checkBeginHyphenAttributeCondition(e, (AttributeCondition) c); case Condition.SAC_CLASS_CONDITION: return checkClassCondition(e, (AttributeCondition) c); case Condition.SAC_ID_CONDITION: return checkIdCondition(e, (AttributeCondition) c); case Condition.SAC_LANG_CONDITION: return checkLangCondition(e, (LangCondition) c); case Condition.SAC_NEGATIVE_CONDITION: return !checkCondition(e, ((NegativeCondition) c).getCondition()); case Condition.SAC_ONE_OF_ATTRIBUTE_CONDITION: return checkOneOfAttributeCondition(e, (AttributeCondition) c); case Condition.SAC_OR_CONDITION: return checkCondition(e, ((CombinatorCondition) c).getFirstCondition()) || checkCondition(e, ((CombinatorCondition) c).getSecondCondition()); case Condition.SAC_POSITIONAL_CONDITION: return checkPositionalCondition ( e, ((PositionalCondition) c).getPosition() ); case Condition.SAC_PSEUDO_CLASS_CONDITION: return checkPseudoClassCondition(e, (AttributeCondition) c); default: return false; // Ignore non-CSS2 or irrelevant condition types. } } private static boolean checkIdCondition(Element e, AttributeCondition c) { for (int i = 0; i < e.attributes.getLength(); ++i) { if ( "ID".equals(e.attributes.getType(i)) && c.getValue().equals(e.attributes.getValue(i)) ) { return true; } } return false; } private static boolean checkLangCondition(Element e, LangCondition c) { return e.language.startsWith(((LangCondition) c).getLang() + "-") || e.language.equals(((LangCondition) c).getLang()); } private static boolean checkOneOfAttributeCondition(Element e, AttributeCondition c) { return checkAttributeCondition ( e, c, new TestAttribute() { public boolean test(Attributes atts, int i, AttributeCondition c) { return hasToken(atts.getValue(i), c.getValue()); } } ); } private static boolean checkPositionalCondition(Element e, int position) { // The element on the top of the stack is not yet in the child list of its // parent. The preceding sibling is the last element in the parent's child // list. return e.parent.children.size() == position; } private static boolean checkPseudoClassCondition(Element e, AttributeCondition c) { return "after".equals(c.getValue()) || "before".equals(c.getValue()) || ("first-child".equals(c.getValue()) && checkPositionalCondition(e, 0)); } public void endDocument() throws SAXException { } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { Element element = (Element) elements.pop(); ((Element) elements.peek()).children.add(element); element.children = null; } public void endPrefixMapping(String prefix) throws SAXException { } private String getLanguage(String namespaceURI, Attributes attributes, Element parent) { String result = null; if (Constants.XHTML == namespaceURI) { result = attributes.getValue("lang"); } if (result == null) { result = attributes.getValue("xml:lang"); } if (result == null) { result = parent.language; } return result; } private static Set getSiblingStates(Collection states) { Set result = new HashSet(); for (Iterator i = states.iterator(); i.hasNext();) { Object nextState = ((Compiled.DFAState) i.next()).events.get(Compiled.SIBLING); if (nextState != null) { result.add(nextState); } } return result; } public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { } private static boolean hasToken(String s, String token) { int i; return (i = s.indexOf(token)) != -1 && (i == 0 || s.charAt(i - 1) == ' ') && ( i == s.length() - token.length() || s.charAt(i + token.length()) == ' ' ); } /** * Returns the rules that match a pseudo element sorted from least to most * specific. */ public Rule[] matchingPseudoRules() { SortedSet result = new TreeSet(new RuleComparator()); for ( Iterator i = ((Element) elements.peek()).states.iterator(); i.hasNext(); ) { result.addAll(((Compiled.DFAState) i.next()).pseudoRules); } return (Rule[]) result.toArray(new Rule[0]); } /** * Returns the rules that match a normal element sorted from least to most * specific. */ public Rule[] matchingRules() { SortedSet result = new TreeSet(new RuleComparator()); for ( Iterator i = ((Element) elements.peek()).states.iterator(); i.hasNext(); ) { result.addAll(((Compiled.DFAState) i.next()).rules); } return (Rule[]) result.toArray(new Rule[0]); } public void processingInstruction(String target, String data) throws SAXException { } public void setDocumentLocator(Locator locator) { } public void skippedEntity(String name) throws SAXException { } public void startDocument() throws SAXException { elements.clear(); Element root = new Element("", "/"); root.language = DEFAULT_LANGUAGE; elements.push(root); } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { Element parent = (Element) elements.peek(); Set currentStates = parent.states; Element element = new Element(namespaceURI, localName); element.attributes = atts; element.language = getLanguage(namespaceURI, atts, parent); element.parent = parent; elements.push(element); traceElement(namespaceURI + "|" + localName, atts); stepStates(parent.states, element); if (parent.children.size() > 0) { stepStates ( getSiblingStates ( ((Element) parent.children.get(parent.children.size() - 1)).states ), element ); } // At every element new rules can be started, because they are relative. step(startState, element); } public void startPrefixMapping(String prefix, String uri) throws SAXException { } /** * More than one state transition can occur because when the candidate * conditions are fullfilled, they constitute an event. The universal * selector transitions are also tried. */ private static void step(Compiled.DFAState state, Element element) { stepOneEvent ( state, element, ("".equals(element.namespaceURI) ? "*" : element.namespaceURI) + "|" + element.localName ); if (!"".equals(element.namespaceURI)) { stepOneEvent(state, element, "*|" + element.localName); stepOneEvent(state, element, element.namespaceURI + "|*"); } else { stepOneEvent ( state, element, DocumentHandler.SAC_NO_URI + "|" + element.localName ); } stepOneEvent(state, element, Compiled.ANY_ELEMENT); } private static void stepOneEvent(Compiled.DFAState state, Element element, String name) { Compiled.DFAState nextState = (Compiled.DFAState) state.events.get(name); if (nextState != null) { traceTransition(state, nextState, name); element.states.add(nextState); stepThroughConditions(nextState, element); } } private static void stepStates(Collection states, Element element) { for (Iterator i = states.iterator(); i.hasNext();) { step((Compiled.DFAState) i.next(), element); } } private static void stepThroughConditions(Compiled.DFAState state, Element element) { for ( Iterator i = state.candidateConditions.keySet().iterator(); i.hasNext(); ) { Condition c = (Condition) i.next(); Compiled.DFAState nextState = (Compiled.DFAState) state.candidateConditions.get(c); if (nextState != null && checkCondition(element, c)) { traceTransition(state, nextState, c); element.states.add(nextState); } } } private static void traceElement(String qName, Attributes atts) { if (trace) { System.out.print(qName + ": "); for (int i = 0; i < atts.getLength(); ++i) { System.out.print(atts.getQName(i) + "=" + atts.getValue(i) + " "); } System.out.println(); } } private static void traceTransition(Compiled.DFAState from, Compiled.DFAState to, Object event) { if (trace) { System.out.println ( String.valueOf(from.state) + " -> " + String.valueOf(to.state) + ": " + ( event instanceof Condition ? Util.conditionText((Condition) event) : event.toString() ) ); } } private static class Element { private Attributes attributes; private List children = new ArrayList(); private String language; private String localName; private String namespaceURI; private Element parent; private Set states = new HashSet(); private Element(String namespaceURI, String localName) { this.namespaceURI = namespaceURI != null ? namespaceURI : ""; this.localName = localName; } } // Element private interface TestAttribute { public boolean test (Attributes atts, int i, AttributeCondition c); } // TestAttribute } // Matcher css2xslfo/src/be/re/css/NormalizeTableFilter.java0000644000175000017500000003747211434532506023040 0ustar mithrandimithrandipackage be.re.css; import java.util.ArrayList; import java.util.List; import java.util.Stack; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * This filter propagates table-column-group properties to table-column * elements and table-column properties to table-cell elements. It also fills up * rows which are too short with empty table cells. * @author Werner Donn\u00e9 */ class NormalizeTableFilter extends XMLFilterImpl { private Stack columnStack = new Stack(); private Stack elementStack = new Stack(); NormalizeTableFilter() { } NormalizeTableFilter(XMLReader parent) { super(parent); } private void addColumn(Attributes atts) { List columns = (List) columnStack.peek(); int span = getSpan(atts, "span"); for (int i = 0; i < span; ++i) { columns.add(atts); } } private void addTableCellRowContributions(Element element) { int rowSpan = getSpan(element.atts, "rowspan"); if (rowSpan > 1) { int colSpan = getSpan(element.atts, "colspan"); Element group = getGroup(); for (int i = 1; i < rowSpan; ++i) // For the next rows. { if (i == ((List) group.extra).size()) { ((List) group.extra).add(new Integer(colSpan)); } else { ((List) group.extra).set ( i, new Integer ( ((Integer) ((List) group.extra).get(i)).intValue() + colSpan ) ); } } } } private void bookKeeping(Element element, Element parent) { if (element.isDisplay(Element.TABLE)) { columnStack.push(new ArrayList()); } else { if (element.isDisplay(Element.TABLE_COLUMN)) { addColumn(new AttributesImpl(element.atts)); } else { if (element.isDisplay(Element.TABLE_ROW)) { if (isGroup(parent) && parent.extra == null) { parent.extra = new ArrayList(); // Row seen. ((List) parent.extra).add(new Integer(0)); // No contributions because there is no previous row. } } else { if (element.isDisplay(Element.TABLE_CELL)) { int currentCellCount = parent.extra == null ? 0 : ((Integer) parent.extra).intValue(); parent.extra = new Integer ( currentCellCount + getSpan(element.atts, "colspan") ); addTableCellRowContributions(element); } } } } } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { Element element = (Element) elementStack.pop(); if ( element.isDisplay(Element.TABLE_ROW_GROUP) && Constants.CSS.equals(element.namespaceURI) && "synthetic".equals(element.localName) ) { // Flush pending synthetic group. super.endElement(Constants.CSS, "synthetic", "css:synthetic"); endElement(namespaceURI, localName, qName); return; } Element parent = elementStack.empty() ? null : ((Element) elementStack.peek()); if (element.isDisplay(Element.TABLE_COLUMN_GROUP)) { synthesizeColumns(element); } else { if (element.isDisplay(Element.TABLE_ROW)) { synthesizeCells(element, parent); } else { if (element.isDisplay(Element.TABLE)) { columnStack.pop(); } } } if ( !element.isDisplay(Element.TABLE_COLUMN_GROUP) && ( !element.isDisplay(Element.TABLE_COLUMN) || parent == null || !parent.isDisplay(Element.TABLE_COLUMN_GROUP) ) ) { super.endElement(namespaceURI, localName, qName); } } /** * Searches down the element stack until an element with a display type in * oneOf is found, but not beyond upTo. */ private Element getAncestor(String[] oneOf, String[] upTo) { for (int i = elementStack.size() - 1; i >= 0; --i) { Element element = (Element) elementStack.get(i); for (int j = 0; j < oneOf.length; ++j) { if (element.isDisplay(oneOf[j])) { return element; } } for (int j = 0; j < upTo.length; ++j) { if (element.isDisplay(upTo[j])) { return null; } } } return null; } private Attributes getColumn() { List columns = (List) columnStack.peek(); Integer position = (Integer) ((Element) elementStack.peek()).extra; return position == null && columns.size() > 0 ? (Attributes) columns.get(0) : ( columns.size() == 0 || position.intValue() >= columns.size() ? null : (Attributes) columns.get(position.intValue()) ); } private Element getGroup() { return getAncestor ( new String[] { Element.TABLE_ROW_GROUP, Element.TABLE_HEADER_GROUP, Element.TABLE_FOOTER_GROUP }, new String[] {Element.TABLE} ); } private static int getSpan(Attributes atts, String name) { String span = atts.getValue(Constants.CSS, name); return span == null ? 1 : Integer.parseInt(span); } private Attributes getTableCellAttributes(Element element, Element parent) { Element table = getAncestor(new String[] {Element.TABLE}, new String[0]); if (table == null) { return element.atts; } Attributes column = getColumn(); // While not being general, the XHTML alignment is done here instead of in // XHTMLAttributeTranslationFilter because we have to know to which column // a cell belongs, in order to possibly inherit from it. This is only // possible when the table is normalized. Attributes atts = Constants.XHTML.equals(parent.namespaceURI) ? inheritXHTMLAlign(element.atts, column, parent) : element.atts; int index = table.atts.getIndex(Constants.CSS, "border-collapse"); // The following are redundant and harmless for collapse, but it produces // something useful for XSL-FO processors that treat collapse as separate. if (index == -1 || "collapse".equals(table.atts.getValue(index))) { if (parent.isDisplay(Element.TABLE_ROW)) { atts = Util. mergeAttributes(parent.atts, atts, new String[] {"border*"}, true); } if (column != null) { atts = Util.mergeAttributes(column, atts, new String[] {"border*"}, true); } } return atts; } private Attributes getTableRowAttributes(Attributes atts, Attributes parentAtts) { // The following are redundant and harmless for collapse, but it produces // something useful for XSL-FO processors that treat collapse as separate. return Util.mergeAttributes ( parentAtts, atts, new String[] {"border-before*", "border-top*"}, true ); } private Attributes inheritXHTMLAlign(Attributes atts, Attributes columnAtts, Element parent) { AttributesImpl result = new AttributesImpl(atts); String textAlign = atts.getIndex(Constants.SPECIF, "text-align") != -1 ? // Can be overridden by XHTML. null : atts.getValue(Constants.CSS, "text-align"); String verticalAlign = atts.getIndex(Constants.SPECIF, "vertical-align") != -1 ? // Can be overridden by XHTML. null : atts.getValue(Constants.CSS, "vertical-align"); if (textAlign == null && columnAtts != null) { textAlign = columnAtts.getValue(Constants.CSS, "text-align"); } if ( ( textAlign == null || verticalAlign == null ) && parent.isDisplay(Element.TABLE_ROW) ) { if (textAlign == null) { textAlign = parent.atts.getValue(Constants.CSS, "text-align"); } if (verticalAlign == null) { verticalAlign = parent.atts.getValue(Constants.CSS, "vertical-align"); } if (textAlign == null || verticalAlign == null) { Element group = getGroup(); if (group != null) { if (textAlign == null) { textAlign = group.atts.getValue(Constants.CSS, "text-align"); } if (verticalAlign == null) { verticalAlign = group.atts.getValue(Constants.CSS, "vertical-align"); if (verticalAlign == null && columnAtts != null) { verticalAlign = columnAtts.getValue(Constants.CSS, "vertical-align"); } } if (textAlign == null || verticalAlign == null) { Element table = getAncestor(new String[] {Element.TABLE}, new String[0]); if (table != null) { if (textAlign == null) { textAlign = table.atts.getValue(Constants.CSS, "text-align"); } if (verticalAlign == null) { verticalAlign = table.atts.getValue(Constants.CSS, "vertical-align"); } } } } } } if (textAlign != null) { Util.setAttribute ( result, Constants.CSS, "text-align", "css:text-align", textAlign ); } if (verticalAlign != null) { Util.setAttribute ( result, Constants.CSS, "vertical-align", "css:vertical-align", verticalAlign ); } return result; } private static boolean isGroup(Element element) { return element.isDisplay(Element.TABLE_HEADER_GROUP) || element.isDisplay(Element.TABLE_FOOTER_GROUP) || element.isDisplay(Element.TABLE_ROW_GROUP); } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { Element element = new Element(namespaceURI, localName, qName, atts); if (!element.isDisplay(Element.TABLE_COLUMN_GROUP)) { Element parent = elementStack.empty() ? null : (Element) elementStack.peek(); if ( element.isDisplay(Element.TABLE_COLUMN) && parent.isDisplay(Element.TABLE_COLUMN_GROUP) ) { parent.addChild(element); } else { if ( element.isDisplay(Element.TABLE_ROW) && parent.isDisplay(Element.TABLE) ) { synthesizeGroup(); parent = (Element) elementStack.peek(); } else { if (isGroup(element) && parent.isDisplay(Element.TABLE_ROW_GROUP)) { // Flush pending synthetic group. elementStack.pop(); super.endElement(Constants.CSS, "synthetic", "css:synthetic"); } } element.atts = element.isDisplay(Element.TABLE_CELL) ? getTableCellAttributes(element, parent) : ( element.isDisplay(Element.TABLE_ROW) && isGroup(parent) && parent.extra == null /* No row seen yet */ ? getTableRowAttributes(atts, parent.atts) : atts ); super.startElement(namespaceURI, localName, qName, element.atts); bookKeeping(element, parent); } } elementStack.push(element); } private void synthesizeCells(Element element, Element parent) throws SAXException { if (element.extra != null) { List columns = (List) columnStack.peek(); List rowContributions = (List) parent.extra; // From group parent. int contribution = rowContributions.size() > 0 ? //rowContributions != null && rowContributions.size() > 0 ? ((Integer) rowContributions.get(0)).intValue() : 0; if (rowContributions.size() > 0) { rowContributions.remove(0); } if (rowContributions.size() == 0) // No contributions left for next row. { rowContributions.add(new Integer(0)); } if (((Integer) element.extra).intValue() + contribution < columns.size()) { for ( int i = ((Integer) element.extra).intValue(); i < columns.size(); ++i ) { super.startElement ( Constants.CSS, "synthetic", "css:synthetic", synthesizeColumnAttributes ( (Attributes) columns.get(i), "table-cell", new String[] {"border*"} ) ); super.endElement(Constants.CSS, "synthetic", "css:synthetic"); } } } } private static Attributes synthesizeColumnAttributes ( Attributes source, String display, String[] include ) { AttributesImpl atts = new AttributesImpl(); for (int i = 0; i < source.getLength(); ++i) { if (Util.inArray(include, source.getLocalName(i))) { atts.addAttribute ( source.getURI(i), source.getLocalName(i), source.getQName(i), source.getType(i), source.getValue(i) ); } } atts. addAttribute(Constants.CSS, "display", "css:display", "CDATA", display); return atts; } private void synthesizeColumns(Element element) throws SAXException { if (element.children == null) { int span = getSpan(element.atts, "span"); for (int i = 0; i < span; ++i) { Attributes atts = synthesizeColumnAttributes ( element.atts, "table-column", i == 0 ? // Take over the group border if needed. new String[] {"border-left*", "text-align", "vertical-align"} : ( i == span - 1 ? new String[] {"border-right*", "text-align", "vertical-align"} : new String[] {"text-align", "vertical-align"} ) ); addColumn(atts); super.startElement(Constants.CSS, "synthetic", "css:synthetic", atts); super.endElement(Constants.CSS, "synthetic", "css:synthetic"); } } else { for (int i = 0; i < element.children.size(); ++i) { Element child = (Element) element.children.get(i); Attributes atts = Util.mergeAttributes ( element.atts, child.atts, i == 0 ? // Take over the group border if needed. new String[] {"border-left*", "text-align", "vertical-align"} : ( i == element.children.size() - 1 ? new String[] {"border-right*", "text-align", "vertical-align"} : new String[] {"text-align", "vertical-align"} ), true ); addColumn(atts); super.startElement ( child.namespaceURI, child.localName, child.qName, atts ); super.endElement(child.namespaceURI, child.localName, child.qName); } } } private void synthesizeGroup() throws SAXException { AttributesImpl atts = new AttributesImpl(); atts.addAttribute ( Constants.CSS, "display", "css:display", "CDATA", "table-row-group" ); super.startElement(Constants.CSS, "synthetic", "css:synthetic", atts); elementStack.push ( new Element(Constants.CSS, "synthetic", "css:synthetic", atts) ); } } // NormalizeTableFilter css2xslfo/src/be/re/css/PageRule.java0000644000175000017500000000260611434532506020455 0ustar mithrandimithrandipackage be.re.css; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Represents one CSS2 @page rule. * @author Werner Donn\u00e9 */ class PageRule { private int position; private List properties = new ArrayList(); private String name; PageRule(String name, int position) { this.name = name; this.position = position; } void addProperty(Property property) { properties.add(property); } String getName() { return name; } int getPosition() { return position; } Property[] getProperties() { return (Property[]) properties.toArray(new Property[properties.size()]); } void setProperty(Property property) { for (Iterator i = properties.iterator(); i.hasNext();) { if (((Property) i.next()).getName().equals(property.getName())) { i.remove(); } } properties.add(property); } /** * Splits this rule into a set of equivalent rules in which there is only one * property. For each property of this rule there will be a new one. */ PageRule[] split() { PageRule[] result = new PageRule[getProperties().length]; for (int i = 0; i < result.length; ++i) { result[i] = new PageRule(getName(), getPosition()); result[i].addProperty(getProperties()[i]); } return result; } } // PageRule css2xslfo/src/be/re/css/PageSetupFilter.java0000644000175000017500000007113011434532506022012 0ustar mithrandimithrandipackage be.re.css; import be.re.xml.DOMToContentHandler; import be.re.xml.sax.GobbleDocumentEvents; import be.re.xml.sax.FilterOfFilters; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Stack; import java.util.TreeSet; import org.w3c.dom.Node; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * This filter produces the page setup, taking into account named pages. * Named page properties will be considered inside a body region element on * blocks and outer tables. * @author Werner Donn\u00e9 */ class PageSetupFilter extends XMLFilterImpl { private static final String DEFAULT_COLUMN_COUNT = "1"; private static final String DEFAULT_REGION_HEIGHT = "10mm"; private static final String DEFAULT_REGION_WIDTH = "20mm"; private static final String[][] pageInheritanceTable = { {"first-left-named", "unnamed", "left", "first", "named"}, {"first-right-named", "unnamed", "right", "first", "named"}, {"last-left-named", "unnamed", "left", "last", "named"}, {"last-right-named", "unnamed", "right", "last", "named"}, {"left-named", "unnamed", "left", "named"}, {"right-named", "unnamed", "right", "named"}, {"blank-left-named", "unnamed", "left", "blank", "named"}, {"blank-right-named", "unnamed", "right", "blank", "named"} }; private static final String[] prefixes = new String[] { "first-left-", "first-right-", "blank-left-", "blank-right-", "first-", "blank-", "left-", "right-", "last-left-", "last-right-", "last-" }; private static final String[][] regionInheritanceTable = { { "first-left-named", "first-named", "first-left", "first", "left-named", "left", "named", "unnamed" }, { "first-right-named", "first-named", "first-right", "first", "right-named", "right", "named", "unnamed" }, { "last-left-named", "last-named", "last-left", "last", "left-named", "left", "named", "unnamed" }, { "last-right-named", "last-named", "last-right", "last", "right-named", "right", "named", "unnamed" }, {"left-named", "left", "named", "unnamed"}, {"right-named", "right", "named", "unnamed"}, { "blank-left-named", "blank-named", "blank-left", "blank", "left-named", "left", "named", "unnamed" }, { "blank-right-named", "blank-named", "blank-right", "blank", "right-named", "right", "named", "unnamed" } }; private URL baseUrl; private Context context; private boolean debug; private Stack elements = new Stack(); private PageRule[] resolvedPageRules; private Map userAgentParameters; PageSetupFilter ( Context context, URL baseUrl, Map userAgentParameters, boolean debug ) { this.context = context; this.baseUrl = baseUrl; this.userAgentParameters = userAgentParameters; this.debug = debug; } PageSetupFilter ( Context context, URL baseUrl, Map userAgentParameters, XMLReader parent, boolean debug ) { super(parent); this.context = context; this.baseUrl = baseUrl; this.userAgentParameters = userAgentParameters; this.debug = debug; } private static List addUnnamedPageRule(List pageRules) { boolean unnamedPresent = false; for (Iterator i = pageRules.iterator(); i.hasNext() && !unnamedPresent;) { if (((PageRule) i.next()).getName().equals("unnamed")) { unnamedPresent = true; } } if (unnamedPresent) { return pageRules; } PageRule rule = new PageRule("unnamed", 0); rule.addProperty(new Property("size", "portrait", false, null)); pageRules.add(rule); return pageRules; } private PageRule[] applyPageRules() throws SAXException { if (context.pageRules.size() == 0) { return new PageRule[0]; } PageRule[] pageRules = recomposePageRules ( sortPageRules ( (PageRule[]) addUnnamedPageRule(context.pageRules).toArray(new PageRule[0]) ) ); super. startElement(Constants.CSS, "pages", "css:pages", new AttributesImpl()); String[] names = getPageRuleNames(pageRules); for (int i = 0; i < names.length; ++i) { generatePage ( getPageAttributes ( pageRules, names[i], getInheritanceTableEntry(pageInheritanceTable, names[i]) ) ); } super.endElement(Constants.CSS, "pages", "css:pages"); return pageRules; } public void characters(char[] ch, int start, int length) throws SAXException { if (shouldEmitContents()) { super.characters(ch, start, length); } } private boolean closeElementsInBodyRegion() throws SAXException { boolean closed = false; for ( int i = elements.size() - 1; i >= 0 && ((Element) elements.get(i)).inBodyRegion; --i ) { Element element = (Element) elements.get(i); super.endElement(element.namespaceURI, element.localName, element.qName); closed = true; } return closed; } private void emitRegion(org.w3c.dom.Element region, String flowName) throws SAXException { AttributesImpl atts = new AttributesImpl(); XMLFilterImpl filter = new FilterOfFilters ( new XMLFilter[] { Util.createPostProjectionFilter ( baseUrl, userAgentParameters, debug ).getFilter(), new GobbleDocumentEvents() // Give a chance for initialization, but don't interfere // with the chain. } ); atts.addAttribute("", "flow-name", "flow-name", "CDATA", flowName); filter.setContentHandler(getContentHandler()); filter.startDocument(); super.startElement ( Constants.XSLFO, "static-content", "fo:static-content", atts ); DOMToContentHandler. elementToContentHandler(removeWidthAndHeight(region), filter); filter.endDocument(); super.endElement(Constants.XSLFO, "static-content", "fo:static-content"); } public void endDocument() throws SAXException { endPrefixMapping("fo"); endPrefixMapping("css"); endPrefixMapping("xh"); endPrefixMapping("sp"); super.endDocument(); } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { Element element = (Element) elements.pop(); if (element.inBodyRegion) { super.endElement(namespaceURI, localName, qName); if (elements.isEmpty() || !((Element) elements.peek()).inBodyRegion) { super.startElement ( Constants.CSS, "last-page-mark", "css:last-page-mark", new AttributesImpl() ); super.endElement(Constants.CSS, "last-page-mark", "css:last-page-mark"); super.endElement(Constants.CSS, "page-sequence", "css:page-sequence"); } else { if (element.span && closeElementsInBodyRegion()) { reopenElementsInBodyRegion(false); } } } if (elements.isEmpty()) { super.endElement(Constants.CSS, "root", "css:root"); } } private static String extractPseudoPrefix(String pageName) { for (int i = 0; i < prefixes.length; ++i) { if (pageName.startsWith(prefixes[i])) { return prefixes[i]; } } return ""; } private void generateBodyRegionExtent(Attributes pageAtts, AttributesImpl regionAtts) throws SAXException { String columnCount = pageAtts.getValue(Constants.CSS, "column-count"); String columnGap = pageAtts.getValue(Constants.CSS, "column-gap"); if (columnCount == null) { columnCount = (String) userAgentParameters.get("column-count"); } if (columnCount != null) { regionAtts. addAttribute("", "column-count", "columnt-count", "CDATA", columnCount); } if (columnGap != null) { regionAtts. addAttribute("", "column-gap", "columnt-gap", "CDATA", columnGap); } super.startElement ( Constants.XSLFO, "region-body", "fo:region-body", regionAtts ); super.endElement(Constants.XSLFO, "region-body", "fo:region-body"); } private void generatePage(Attributes attributes) throws SAXException { AttributesImpl atts = new AttributesImpl(attributes); AttributesImpl bodyRegionAttributes = new AttributesImpl(); moveBodyProperties(atts, bodyRegionAttributes); super.startElement(Constants.CSS, "page", "css:page", atts); List extents = new ArrayList(); Set generated = new HashSet(); String name = atts.getValue(Constants.CSS, "name"); String[] inheritedPages = getInheritanceTableEntry(regionInheritanceTable, name); String[] pages = new String[inheritedPages.length + 1]; String[] regionNames = new String[]{"top", "bottom", "left", "right"}; System.arraycopy(inheritedPages, 0, pages, 1, inheritedPages.length); pages[0] = name; for (int i = 0; i < pages.length; ++i) { Map regions = (Map) context.regions.get(pages[i]); if (regions != null) { for (int j = 0; j < regionNames.length; ++j) { if (!generated.contains(regionNames[j])) { org.w3c.dom.Element region = (org.w3c.dom.Element) regions.get(regionNames[j]); if (region != null) { generated.add(regionNames[j]); String extent; if ( "top".equals(regionNames[j]) || "bottom".equals(regionNames[j]) ) { extent = region.getAttributeNS(Constants.CSS, "height"); if (extent.equals("")) { extent = DEFAULT_REGION_HEIGHT; } } else { extent = region.getAttributeNS(Constants.CSS, "width"); if (extent.equals("")) { extent = DEFAULT_REGION_WIDTH; } } bodyRegionAttributes.addAttribute ( "", "margin-" + regionNames[j], "margin-" + regionNames[j], "CDATA", extent ); extents.add ( generateRegionExtent(region, name, regionNames[j], extent) ); } } } } } // The region order matters. generateBodyRegionExtent(atts, bodyRegionAttributes); for (Iterator j = sortExtents(extents).iterator(); j.hasNext();) { DOMToContentHandler.elementToContentHandler ( (org.w3c.dom.Element) j.next(), getContentHandler() ); } super.endElement(Constants.CSS, "page", "css:page"); } private org.w3c.dom.Element generateRegionExtent ( org.w3c.dom.Element region, String page, String name, String extent ) throws SAXException { String element = "top".equals(name) ? "region-before" : ( "bottom".equals(name) ? "region-after" : ("left".equals(name) ? "region-start" : "region-end") ); String precedence = region.getAttributeNS(Constants.CSS, "precedence"); org.w3c.dom.Element result = region.getOwnerDocument(). createElementNS(Constants.XSLFO, "fo:" + element); if (!precedence.equals("")) { result.setAttribute("precedence", precedence); } result.setAttribute("region-name", page + "-" + name); result.setAttribute("extent", extent); return result; } private void generateRegions(String page) throws SAXException { super.startElement ( Constants.CSS, "regions", "css:regions", new AttributesImpl() ); if (context.regions.size() > 0) { Set generated = new HashSet(); String[] regionNames = new String[]{"top", "bottom", "left", "right"}; for (int i = 0; i < regionInheritanceTable.length; ++i) { for (int j = 0; j < regionInheritanceTable[i].length; ++j) { String specificPage = getSpecificPageName(regionInheritanceTable[i][j], page); Map regions = (Map) context.regions.get(specificPage); if (regions != null) { for (int k = 0; k < regionNames.length; ++k) { String flowName = getSpecificPageName(regionInheritanceTable[i][0], page) + "-" + regionNames[k]; if (!generated.contains(flowName)) { org.w3c.dom.Element region = (org.w3c.dom.Element) regions.get(regionNames[k]); if (region != null) { generated.add(flowName); emitRegion(region, flowName); } } } } } } } super.endElement(Constants.CSS, "regions", "css:regions"); } private static String[] getInheritanceTableEntry(String[][] table, String name) { String symbolic = extractPseudoPrefix(name) + "named"; String unprefixed = stripPseudoPrefix(name); for (int i = 0; i < table.length; ++i) { if (table[i][0].equals(symbolic)) { List result = new ArrayList(); for (int j = 0; j < table[i].length - 1; ++j) { int index = table[i][j + 1].equals("unnamed") ? -1 : table[i][j + 1].indexOf("named"); if (!unprefixed.equals("unnamed") || !table[i][j + 1].equals("named")) // The named page "unnamed" doesn't exist. { result.add ( index != -1 ? (table[i][j + 1].substring(0, index) + unprefixed) : table[i][j + 1] ); } } return (String[]) result.toArray(new String[0]); } } return new String[0]; } /** * The page properties are determined in the order of names. * A successor overrides the values of its predecessors. This implements the * cascade. */ private Attributes getPageAttributes(PageRule[] pageRules, String pageName, String[] names) { AttributesImpl result = new AttributesImpl(); result.addAttribute(Constants.CSS, "name", "css:name", "CDATA", pageName); for (int i = 0; i < names.length; ++i) { for (int j = 0; j < pageRules.length; ++j) { if (names[i].equals(pageRules[j].getName())) { Property[] properties = pageRules[j].getProperties(); for (int k = 0; k < properties.length; ++k) { Util.setCSSAttribute(result, properties[k], -1); } } } } return result; } /** * The method expands all the style sheet specified page names into first, * last, left, right, blank and any variants, which go in the repeatable page * masters. Only the most precise page names remain. */ private static String[] getPageRuleNames(PageRule[] rules) { Set result = new HashSet(); for (int i = 0; i < rules.length; ++i) { String stripped = stripPseudoPrefix(rules[i].getName()); if (!isPseudoPageName(rules[i].getName())) { result.add("first-left-" + stripped); result.add("first-right-" + stripped); result.add("last-left-" + stripped); result.add("last-right-" + stripped); result.add("blank-left-" + stripped); result.add("blank-right-" + stripped); result.add("left-" + stripped); result.add("right-" + stripped); } } result.remove("first"); result.remove("last"); result.remove("blank"); result.remove("left"); result.remove("right"); result.remove("first-left"); result.remove("first-right"); result.remove("last-left"); result.remove("last-right"); result.remove("blank-left"); result.remove("blank-right"); result.remove("unnamed"); return (String[]) result.toArray(new String[result.size()]); } private static String getSpecificPageName(String symbolicName, String page) { return symbolicName.indexOf("-named") != -1 ? symbolicName.substring(0, symbolicName.indexOf("-named")) + "-" + page : ("named".equals(symbolicName) ? page : symbolicName); } private static boolean isPseudoPageName(String name) { return Util. inArray(new String[]{"first", "last", "left", "right", "blank"}, name); } private static void moveBodyProperties(AttributesImpl pageAtts, AttributesImpl regionAtts) { for (int i = 0; i < pageAtts.getLength(); ++i) { if ( Constants.CSS.equals(pageAtts.getURI(i)) && ( pageAtts.getLocalName(i).startsWith("background-") || pageAtts.getLocalName(i).startsWith("border-") || pageAtts.getLocalName(i).startsWith("padding-") ) ) { if (!pageAtts.getLocalName(i).endsWith(".conditionality")) { regionAtts.addAttribute ( pageAtts.getURI(i), pageAtts.getLocalName(i), pageAtts.getQName(i), pageAtts.getType(i), pageAtts.getValue(i) ); } pageAtts.removeAttribute(i--); } } } public void processingInstruction(String target, String data) throws SAXException { if (shouldEmitContents()) { super.processingInstruction(target, data); } } /** * This performs the cascade. */ private static PageRule[] recomposePageRules(PageRule[] pageRules) { Map result = new HashMap(); for (int i = 0; i < pageRules.length; ++i) { PageRule pageRule = (PageRule) result.get(pageRules[i].getName()); if (pageRule == null) { pageRule = new PageRule(pageRules[i].getName(), 0); result.put(pageRule.getName(), pageRule); } pageRule.setProperty(pageRules[i].getProperties()[0]); } return (PageRule[]) result.values().toArray(new PageRule[0]); } private static AttributesImpl removeId(AttributesImpl atts) { for (int i = 0; i < atts.getLength(); ++i) { if ("ID".equals(atts.getType(i))) { atts.removeAttribute(i); return atts; } } return atts; } private static org.w3c.dom.Element removeWidthAndHeight(org.w3c.dom.Element region) { org.w3c.dom.Element result = (org.w3c.dom.Element) region.cloneNode(true); result.removeAttributeNS(Constants.CSS, "width"); result.removeAttributeNS(Constants.CSS, "height"); return result; } private void reopenElementsInBodyRegion(boolean span) throws SAXException { int i; for ( i = elements.size() - 1; i >= 0 && ((Element) elements.get(i)).inBodyRegion; --i ); if (((Element) elements.get(i + 1)).inBodyRegion) { for (int j = i + 1; j < elements.size(); ++j) { Element element = (Element) elements.get(j); AttributesImpl atts = removeId(element.atts); // Avoid duplicate IDs. if (span && j == i + 1) { atts = new AttributesImpl(atts); atts.addAttribute ( Constants.CSS, "column-span", "css:column-span", "CDATA", "all" ); } super.startElement ( element.namespaceURI, element.localName, element.qName, atts ); } } } void setBaseUrl(URL baseUrl) { this.baseUrl = baseUrl; } private boolean shouldEmitContents() { return ((Element) elements.peek()).inBodyRegion; } private static Collection sortExtents(Collection extents) { Collection result = new TreeSet ( new Comparator() { public int compare(Object o1, Object o2) { String[] ordered = new String[] {"region-before", "region-after", "region-start", "region-end"}; return Util.indexOf(ordered, ((Node) o1).getLocalName()) - Util.indexOf(ordered, ((Node) o2).getLocalName()); } } ); result.addAll(extents); return result; } private static PageRule[] sortPageRules(PageRule[] pageRules) { Arrays.sort ( pageRules, new Comparator() { public int compare(Object object1, Object object2) { PageRule rule1 = (PageRule) object1; PageRule rule2 = (PageRule) object2; String name1 = rule1.getName(); String name2 = rule2.getName(); int result = !"unnamed".equals(name1) && "unnamed".equals(name2) ? 1 : ("unnamed".equals(name1) && !"unnamed".equals(name2) ? -1 : 0); if (result == 0) { result = "first".equals(name1) && !"first".equals(name2) ? 1 : (!"first".equals(name1) && "first".equals(name2) ? -1 : 0); } if (result == 0) { result = "last".equals(name1) && !"last".equals(name2) ? 1 : (!"last".equals(name1) && "last".equals(name2) ? -1 : 0); } if (result == 0) { result = "left".equals(name1) && !"left".equals(name2) ? 1 : (!"left".equals(name1) && "left".equals(name2) ? -1 : 0); } if (result == 0) { result = "right".equals(name1) && !"right".equals(name2) ? 1 : (!"right".equals(name1) && "right".equals(name2) ? -1 : 0); } if (result == 0) { result = rule1.getPosition() - rule2.getPosition(); } return result; } } ); return pageRules; } public void startDocument() throws SAXException { super.startDocument(); startPrefixMapping("css", Constants.CSS); startPrefixMapping("xh", Constants.XHTML); startPrefixMapping("sp", Constants.SPECIF); startPrefixMapping("fo", Constants.XSLFO); getParent().setContentHandler(new Recorder()); } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { String display = atts.getValue(Constants.CSS, "display"); Element element = new Element(namespaceURI, localName, qName, atts); Element parent = elements.isEmpty() ? null : (Element) elements.peek(); if (parent == null) { super.startElement(Constants.CSS, "root", "css:root", atts); } element.inBodyRegion = (parent != null && parent.inBodyRegion) || "body".equals(atts.getValue(Constants.CSS, "region")); element.inTable = (parent != null && parent.inTable) || "table".equals(display); if ( element.inBodyRegion && ( parent == null || ( !parent.inTable && ( element.inTable || "block".equals(display) ) ) ) ) { int span = element.atts.getIndex(Constants.CSS, "column-span"); if (span != -1) { element.span = "all".equals(element.atts.getValue(span)); element.atts.removeAttribute(span); } element.pageName = atts.getValue(Constants.CSS, "page"); if ("auto".equals(element.pageName)) { element.pageName = null; } if (element.pageName == null && parent != null) { element.pageName = parent.pageName; } if (element.pageName == null) { element.pageName = "unnamed"; } boolean newPage = parent == null || !element.pageName.equals(parent.pageName); if (newPage || element.span) { boolean closed = closeElementsInBodyRegion(); if (newPage) { if (parent != null && parent.pageName != null) // There is an open page sequence. { super. endElement(Constants.CSS, "page-sequence", "css:page-sequence"); } else { // Pages go before the first page sequence. resolvedPageRules = applyPageRules(); } AttributesImpl attributes = new AttributesImpl(); attributes.addAttribute ( Constants.CSS, "page", "css:page", "CDATA", element.pageName ); super.startElement ( Constants.CSS, "page-sequence", "css:page-sequence", attributes ); generateRegions(element.pageName); } if (closed) { reopenElementsInBodyRegion(element.span); } if (parent != null) { parent.pageName = element.pageName; } } } else { if (parent != null) { element.pageName = parent.pageName; } } if (element.inBodyRegion) { super.startElement(namespaceURI, localName, qName, element.atts); } elements.push(element); } private static String stripPseudoPrefix(String pageName) { for (int i = 0; i < prefixes.length; ++i) { if (pageName.startsWith(prefixes[i])) { return pageName.substring(prefixes[i].length()); } } return pageName; } private static class Element { private AttributesImpl atts; private boolean inBodyRegion; private boolean inTable; private String localName; private String namespaceURI; private String pageName; private String qName; private boolean span; private Element ( String namespaceURI, String localName, String qName, Attributes atts ) { this.namespaceURI = namespaceURI; this.localName = localName; this.qName = qName; this.atts = new AttributesImpl(atts); } } // Element private class Recorder extends XMLFilterImpl { private List events = new ArrayList(); private Stack elements = new Stack(); public void endElement(String namespaceURI, String localName, String qName) throws SAXException { elements.pop(); events.add(new Event(namespaceURI, localName, qName, null)); } private void replayEvents() throws SAXException { for (int i = 0; i < events.size(); ++i) { Event event = (Event) events.get(i); if (event.atts != null) { PageSetupFilter.this.startElement ( event.namespaceURI, event.localName, event.qName, event.atts ); } else { PageSetupFilter.this. endElement(event.namespaceURI, event.localName, event.qName); } } } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { events.add(new Event(namespaceURI, localName, qName, atts)); if (!elements.isEmpty() && ((Element) elements.peek()).inBodyRegion) { replayEvents(); PageSetupFilter.this.getParent(). setContentHandler(PageSetupFilter.this); } else { Element element = new Element(namespaceURI, localName, qName, atts); element.inBodyRegion = "body".equals(atts.getValue(Constants.CSS, "region")); elements.push(element); } } private class Event { private Attributes atts; private String localName; private String namespaceURI; private String qName; private Event ( String namespaceURI, String localName, String qName, Attributes atts ) { this.namespaceURI = namespaceURI; this.localName = localName; this.qName = qName; this.atts = (atts == null ? null : new AttributesImpl(atts)); } } // Event } // Recorder } // PageSetupFilter css2xslfo/src/be/re/css/ProjectorFilter.java0000644000175000017500000014111611434532506022066 0ustar mithrandimithrandipackage be.re.css; import be.re.xml.Accumulator; import be.re.xml.DOMToContentHandler; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.lang.reflect.UndeclaredThrowableException; import java.net.MalformedURLException; import java.net.URL; import java.text.MessageFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.List; import java.util.Set; import java.util.Stack; import java.util.StringTokenizer; import org.w3c.css.sac.CSSException; import org.w3c.css.sac.InputSource; import org.w3c.css.sac.LexicalUnit; import org.w3c.css.sac.Parser; import org.w3c.dom.Node; import org.w3c.dom.Text; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLFilter; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * This class implements the CSS cascading mechanism. It projects the CSS * properties onto the elements in the source document according to the * CSS stylesheet. They are represented as attributes in a distinct namespace. * An external stylesheet can be specified with the processing instruction * which is proposed in section 2.2 of the CSS2 specification. * * Only properties from the "all" and "print" media are considered, besides the * media-neutral ones. * * The filter works for any XML vocabulary, but special measures have been taken * for the XHTML namespace. The style attribute, for example, is recognised * and applied. The XHTML methods of specifying stylesheets, such as the * link and style elements, are also honored. * * All shorthand properties are split into their constituting parts. This makes * it easier to write an XSLT stylesheet which transforms the result of this * class into XSL-FO. * @author Werner Donn\u00e9 */ class ProjectorFilter extends XMLFilterImpl { private static final String DEFAULT_CLOSE_QUOTE = "\""; private static final String DEFAULT_OPEN_QUOTE = "\""; private static final String AFTER = "after".intern(); private static final String BASE = "base".intern(); private static final String BEFORE = "before".intern(); private static final String BODY = "body".intern(); private static final String FIRST_LETTER = "first-letter".intern(); private static final String FIRST_LINE = "first-line".intern(); private static final String LINK = "link".intern(); private static final String STYLE = "style".intern(); private static final String[][] pageFormatTable = { {"armenian", "ա"}, {"decimal", "1"}, {"decimal-leading-zero", "01"}, {"georgian", "ა"}, {"hebrew", "א"}, {"hiragana", "あ"}, {"hiragana-iroha", "い"}, {"katakana", "ア"}, {"katakana-iroha", "イ"}, {"lower-alpha", "a"}, {"lower-greek", "α"}, {"lower-latin", "a"}, {"lower-roman", "i"}, {"upper-alpha", "A"}, {"upper-latin", "A"}, {"upper-roman", "I"}, }; private URL baseUrl = null; private boolean collectStyleSheet = false; private Compiled compiled = new Compiled(); private Context context; private Stack counters = new Stack(); private Stack elements = new Stack(); private String embeddedStyleSheet = ""; private int lastRulePosition = 0; private Matcher matcher = null; private Stack namedStrings = new Stack(); private int quoteDepth = 0; // Filter state because quotes can match across the hole document. private Map userAgentParameters; private URL userAgentStyleSheet = null; ProjectorFilter(Context context) { this(null, null, new HashMap(), context); } ProjectorFilter ( URL baseUrl, URL userAgentStyleSheet, Map userAgentParameters, Context context ) { this.baseUrl = baseUrl; this.userAgentStyleSheet = userAgentStyleSheet != null ? userAgentStyleSheet : getClass().getResource("style/ua.css"); this.userAgentParameters = userAgentParameters; this.context = context; } private static void addFOMarker(Node parent, String name, String value) { org.w3c.dom.Element element = parent.getOwnerDocument().createElementNS(Constants.CSS, "css:fo-marker"); element.appendChild(parent.getOwnerDocument().createTextNode(value)); element.setAttributeNS(Constants.CSS, "css:name", name); parent.insertBefore(element, parent.getFirstChild()); } private Rule[] appendStyleAttributeRules ( Rule[] matchingRules, Attributes atts, String namespaceURI ) throws SAXException { if (Constants.XHTML != namespaceURI) { return matchingRules; } String style = atts.getValue("style"); if (style == null || "".equals(style)) { return matchingRules; } try { Rule[] rules = getStyleAttributeRules(style); Rule[] result = new Rule[matchingRules.length + rules.length]; System.arraycopy(matchingRules, 0, result, 0, matchingRules.length); System.arraycopy(rules, 0, result, matchingRules.length, rules.length); return result; } catch (IOException e) { throw new SAXException(e); } } private void applyContentProperty(Element element, Rule[] pseudoRules) throws SAXException { boolean seen = false; // From most to least specific. for (int i = pseudoRules.length - 1; i >= 0 && !seen; --i) { Property[] properties = pseudoRules[i].getProperties(); for (int j = 0; j < properties.length && !seen; ++j) { if ( "content".equals(properties[j].getName()) && properties[j].getLexicalUnit().getLexicalUnitType() != LexicalUnit.SAC_INHERIT ) { seen = true; for ( LexicalUnit k = properties[j].getLexicalUnit(); k != null; k = k.getNextLexicalUnit() ) { switch (k.getLexicalUnitType()) { case LexicalUnit.SAC_ATTR: serializeAttrFunction(k, element, properties[j].getPrefixMap()); break; case LexicalUnit.SAC_COUNTER_FUNCTION: serializeCounterFunction(k); break; case LexicalUnit.SAC_COUNTERS_FUNCTION: serializeCountersFunction(k); break; case LexicalUnit.SAC_FUNCTION: serializeFunction(k, element, properties[j].getPrefixMap()); break; case LexicalUnit.SAC_IDENT: serializeQuote(k, element); break; case LexicalUnit.SAC_STRING_VALUE: serializeString(k.getStringValue()); break; case LexicalUnit.SAC_URI: serializeUriFunction(k); break; default: break; } } } } } } private void addFirstLetterMarker(Element element) { Rule[] pseudoRules = selectPseudoRules(element.matchingPseudoRules, FIRST_LETTER); if (pseudoRules.length > 0) { element.appliedAttributes.addAttribute ( Constants.CSS, "has-first-letter", "css:has-first-letter", "CDATA", "1" ); } } private void applyPseudoRules(Element element, String name) throws SAXException { Rule[] pseudoRules = selectPseudoRules(element.matchingPseudoRules, name); if (pseudoRules.length > 0) { AttributesImpl extra = new AttributesImpl(); if (AFTER == name || BEFORE == name) { extra.addAttribute ( Constants.CSS, "display", "css:display", "CDATA", "inline" ); } AttributesImpl attributes = setCSSAttributes(pseudoRules, extra); AttributesImpl changeBarAttributes = splitChangeBarAttributes(attributes); if (BEFORE == name) { serializeChangeBarBegin(changeBarAttributes); } super.startElement(Constants.CSS, name, "css:" + name, attributes); if (AFTER == name || BEFORE == name) { serializeFOMarkers(pseudoRules); applyContentProperty(element, pseudoRules); } super.endElement(Constants.CSS, name, "css:" + name); if (AFTER == name) { serializeChangeBarEnd(changeBarAttributes); } } } public void characters(char[] ch, int start, int length) throws SAXException { if (collectStyleSheet) { embeddedStyleSheet += new String(ch, start, length); } super.characters(ch, start, length); } private static String convertPageFormat(String listStyle) { for (int i = 0; i < pageFormatTable.length; ++i) { if (listStyle.equals(pageFormatTable[i][0])) { return pageFormatTable[i][1]; } } return "1"; // Decimal is the default. } private static void detectMarkers(Element element) { boolean hasMarkers = false; for (int i = 0; i < element.matchingPseudoRules.length && !hasMarkers; ++i) { hasMarkers = ( element.matchingPseudoRules[i].getPseudoElementName() == BEFORE || element.matchingPseudoRules[i].getPseudoElementName() == AFTER ) && "display".equals ( element.matchingPseudoRules[i].getProperty().getName() ) && "marker".equals ( element.matchingPseudoRules[i].getProperty().getValue() ); } if (hasMarkers) { element.appliedAttributes.addAttribute ( Constants.CSS, "has-markers", "css:has-markers", "CDATA", "1" ); } } public void endDocument() throws SAXException { endPrefixMapping("css"); endPrefixMapping("sp"); super.endDocument(); matcher.endDocument(); reset(); } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { counters.pop(); namedStrings.pop(); matcher.endElement(namespaceURI, localName, qName); if (collectStyleSheet) { collectStyleSheet = false; try { parseStyleSheet(new StringReader(embeddedStyleSheet), 0, true); } catch (IOException e) { throw new SAXException(e); } embeddedStyleSheet = ""; } Element element = (Element) elements.pop(); applyPseudoRules(element, AFTER); super.endElement(element.namespaceURI, element.localName, element.qName); element.matchingElementRules = null; element.matchingPseudoRules = null; element.appliedAttributes = null; if (element.floating) { super.endElement(Constants.CSS, "float", "css:float"); } } private static String evaluateAttrFunction ( LexicalUnit function, Attributes attributes, Map prefixMap ) { if (function.getStringValue() == null) { return ""; } String attribute = function.getStringValue(); int index = attribute.indexOf('|'); String value = index == -1 ? attributes.getValue(attribute) : attributes.getValue ( (String) prefixMap.get(attribute.substring(0, index)), attribute.substring(index + 1) ); return value != null ? value : ""; } private String evaluateCounterFunction(LexicalUnit function) { if (function.getParameters() == null) { return ""; } String counter = function.getParameters().getStringValue(); if (counter == null) { return ""; } Integer value = (Integer) findCounterScope(counter).get(counter.toLowerCase()); String listStyle = getCounterListStyle(function); return value != null && !"none".equalsIgnoreCase(listStyle) && !"inherit".equalsIgnoreCase(listStyle) ? getCounterString(value.intValue(), listStyle) : ""; } private String evaluateCountersFunction(LexicalUnit function) throws SAXException { if (function.getParameters() == null) { return ""; } String counter = function.getParameters().getStringValue(); if (counter == null) { return ""; } LexicalUnit parameter = function.getParameters().getNextLexicalUnit().getNextLexicalUnit(); if (parameter == null) { return ""; } String separator = parameter.getStringValue(); if (separator == null) { return ""; } String listStyle = getCountersListStyle(parameter); return !"none".equalsIgnoreCase(listStyle) && !"inherit".equalsIgnoreCase(listStyle) ? getCountersString(counter.toLowerCase(), separator, listStyle) : ""; } private static String evaluateQuote(LexicalUnit quote, Element element, int[] quoteDepth) { if (quote.getStringValue().equals("open-quote")) { String s = selectOpenQuote(element, quoteDepth[0]); ++quoteDepth[0]; return s; } if (quote.getStringValue().equals("close-quote")) { --quoteDepth[0]; String s = selectCloseQuote(element, quoteDepth[0]); return s; } if (quote.getStringValue().equals("no-open-quote")) { ++quoteDepth[0]; } else { if (quote.getStringValue().equals("no-close-quote")) { --quoteDepth[0]; } } return ""; } private String evaluateStringFunction(LexicalUnit function) throws SAXException { if (function.getParameters() == null) { return ""; } String name = function.getParameters().getStringValue().toLowerCase(); String value = (String) findNamedStringScope(name).get(name); return value != null ? value : ""; } private Map findCounterScope(String counter) { return findScope(counters, counter, new Integer(0)); } private Map findNamedStringScope(String namedString) { return findScope(namedStrings, namedString, ""); } private static Map findScope(Stack scopes, String item, Object defaultValue) { for (int i = scopes.size() - 1; i >= 0; --i) { if (((Map) scopes.get(i)).containsKey(item)) { return (Map) scopes.get(i); } } // The highest scope is the default scope. ((Map) scopes.get(0)).put(item, defaultValue); return (Map) scopes.get(0); } public URL getBaseUrl() { return baseUrl; } private static String getCounterListStyle(LexicalUnit function) { return function.getParameters().getNextLexicalUnit() != null && function.getParameters().getNextLexicalUnit().getLexicalUnitType() == LexicalUnit.SAC_OPERATOR_COMMA ? function.getParameters().getNextLexicalUnit().getNextLexicalUnit(). getStringValue() : "decimal"; } private static String getCountersListStyle(LexicalUnit function) { return function.getNextLexicalUnit() != null && function.getNextLexicalUnit().getLexicalUnitType() == LexicalUnit.SAC_OPERATOR_COMMA ? function.getNextLexicalUnit().getNextLexicalUnit().getStringValue() : "decimal"; } private static String getCounterString(int value, String listStyle) { if (listStyle.equals("circle")) { return "\u25cb"; } if (listStyle.equals("disc")) { return "\u2022"; } if (listStyle.equals("square")) { return "\u25a0"; } if (listStyle.equals("decimal-leading-zero")) { return (value < 10 ? "0" : "") + String.valueOf(value); } if (listStyle.equals("lower-alpha") || listStyle.equals("lower-latin")) { return String.valueOf((char) (value + 96)); } if (listStyle.equals("upper-alpha") || listStyle.equals("upper-latin")) { return String.valueOf((char) (value + 64)); } if (listStyle.equals("lower-greek")) { return String.valueOf((char) (value + 944)); } if (listStyle.equals("lower-roman")) { return Util.toRoman(value).toLowerCase(); } if (listStyle.equals("upper-roman")) { return Util.toRoman(value); } if (listStyle.equals("footnote")) { return Util.toFootnote(value); } return String.valueOf(value); // decimal } private String getCountersString(String counter, String separator, String listStyle) { String result = ""; for (Iterator i = counters.iterator(); i.hasNext();) { Map scope = (Map) i.next(); Integer value = (Integer) scope.get(counter); if (value != null) { result += (result.equals("") ? "" : separator) + getCounterString(value.intValue(), listStyle); } } return result; } private static String getElementContents(Node node) { return node == null ? "" : ( ( node instanceof Text ? ((Text) node).getData() : ( node instanceof org.w3c.dom.Element && ( !Constants.CSS.equals(node.getNamespaceURI()) || !( BEFORE.equals(node.getLocalName()) || AFTER.equals(node.getLocalName()) ) ) ? getElementContents(node.getFirstChild()) : "" ) ) + getElementContents(node.getNextSibling()) ); } private static LexicalUnit getQuotePair(LexicalUnit unit, int quoteDepth) { for ( int i = 0; i < quoteDepth && unit.getNextLexicalUnit().getNextLexicalUnit() != null; ++i ) { unit = unit.getNextLexicalUnit().getNextLexicalUnit(); } return unit; } private static String[] getSetNamedStringNames(Rule[] rules) { Set result = new HashSet(); for (int i = 0; i < rules.length; ++i) { Property[] properties = rules[i].getProperties(); for (int j = 0; j < properties.length; ++j) { if ( "string-set".equals(properties[j].getName()) && properties[j].getLexicalUnit() != null && properties[j].getLexicalUnit().getLexicalUnitType() == LexicalUnit.SAC_IDENT && !"none".equalsIgnoreCase ( properties[j].getLexicalUnit().getStringValue() ) ) { if ( !hasContentsIdentifier // Those are serialized differently. ( properties[j].getLexicalUnit().getNextLexicalUnit() ) ) { result.add ( properties[j].getLexicalUnit().getStringValue().toLowerCase() ); } else { // In case there is a rule earlier in the cascade that doesn't // have "contents" as the value for the named string. result.remove ( properties[j].getLexicalUnit().getStringValue().toLowerCase() ); } } } } return (String[]) result.toArray(new String[result.size()]); } private Rule[] getStyleAttributeRules(String style) throws IOException, SAXException { final List rules = new ArrayList(); try { parseStyleSheet ( null, new StringReader("dummy{" + style + "}"), new RuleCollector.RuleEmitter() { public void addRule(Rule rule) { rules.add(rule); } }, new ArrayList(), 0, false ); } catch (MalformedURLException e) { throw new UndeclaredThrowableException(e); // Would be a bug. } return (Rule[]) rules.toArray(new Rule[0]); } public URL getUserAgentStyleSheet() { return userAgentStyleSheet; } private void handleControlInformation ( String namespaceURI, String localName, AttributesImpl atts ) throws SAXException { try { if (atts.getValue("xml:base") != null) { ((Element) elements.peek()).baseUrl = new URL(atts.getValue("xml:base")); } setXMLIDType(atts); if (Constants.XHTML == namespaceURI) { if (BASE == localName) { if (atts.getValue("href") != null) { URL base = new URL(atts.getValue("href")); for (int i = 0; i < elements.size(); ++i) { ((Element) elements.get(i)).baseUrl = base; } } } else { if (BODY == localName) { URL base = ((Element) elements.peek()).baseUrl; if (base != null) // Make sure the BASE is translated for the rest of the chain. { Util. setAttribute(atts, "", "xml:base", "xml:base", base.toString()); } } else { if (LINK == localName) { if (isMatchingStyleSheet(atts) && atts.getValue("href") != null) { parseStyleSheet(atts.getValue("href"), 0, true); } } else { if (STYLE == localName && isMatchingStyleSheet(atts)) { collectStyleSheet = true; } } } } } } catch (Exception e) { throw new SAXException(e); } } private void handleFloats(Element element) throws SAXException { int floating = element.appliedAttributes.getIndex(Constants.CSS, "float"); if (floating == -1) { return; } if (!"none".equals(element.appliedAttributes.getValue(floating))) { AttributesImpl floatAttributes = new AttributesImpl(); floatAttributes.addAttribute ( Constants.CSS, "float", "css:float", "CDATA", element.appliedAttributes.getValue(floating) ); super.startElement(Constants.CSS, "float", "css:float", floatAttributes); element.floating = true; } element.appliedAttributes.removeAttribute(floating); } private void handleGraphics(Element element) throws SAXException { if ( "graphic". equals(element.appliedAttributes.getValue(Constants.CSS, "display")) ) { String url = Util.getIndirectValue(element.appliedAttributes, "src"); if (url != null) { try { element.appliedAttributes.setValue ( element.appliedAttributes.getIndex(Constants.CSS, "src"), element.baseUrl != null ? new URL(element.baseUrl, url).toString() : url ); } catch (MalformedURLException e) { throw new SAXException(e); } } } } private static boolean hasContentsIdentifier(LexicalUnit unit) { return unit == null ? false : ( unit.getLexicalUnitType() == LexicalUnit.SAC_IDENT && "contents".equalsIgnoreCase(unit.getStringValue()) ? true : hasContentsIdentifier(unit.getNextLexicalUnit()) ); } private void incrementCounter(Property counterIncrement, boolean display) { for ( LexicalUnit i = counterIncrement.getLexicalUnit(); i != null; i = i.getNextLexicalUnit() ) { if (i.getLexicalUnitType() == LexicalUnit.SAC_IDENT) { String counter = i.getStringValue().toLowerCase(); if (display || "page".equals(counter)) { Map scope = findCounterScope(i.getStringValue()); scope.put ( counter, new Integer ( ((Integer) scope.get(i.getStringValue())).intValue() + ( i.getNextLexicalUnit() != null && i.getNextLexicalUnit().getLexicalUnitType() == LexicalUnit.SAC_INTEGER ? i.getNextLexicalUnit().getIntegerValue() : 1 ) ) ); } } } } /** * The installed accumulator catches region elements processed by this * filter and saves them. */ private void installRegionAccumulator() throws SAXException { Accumulator.postAccumulate ( this, new Accumulator.ProcessElement() { public void process(org.w3c.dom.Element element, XMLFilter filter) throws SAXException { String pageName = element.getAttributeNS(Constants.CSS, "page"); if (pageName.equals("") || pageName.equals("auto")) { pageName = "unnamed"; } element.setAttributeNS(Constants.CSS, "css:page", pageName); Map regionsForPage = (Map) context.regions.get(pageName); if (regionsForPage == null) { regionsForPage = new HashMap(); context.regions.put(pageName, regionsForPage); } regionsForPage. put(element.getAttributeNS(Constants.CSS, "region"), element); } } ); } private void installStringSetAccumulator ( final String name, final String value, final Map scope ) throws SAXException { Accumulator.postAccumulate ( this, new Accumulator.ProcessElement() { public void process(org.w3c.dom.Element element, XMLFilter filter) throws SAXException { String result = MessageFormat.format ( value, new Object[]{getElementContents(element.getFirstChild())} ); scope.put(name, result); addFOMarker(element, name, result); DOMToContentHandler.elementToContentHandler ( element, filter.getContentHandler() ); } } ); } private static boolean isMatchingStyleSheet(Attributes atts) { if ( !"text/css".equals(atts.getValue("type")) || ( atts.getValue("rel") != null && !"stylesheet".equalsIgnoreCase(atts.getValue("rel").trim()) ) ) { return false; } if (atts.getValue("media") == null) { return true; } StringTokenizer tokenizer = new StringTokenizer(atts.getValue("media"), ","); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken().trim().toLowerCase(); if ("all".equals(token) || "print".equals(token)) { return true; } } return false; } private static boolean isStaticRegion(Attributes atts) { String region = atts.getValue(Constants.CSS, "region"); return region != null && !"body".equalsIgnoreCase(region) && !"none".equalsIgnoreCase(region); } private void parseStyleSheet(String uri, int offset, boolean resetMatcher) throws CSSException, MalformedURLException, IOException, SAXException { parseStyleSheet(uri, null, offset, resetMatcher); } private void parseStyleSheet(Reader reader, int offset, boolean resetMatcher) throws CSSException, IOException, SAXException { try { parseStyleSheet(null, reader, offset, resetMatcher); } catch (MalformedURLException e) { throw new UndeclaredThrowableException(e); // Would be a bug. } } private void parseStyleSheet(String uri, Reader reader, int offset, boolean resetMatcher) throws CSSException, MalformedURLException, IOException, SAXException { parseStyleSheet ( uri, reader, new RuleCollector.RuleEmitter() { public void addRule(Rule rule) { compiled.addRule(rule); } }, context.pageRules, offset, resetMatcher ); } private void parseStyleSheet ( String uri, Reader reader, RuleCollector.RuleEmitter ruleEmitter, List pageRules, int offset, boolean resetMatcher ) throws CSSException, MalformedURLException, IOException, SAXException { URL base = !elements.isEmpty() && ((Element) elements.peek()).baseUrl != null ? ((Element) elements.peek()).baseUrl : baseUrl; Parser parser = Util.getSacParser(); InputSource source = reader != null ? new InputSource(reader) : new InputSource(); source.setURI ( base != null && uri != null ? new URL(base, uri).toString() : (base != null ? base.toString() : uri) ); RuleCollector collector = new RuleCollector ( ruleEmitter, pageRules, source.getURI() != null ? new URL(source.getURI()) : null, lastRulePosition, offset ); parser.setDocumentHandler(collector); parser.parseStyleSheet(source); lastRulePosition = collector.getCurrentPosition(); if (resetMatcher) { setMatcher(); } } public void processingInstruction(String target, String data) throws SAXException { if ("xml-stylesheet".equalsIgnoreCase(target)) { StringTokenizer tokenizer = new StringTokenizer(data, " "); String type = null; String uri = null; while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); if (token.startsWith("type=")) { type = token.substring(token.indexOf('=') + 1); } else { if (token.startsWith("href=")) { uri = token.substring(token.indexOf('=') + 1); } } } if ( uri != null && uri.length() > 2 && type != null && type.length() > 2 && type.substring(1, type.length() - 1).equals("text/css") ) { try { parseStyleSheet(uri.substring(1, uri.length() - 1), 0, true); } catch (Exception e) { throw new SAXException(e); } } } super.processingInstruction(target, data); } private void repositionMatcher() throws SAXException { matcher.startDocument(); // The "/" element is of no concern. for (int i = 1; i < elements.size() - 1; ++i) { Element element = (Element) elements.get(i); matcher.startElement ( element.namespaceURI, element.localName, element.qName, element.attributes ); } } private void reset() { context.pageRules.clear(); compiled = new Compiled(); matcher = null; collectStyleSheet = false; embeddedStyleSheet = ""; elements.clear(); counters.clear(); namedStrings.clear(); context.regions.clear(); } private void resetCounter(Property counterReset, boolean display) { for ( LexicalUnit i = counterReset.getLexicalUnit(); i != null; i = i.getNextLexicalUnit() ) { if (i.getLexicalUnitType() == LexicalUnit.SAC_IDENT) { String counter = i.getStringValue().toLowerCase(); if (display || "page".equals(counter)) { ((Map) counters.peek()).put ( counter, new Integer ( i.getNextLexicalUnit() != null && i.getNextLexicalUnit().getLexicalUnitType() == LexicalUnit.SAC_INTEGER ? i.getNextLexicalUnit().getIntegerValue() : 0 ) ); } } } } private static String selectCloseQuote(Element element, int quoteDepth) { if (element.quotes == null) { return DEFAULT_CLOSE_QUOTE; } return getQuotePair(element.quotes, quoteDepth).getNextLexicalUnit(). getStringValue(); } private static String selectOpenQuote(Element element, int quoteDepth) { if (element.quotes == null) { return DEFAULT_OPEN_QUOTE; } return getQuotePair(element.quotes, quoteDepth).getStringValue(); } /** * Maintains the order. */ private static Rule[] selectPseudoRules(Rule[] rules, String pseudoElementName) { List result = new ArrayList(); for (int i = 0; i < rules.length; ++i) { if (pseudoElementName == rules[i].getPseudoElementName()) { result.add(rules[i]); } } return (Rule[]) result.toArray(new Rule[0]); } private void serializeAttrFunction(LexicalUnit unit, Element element, Map prefixMap) throws SAXException { String value = evaluateAttrFunction(unit, element.attributes, prefixMap); super.characters(value.toCharArray(), 0, value.length()); } private void serializeChangeBarBegin(Attributes attributes) throws SAXException { if (attributes.getIndex("change-bar-class") != -1) { super.startElement ( Constants.CSS, "change-bar-begin", "css:change-bar-begin", attributes ); super. endElement(Constants.CSS, "change-bar-begin", "css:change-bar-begin"); } } private void serializeChangeBarEnd(Attributes attributes) throws SAXException { int index = attributes.getIndex("change-bar-class"); if (index != -1) { AttributesImpl atts = new AttributesImpl(); atts.addAttribute ( attributes.getURI(index), attributes.getLocalName(index), attributes.getQName(index), attributes.getType(index), attributes.getValue(index) ); super.startElement ( Constants.CSS, "change-bar-end", "css:change-bar-end", atts ); super. endElement(Constants.CSS, "change-bar-end", "css:change-bar-end"); } } private void serializeCounterFunction(LexicalUnit unit) throws SAXException { if (unit.getParameters() == null) { return; } String counter = unit.getParameters().getStringValue().toLowerCase(); if ("page".equals(counter)) // Special synthetic counter. { serializePageNumber(getCounterListStyle(unit)); } else { if ("pages".equals(counter)) // Special synthetic counter. { serializePagesTotal(); } else { String value = evaluateCounterFunction(unit); super.characters(value.toCharArray(), 0, value.length()); } } } private void serializeCountersFunction(LexicalUnit unit) throws SAXException { String value = evaluateCountersFunction(unit); super.characters(value.toCharArray(), 0, value.length()); } private void serializeFOMarkers(Rule[] rules) throws SAXException { String[] names = getSetNamedStringNames(rules); for (int i = 0; i < names.length; ++i) { String value = (String) findNamedStringScope(names[i]).get(names[i]); if (value != null) { AttributesImpl atts = new AttributesImpl(); atts.addAttribute(Constants.CSS, "name", "css:name", "CDATA", names[i]); super.startElement(Constants.CSS, "fo-marker", "css:fo-marker", atts); super.characters(value.toCharArray(), 0, value.length()); super.endElement(Constants.CSS, "fo-marker", "css:fo-marker"); } } } private void serializeFunction(LexicalUnit unit, Element element, Map prefixMap) throws SAXException { if ("string".equalsIgnoreCase(unit.getFunctionName())) { serializeStringFunction(unit); } else { if ("page-ref".equalsIgnoreCase(unit.getFunctionName())) { serializePageRefFunction(unit, element, prefixMap); } } } private void serializeQuote(LexicalUnit unit, Element element) throws SAXException { int[] quoteDepthReference = new int[] {quoteDepth}; String value = evaluateQuote(unit, element, quoteDepthReference); quoteDepth = quoteDepthReference[0]; super.characters(value.toCharArray(), 0, value.length()); } private void serializePageNumber(String listStyle) throws SAXException { AttributesImpl attributes = new AttributesImpl(); attributes.addAttribute ( Constants.CSS, "format", "css:format", "CDATA", convertPageFormat(listStyle) ); if ( listStyle.equals("armenian") || listStyle.equals("georgian") || listStyle.equals("hebrew") ) { attributes.addAttribute ( Constants.CSS, "letter-value", "css:letter-value", "CDATA", "traditional" ); } super. startElement(Constants.CSS, "page-number", "css:page-number", attributes); super.endElement(Constants.CSS, "page-number", "css:page-number"); } private void serializePageRefFunction(LexicalUnit unit, Element element, Map prefixMap) throws SAXException { if (unit.getParameters() == null) { return; } String value = unit.getParameters().getLexicalUnitType() == LexicalUnit.SAC_ATTR ? evaluateAttrFunction ( unit.getParameters(), element.attributes, prefixMap ) : element.attributes.getValue(unit.getParameters().getStringValue()); if (value == null) { return; } AttributesImpl attributes = new AttributesImpl(); attributes. addAttribute(Constants.CSS, "ref-id", "css:ref-id", "CDATA", value); super.startElement(Constants.CSS, "page-ref", "css:page-ref", attributes); super.endElement(Constants.CSS, "page-ref", "css:page-ref"); } private void serializePagesTotal() throws SAXException { super.startElement ( Constants.CSS, "pages-total", "css:pages-total", new AttributesImpl() ); super.endElement(Constants.CSS, "pages-total", "css:pages-total"); } private void serializeString(String s) throws SAXException { int position = 0; for (int i = s.indexOf('\n'); i != -1; i = s.indexOf(position, '\n')) { super.characters(s.substring(position, i).toCharArray(), 0, i - position); super.startElement ( Constants.CSS, "newline", "css:newline", new AttributesImpl() ); super.endElement(Constants.CSS, "newline", "css:newline"); position = i + 1; } if (position < s.length()) { super.characters ( s.substring(position).toCharArray(), 0, s.length() - position ); } } private void serializeStringFunction(LexicalUnit unit) throws SAXException { if (unit.getParameters() == null) { return; } AttributesImpl atts = new AttributesImpl(); String name = unit.getParameters().getStringValue(); if (name == null) { return; } atts.addAttribute(Constants.CSS, "name", "css:name", "CDATA", name); super.startElement ( Constants.CSS, "retrieve-fo-marker", "css:retrieve-fo-marker", atts ); super. endElement(Constants.CSS, "retrieve-fo-marker", "css:retrieve-fo-marker"); } private void serializeUriFunction(LexicalUnit unit) throws SAXException { if (unit.getStringValue() == null) { return; } AttributesImpl atts = new AttributesImpl(); atts.addAttribute ( Constants.CSS, "href", "css:href", "CDATA", "url(" + unit.getStringValue() + ")" ); super.startElement(Constants.CSS, "external", "css:external", atts); super.endElement(Constants.CSS, "external", "css:external"); } public void setBaseUrl(URL baseUrl) { this.baseUrl = baseUrl; } /** * This method produces CSS attributes according to the matching rules. It * also has a side effect in that it adjusts the counters and named strings. * This was done in order to scan the matching rules only once. */ private AttributesImpl setCSSAttributes(Rule[] matchingRules, Attributes attributes) throws SAXException { Property counterIncrement = null; Property counterReset = null; boolean displayNone = false; AttributesImpl result = new AttributesImpl(attributes); Property stringSet = null; // From least to most specific. for (int i = 0; i < matchingRules.length; ++i) { Property property = matchingRules[i].getProperties()[0]; String propertyName = property.getName(); if (propertyName.equals("counter-increment")) { counterIncrement = property; } else { if (propertyName.equals("counter-reset")) { counterReset = property; } else { if (propertyName.equals("string-set")) { if (matchingRules[i].getPseudoElementName() == null) { stringSet = property; } } else { Util.setCSSAttribute ( result, property, matchingRules[i].getSpecificity() ); if ( propertyName.equals("display") && "none".equalsIgnoreCase(property.getValue()) ) { displayNone = true; } } } } } if (counterReset != null) { resetCounter(counterReset, !displayNone); } if (counterIncrement != null) { incrementCounter(counterIncrement, !displayNone); } if (stringSet != null && !displayNone) { setNamedString(stringSet); } return result; } private void setMatcher() throws SAXException { compiled.generateDFA(); matcher = new Matcher(compiled); repositionMatcher(); } private void setNamedString(Property stringSet) throws SAXException { if ( stringSet.getLexicalUnit() == null || stringSet.getLexicalUnit().getLexicalUnitType() != LexicalUnit.SAC_IDENT || "none". equalsIgnoreCase(stringSet.getLexicalUnit().getStringValue()) ) { return; } boolean needContents = false; String name = stringSet.getLexicalUnit().getStringValue().toLowerCase(); String result = ""; Map scope = findNamedStringScope(name); for ( LexicalUnit i = stringSet.getLexicalUnit().getNextLexicalUnit(); i != null; i = i.getNextLexicalUnit() ) { switch (i.getLexicalUnitType()) { case LexicalUnit.SAC_ATTR: result += evaluateAttrFunction ( i, ((Element) elements.peek()).attributes, stringSet.getPrefixMap() ); break; case LexicalUnit.SAC_COUNTER_FUNCTION: result += evaluateCounterFunction(i); break; case LexicalUnit.SAC_COUNTERS_FUNCTION: result += evaluateCountersFunction(i); break; case LexicalUnit.SAC_FUNCTION: if ("string".equalsIgnoreCase(i.getFunctionName())) { result += evaluateStringFunction(i); } break; case LexicalUnit.SAC_IDENT: if ("contents".equalsIgnoreCase(i.getStringValue())) { result += "{0}"; needContents = true; } else { result += evaluateQuote(i, (Element) elements.peek(), new int[1]); // Local evaluation. } break; case LexicalUnit.SAC_STRING_VALUE: result += i.getStringValue(); break; default: break; } } if (!needContents) { scope.put(name, result); } else { installStringSetAccumulator(name, result, scope); } } private void setQuotes() { Element element = (Element) elements.peek(); for (int i = 0; i < element.matchingElementRules.length; ++i) { Property[] properties = element.matchingElementRules[i].getProperties(); if (properties[0].getName().equals("quotes")) { element.quotes = properties[0].getLexicalUnit(); } } if ( element.quotes == null || element.quotes.getLexicalUnitType() == LexicalUnit.SAC_INHERIT ) { element.quotes = ((Element) elements.get(elements.size() - 2)).quotes; } } public void setUserAgentStyleSheet(URL userAgentStyleSheet) { this.userAgentStyleSheet = userAgentStyleSheet; } private static void setXMLIDType(AttributesImpl atts) { int index = atts.getIndex("xml:id"); if (index != -1 && !"ID".equals(atts.getType(index))) { atts.setType(index, "ID"); } } /** * Removes the change-bar attributes from attributes and returns * those that are in the CSS namespace. They are returned without a * namespace however. */ private static AttributesImpl splitChangeBarAttributes(AttributesImpl attributes) { AttributesImpl result = new AttributesImpl(); for (int i = 0; i < attributes.getLength(); ++i) { if (attributes.getLocalName(i).startsWith("change-bar-")) { if (Constants.CSS.equals(attributes.getURI(i))) { result.addAttribute ( "", attributes.getLocalName(i), attributes.getLocalName(i), attributes.getType(i), attributes.getValue(i) ); } attributes.removeAttribute(i--); } } return result; } public void startDocument() throws SAXException { reset(); try { parseStyleSheet(new StringReader("*{display: inline}"), -2, true); String htmlHeaderMark = (String) userAgentParameters.get("html-header-mark"); if (htmlHeaderMark != null) { parseStyleSheet ( new StringReader(htmlHeaderMark + "{string-set: component contents}"), -2, true ); } parseStyleSheet(userAgentStyleSheet.toString(), -1, true); } catch (Exception e) { throw new SAXException(e); } Element root = new Element("", "/", "/"); root.baseUrl = baseUrl; elements.push(root); counters.push(new HashMap()); namedStrings.push(new HashMap()); super.startDocument(); startPrefixMapping("css", Constants.CSS); startPrefixMapping("sp", Constants.SPECIF); } /** * The string arguments are interned. */ public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { if (namespaceURI != null) { namespaceURI = namespaceURI.intern(); } if (localName != null) { localName = localName.intern(); } if (qName != null) { qName = qName.intern(); } Element element = new Element(namespaceURI, localName, qName); element.baseUrl = ((Element) elements.peek()).baseUrl; elements.push(element); element.attributes = new AttributesImpl(atts); // Must be copied because atts might be recuperated by the parser. handleControlInformation(namespaceURI, localName, element.attributes); matcher.startElement(namespaceURI, localName, qName, element.attributes); element.matchingElementRules = appendStyleAttributeRules(matcher.matchingRules(), atts, namespaceURI); element.matchingPseudoRules = matcher.matchingPseudoRules(); setQuotes(); element.appliedAttributes = setCSSAttributes(element.matchingElementRules, element.attributes); handleFloats(element); handleGraphics(element); detectMarkers(element); if (isStaticRegion(element.appliedAttributes)) { installRegionAccumulator(); } addFirstLetterMarker(element); translateId(element.appliedAttributes); super. startElement(namespaceURI, localName, qName, element.appliedAttributes); serializeFOMarkers(element.matchingElementRules); applyPseudoRules(element, FIRST_LETTER); applyPseudoRules(element, BEFORE); applyPseudoRules(element, FIRST_LINE); counters.push(new HashMap()); namedStrings.push(new HashMap()); } private static void translateId(AttributesImpl atts) { for (int i = 0; i < atts.getLength(); ++i) { if ("ID".equals(atts.getType(i))) { atts.setAttribute ( i, Constants.XML, "id", "xml:id", "ID", atts.getValue(i) ); } } } private static class Element { private AttributesImpl appliedAttributes; private AttributesImpl attributes = new AttributesImpl(); private URL baseUrl; private boolean floating = false; private String localName; private Rule[] matchingElementRules = null; private Rule[] matchingPseudoRules = null; private String namespaceURI; private String qName; private LexicalUnit quotes = null; private Element(String namespaceURI, String localName, String qName) { this.namespaceURI = namespaceURI; this.localName = localName; this.qName = qName; } } // Element } // ProjectorFilter css2xslfo/src/be/re/css/Property.java0000644000175000017500000003665211434532506020605 0ustar mithrandimithrandipackage be.re.css; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.UndeclaredThrowableException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import org.w3c.css.sac.LexicalUnit; /** * Represents a CSS2 property. It also implements splitting of shorthand * properties into basic properties. * @author Werner Donn\u00e9 */ public class Property { private static final String[] BACKGROUND_ATTACHMENT = {"fixed", "scroll"}; private static final String[] BACKGROUND_REPEAT = {"repeat", "repeat-x", "repeat-y", "no-repeat"}; private static final String[] BORDER_STYLE = { "none", "hidden", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset" }; private static final String[] COLORS = { "aqua", "black", "blue", "fuchsia", "gray", "green", "lime", "maroon", "navy", "olive", "purple", "red", "silver", "teal", "white", "yellow", "transparent" }; private static final String[] FONT_SIZE = { "xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large", "larger", "smaller" }; private static final String[] FONT_STYLE = {"normal", "italic", "oblique"}; private static final String[] FONT_VARIANT = {"normal", "small-caps"}; private static final String[] FONT_WEIGHT = {"normal", "bold", "bolder", "lighter"}; private static final String[] LIST_STYLE_POSITION = {"inside", "outside"}; private static final String[] LIST_STYLE_TYPE = { "disc", "circle", "square", "decimal", "decimal-leading-zero", "lower-roman", "upper-roman", "lower-greek", "lower-alpha", "lower-latin", "upper-alpha", "upper-latin", "hebrew", "armenian", "georgian", "cjk-ideographic", "hiragana", "katakana", "hiragana-iroha", "katakana-iroha", "none" }; private static final String[] SYSTEM_FONTS = {"caption", "icon", "menu", "message-box", "small-caption", "status-bar"}; private URL baseUrl; private boolean important; private String name; private Map prefixMap; private LexicalUnit value; private String valueAsString; /** * Is not used for shorthand properties. */ Property(String name, String value, boolean important, Map prefixMap) { this.name = name; this.valueAsString = value; this.important = important; this.prefixMap = prefixMap; } public Property ( String name, LexicalUnit value, boolean important, Map prefixMap, URL baseUrl ) { this.name = name; this.value = value; this.valueAsString = Util.lexicalUnitToString(value, !"font-family".equals(name), baseUrl); this.important = important; this.prefixMap = prefixMap; this.baseUrl = baseUrl; } private Property copy(String name, String value) { return new Property(name, value, getImportant(), getPrefixMap()); } public boolean getImportant() { return important; } public String getName() { return name; } public LexicalUnit getLexicalUnit() { return value; } public Map getPrefixMap() { return prefixMap; } public String getValue() { return valueAsString; } private boolean isFontSize(LexicalUnit unit) { int type = unit.getLexicalUnitType(); return type == LexicalUnit.SAC_CENTIMETER || type == LexicalUnit.SAC_EM || type == LexicalUnit.SAC_EX || type == LexicalUnit.SAC_INCH || type == LexicalUnit.SAC_MILLIMETER || type == LexicalUnit.SAC_PERCENTAGE || type == LexicalUnit.SAC_PICA || type == LexicalUnit.SAC_PIXEL || type == LexicalUnit.SAC_POINT || Util.inArray(FONT_SIZE, Util.lexicalUnitAtomLower(unit, baseUrl)); } private static boolean isFontWeight(String atom) { try { return Util.inArray(FONT_WEIGHT, atom) || (Integer.parseInt(atom) >= 100 && Integer.parseInt(atom) <= 900); } catch (NumberFormatException e) { return false; } } private Property[] setAtoms(String[] names, String[] atoms) { Property[] result = new Property[names.length]; for (int i = 0; i < names.length; ++i) { result[i] = copy(names[i], atoms[i]); } return result; } public Property[] split() { StringTokenizer tokenizer = new StringTokenizer(getName(), "-"); String name = "split"; while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); name += token.substring(0, 1).toUpperCase() + token.substring(1); } try { return (Property[]) getClass().getDeclaredMethod(name, new Class[0]). invoke(this, new Object[0]); } catch (IllegalAccessException e) { throw new UndeclaredThrowableException(e); } catch (InvocationTargetException e) { throw new UndeclaredThrowableException(e); } catch (NoSuchMethodException e) { return new Property[] {this}; } } private Property[] splitBackground() { List result = new ArrayList(); String remaining = null; for (LexicalUnit i = value; i != null; i = i.getNextLexicalUnit()) { String atom = Util.lexicalUnitAtomLower(i, baseUrl); if (i.getLexicalUnitType() == LexicalUnit.SAC_URI) { result.add(copy("background-image", atom)); } else { if ( i.getLexicalUnitType() == LexicalUnit.SAC_RGBCOLOR || Util.inArray(COLORS, atom) ) { result.add(copy("background-color", atom)); } else { if (Util.inArray(BACKGROUND_ATTACHMENT, atom)) { result.add(copy("background-attachment", atom)); } else { if (Util.inArray(BACKGROUND_REPEAT, atom)) { result.add(copy("background-repeat", atom)); } else { remaining = remaining == null ? atom : (remaining + " " + atom); } } } } } if (remaining != null) { result.add(copy("background-position", remaining)); } return (Property[]) result.toArray(new Property[result.size()]); } private Property[] splitBorder() { List result = new ArrayList(); String remaining = null; for (LexicalUnit i = value; i != null; i = i.getNextLexicalUnit()) { String atom = Util.lexicalUnitAtomLower(i, baseUrl); if ( i.getLexicalUnitType() == LexicalUnit.SAC_RGBCOLOR || Util.inArray(COLORS, atom) || atom.equals("transparant") ) { result.add(copy("border-top-color", atom)); result.add(copy("border-right-color", atom)); result.add(copy("border-bottom-color", atom)); result.add(copy("border-left-color", atom)); } else { if (Util.inArray(BORDER_STYLE, atom)) { result.add(copy("border-top-style", atom)); result.add(copy("border-right-style", atom)); result.add(copy("border-bottom-style", atom)); result.add(copy("border-left-style", atom)); } else { remaining = remaining == null ? atom : (remaining + " " + atom); } } } if (remaining != null) { result.add(copy("border-top-width", remaining)); result.add(copy("border-bottom-width", remaining)); result.add(copy("border-left-width", remaining)); result.add(copy("border-right-width", remaining)); result.add(copy("border-after-width.conditionality", "retain")); result.add(copy("border-before-width.conditionality", "retain")); } return (Property[]) result.toArray(new Property[result.size()]); } private Property[] splitBorderBottom() { return splitBorderSide("bottom"); } private Property[] splitBorderBottomWidth() { Property[] result = new Property[2]; result[0] = copy(getName(), getValue()); result[1] = copy("border-after-width.conditionality", "retain"); return result; } private Property[] splitBorderColor() { return splitFourWays(getName(), getImportant()); } private Property[] splitBorderLeft() { return splitBorderSide("left"); } private Property[] splitBorderRight() { return splitBorderSide("right"); } private Property[] splitBorderStyle() { return splitFourWays(getName(), getImportant()); } private Property[] splitBorderTop() { return splitBorderSide("top"); } private Property[] splitBorderSide(String side) { List result = new ArrayList(); String remaining = null; for (LexicalUnit i = value; i != null; i = i.getNextLexicalUnit()) { String atom = Util.lexicalUnitAtomLower(i, baseUrl); if ( i.getLexicalUnitType() == LexicalUnit.SAC_RGBCOLOR || Util.inArray(COLORS, atom) || atom.equals("transparant") ) { result.add(copy("border-" + side + "-color", atom)); } else { if (Util.inArray(BORDER_STYLE, atom)) { result.add(copy("border-" + side + "-style", atom)); } else { remaining = remaining == null ? atom : (remaining + " " + atom); } } } if (remaining != null) { result.add(copy("border-" + side + "-width", remaining)); if ("top".equals(side)) { result.add(copy("border-before-width.conditionality", "retain")); } else { if ("bottom".equals(side)) { result.add(copy("border-after-width.conditionality", "retain")); } } } return (Property[]) result.toArray(new Property[result.size()]); } private Property[] splitBorderTopWidth() { Property[] result = new Property[2]; result[0] = copy(getName(), getValue()); result[1] = copy("border-before-width.conditionality", "retain"); return result; } private Property[] splitBorderWidth() { Property[] values = splitFourWays(getName(), getImportant()); Property[] result = new Property[values.length + 2]; System.arraycopy(values, 0, result, 0, values.length); result[values.length] = copy("border-after-width.conditionality", "retain"); result[values.length + 1] = copy("border-before-width.conditionality", "retain"); return result; } private Property[] splitFont() { List result = new ArrayList(); String remaining = null; for (LexicalUnit i = value; i != null; i = i.getNextLexicalUnit()) { String originalAtom = Util.lexicalUnitAtom(i, baseUrl); String atom = originalAtom.toLowerCase(); if (Util.inArray(SYSTEM_FONTS, atom)) { result.add(copy("font", atom)); } else { if (Util.inArray(FONT_STYLE, atom)) { result.add(copy("font-style", atom)); } else { if (Util.inArray(FONT_VARIANT, atom)) { result.add(copy("font-variant", atom)); } else { if (isFontWeight(atom)) { result.add(copy("font-weight", atom)); } else { if ( ( i.getPreviousLexicalUnit() == null || i.getPreviousLexicalUnit().getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_SLASH ) && isFontSize(i) ) { result.add(copy("font-size", atom)); } else { if (i.getLexicalUnitType() == LexicalUnit.SAC_OPERATOR_SLASH) { i = i.getNextLexicalUnit(); result.add ( copy("line-height", Util.lexicalUnitAtomLower(i, baseUrl)) ); } else { remaining = remaining == null ? originalAtom : (remaining + " " + originalAtom); } } } } } } } if (remaining != null) { result.add(copy("font-family", remaining)); } return (Property[]) result.toArray(new Property[result.size()]); } private Property[] splitFourWays(String name, boolean important) { String[] names = splitFourWaysNames(name); LexicalUnit[] units = Util.lexicalUnitArray(value); if (units.length == 1) { String atom = Util.lexicalUnitAtomLower(units[0], baseUrl); return setAtoms(names, new String[] {atom, atom, atom, atom}); } if (units.length == 2) { String atom1 = Util.lexicalUnitAtomLower(units[0], baseUrl); String atom2 = Util.lexicalUnitAtomLower(units[1], baseUrl); return setAtoms(names, new String[] {atom1, atom2, atom1, atom2}); } if (units.length == 3) { String atom1 = Util.lexicalUnitAtomLower(units[0], baseUrl); String atom2 = Util.lexicalUnitAtomLower(units[1], baseUrl); String atom3 = Util.lexicalUnitAtomLower(units[2], baseUrl); return setAtoms(names, new String[] {atom1, atom2, atom3, atom2}); } if (units.length == 4) { String atom1 = Util.lexicalUnitAtomLower(units[0], baseUrl); String atom2 = Util.lexicalUnitAtomLower(units[1], baseUrl); String atom3 = Util.lexicalUnitAtomLower(units[2], baseUrl); String atom4 = Util.lexicalUnitAtomLower(units[3], baseUrl); return setAtoms(names, new String[] {atom1, atom2, atom3, atom4}); } return new Property[] {this}; } private static String[] splitFourWaysNames(String name) { String[] result = new String[4]; StringTokenizer tokenizer = new StringTokenizer(name, "-"); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); if (result[0] == null) { result[0] = token + "-top"; result[1] = token + "-right"; result[2] = token + "-bottom"; result[3] = token + "-left"; } else { for (int i = 0; i < result.length; ++i) { result[i] += "-" + token; } } } return result; } private Property[] splitListStyle() { List result = new ArrayList(); for (LexicalUnit i = value; i != null; i = i.getNextLexicalUnit()) { String atom = Util.lexicalUnitAtomLower(i, baseUrl); if (atom.equals("none")) { result.add(copy("list-style-type", atom)); result.add(copy("list-style-image", atom)); } else { if (i.getLexicalUnitType() == LexicalUnit.SAC_URI) { result.add(copy("list-style-image", atom)); } else { if (Util.inArray(LIST_STYLE_POSITION, atom)) { result.add(copy("list-style-position", atom)); } else { if (Util.inArray(LIST_STYLE_TYPE, atom)) { result.add(copy("list-style-type", atom)); } } } } } return (Property[]) result.toArray(new Property[result.size()]); } private Property[] splitMargin() { return splitFourWays(getName(), getImportant()); } private Property[] splitPadding() { return splitFourWays(getName(), getImportant()); } } // Property css2xslfo/src/be/re/css/Rule.java0000644000175000017500000002070611434532506017661 0ustar mithrandimithrandipackage be.re.css; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.w3c.css.sac.AttributeCondition; import org.w3c.css.sac.CombinatorCondition; import org.w3c.css.sac.Condition; import org.w3c.css.sac.ConditionalSelector; import org.w3c.css.sac.DescendantSelector; import org.w3c.css.sac.ElementSelector; import org.w3c.css.sac.NegativeSelector; import org.w3c.css.sac.PositionalCondition; import org.w3c.css.sac.Selector; import org.w3c.css.sac.SiblingSelector; /** * Represents one CSS2 rule. * @author Werner Donn\u00e9 */ public class Rule { private Property[] cachedArray = null; private String elementName; private int position; private Map properties = new HashMap(); private String pseudoElementName; private Selector selector; private Selector[] selectorChain; private int specificity; /** * Use values like -1, 0 and +1 for offset. This will shift the * specificity up or down, which is needed to account for the style sheet * source. */ Rule(Selector selector, int position, int offset) { this.selector = selector instanceof ElementSelector ? new InternedElementSelector((ElementSelector) selector) : selector; this.position = position; selectorChain = Util.getSelectorChain(selector); specificity = specificity() + offset * 10000000; elementName = getElementName(selectorChain, selectorChain.length - 1); pseudoElementName = getPseudoElementName(selectorChain); if (elementName != null) { elementName = elementName.intern(); } if (pseudoElementName != null) { pseudoElementName = pseudoElementName.intern(); } } /** * The created rule physically shares the selector and specificity * information. This makes it possible to match a set of rules resulting * after a split by picking only one of them. */ private Rule(Rule source, int position) { this.selector = source.selector; this.position = position; this.elementName = source.elementName; this.pseudoElementName = source.pseudoElementName; this.selectorChain = source.selectorChain; this.specificity = source.specificity; } void addProperty(Property property) { properties.put(property.getName(), property); } /** * Returns the interned name of the element this rule applies to. If it * doesn't apply to an element null is returned. */ public String getElementName() { return elementName; } private static String getElementName(Selector[] selectorChain, int position) { switch (selectorChain[position].getSelectorType()) { case Selector.SAC_ELEMENT_NODE_SELECTOR: return ((ElementSelector) selectorChain[position]). getLocalName(); case Selector.SAC_PSEUDO_ELEMENT_SELECTOR: return getElementName(selectorChain, position - 1); default: return null; } } int getPosition() { return position; } Property[] getProperties() { if (cachedArray == null || cachedArray.length != properties.size()) { cachedArray = (Property[]) properties.values().toArray(new Property[properties.size()]); } return cachedArray; } public Property getProperty() { Property[] result = getProperties(); if (result.length != 1) { throw new RuntimeException("Unsplit rule"); } return result[0]; } private static void getPseudoClassConditions(Condition c, List result) { if (c.getConditionType() == Condition.SAC_PSEUDO_CLASS_CONDITION) { result.add(((AttributeCondition) c).getValue()); } else { if (c.getConditionType() == Condition.SAC_AND_CONDITION) { getPseudoClassConditions ( ((CombinatorCondition) c).getFirstCondition(), result ); getPseudoClassConditions ( ((CombinatorCondition) c).getSecondCondition(), result ); } } } /** * Returns the interned pseudo element name or null if the rule * doesn't apply to a pseudo element. */ public String getPseudoElementName() { return pseudoElementName; } private static String getPseudoElementName(Selector[] selectorChain) { if ( selectorChain[selectorChain.length - 1].getSelectorType() == Selector.SAC_PSEUDO_ELEMENT_SELECTOR ) { return ((ElementSelector) selectorChain[selectorChain.length - 1]). getLocalName(); } if ( selectorChain.length > 1 && selectorChain[selectorChain.length - 2].getSelectorType() == Selector.SAC_CONDITIONAL_SELECTOR ) { List conditions = new ArrayList(); getPseudoClassConditions ( ((ConditionalSelector) selectorChain[selectorChain.length - 2]). getCondition(), conditions ); return conditions.contains("before") ? "before" : ( conditions.contains("after") ? "after" : (conditions.contains("first-line") ? "first-line" : null) ); } return null; } /** * Returns the selector that matches the rule. */ public Selector getSelector() { return selector; } /** * Flattens the selector expression tree in infix order. */ Selector[] getSelectorChain() { return selectorChain; } int getSpecificity() { return specificity; } private int specificity() { Specificity s = new Specificity(); specificity(selector, s); return 10000 * s.ids + 100 * s.attributes + s.names; } private static void specificity(Selector selector, Specificity s) { if (selector instanceof ConditionalSelector) { specificity(((ConditionalSelector) selector).getCondition(), s); specificity(((ConditionalSelector) selector).getSimpleSelector(), s); } else { if (selector instanceof DescendantSelector) { specificity(((DescendantSelector) selector).getAncestorSelector(), s); specificity(((DescendantSelector) selector).getSimpleSelector(), s); } else { if (selector instanceof NegativeSelector) { specificity(((NegativeSelector) selector).getSimpleSelector(), s); } else { if (selector instanceof SiblingSelector) { specificity(((SiblingSelector) selector).getSelector(), s); specificity(((SiblingSelector) selector).getSiblingSelector(), s); } else { if ( selector.getSelectorType() == Selector.SAC_ELEMENT_NODE_SELECTOR && ((ElementSelector) selector).getLocalName() != null // There is no name for "*". ) { ++s.names; } } } } } } private static void specificity(Condition c, Specificity s) { switch (c.getConditionType()) { case Condition.SAC_ID_CONDITION: ++s.ids; break; case Condition.SAC_ATTRIBUTE_CONDITION: case Condition.SAC_BEGIN_HYPHEN_ATTRIBUTE_CONDITION: case Condition.SAC_CLASS_CONDITION: case Condition.SAC_LANG_CONDITION: case Condition.SAC_ONE_OF_ATTRIBUTE_CONDITION: case Condition.SAC_PSEUDO_CLASS_CONDITION: ++s.attributes; break; case Condition.SAC_AND_CONDITION: case Condition.SAC_OR_CONDITION: specificity(((CombinatorCondition) c).getFirstCondition(), s); specificity(((CombinatorCondition) c).getSecondCondition(), s); break; } if ( c.getConditionType() == Condition.SAC_POSITIONAL_CONDITION && ((PositionalCondition) c).getPosition() == 1 // first-child pseudo class. ) { ++s.attributes; } } /** * Splits this rule into a set of equivalent rules in which there is only one * property. For each property of this rule there will be a new one. */ Rule[] split() { Rule[] result = new Rule[getProperties().length]; for (int i = 0; i < result.length; ++i) { result[i] = new Rule(this, getPosition()); result[i].addProperty(getProperties()[i]); } return result; } private static class Specificity { private int attributes; private int ids; private int names; } // Specificity } // Rule css2xslfo/src/be/re/css/RuleCollector.java0000644000175000017500000001520411434532506021525 0ustar mithrandimithrandipackage be.re.css; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import org.w3c.css.sac.CSSException; import org.w3c.css.sac.DocumentHandler; import org.w3c.css.sac.InputSource; import org.w3c.css.sac.LexicalUnit; import org.w3c.css.sac.Parser; import org.w3c.css.sac.SACMediaList; import org.w3c.css.sac.SelectorList; /** * This class collects rules and page rules from the "all" and "print" media. * The other media are ignored. Rules without any properties are also ignored. * @author Werner Donn\u00e9 */ class RuleCollector implements DocumentHandler { private URL baseUrl; private RuleEmitter ruleEmitter; private PageRule currentPageRule = null; private Rule[] currentRules = null; private boolean ignore = false; private int offset; private List pageRules; private Map prefixMap = new HashMap(); private int position; RuleCollector ( RuleEmitter ruleEmitter, List pageRules, URL baseUrl, int startPosition, int offset ) { this.ruleEmitter = ruleEmitter; this.pageRules = pageRules; this.baseUrl = baseUrl; this.position = startPosition; this.offset = offset; } public void comment(String text) throws CSSException { } public void endDocument(InputSource source) throws CSSException { } public void endFontFace() throws CSSException { } public void endMedia(SACMediaList media) throws CSSException { ignore = false; } public void endPage(String name, String pseudoPage) throws CSSException { if (currentPageRule.getProperties().length > 0) { PageRule[] split = currentPageRule.split(); for (int i = 0; i < split.length; ++i) { pageRules.add(split[i]); } } currentPageRule = null; } public void endSelector(SelectorList selectors) throws CSSException { if (!ignore) { for (int i = 0; i < currentRules.length; ++i) { if (currentRules[i].getProperties().length > 0) { Rule[] split = currentRules[i].split(); for (int j = 0; j < split.length; ++j) { ruleEmitter.addRule(split[j]); } } } currentRules = null; } } int getCurrentPosition() { return position; } private boolean hasOneOfMedia(SACMediaList media, String[] choices) { if (media == null) { return false; } for (int i = 0; i < media.getLength(); ++i) { for (int j = 0; j < choices.length; ++j) { if (media.item(i).equals(choices[j])) { return true; } } } return false; } public void ignorableAtRule(String atRule) throws CSSException { } public void importStyle(String uri, SACMediaList media, String defaultNamespaceURI) throws CSSException { if (!ignore) { if ( media == null || hasOneOfMedia(media, new String[] {"all", "print"}) ) { try { Parser parser = Util.getSacParser(); URL url = (baseUrl != null ? new URL(baseUrl, uri) : new URL(uri)); RuleCollector importCollector = new RuleCollector(ruleEmitter, pageRules, url, position, offset); parser.setDocumentHandler(importCollector); parser.parseStyleSheet(url.toString()); position = importCollector.getCurrentPosition(); } catch (Exception e) { throw new CSSException(e); } } } } public void namespaceDeclaration(String prefix, String uri) throws CSSException { prefixMap.put(prefix, uri); } public void property(String name, LexicalUnit value, boolean important) throws CSSException { if (!ignore) { Property[] properties = new Property(name.toLowerCase(), value, important, prefixMap, baseUrl). split(); if (currentRules != null) { for (int i = 0; i < currentRules.length; ++i) { for (int j = 0; j < properties.length; ++j) { currentRules[i].addProperty(properties[j]); } } } else { if (currentPageRule != null) { for (int i = 0; i < properties.length; ++i) { LexicalUnit unit = properties[i].getLexicalUnit(); if ( "counter-reset".equals(properties[i].getName()) && unit.getLexicalUnitType() == LexicalUnit.SAC_IDENT && "page".equals(unit.getStringValue()) && ( unit.getNextLexicalUnit() == null || unit.getNextLexicalUnit().getLexicalUnitType() == LexicalUnit.SAC_INTEGER ) ) { properties[i] = unit.getNextLexicalUnit() == null ? new Property ( "initial-page-number", "1", properties[i].getImportant(), prefixMap ) : new Property ( "initial-page-number", unit.getNextLexicalUnit(), properties[i].getImportant(), prefixMap, baseUrl ); } currentPageRule.addProperty(properties[i]); } } } } } public void startDocument(InputSource source) throws CSSException { } public void startFontFace() throws CSSException { } public void startMedia(SACMediaList media) throws CSSException { ignore = !hasOneOfMedia(media, new String[] {"all", "print"}); } public void startPage(final String name, final String pseudoPage) throws CSSException { if (!ignore) { currentPageRule = new PageRule ( name != null && pseudoPage != null ? (pseudoPage + "-" + name ) : ( name != null ? name : (pseudoPage != null ? pseudoPage : "unnamed") ), position++ ); } } public void startSelector(SelectorList selectors) throws CSSException { if (ignore || selectors.getLength() == 0) { currentRules = null; return; } currentRules = new Rule[selectors.getLength()]; for (int i = 0; i < currentRules.length; ++i) { currentRules[i] = new Rule(selectors.item(i), position++, offset); } } interface RuleEmitter { public void addRule (Rule rule); } // RuleEmitter } // RuleCollector css2xslfo/src/be/re/css/RuleComparator.java0000644000175000017500000000203311434532506021702 0ustar mithrandimithrandipackage be.re.css; import java.util.Comparator; /** * A comparator for sorting rules from least to most specific. The rules must * be split, i.e. they should have exactly one property. * @author Werner Donn\u00e9 */ class RuleComparator implements Comparator { public int compare(Object object1, Object object2) { Rule rule1 = (Rule) object1; Rule rule2 = (Rule) object2; Property property1 = rule1.getProperty(); Property property2 = rule2.getProperty(); int result = property1.getName().compareTo(property2.getName()); if (result == 0) { result = ( !property1.getImportant() && property2.getImportant() ? -1 : ( property1.getImportant() && !property2.getImportant() ? 1 : 0 ) ); } if (result == 0) { result = rule1.getSpecificity() - rule2.getSpecificity(); } if (result == 0) { result = rule1.getPosition() - rule2.getPosition(); } return result; } } // RuleComparator css2xslfo/src/be/re/css/SpaceCorrectionFilter.java0000644000175000017500000000444111434532506023201 0ustar mithrandimithrandipackage be.re.css; import java.lang.reflect.UndeclaredThrowableException; import java.util.Properties; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * Process space characters as in Jirka's Kosek spaces.xsl DocBook style sheet. * @author Werner Donn\u00e9 */ class SpaceCorrectionFilter extends XMLFilterImpl { private static final String[] widths = loadWidths(); SpaceCorrectionFilter() { } SpaceCorrectionFilter(XMLReader parent) { super(parent); } public void characters(char[] ch, int start, int length) throws SAXException { int position = start; for (int i = 0; i < length; ++i) { if ( ch[start + i] >= '\u2000' && ch[start + i] <= '\u200A' && widths[ch[start + i] - 0x2000].length() > 0 ) { super.characters(ch, position, start + i - position); position = start + i + 1; AttributesImpl atts = new AttributesImpl(); atts.addAttribute ( "", "leader-length", "leader-length", "CDATA", widths[ch[start + i] - 0x2000] ); super.startElement(Constants.XSLFO, "leader", "fo:leader", atts); super.endElement(Constants.XSLFO, "leader", "fo:leader"); } } if (position < start + length) { super.characters(ch, position, start + length - position); } } private static String[] loadWidths() { try { Properties properties = new Properties(); String[] result = new String[11]; properties.load ( SpaceCorrectionFilter.class. getResourceAsStream("res/space_correction.prop") ); for (int i = 0; i < result.length; ++i) { String value = properties. getProperty(Integer.toString(0x2000 + i, 16).toLowerCase()); if (value == null) { value = properties. getProperty(Integer.toString(0x2000 + i, 16).toUpperCase()); } result[i] = value != null ? value : ""; } return result; } catch (Exception e) { throw new UndeclaredThrowableException(e); } } } // SpaceCorrectionFilter css2xslfo/src/be/re/css/TestSAC.java0000644000175000017500000002523111434532506020216 0ustar mithrandimithrandipackage be.re.css; import java.io.File; import java.io.PrintWriter; import java.net.URL; import org.w3c.css.sac.CSSException; import org.w3c.css.sac.CharacterDataSelector; import org.w3c.css.sac.ConditionalSelector; import org.w3c.css.sac.DescendantSelector; import org.w3c.css.sac.DocumentHandler; import org.w3c.css.sac.ElementSelector; import org.w3c.css.sac.InputSource; import org.w3c.css.sac.LexicalUnit; import org.w3c.css.sac.NegativeSelector; import org.w3c.css.sac.Parser; import org.w3c.css.sac.ProcessingInstructionSelector; import org.w3c.css.sac.SACMediaList; import org.w3c.css.sac.Selector; import org.w3c.css.sac.SelectorList; import org.w3c.css.sac.SiblingSelector; import org.w3c.css.sac.helpers.ParserFactory; public class TestSAC { private static final Tuple[] tuples = { new Tuple(LexicalUnit.SAC_OPERATOR_COMMA, "SAC_OPERATOR_COMMA"), new Tuple(LexicalUnit.SAC_OPERATOR_PLUS, "SAC_OPERATOR_PLUS"), new Tuple(LexicalUnit.SAC_OPERATOR_MINUS, "SAC_OPERATOR_MINUS"), new Tuple(LexicalUnit.SAC_OPERATOR_MULTIPLY, "SAC_OPERATOR_MULTIPLY"), new Tuple(LexicalUnit.SAC_OPERATOR_SLASH, "SAC_OPERATOR_SLASH"), new Tuple(LexicalUnit.SAC_OPERATOR_MOD, "SAC_OPERATOR_MOD"), new Tuple(LexicalUnit.SAC_OPERATOR_EXP, "SAC_OPERATOR_EXP"), new Tuple(LexicalUnit.SAC_OPERATOR_LT, "SAC_OPERATOR_LT"), new Tuple(LexicalUnit.SAC_OPERATOR_GT, "SAC_OPERATOR_GT"), new Tuple(LexicalUnit.SAC_OPERATOR_LE, "SAC_OPERATOR_LE"), new Tuple(LexicalUnit.SAC_OPERATOR_GE, "SAC_OPERATOR_GE"), new Tuple(LexicalUnit.SAC_OPERATOR_TILDE, "SAC_OPERATOR_TILDE"), new Tuple(LexicalUnit.SAC_INHERIT, "SAC_INHERIT"), new Tuple(LexicalUnit.SAC_INTEGER, "SAC_INTEGER"), new Tuple(LexicalUnit.SAC_REAL, "SAC_REAL"), new Tuple(LexicalUnit.SAC_EM, "SAC_EM"), new Tuple(LexicalUnit.SAC_EX, "SAC_EX"), new Tuple(LexicalUnit.SAC_PIXEL, "SAC_PIXEL"), new Tuple(LexicalUnit.SAC_INCH, "SAC_INCH"), new Tuple(LexicalUnit.SAC_CENTIMETER, "SAC_CENTIMETER"), new Tuple(LexicalUnit.SAC_MILLIMETER, "SAC_MILLIMETER"), new Tuple(LexicalUnit.SAC_POINT, "SAC_POINT"), new Tuple(LexicalUnit.SAC_PICA, "SAC_PICA"), new Tuple(LexicalUnit.SAC_PERCENTAGE, "SAC_PERCENTAGE"), new Tuple(LexicalUnit.SAC_URI, "SAC_URI"), new Tuple(LexicalUnit.SAC_COUNTER_FUNCTION, "SAC_COUNTER_FUNCTION"), new Tuple(LexicalUnit.SAC_COUNTERS_FUNCTION, "SAC_COUNTERS_FUNCTION"), new Tuple(LexicalUnit.SAC_RGBCOLOR, "SAC_RGBCOLOR"), new Tuple(LexicalUnit.SAC_DEGREE, "SAC_DEGREE"), new Tuple(LexicalUnit.SAC_GRADIAN, "SAC_GRADIAN"), new Tuple(LexicalUnit.SAC_RADIAN, "SAC_RADIAN"), new Tuple(LexicalUnit.SAC_MILLISECOND, "SAC_MILLISECOND"), new Tuple(LexicalUnit.SAC_SECOND, "SAC_SECOND"), new Tuple(LexicalUnit.SAC_HERTZ, "SAC_HERTZ"), new Tuple(LexicalUnit.SAC_KILOHERTZ, "SAC_KILOHERTZ"), new Tuple(LexicalUnit.SAC_IDENT, "SAC_IDENT"), new Tuple(LexicalUnit.SAC_STRING_VALUE, "SAC_STRING_VALUE"), new Tuple(LexicalUnit.SAC_ATTR, "SAC_ATTR"), new Tuple(LexicalUnit.SAC_RECT_FUNCTION, "SAC_RECT_FUNCTION"), new Tuple(LexicalUnit.SAC_UNICODERANGE, "SAC_UNICODERANGE"), new Tuple(LexicalUnit.SAC_SUB_EXPRESSION, "SAC_SUB_EXPRESSION"), new Tuple(LexicalUnit.SAC_FUNCTION, "SAC_FUNCTION"), new Tuple(LexicalUnit.SAC_DIMENSION, "SAC_DIMENSION") }; public static void main(String[] args) throws Exception { if (args.length != 1) { System.err.println("Usage: be.re.css.TestSAC url_or_filename"); return; } Parser parser = new ParserFactory().makeParser(); PrintWriter out = new PrintWriter(System.out); parser.setDocumentHandler(new SACWriter(out, new File(args[0]).toURL())); parser.parseStyleSheet ( be.re.net.Util.isUrl(args[0]) ? new URL(args[0]).toString() : be.re.net.Util.fileToUrl(new File(args[0])).toString() ); out.flush(); } private static class SACWriter implements DocumentHandler { private URL baseUrl; private PrintWriter out; private SACWriter(PrintWriter out, URL baseUrl) { this.out = out; this.baseUrl = baseUrl; } public void comment(String text) throws CSSException { out.println("comment: " + text); } public void endDocument(InputSource source) throws CSSException { out.println("end document"); } public void endFontFace() throws CSSException { out.println("end font face"); } public void endMedia(SACMediaList media) throws CSSException { out.println("end media"); } public void endPage(String name, String pseudePage) throws CSSException { out.println("end page"); } public void endSelector(SelectorList selectors) throws CSSException { out.println("end selector"); } private static String enumerateUnits(LexicalUnit value) { return lexicalUnitTypeToString(value) + ( value.getNextLexicalUnit() != null ? (", " + enumerateUnits(value.getNextLexicalUnit())) : "" ); } public void ignorableAtRule(String atRule) throws CSSException { out.println("ignorable at-rule: " + atRule); } public void importStyle(String uri, SACMediaList media, String defaultNamespaceURI) throws CSSException { out.println("import: " + uri); try { Parser parser = new ParserFactory().makeParser(); parser.setDocumentHandler(new SACWriter(out, new URL(baseUrl, uri))); parser.parseStyleSheet(new URL(baseUrl, uri).toString()); } catch (Exception e) { throw new CSSException(e); } } private static String lexicalUnitTypeToString(LexicalUnit value) { for (int i = 0; i < tuples.length; ++i) { if (tuples[i].id == value.getLexicalUnitType()) { return tuples[i].name; } } return "unknown"; } public void namespaceDeclaration(String prefix, String uri) throws CSSException { out.println("namespace declaration: " + prefix + ", " + uri); } public void property(String name, LexicalUnit value, boolean important) throws CSSException { out.println ( "property: " + name + ": " + Util.lexicalUnitToString(value, false, null) + "(" + enumerateUnits(value) + "), " + String.valueOf(important) ); } private String selectorText(Selector selector) { switch (selector.getSelectorType()) { case Selector.SAC_ANY_NODE_SELECTOR: return "(any)"; case Selector.SAC_CDATA_SECTION_NODE_SELECTOR: return "(cdata: " + ((CharacterDataSelector) selector).getData() + ")"; case Selector.SAC_CHILD_SELECTOR: return "(child: " + selectorText ( ((DescendantSelector) selector).getAncestorSelector() ) + " " + selectorText(((DescendantSelector) selector).getSimpleSelector()) + ")"; case Selector.SAC_COMMENT_NODE_SELECTOR: return "(comment: " + ((CharacterDataSelector) selector).getData() + ")"; case Selector.SAC_CONDITIONAL_SELECTOR: return "(conditional: " + Util.conditionText(((ConditionalSelector) selector). getCondition()) + " " + selectorText(((ConditionalSelector) selector).getSimpleSelector()) + ")"; case Selector.SAC_DESCENDANT_SELECTOR: return "(descendant: " + selectorText ( ((DescendantSelector) selector).getAncestorSelector() ) + " " + selectorText(((DescendantSelector) selector).getSimpleSelector()) + ")"; case Selector.SAC_DIRECT_ADJACENT_SELECTOR: return "(sibling: " + selectorText(((SiblingSelector) selector).getSelector()) + " " + selectorText(((SiblingSelector) selector).getSiblingSelector()) + ")"; case Selector.SAC_ELEMENT_NODE_SELECTOR: return "(element: " + ( ((ElementSelector) selector).getNamespaceURI() != null ? (((ElementSelector) selector).getNamespaceURI() + "#") : "" ) + ((ElementSelector) selector).getLocalName() + ")"; case Selector.SAC_NEGATIVE_SELECTOR: return "(negative: " + selectorText(((NegativeSelector) selector).getSimpleSelector()) + ")"; case Selector.SAC_PROCESSING_INSTRUCTION_NODE_SELECTOR: return "(pi: (" + ((ProcessingInstructionSelector) selector).getData() + ") (" + ((ProcessingInstructionSelector) selector).getTarget() + "))"; case Selector.SAC_PSEUDO_ELEMENT_SELECTOR: return "(pseudo: " + ( ((ElementSelector) selector).getNamespaceURI() != null ? (((ElementSelector) selector).getNamespaceURI() + "#") : "" ) + ((ElementSelector) selector).getLocalName() + ")"; case Selector.SAC_ROOT_NODE_SELECTOR: return "(root)"; case Selector.SAC_TEXT_NODE_SELECTOR: return "(text: " + ((CharacterDataSelector) selector).getData() + ")"; default: return "(unknown)"; } } public void startDocument(InputSource source) throws CSSException { out.println("start document"); } public void startFontFace() throws CSSException { out.println("start font face"); } public void startMedia(SACMediaList media) throws CSSException { out.print("start media:"); for (int i = 0; i < media.getLength(); ++i) { out.print(" " + media.item(i)); } out.println(); } public void startPage(final String name, final String pseudoPage) throws CSSException { out.println("start page: " + name + ", " + pseudoPage); } public void startSelector(SelectorList selectors) throws CSSException { out.print("start selector:"); for (int i = 0; i < selectors.getLength(); ++i) { out.print(" " + selectorText(selectors.item(i))); } out.println(); } } // SACWriter private static class Tuple { private int id; private String name; private Tuple(int id, String name) { this.id = id; this.name = name; } } // Tuple } // TestSAC css2xslfo/src/be/re/css/Util.java0000644000175000017500000007037611434532506017677 0ustar mithrandimithrandipackage be.re.css; import be.re.xml.sax.FilterOfFilters; import java.io.File; import java.io.PrintStream; import java.lang.reflect.UndeclaredThrowableException; import java.net.MalformedURLException; import java.net.URL; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.stream.StreamSource; import org.w3c.css.sac.AttributeCondition; import org.w3c.css.sac.CSSException; import org.w3c.css.sac.CombinatorCondition; import org.w3c.css.sac.Condition; import org.w3c.css.sac.ConditionalSelector; import org.w3c.css.sac.ContentCondition; import org.w3c.css.sac.DescendantSelector; import org.w3c.css.sac.ElementSelector; import org.w3c.css.sac.LangCondition; import org.w3c.css.sac.LexicalUnit; import org.w3c.css.sac.NegativeCondition; import org.w3c.css.sac.NegativeSelector; import org.w3c.css.sac.Parser; import org.w3c.css.sac.PositionalCondition; import org.w3c.css.sac.Selector; import org.w3c.css.sac.SiblingSelector; import org.xml.sax.Attributes; import org.xml.sax.XMLFilter; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * A collection of functions. * @author Werner Donn\u00e9 */ class Util { private static final String[] FOOTNOTE_NUMBERS = new String[] { "*", "\u2020", "\u2021", "\u00a7", "\u007c\u007c", "\u00b6", "#", "**", "\u2020\u2020", "\u2021\u2021", "\u00a7\u00a7" }; private static final Set INHERITED = new HashSet ( Arrays.asList ( new String[] { "azimuth", "border-collapse", "border-spacing", "caption-size", "color", "cursor", "direction", "elevation", "empty-cells", "font", "font-family", "font-size", "font-stretch", "font-style", "font-variant", "font-weight", "hyphenate", "leader-alignment", "leader-length", "leader-pattern", "leader-pattern-width", "letter-spacing", "line-height", "list-style", "list-style-image", "list-style-position", "list-style-type", "orientation", "orphans", "page", "page-break-inside", "pitch", "pitch-range", "quotes", "richness", "rule-style", "rule-thickness", "speak", "speak-header", "speak-numeral", "speak-punctuation", "speech-rate", "stress", "text-align", "text-align-last", "text-indent", "text-transform", "voice-family", "volume", "white-space", "widows", "word-spacing" } ) ); private static Class sacParserClass = null; static String conditionText(Condition condition) { switch (condition.getConditionType()) { case Condition.SAC_AND_CONDITION: return "(and: " + conditionText ( ((CombinatorCondition) condition).getFirstCondition() ) + " " + conditionText ( ((CombinatorCondition) condition).getSecondCondition() ) + ")"; case Condition.SAC_ATTRIBUTE_CONDITION: return "(attribute: (" + ((AttributeCondition) condition).getNamespaceURI() + ") (" + ((AttributeCondition) condition).getLocalName() + ") (" + ((AttributeCondition) condition).getSpecified() + ") (" + ((AttributeCondition) condition).getValue() + "))"; case Condition.SAC_BEGIN_HYPHEN_ATTRIBUTE_CONDITION: return "(hyphen: (" + ((AttributeCondition) condition).getNamespaceURI() + ") (" + ((AttributeCondition) condition).getLocalName() + ") (" + ((AttributeCondition) condition).getSpecified() + ") (" + ((AttributeCondition) condition).getValue() + "))"; case Condition.SAC_CLASS_CONDITION: return "(class: (" + ((AttributeCondition) condition).getNamespaceURI() + ") (" + ((AttributeCondition) condition).getLocalName() + ") (" + ((AttributeCondition) condition).getSpecified() + ") (" + ((AttributeCondition) condition).getValue() + "))"; case Condition.SAC_CONTENT_CONDITION: return "(content: " + ((ContentCondition) condition).getData() + ")"; case Condition.SAC_ID_CONDITION: return "(id: (" + ((AttributeCondition) condition).getNamespaceURI() + ") (" + ((AttributeCondition) condition).getLocalName() + ") (" + ((AttributeCondition) condition).getSpecified() + ") (" + ((AttributeCondition) condition).getValue() + "))"; case Condition.SAC_LANG_CONDITION: return "(lang: " + ((LangCondition) condition).getLang() + ")"; case Condition.SAC_NEGATIVE_CONDITION: return "(negative: " + conditionText(((NegativeCondition) condition).getCondition()) + ")"; case Condition.SAC_ONE_OF_ATTRIBUTE_CONDITION: return "(one of: (" + ((AttributeCondition) condition).getNamespaceURI() + ") (" + ((AttributeCondition) condition).getLocalName() + ") (" + ((AttributeCondition) condition).getSpecified() + ") (" + ((AttributeCondition) condition).getValue() + "))"; case Condition.SAC_ONLY_CHILD_CONDITION: return "(only child)"; case Condition.SAC_ONLY_TYPE_CONDITION: return "(only type)"; case Condition.SAC_OR_CONDITION: return "(or: " + conditionText ( ((CombinatorCondition) condition).getFirstCondition() ) + " " + conditionText ( ((CombinatorCondition) condition).getSecondCondition() ) + ")"; case Condition.SAC_POSITIONAL_CONDITION: return "(positional: (" + ((PositionalCondition) condition).getPosition() + ") (" + ((PositionalCondition) condition).getType() + ") (" + ((PositionalCondition) condition).getTypeNode() + "))"; case Condition.SAC_PSEUDO_CLASS_CONDITION: return "(pseudo class: (" + ((AttributeCondition) condition).getNamespaceURI() + ") (" + ((AttributeCondition) condition).getLocalName() + ") (" + ((AttributeCondition) condition).getSpecified() + ") (" + ((AttributeCondition) condition).getValue() + "))"; default: return "(unknown)"; } } private static String convertFloat(float value) { return new DecimalFormat ( "####0.0####", new DecimalFormatSymbols(Locale.ENGLISH) ).format(value); } static void copyAttribute ( Attributes from, AttributesImpl to, String namespaceURI, String localName ) { int index = from.getIndex(namespaceURI, localName); if (index != -1) { to.addAttribute ( namespaceURI, localName, from.getQName(index), from.getType(index), from.getValue(index) ); } } static PostProjectionFilter createPostProjectionFilter ( URL baseUrl, Map userAgentParameters, boolean debug ) { final LinkFilter linkFilter = new LinkFilter(baseUrl); final XMLFilterImpl filter = new FilterOfFilters ( new XMLFilter[] { new InvalidPropertyFilter(), new WrapperFilter(), new DisplayNonePropagator(), new ForeignFilter(), new FirstLetterFilter(), userAgentParameters != null && userAgentParameters.get("rule-thickness") != null ? new XHTMLAttributeTranslationFilter ( (String) userAgentParameters.get("rule-thickness") ) : new XHTMLAttributeTranslationFilter(), new NormalizeTableFilter(), new CenterFilter(), new LengthAdjustFilter(), new WidthAndMarginsFilter(), new MarkerFilter(), linkFilter, new FootnoteFilter(), new BlockContainerFilter(), new ListImageLabelFilter() }, debug ); return new PostProjectionFilter() { public XMLFilterImpl getFilter() { return filter; } public void setBaseUrl(URL url) { linkFilter.setBaseUrl(url); } }; } static XMLFilter createPreprocessorFilter(URL[] preprocessors, XMLFilter parent) throws TransformerConfigurationException { SAXTransformerFactory factory = be.re.xml.sax.Util.newSAXTransformerFactory(); XMLFilter result = parent; for (int i = 0; i < preprocessors.length; ++i) { XMLFilter transformer = factory.newXMLFilter(new StreamSource(preprocessors[i].toString())); transformer.setParent(result); result = transformer; } return result; } static URL createUrl(String s) throws MalformedURLException { return be.re.net.Util.isUrl(s) ? new URL(s) : be.re.net.Util.fileToUrl(new File(s)); } static URL[] createUrls(String s) throws MalformedURLException { List result = new ArrayList(); StringTokenizer tokenizer = new StringTokenizer(s, ","); while (tokenizer.hasMoreTokens()) { result.add(createUrl(tokenizer.nextToken())); } return (URL[]) result.toArray(new URL[0]); } static String getIndirectType(Attributes attributes, String property) { String value = attributes.getValue(Constants.CSS, property); int index = value != null ? value.lastIndexOf('|') : -1; return value != null ? ( index != -1 ? attributes. getType(value.substring(0, index), value.substring(index + 1)) : attributes.getType(value) ) : null; } static String getIndirectValue(Attributes attributes, String property) { String value = attributes.getValue(Constants.CSS, property); int index = value != null ? value.lastIndexOf('|') : -1; return value != null ? ( index != -1 ? attributes. getValue(value.substring(0, index), value.substring(index + 1)) : attributes.getValue(value) ) : null; } static Selector getLastSelector(Selector selector) { Selector[] chain = Util.getSelectorChain(selector); return chain[chain.length - 1]; } static Parser getSacParser() throws CSSException { try { return (Parser) getSacParserClass().newInstance(); } catch (Exception e) { if (e instanceof CSSException) { throw (CSSException) e; } throw new CSSException(e); } } private static Class getSacParserClass() throws Exception { if (sacParserClass == null) { String cls = be.re.util.Util.getSystemProperty("org.w3c.css.sac.parser"); if (cls == null) { throw new CSSException("No value for org.w3c.css.sac.parser"); } sacParserClass = Class.forName(cls); } return sacParserClass; } /** * Flattens the selector expression tree in infix order. */ static Selector[] getSelectorChain(Selector selector) { List result = getSelectorChainList(selector); return (Selector[]) result.toArray(new Selector[result.size()]); } private static List getSelectorChainList(Selector selector) { List result; switch (selector.getSelectorType()) { case Selector.SAC_CHILD_SELECTOR: case Selector.SAC_DESCENDANT_SELECTOR: result = getSelectorChainList ( ((DescendantSelector) selector).getAncestorSelector() ); result.add(selector); result.addAll ( getSelectorChainList ( ((DescendantSelector) selector).getSimpleSelector() ) ); break; case Selector.SAC_CONDITIONAL_SELECTOR: result = new ArrayList(); result.add(selector); result.addAll ( getSelectorChainList ( ((ConditionalSelector) selector).getSimpleSelector() ) ); break; case Selector.SAC_DIRECT_ADJACENT_SELECTOR: result = getSelectorChainList(((SiblingSelector) selector).getSelector()); result.add(selector); result.addAll ( getSelectorChainList ( ((SiblingSelector) selector).getSiblingSelector() ) ); break; case Selector.SAC_NEGATIVE_SELECTOR: result = new ArrayList(); result.add(selector); result.addAll ( getSelectorChainList ( ((NegativeSelector) selector).getSimpleSelector() ) ); break; default: result = new ArrayList(); result.add(selector); } return result; } static boolean inArray(String[] array, String object) { for (int i = 0; i < array.length; ++i) { if ( ( array[i].charAt(array[i].length() - 1) == '*' && object.startsWith(array[i].substring(0, array[i].length() - 1)) ) || array[i].equals(object) ) { return true; } } return false; } static int indexOf(Object[] array, Object object) { for (int i = 0; i < array.length; ++i) { if (array[i].equals(object)) { return i; } } return -1; } static boolean isInherited(String property) { return INHERITED.contains(property); } static boolean isWhitespace(char[] ch, int start, int length) { for (int i = start; i < ch.length && i < start + length; ++i) { if (!Character.isWhitespace(ch[i])) { return false; } } return true; } static boolean isZeroLength(String value) { return Util.inArray ( new String[] {"0", "0pt", "0px", "0pc", "0mm", "0cm", "0in", "0em"}, value ); } static LexicalUnit[] lexicalUnitArray(LexicalUnit unit) { List result = new ArrayList(); for (LexicalUnit i = unit; i != null; i = i.getNextLexicalUnit()) { result.add(i); } return (LexicalUnit[]) result.toArray(new LexicalUnit[result.size()]); } static String lexicalUnitAtom(LexicalUnit unit, URL baseUrl) { return lexicalUnitAtom(unit, false, baseUrl); } private static String lexicalUnitAtom(LexicalUnit unit, boolean identifiersToLower, URL baseUrl) { switch (unit.getLexicalUnitType()) { case LexicalUnit.SAC_ATTR: return "attr(" + unit.getStringValue().toLowerCase() + ")"; case LexicalUnit.SAC_CENTIMETER: case LexicalUnit.SAC_DEGREE: case LexicalUnit.SAC_DIMENSION: case LexicalUnit.SAC_EM: case LexicalUnit.SAC_EX: case LexicalUnit.SAC_GRADIAN: case LexicalUnit.SAC_HERTZ: case LexicalUnit.SAC_INCH: case LexicalUnit.SAC_KILOHERTZ: case LexicalUnit.SAC_MILLIMETER: case LexicalUnit.SAC_MILLISECOND: case LexicalUnit.SAC_PERCENTAGE: case LexicalUnit.SAC_PICA: case LexicalUnit.SAC_PIXEL: case LexicalUnit.SAC_POINT: case LexicalUnit.SAC_RADIAN: return (convertFloat(unit.getFloatValue()) + unit.getDimensionUnitText()). toLowerCase(); // Flute 1.3 work-around, should be in previous list. case LexicalUnit.SAC_REAL: return convertFloat(unit.getFloatValue()); case LexicalUnit.SAC_COUNTER_FUNCTION: case LexicalUnit.SAC_COUNTERS_FUNCTION: case LexicalUnit.SAC_FUNCTION: case LexicalUnit.SAC_RECT_FUNCTION: return unit.getFunctionName().toLowerCase() + "(" + ( unit.getParameters() != null ? lexicalUnitChain ( unit.getParameters(), identifiersToLower, baseUrl ) : "" ) + ")"; case LexicalUnit.SAC_IDENT: return identifiersToLower ? unit.getStringValue().toLowerCase() : unit.getStringValue(); case LexicalUnit.SAC_INHERIT: return "inherit"; case LexicalUnit.SAC_INTEGER: return String.valueOf(unit.getIntegerValue()); case LexicalUnit.SAC_OPERATOR_COMMA: return ","; case LexicalUnit.SAC_OPERATOR_EXP: return "^"; case LexicalUnit.SAC_OPERATOR_GE: return ">="; case LexicalUnit.SAC_OPERATOR_GT: return ">"; case LexicalUnit.SAC_OPERATOR_LE: return "<="; case LexicalUnit.SAC_OPERATOR_LT: return "<"; case LexicalUnit.SAC_OPERATOR_MINUS: return "-"; case LexicalUnit.SAC_OPERATOR_MOD: return "%"; case LexicalUnit.SAC_OPERATOR_MULTIPLY: return "*"; case LexicalUnit.SAC_OPERATOR_PLUS: return "+"; case LexicalUnit.SAC_OPERATOR_SLASH: return "/"; case LexicalUnit.SAC_OPERATOR_TILDE: return "~"; case LexicalUnit.SAC_RGBCOLOR: return "rgb(" + lexicalUnitChain(unit.getParameters(), identifiersToLower, baseUrl) + ")"; case LexicalUnit.SAC_STRING_VALUE: return unit.getStringValue(); case LexicalUnit.SAC_URI: try { return "url(" + ( baseUrl != null ? new URL(baseUrl, unit.getStringValue()).toString() : unit.getStringValue() ) + ")"; } catch (MalformedURLException e) { throw new RuntimeException(e); } default: return ""; } } static String lexicalUnitAtomLower(LexicalUnit unit, URL baseUrl) { return unit.getLexicalUnitType() == LexicalUnit.SAC_URI ? lexicalUnitAtom(unit, baseUrl) : lexicalUnitAtom(unit, baseUrl).toLowerCase(); } static String[] lexicalUnitAtoms(LexicalUnit unit, URL baseUrl) { return lexicalUnitAtoms(unit, false, baseUrl); } private static String[] lexicalUnitAtoms(LexicalUnit unit, boolean lower, URL baseUrl) { LexicalUnit[] values = lexicalUnitArray(unit); String[] result = new String[values.length]; for (int i = 0; i < values.length; ++i) { result[i] = lower ? lexicalUnitAtomLower(values[i], baseUrl) : lexicalUnitAtom(values[i], baseUrl); } return result; } static String[] lexicalUnitAtomsLower(LexicalUnit unit, URL baseUrl) { return lexicalUnitAtoms(unit, true, baseUrl); } private static String lexicalUnitChain(LexicalUnit unit, boolean identifiersToLower, URL baseUrl) { return lexicalUnitAtom(unit, identifiersToLower, baseUrl) + ( unit.getNextLexicalUnit() != null ? ( " " + lexicalUnitChain ( unit.getNextLexicalUnit(), identifiersToLower, baseUrl ) ) : "" ); } static String lexicalUnitToString(LexicalUnit unit, boolean identifiersToLower, URL baseUrl) { return lexicalUnitChain(unit, identifiersToLower, baseUrl); } /** * Adds from attributes to into giving precedence * to the latter. */ static Attributes mergeAttributes(Attributes from, Attributes into) { return mergeAttributes(from, into, new String[0], false); } /** * Adds from attributes to into giving precedence * to the latter. If include is true, the attribute * in from must be in subset in order for it to be * included. If include is false, the attribute * in from must not be in subset in order for it to * be included. */ static Attributes mergeAttributes ( Attributes from, Attributes into, String[] subset, boolean include ) { AttributesImpl result = new AttributesImpl(into); for (int i = 0; i < from.getLength(); ++i) { if ( into.getIndex(from.getURI(i), from.getLocalName(i)) == -1 && ( ( !include && !inArray(subset, from.getLocalName(i)) ) || ( include && inArray(subset, from.getLocalName(i)) ) ) ) { result.addAttribute ( from.getURI(i), from.getLocalName(i), from.getQName(i), from.getType(i), from.getValue(i) ); } } return result; } static void printUserAgentParameters(PrintStream out) { System.err.println("User Agent parameters:"); System.err.println(" column-count (default: 1)"); System.err.println(" country (default: GB)"); System.err. println(" font-size (default: 10pt for a5 and b5, otherwise 11pt)"); System.err.println(" html-header-mark: an HTML element (default: none)"); System.err.println(" language (default: en)"); System.err.println(" odd-even-shift (default: 10mm)"); System.err. println(" orientation (default: portrait; other: landscape)"); System.err.println(" paper-margin-bottom (default: 0mm)"); System.err.println(" paper-margin-left (default: 25mm)"); System.err.println(" paper-margin-right (default: 25mm)"); System.err.println(" paper-margin-top (default: 10mm)"); System.err.println(" paper-mode (default: onesided; other: twosided)"); System.err.println ( " paper-size (default: a4; others: a0, a1, a2, a3, a5, b5, " + "executive, letter and legal)" ); System.err.println(" rule-thickness (default: 0.2pt)"); System.err.println(" writing-mode (default: lr-tb)"); } private static String processFontFamily(String value) { value = value.trim(); if ( value.indexOf(' ') == -1 || ( value.charAt(0) == '\'' && value.charAt(value.length() - 1) == '\'' ) || ( value.charAt(0) == '"' && value.charAt(value.length() - 1) == '"' ) ) { return value; } String result = ""; StringTokenizer tokenizer = new StringTokenizer(value, ","); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken().trim(); result += (result.equals("") ? "" : ", ") + (token.indexOf(' ') != -1 ? ("'" + token + "'") : token); } return result; } static void removeAttribute(AttributesImpl atts, String namespaceURI, String localName) { int index = atts.getIndex(namespaceURI, localName); if (index != -1) { atts.removeAttribute(index); } } static void setAttribute ( AttributesImpl attributes, String namespaceURI, String localName, String qName, String value ) { int index = attributes.getIndex(namespaceURI, localName); if (index == -1) { attributes.addAttribute(namespaceURI, localName, qName, "CDATA", value); } else { attributes.setAttribute ( index, namespaceURI, localName, qName, "CDATA", value ); } } /** * If the value of a property is a call to the "attr" function and if the * property is not "content", the call is replaced by the expanded attribute * name in which the URI is separated from the local name by a |. */ static void setCSSAttribute(AttributesImpl attributes, Property property, int specificity) { String propertyName = property.getName(); String value; if ( !"content".equals(propertyName) && property.getLexicalUnit() != null && property.getLexicalUnit().getLexicalUnitType() == LexicalUnit.SAC_ATTR ) { value = property.getLexicalUnit().getStringValue(); int index = value.lastIndexOf('|'); if (index != -1) { value = (String) property.getPrefixMap().get(value.substring(0, index)) + "|" + value.substring(index + 1); } } else { value = property.getValue(); } Util.setAttribute ( attributes, Constants.CSS, propertyName, "css:" + propertyName, "font-family".equals(propertyName) ? processFontFamily(value) : value ); // XHTML attributes are translated to CSS properties further down the // filter chain. They get a specificity of 0 and a position before the // other rules in the style sheet. Therefore, they can only overwrite // property values selected by the universal selector or comming from the // UA style sheet. if (specificity <= 0) // Universal selector is 0, UA rules are < 0. { // Marked as eligible for replacement. Util.setAttribute ( attributes, Constants.SPECIF, propertyName, "sp:" + propertyName, "1" ); } } static String toFootnote(int v) { return v > FOOTNOTE_NUMBERS.length ? "*" : FOOTNOTE_NUMBERS[v - 1]; } static String toRoman(int v) { return v < 1 ? "" : ( v < 4 ? ("I" + toRoman(v - 1)) : ( v < 5 ? "IV" : ( v < 9 ? ("V" + toRoman(v - 5)) : ( v < 10 ? "IX" : ( v < 40 ? ("X" + toRoman(v - 10)) : ( v < 50 ? ("XL" + toRoman(v - 40)) : ( v < 90 ? ("L" + toRoman(v - 50)) : ( v < 100 ? ("XC" + toRoman(v - 90)) : ( v < 400 ? ("C" + toRoman(v - 100)) : ( v < 500 ? ("CD" + toRoman(v - 400)) : ( v < 900 ? ( "D" + toRoman(v - 500) ) : ( v < 1000 ? ( "CM" + toRoman(v - 900) ) : ( "M" + toRoman(v - 1000) ) ) ) ) ) ) ) ) ) ) ) ) ); } interface PostProjectionFilter { public XMLFilterImpl getFilter (); public void setBaseUrl (URL baseUrl); } // BaseUrl } // Util css2xslfo/src/be/re/css/WidthAndMarginsFilter.java0000644000175000017500000001550711434532506023146 0ustar mithrandimithrandipackage be.re.css; import java.util.Stack; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * Compensates the differences between CSS and XSL-FO with respect to * horizontal margins and width. There should be no shorthand properties * anymore. * @author Werner Donne\u00e9 */ class WidthAndMarginsFilter extends XMLFilterImpl { private Stack stack = new Stack(); WidthAndMarginsFilter() { } WidthAndMarginsFilter(XMLReader parent) { super(parent); } private static String adjustMargin(String margin, Attributes atts, String edge) { String s; return "auto".equals(margin) ? margin : ( margin + (Util.isZeroLength(s = getBorderWidth(atts, edge)) ? "" : ("+" + s)) ); } private static String canonicLength(String value) { return Util.isZeroLength(value) ? "0pt" : value; } private static Attributes correctBlock(Attributes atts, Attributes parent) { AttributesImpl result = new AttributesImpl(atts); String marginLeft = getImplicitZeroProperty(atts, "margin-left"); String marginRight = getImplicitZeroProperty(atts, "margin-right"); String width = atts.getValue(Constants.CSS, "width"); if ("auto".equals(width)) { marginLeft = "0pt"; marginRight = "0pt"; } else { if ( width != null && !width.equals("auto") && !marginLeft.equals("auto") && !marginRight.equals("auto") ) // Over-constraint. { String direction = atts.getValue(Constants.CSS, "direction"); if (direction == null || direction.equals("ltr")) { marginRight = "auto"; } else { marginLeft = "auto"; } } } if (marginLeft.equals("auto") && marginRight.equals("auto")) { marginRight = "0pt"; } setValue(result, "margin-left", adjustMargin(marginLeft, atts, "left")); setValue(result, "margin-right", adjustMargin(marginRight, atts, "right")); if (width != null) { setValue(result, "width", width); } return result; } private static Attributes correctInline(Attributes atts) { AttributesImpl result = new AttributesImpl(atts); int index = result.getIndex(Constants.CSS, "width"); if (index != -1) { result.removeAttribute(index); } makeAutoExplicit(result, "margin-left"); makeAutoExplicit(result, "margin-right"); return result; } private static Attributes correctFloat(Attributes atts) { AttributesImpl result = new AttributesImpl(atts); // The "width" property is not touched here because that could disable // replaced elements (width="auto" should be set to "0"). We can't // distinguish replaced and non-replaced elements here. makeAutoExplicit(result, "margin-left"); makeAutoExplicit(result, "margin-right"); return result; } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { super.endElement(namespaceURI, localName, qName); stack.pop(); } private static String getBorderWidth(Attributes atts, String edge) { String value = atts.getValue(Constants.CSS, "border-" + edge + "-width"); return atts.getValue(Constants.CSS, "border-" + edge + "-style") == null || "none".equals ( atts.getValue(Constants.CSS, "border-" + edge + "-style") ) ? "0pt" : ( value == null ? "0.6pt" : // medium ( "thin".equals(value) ? "0.2pt" : ( "medium".equals(value) ? "0.6pt" : ("thick".equals(value) ? "1pt" : canonicLength(value)) ) ) ); } private static String getImplicitZeroProperty(Attributes atts, String property) { String value = atts.getValue(Constants.CSS, property); return value == null ? "0pt" : canonicLength(value); } private static String getPadding(Attributes atts, String edge) { String value = atts.getValue(Constants.CSS, "padding-" + edge); return value == null ? "0pt" : canonicLength(value); } private static void makeAutoExplicit(AttributesImpl atts, String property) { int index = atts.getIndex(Constants.CSS, property); if (index == -1) { atts.addAttribute ( Constants.CSS, property, "css:" + property, "CDATA", "0pt" ); } else { if ("auto".equals(atts.getValue(index))) { atts.setValue(index, "0pt"); } } } private static void setValue(AttributesImpl atts, String name, String value) { int index = atts.getIndex(Constants.CSS, name); if (index != -1) { atts.setValue(index, value); } else { atts.addAttribute(Constants.CSS, name, "css:" + name, "CDATA", value); } } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { String display = atts.getValue(Constants.CSS, "display"); if (display != null) { if (display.equals("inline")) { atts = correctInline(atts); } else { if ( atts.getValue(Constants.CSS, "float") != null && !"none".equals(atts.getValue(Constants.CSS, "float")) ) { atts = correctFloat(atts); } else { // Absolute and fixed positioning is left to the following processor // because layout calculation results are needed. if ( Util.inArray ( new String[] {"block", "compact", "list-item", "run-in", "table"}, display ) && !"absolute".equals(atts.getValue(Constants.CSS, "position")) && !"fixed".equals(atts.getValue(Constants.CSS, "position")) && ( // If the parent is a table-cell we leave it (too complicated). stack.isEmpty() || !"table-cell".equals ( ((Attributes) stack.peek()). getValue(Constants.CSS, "display") ) ) ) { atts = correctBlock ( atts, !stack.isEmpty() ? (Attributes) stack.peek() : new AttributesImpl() ); } } } } stack.push(new AttributesImpl(atts)); super.startElement(namespaceURI, localName, qName, atts); } } // WidthAndMarginsFilter css2xslfo/src/be/re/css/WrapperFilter.java0000644000175000017500000000454611434532506021544 0ustar mithrandimithrandipackage be.re.css; import java.util.Stack; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * This filter removes elements with the display type "wrapper". The inherited * properties on the element are propagated to its children. * @author Werner Donn\u00e9 */ class WrapperFilter extends XMLFilterImpl { private Stack elements = new Stack(); WrapperFilter() { } WrapperFilter(XMLReader parent) { super(parent); } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { if (!((Element) elements.pop()).remove) { super.endElement(namespaceURI, localName, qName); } } private static Attributes mergeInheritedProperties(Attributes atts, Attributes inheritedProperties) { return inheritedProperties == null ? atts : Util.mergeAttributes(inheritedProperties, atts); } private static Attributes selectInheritedProperties(Attributes atts) { AttributesImpl result = new AttributesImpl(); for (int i = 0; i < atts.getLength(); ++i) { if ( Constants.CSS.equals(atts.getURI(i)) && Util.isInherited(atts.getLocalName(i)) ) { result.addAttribute ( atts.getURI(i), atts.getLocalName(i), atts.getQName(i), atts.getType(i), atts.getValue(i) ); } } return result; } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { Element element = new Element(); if ("wrapper".equals(atts.getValue(Constants.CSS, "display"))) { element.remove = true; element.inheritedProperties = selectInheritedProperties(atts); } else { super.startElement ( namespaceURI, localName, qName, mergeInheritedProperties ( atts, elements.isEmpty() ? null : ((Element) elements.peek()).inheritedProperties ) ); } elements.push(element); } private static class Element { private Attributes inheritedProperties; private boolean remove; } // Element } // WrapperFilter css2xslfo/src/be/re/css/XHTMLAttributeTranslationFilter.java0000644000175000017500000005633311434532506025124 0ustar mithrandimithrandipackage be.re.css; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Stack; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * This filter translates XHTML attributes to the corresponding CSS properties. * @author Werner Donn\u00e9 */ class XHTMLAttributeTranslationFilter extends XMLFilterImpl { private static final String COL = "col".intern(); private static final String COLGROUP = "colgroup".intern(); private static final String TABLE = "table".intern(); private static final String TBODY = "tbody".intern(); private static final String TFOOT = "tfoot".intern(); private static final String THEAD = "thead".intern(); private static final String TD = "td".intern(); private static final String TH = "th".intern(); private static final String TR = "tr".intern(); private static final Map map = loadTable ( new String[][] { // element, attribute, attribute value, CSS property, CSS property value {"applet", "align", "bottom", "vertical-align", "bottom"}, {"applet", "align", "left", "text-align", "left"}, {"applet", "align", "middle", "vertical-align", "middle"}, {"applet", "align", "right", "text-align", "right"}, {"applet", "align", "top", "vertical-align", "top"}, {"applet", "height", null, "height", null}, {"applet", "hspace", null, "margin-left", null}, {"applet", "hspace", null, "margin-right", null}, {"applet", "vspace", null, "margin-bottom", null}, {"applet", "vspace", null, "margin-top", null}, {"applet", "width", null, "width", null}, {"body", "background", null, "background-image", null}, {"body", "text", null, "color", null}, {"caption", "align", null, "caption-side", null}, {"col", "align", "center", "text-align", "center"}, {"col", "align", "char", "text-align", "@char;."}, {"col", "align", "justify", "text-align", "justify"}, {"col", "align", "left", "text-align", "left"}, {"col", "align", "right", "text-align", "right"}, {"col", "span", null, "span", null}, {"col", "valign", null, "vertical-align", null}, {"col", "width", null, "width", null}, {"colgroup", "align", "center", "text-align", "center"}, {"colgroup", "align", "char", "text-align", "@char;."}, {"colgroup", "align", "justify", "text-align", "justify"}, {"colgroup", "align", "left", "text-align", "left"}, {"colgroup", "align", "right", "text-align", "right"}, {"colgroup", "span", null, "span", null}, {"colgroup", "valign", null, "vertical-align", null}, {"colgroup", "width", null, "width", null}, {"div", "align", null, "text-align", null}, {"font", "color", null, "color", null}, {"font", "face", null, "font-family", null}, {"font", "size", null, "font-size", "f:fontSize"}, {"h1", "align", null, "text-align", null}, {"h2", "align", null, "text-align", null}, {"h3", "align", null, "text-align", null}, {"h4", "align", null, "text-align", null}, {"h5", "align", null, "text-align", null}, {"h6", "align", null, "text-align", null}, {"hr", "align", null, "text-align", null}, {"hr", "noshade", null, "border-bottom-style", "solid"}, {"hr", "noshade", null, "border-left-style", "solid"}, {"hr", "noshade", null, "border-right-style", "solid"}, {"hr", "noshade", null, "border-top-style", "solid"}, {"hr", "size", null, "height", null}, {"hr", "width", null, "width", null}, {"img", "border", null, "border-bottom-width", null}, {"img", "border", null, "border-left-width", null}, {"img", "border", null, "border-right-width", null}, {"img", "border", null, "border-top-width", null}, {"img", "border", null, "border-bottom-style", "solid"}, {"img", "border", null, "border-left-style", "solid"}, {"img", "border", null, "border-right-style", "solid"}, {"img", "border", null, "border-top-style", "solid"}, {"img", "border", null, "border-after-width.conditionality", "retain"}, {"img", "border", null, "border-before-width.conditionality", "retain"}, {"img", "height", null, "height", null}, {"img", "hspace", null, "margin-left", null}, {"img", "hspace", null, "margin-right", null}, {"img", "vspace", null, "margin-bottom", null}, {"img", "vspace", null, "margin-top", null}, {"img", "width", null, "width", null}, {"input", "align", null, "text-align", null}, {"object", "border", null, "border-bottom-width", null}, {"object", "border", null, "border-left-width", null}, {"object", "border", null, "border-right-width", null}, {"object", "border", null, "border-top-width", null}, {"object", "border", null, "border-bottom-style", "solid"}, {"object", "border", null, "border-left-style", "solid"}, {"object", "border", null, "border-right-style", "solid"}, {"object", "border", null, "border-top-style", "solid"}, { "object", "border", null, "border-after-width.conditionality", "retain" }, { "object", "border", null, "border-before-width.conditionality", "retain" }, {"li", "compact", null, "list-style-position", "inside"}, {"li", "type", null, "list-style-type", null}, {"object", "height", null, "height", null}, {"object", "hspace", null, "margin-left", null}, {"object", "hspace", null, "margin-right", null}, {"object", "vspace", null, "margin-bottom", null}, {"object", "vspace", null, "margin-top", null}, {"object", "width", null, "width", null}, {"ol", "compact", null, "list-style-position", "inside"}, {"ol", "type", "1", "list-style-type", "decimal"}, {"ol", "type", "a", "list-style-type", "lower-alpha"}, {"ol", "type", "A", "list-style-type", "upper-alpha"}, {"ol", "type", "i", "list-style-type", "lower-roman"}, {"ol", "type", "I", "list-style-type", "upper-roman"}, {"p", "align", null, "text-align", null}, {"span", "align", null, "text-align", null}, {"table", "width", null, "width", null}, {"tbody", "align", "center", "text-align", "center"}, {"tbody", "align", "char", "text-align", "@char;."}, {"tbody", "align", "justify", "text-align", "justify"}, {"tbody", "align", "left", "text-align", "left"}, {"tbody", "align", "right", "text-align", "right"}, {"tbody", "valign", null, "vertical-align", null}, {"td", "align", "center", "text-align", "center"}, {"td", "align", "char", "text-align", "@char;."}, {"td", "align", "justify", "text-align", "justify"}, {"td", "align", "left", "text-align", "left"}, {"td", "align", "right", "text-align", "right"}, {"td", "colspan", null, "colspan", null}, {"td", "height", null, "height", null}, {"td", "nowrap", null, "white-space", "nowrap"}, {"td", "rowspan", null, "rowspan", null}, {"td", "valign", null, "vertical-align", null}, {"td", "width", null, "width", null}, {"tfoot", "align", "center", "text-align", "center"}, {"tfoot", "align", "char", "text-align", "@char;."}, {"tfoot", "align", "justify", "text-align", "justify"}, {"tfoot", "align", "left", "text-align", "left"}, {"tfoot", "align", "right", "text-align", "right"}, {"tfoot", "valign", null, "vertical-align", null}, {"th", "align", "center", "text-align", "center"}, {"th", "align", "char", "text-align", "@char;."}, {"th", "align", "justify", "text-align", "justify"}, {"th", "align", "left", "text-align", "left"}, {"th", "align", "right", "text-align", "right"}, {"th", "colspan", null, "colspan", null}, {"th", "height", null, "height", null}, {"th", "nowrap", null, "white-space", "nowrap"}, {"th", "rowspan", null, "rowspan", null}, {"th", "valign", null, "vertical-align", null}, {"th", "width", null, "width", null}, {"thead", "align", "center", "text-align", "center"}, {"thead", "align", "char", "text-align", "@char;."}, {"thead", "align", "justify", "text-align", "justify"}, {"thead", "align", "left", "text-align", "left"}, {"thead", "align", "right", "text-align", "right"}, {"thead", "valign", null, "vertical-align", null}, {"tr", "align", "center", "text-align", "center"}, {"tr", "align", "char", "text-align", "@char;."}, {"tr", "align", "justify", "text-align", "justify"}, {"tr", "align", "left", "text-align", "left"}, {"tr", "align", "right", "text-align", "right"}, {"tr", "bgcolor", null, "background-color", null}, {"tr", "valign", null, "vertical-align", null}, {"ul", "compact", null, "list-style-position", "inside"}, {"ul", "type", null, "list-style-type", null} } ); private String defaultBorderThickness; private Stack elementStack = new Stack(); private Stack tableStack = new Stack(); XHTMLAttributeTranslationFilter() { this("0.2pt"); } XHTMLAttributeTranslationFilter(String defaultBorderThickness) { this.defaultBorderThickness = defaultBorderThickness; } XHTMLAttributeTranslationFilter(XMLReader parent) { this(parent, "0.2pt"); } XHTMLAttributeTranslationFilter ( XMLReader parent, String defaultBorderThickness ) { super(parent); this.defaultBorderThickness = defaultBorderThickness; } private static String callPropertyResolver ( String function, String element, Attributes atts, String attribute, String value ) { try { return (String) XHTMLAttributeTranslationFilter.class.getDeclaredMethod ( function, new Class[] {String.class, Attributes.class, String.class, String.class} ).invoke(null, new Object[] {element, atts, attribute, value}); } catch (Exception e) { return value; } } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { if (Constants.XHTML == namespaceURI) { elementStack.pop(); if (TABLE == localName) { tableStack.pop(); } } super.endElement(namespaceURI, localName, qName); } private static boolean equivalentSibling(String element1, String element2) { return element1 == element2 || ( (THEAD == element1 || TBODY == element1 || TFOOT == element1) && (THEAD == element2 || TBODY == element2 || TFOOT == element2) ); } private static String fontSize(String element, Attributes atts, String attribute, String value) { try { return value.startsWith("+") ? ( String.valueOf ( (int) ( 100.0 * (100 + 10 * Integer.parseInt(value.substring(1))) / 100 ) ) + "%" ) : ( value.startsWith("-") ? ( String.valueOf ( (int) ( 100.0 * (100 - 10 * Integer.parseInt(value.substring(1))) / 100 ) ) + "%" ) : (String.valueOf((Integer.parseInt(value) + 7)) + "pt") ); } catch (Exception e) { return "100%"; } } private static Map loadTable(String[][] table) { Map result = new HashMap(); for (int i = 0; i < table.length; ++i) { String key = table[i][0] + "#" + table[i][1]; List tuples = (List) result.get(key); if (tuples == null) { tuples = new ArrayList(); result.put(key, tuples); } tuples.add(new Tuple(table[i][2], table[i][3], table[i][4])); } return result; } private static Tuple[] lookup(String element, Attributes atts, String attribute, String value) { List tuples = (List) map.get(element + "#" + attribute); if (tuples == null) { return new Tuple[0]; } List result = new ArrayList(); for (int i = 0; i < tuples.size(); ++i) { Tuple tuple = (Tuple) tuples.get(i); if (tuple.inValue == null || tuple.inValue.equals(value)) { String otherAttribute; result.add ( new Tuple ( tuple.inValue, tuple.property, tuple.outValue == null ? value : ( tuple.outValue.charAt(0) == '@' ? ( ( otherAttribute = atts.getValue ( tuple.outValue. substring(1, tuple.outValue.indexOf(';')) ) ) != null ? otherAttribute : tuple.outValue.substring(tuple.outValue.indexOf(';') + 1) ) : ( tuple.outValue.startsWith("f:") ? callPropertyResolver ( tuple.outValue.substring(2), element, atts, attribute, value ) : tuple.outValue ) ) ) ); } } return (Tuple[]) result.toArray(new Tuple[result.size()]); } private static void mergeAttribute ( AttributesImpl atts, String originalName, String cssName, String value ) { int index1 = atts.getIndex(Constants.CSS, cssName); if (index1 == -1) { atts. addAttribute(Constants.CSS, cssName, "css:" + cssName, "CDATA", value); } else { int index2 = atts.getIndex(Constants.SPECIF, cssName); if (index2 != -1) { atts.setValue(index1, value); } } if (originalName != null) { index1 = atts.getIndex(originalName); if (index1 != -1) { atts.removeAttribute(index1); } } } private AttributesImpl prepareTableAttributes(String localName, Attributes atts) { return TD == localName || TH == localName ? preprocessTableCell ( localName, atts, new String[] {"all", "cols"}, "left" ) : ( TR == localName ? preprocessRulesBorder ( localName, atts, new String[] {"all", "rows"}, "top" ) : ( COL == localName ? preprocessRulesBorder ( localName, atts, new String[] {"all", "cols"}, "left" ) : ( TABLE == localName ? preprocessTableBorder(atts) : ( THEAD == localName || TFOOT == localName || TBODY == localName ? preprocessRulesBorder ( localName, atts, new String[] {"all", "rows", "groups"}, "top" ) : ( COLGROUP == localName ? preprocessRulesBorder ( localName, atts, new String[] {"groups"}, "left" ) : new AttributesImpl(atts) ) ) ) ) ); } private AttributesImpl preprocessRulesBorder ( String localName, Attributes atts, String[] rulesValues, String borderSide ) { Element table = (Element) tableStack.peek(); String border = table.atts.getValue("border"); String rules = table.atts.getValue("rules"); AttributesImpl result = new AttributesImpl(atts); if ("0".equals(border) || "none".equals(rules)) { return result; } String borderWidth = border == null ? defaultBorderThickness : (border + "px"); Element parent = (Element) elementStack.peek(); if ( ( ( border != null && rules == null ) || Util.inArray(rulesValues, rules) ) && equivalentSibling(localName, ((Preceding) parent.extra).element) && ((Preceding) parent.extra).count > 0 ) { mergeAttribute ( result, "border", "border-" + borderSide + "-width", borderWidth ); mergeAttribute ( result, null, // Removed already. "border-" + borderSide + "-style", "solid" ); if ("bottom".equals(borderSide)) { mergeAttribute ( result, null, // Removed already. "border-after-width.conditionality", "retain" ); } if ("top".equals(borderSide)) { mergeAttribute ( result, null, // Removed already. "border-before-width.conditionality", "retain" ); } } return result; } private AttributesImpl preprocessTableBorder(Attributes atts) { Element table = (Element) tableStack.peek(); String border = table.atts.getValue("border"); String frame = table.atts.getValue("frame"); AttributesImpl result = new AttributesImpl(atts); if ("0".equals(border) || "void".equals(frame)) { return result; } String borderWidth = border == null ? defaultBorderThickness : (border + "px"); if ( ( border != null && frame == null ) || Util.inArray(new String[] {"above", "hsides", "box", "border"}, frame) ) { mergeAttribute(result, "border", "border-top-width", borderWidth); mergeAttribute(result, null, "border-top-style", "solid"); mergeAttribute ( result, null, // Removed already "border-before-width.conditionality", "retain" ); } if ( ( border != null && frame == null ) || Util.inArray(new String[] {"below", "hsides", "box", "border"}, frame) ) { mergeAttribute(result, "border", "border-bottom-width", borderWidth); mergeAttribute(result, null, "border-bottom-style", "solid"); mergeAttribute ( result, null, // Removed already "border-after-width.conditionality", "retain" ); } if ( ( border != null && frame == null ) || Util.inArray(new String[] {"lhs", "vsides", "box", "border"}, frame) ) { mergeAttribute(result, "border", "border-left-width", borderWidth); mergeAttribute(result, null, "border-left-style", "solid"); } if ( ( border != null && frame == null ) || Util.inArray(new String[] {"rhs", "vsides", "box", "border"}, frame) ) { mergeAttribute(result, "border", "border-right-width", borderWidth); mergeAttribute(result, null, "border-right-style", "solid"); } return result; } private AttributesImpl preprocessTableCell ( String localName, Attributes atts, String[] rulesValues, String borderSide ) { // If there are columns the normal column propagation can take place. Else // we should place the borders directly on the cells. return preprocessRulesBorder ( localName, preprocessTableCellPaddingAndSpacing(atts), rulesValues, borderSide ); } private AttributesImpl preprocessTableCellPaddingAndSpacing(Attributes atts) { Element table = (Element) tableStack.peek(); String padding = table.atts.getValue("cellpadding"); AttributesImpl result = new AttributesImpl(atts); String spacing = table.atts.getValue("cellspacing"); if (padding != null) { mergeAttribute(result, null, "padding-top", padding); mergeAttribute(result, null, "padding-bottom", padding); mergeAttribute(result, null, "padding-left", padding); mergeAttribute(result, null, "padding-right", padding); } if (spacing != null) { mergeAttribute(result, null, "margin-top", spacing); mergeAttribute(result, null, "margin-bottom", spacing); mergeAttribute(result, null, "margin-left", spacing); mergeAttribute(result, null, "margin-right", spacing); } return result; } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { if (Constants.XHTML == namespaceURI) { Element element = new Element(namespaceURI, localName, qName, atts); if (TABLE == localName) { element.extra = new Boolean(false); // No columns seen yet. tableStack.push(element); } AttributesImpl newAtts = prepareTableAttributes(localName, atts); for (int i = 0; i < atts.getLength(); ++i) { if (atts.getURI(i).equals("")) { Tuple[] tuples = lookup(localName, atts, atts.getLocalName(i), atts.getValue(i)); for (int j = 0; j < tuples.length; ++j) { mergeAttribute ( newAtts, atts.getLocalName(i), tuples[j].property, tuples[j].outValue ); } } } Element parent = elementStack.empty() ? null : (Element) elementStack.peek(); if (parent != null) { ((Preceding) parent.extra).count = equivalentSibling(localName, ((Preceding) parent.extra).element) ? (((Preceding) parent.extra).count + 1) : 1; ((Preceding) parent.extra).element = localName; } element.extra = new Preceding(); elementStack.push(element); super.startElement(namespaceURI, localName, qName, newAtts); } else { super.startElement(namespaceURI, localName, qName, atts); } } private static class Preceding { private int count = 0; private String element; } // Preceding private static class Tuple { private String inValue; private String outValue; private String property; private Tuple(String inValue, String property, String outValue) { this.inValue = inValue; this.property = property; this.outValue = outValue; } } // Tuple } // XHTMLAttributeTranslationFilter css2xslfo/src/be/re/io/0000755000175000017500000000000011434532510015714 5ustar mithrandimithrandicss2xslfo/src/be/re/io/FlushOutputStream.java0000644000175000017500000000055611434532510022243 0ustar mithrandimithrandipackage be.re.io; import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; public class FlushOutputStream extends FilterOutputStream { public FlushOutputStream(OutputStream out) { super(out); } public void write(byte b) throws IOException { out.write(b); out.flush(); } } // FlushOutputStream css2xslfo/src/be/re/io/IOException.java0000644000175000017500000000070711434532510020751 0ustar mithrandimithrandipackage be.re.io; /** * Make it possible to wrap a cause. * @author Werner Donn\u00e9 */ public class IOException extends java.io.IOException { public IOException() { } public IOException(String s) { super(s); } public IOException(String message, Throwable cause) { super(message); initCause(cause); } public IOException(Throwable cause) { super(); initCause(cause); } } // IOException css2xslfo/src/be/re/io/ReadLineInputStream.java0000644000175000017500000000326411434532510022443 0ustar mithrandimithrandipackage be.re.io; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.io.PushbackInputStream; import java.util.Arrays; /** * @author Werner Donn\u00e9 */ public class ReadLineInputStream extends FilterInputStream { public ReadLineInputStream(InputStream in) { super(new PushbackInputStream(in)); } /** * Reads bytes until '\r', '\n' or "\r\n" is encountered and returns them in * an array. The line termination sequence is discarded and not included in * the array. If the end of the stream has been reached null is * returned. */ public byte[] readLine() throws IOException { return readLine(new byte[1024], 0); } private byte[] readLine(byte[] buffer, int off) throws IOException { Arrays.fill(buffer, off, buffer.length, (byte) 0); int i; for ( i = off; i < buffer.length && (buffer[i] = (byte) in.read()) != '\n' && buffer[i] != '\r' && buffer[i] != -1; ++i ); if (i < buffer.length) { if (i == 0 && buffer[i] == -1) { return null; } byte[] result = new byte[i]; System.arraycopy(buffer, off, result, 0, result.length); if ((char) buffer[i] == '\r') { byte b = (byte) in.read(); if (b != '\n') { ((PushbackInputStream) in).unread(b); } } return result; } return readLine(realloc(buffer), i); } private static byte[] realloc(byte[] buffer) { byte[] result = new byte[buffer.length * 2]; System.arraycopy(buffer, 0, result, 0, buffer.length); return result; } } // ReadLineInputStream css2xslfo/src/be/re/io/StreamConnector.java0000644000175000017500000000721211434532510021667 0ustar mithrandimithrandipackage be.re.io; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** * This class reads data from an input stream and writes it to an output stream * in a separate thread. The thread stops when the input stream is closed * or when an exception occurs. * @author Werner Donn\u00e9 */ public class StreamConnector { private IOException exception = null; private Thread thread; public StreamConnector(InputStream in, OutputStream out) { this(in, out, true, true); } public StreamConnector ( InputStream in, OutputStream out, boolean closeInput, boolean closeOutput ) { this(in, out, 0x10000, closeInput, closeOutput); } public StreamConnector ( InputStream in, OutputStream out, boolean closeInput, boolean closeOutput, boolean flush ) { this(in, out, 0x10000, closeInput, closeOutput, flush); } public StreamConnector ( InputStream in, OutputStream out, int bufferSize, boolean closeInput, boolean closeOutput ) { this(in, out, bufferSize, closeInput, closeOutput, true); } public StreamConnector ( final InputStream in, final OutputStream out, final int bufferSize, final boolean closeInput, final boolean closeOutput, final boolean flush ) { ( thread = new Thread ( new Runnable() { public void run() { try { copy ( in, out, bufferSize, closeInput, closeOutput, flush ); } catch (IOException e) { exception = e; } } } ) ).start(); } public static void copy(InputStream in, OutputStream out) throws IOException { copy(in, out, true, true); } public static void copy ( InputStream in, OutputStream out, boolean closeInput, boolean closeOutput ) throws IOException { copy(in, out, 0x10000, closeInput, closeOutput); } public static void copy ( InputStream in, OutputStream out, boolean closeInput, boolean closeOutput, boolean flush ) throws IOException { copy(in, out, 0x10000, closeInput, closeOutput, flush); } public static void copy ( InputStream in, OutputStream out, int bufferSize, boolean closeInput, boolean closeOutput ) throws IOException { copy(in, out, bufferSize, closeInput, closeOutput, true); } public static void copy ( InputStream in, OutputStream out, int bufferSize, boolean closeInput, boolean closeOutput, boolean flush ) throws IOException { byte[] buffer = new byte[bufferSize]; int len; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); if (flush) { out.flush(); } } if (closeInput) { in.close(); } if (closeOutput) { out.close(); } else { if (flush) { out.flush(); } } } /** * Breaks the connection. It doesn't touch the streams. */ public void disconnect() { thread.interrupt(); } /** * Joins with the thread implementing the io processing. */ public void join() throws IOException, InterruptedException { thread.join(); if (exception != null) { throw exception; } } } // StreamConnector css2xslfo/src/be/re/io/Util.java0000644000175000017500000000722711434532510017504 0ustar mithrandimithrandipackage be.re.io; import be.re.util.UUID; import java.io.File; import java.io.IOException; import java.util.HashSet; import java.util.Iterator; import java.util.ResourceBundle; import java.util.Set; public class Util { private static ResourceBundle bundle = null; private static boolean deleteOnExitHookAdded = false; private static final Set dirsToDelete = new HashSet(); /** * Creates a temporary directory. When the resulting java.io.File * object is garbage collected, the directory will not be deleted along. If * the caller hasn't deleted it the file will be deleted on exit of the VM. */ public static File createTempDir(String prefix, String suffix, File directory) throws IOException { final File result = createTempFileName(prefix, suffix, directory); if (!result.mkdir()) { throw new IOException ( "Can't create temporary directory \"" + result.getAbsolutePath() + "\"." ); } deleteDirOnExit(result); return new File(result.getAbsolutePath()) { public boolean delete() { synchronized (dirsToDelete) { dirsToDelete.remove(result); } return result.delete(); } }; } public static File createTempFile(String prefix, String suffix) throws IOException { return createTempFile(prefix, suffix, null); } /** * Creates a temporary file. When the resulting java.io.File * object is garbage collected, the file will not be deleted along. If the * caller hasn't deleted it the file will be deleted on exit of the VM. */ public static File createTempFile(String prefix, String suffix, File directory) throws IOException { File result = createTempFileName(prefix, suffix, directory); if (!result.createNewFile()) { throw new IOException ( "Can't create temporary file \"" + result.getAbsolutePath() + "\"." ); } result.deleteOnExit(); return result; } public static File createTempFileName(String prefix, String suffix, File directory) { return new File ( directory != null ? directory : new File(System.getProperty("java.io.tmpdir")), (prefix != null ? prefix : "") + UUID.generateFormatted() + (suffix != null ? suffix : ".tmp") ); } public static boolean deleteDir(File dir) { if (dir.isDirectory()) { File[] files = dir.listFiles(); for (int i = 0; i < files.length; ++i) { deleteDir(files[i]); } } return dir.delete(); } public static synchronized void deleteDirOnExit(File dir) { if (!deleteOnExitHookAdded) { deleteOnExitHookAdded = true; Runtime.getRuntime().addShutdownHook ( new Thread ( new Runnable() { public void run() { synchronized (dirsToDelete) { for (Iterator i = dirsToDelete.iterator(); i.hasNext();) { deleteDir((File) i.next()); } } } } ) ); } synchronized (dirsToDelete) { dirsToDelete.add(dir); } } static String getResource(String key) { if (bundle == null) { bundle = ResourceBundle.getBundle("be.re.io.res.Res"); } return bundle.getString(key); } public static boolean isSymbolicLink(File file) throws IOException { return !file.getCanonicalPath().equals(file.getAbsolutePath()); } } // Util css2xslfo/src/be/re/net/0000755000175000017500000000000011434532510016073 5ustar mithrandimithrandicss2xslfo/src/be/re/net/BasicUser.java0000644000175000017500000000374111434532510020623 0ustar mithrandimithrandipackage be.re.net; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; public class BasicUser implements User { private String password; private PropertyChangeSupport propertyChange = new PropertyChangeSupport(this); private String username; public BasicUser() { this(null, null); } public BasicUser(String username, String password) { this.username = username; this.password = password; } public void addPropertyChangeListener(PropertyChangeListener listener) { propertyChange.addPropertyChangeListener(listener); } public void addPropertyChangeListener ( String propertyName, PropertyChangeListener listener ) { propertyChange.addPropertyChangeListener(propertyName, listener); } public String getPassword() { return password; } public String getUsername() { return username; } public void removePropertyChangeListener(PropertyChangeListener listener) { propertyChange.removePropertyChangeListener(listener); } public void removePropertyChangeListener ( String propertyName, PropertyChangeListener listener ) { propertyChange.removePropertyChangeListener(propertyName, listener); } public void setPassword(String value) { if ( ( value == null && password == null ) || ( value != null && value.equals(password) ) ) { return; } String old = password; password = value; propertyChange.firePropertyChange("password", old, value); } public void setUsername(String value) { if ( ( value == null && username == null ) || ( value != null && value.equals(username) ) ) { return; } String old = username; username = value; propertyChange.firePropertyChange("username", old, value); } } // BasicUser css2xslfo/src/be/re/net/Headers.java0000644000175000017500000001047011434532510020313 0ustar mithrandimithrandipackage be.re.net; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; /** * Several Internet protocols use headers. This class can be used to manage * them. Headers can occur more than once. Even name/value pairs may be * dupplicated. * @author Werner Donn\u00e9 */ public class Headers { private List headers = new ArrayList(); /** * Adds a name/value pair. */ public void add(String name, String value) { headers.add(new Header(name, value)); } /** * Adds all the headers in headers. */ public void add(Headers headers) { Header[] all = headers.getAll(); for (int i = 0; i < all.length; ++i) { add(all[i].getName(), all[i].getValue()); } } /** * Removes all headers. */ public void clear() { headers.clear(); } /** * Returns all the values for the header name in the order of * appearance. */ public String[] get(String name) { List values = new ArrayList(); for (Iterator i = headers.iterator(); i.hasNext();) { Header tuple = (Header) i.next(); if (tuple.name.equalsIgnoreCase(name)) { values.add(tuple.value); } } return (String[]) values.toArray(new String[values.size()]); } /** * Returns all headers. */ public Header[] getAll() { return (Header[]) headers.toArray(new Header[headers.size()]); } /** * Returns all the values for the header name in the order of * appearance. If a header value is a comma-separated list, the elements in * the list are added separately in the order of appearance and without * surrounding whitespace. */ public String[] getValuesFromList(String name) { List values = new ArrayList(); for (Iterator i = headers.iterator(); i.hasNext();) { Header tuple = (Header) i.next(); if (tuple.name.equalsIgnoreCase(name)) { StringTokenizer tokenizer = new StringTokenizer(tuple.value, ","); while (tokenizer.hasMoreTokens()) { values.add(tokenizer.nextToken().trim()); } } } return (String[]) values.toArray(new String[values.size()]); } /** * Removes all headers with name as their name. */ public void remove(String name) { for (Iterator i = headers.iterator(); i.hasNext();) { Header tuple = (Header) i.next(); if (tuple.name.equalsIgnoreCase(name)) { i.remove(); } } } /** * Removes one name/value pair. */ public void remove(String name, String value) { for (Iterator i = headers.iterator(); i.hasNext();) { Header tuple = (Header) i.next(); if (tuple.name.equalsIgnoreCase(name) && tuple.value.equals(value)) { i.remove(); } } } /** * Replaces all the headers with name as their name with the * given name/value pair. */ public void set(String name, String value) { remove(name); add(name, value); } /** * Replaces one name/value pair. */ public void set(String name, String oldValue, String newValue) { for (Iterator i = headers.iterator(); i.hasNext();) { Header tuple = (Header) i.next(); if (tuple.name.equalsIgnoreCase(name) && tuple.value.equals(oldValue)) { tuple.value = newValue; } } } /** * Returns the number of headers. */ public int size() { return headers.size(); } /** * A string representation of all headers. The string can be used in Internet * protocols. */ public String toString() { String result = ""; for (Iterator i = headers.iterator(); i.hasNext();) { Header tuple = (Header) i.next(); result += tuple.name + ":" + tuple.value + "\r\n"; } return result; } /** * Represents one header. * @author Werner Donn\u00e9 */ public class Header { private String name; private String value; public Header(String name, String value) { this.name = name; this.value = value; } public String getName() { return name; } public String getValue() { return value; } } // Header } // Headers css2xslfo/src/be/re/net/User.java0000644000175000017500000000031011434532510017646 0ustar mithrandimithrandipackage be.re.net; public interface User { public String getPassword (); public String getUsername (); public void setPassword (String password); public void setUsername (String username); } css2xslfo/src/be/re/net/Util.java0000644000175000017500000006004411434532510017657 0ustar mithrandimithrandipackage be.re.net; import be.re.io.ReadLineInputStream; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.MissingResourceException; import java.util.Properties; import java.util.ResourceBundle; import java.util.StringTokenizer; public class Util { private final static char[] MARK = {'-', '_', '.', '!', '~', '*', '\'', '(', ')'}; private final static char[] PCHAR_SPECIALS = {':', '@', '&', '=', '+', '$', ','}; // Less than uric_no_slash. private final static char[] RESERVED = {';', '/', '?', ':', '@', '&', '=', '+', '$', ','}; private final static String[] archiveExtensions = {"ear", "jar", "rar", "war", "zip"}; private static ResourceBundle bundle = null; private static Map bundles = new HashMap(); private static boolean compareBytes(byte[] b1, byte[] b2, int length) { for (int i = 0; i < length; ++i) { if (b1[i] != b2[i]) { return false; } } return true; } private static String escapeUriPart(String s, TestChar t) { byte[] bytes = null; String result = ""; try { bytes = s.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); // Would be a bug. } char[] c = new char[bytes.length]; for (int i = 0; i < bytes.length; ++i) { c[i] = (char) (0xff & bytes[i]); } for (int i = 0; i < c.length; ++i) { result += !t.test(c, i) ? ("%" + (c[i] < 0x10 ? "0" : "") + Integer.toHexString(c[i])) : new String(c, i, 1); } return result; } public static String escapeUriPathSegment(String segment) { return escapeUriPathSegment(segment, false); } public static String escapeUriPathSegment(String segment, final boolean noParameters) { return escapeUriPart ( segment, new TestChar() { public boolean test(char[] c, int i) { return isPChar(c[i]) || (!noParameters && c[i] == ';') || isStartOfEscape(c, i); } } ); } public static String escapeUriPathSegments(String path) { return escapeUriPathSegments(path, false); } public static String escapeUriPathSegments(String path, boolean noParameters) { String result = ""; StringTokenizer tokenizer = new StringTokenizer(path, "/"); while (tokenizer.hasMoreTokens()) { result += (result.equals("") ? "" : "/") + escapeUriPathSegment(tokenizer.nextToken(), noParameters); } return (path.length() > 0 && path.charAt(0) == '/' ? "/" : "") + result + (path.length() > 1 && path.charAt(path.length() - 1) == '/' ? "/" : ""); } public static String escapeUriQueryString(String queryString) { return escapeUriPart ( queryString, new TestChar() { public boolean test(char[] c, int i) { return (!isReserved(c[i]) || c[i] == '=') && isUriChar(c, i); } } ); } public static String escapeUriQueryStrings(String path) { String result = ""; StringTokenizer tokenizer = new StringTokenizer(path, "&"); while (tokenizer.hasMoreTokens()) { result += (result.equals("") ? "" : "&") + escapeUriQueryString(tokenizer.nextToken()); } return result; } public static String escapeUriReference(String reference) { return escapeUriPart ( reference, new TestChar() { public boolean test(char[] c, int i) { return !isReserved(c[i]) && isUriChar(c, i); } } ); } private static URL escapedComposedUrl(String url) throws MalformedURLException { return new URL ( url.substring(0, url.indexOf(':')) + ":" + escapedUrl(extractSubUrl(url).toString()).toString() + "!/" + escapeUriPathSegments(extractComposedUrlEntry(url)).toString() ); } private static File escapedFile(File file) { return new File ( escapeUriPathSegments ( file.getAbsolutePath().replace(File.separatorChar, '/') ) ); } public static String escapedRelativeUrl(String url, String protocol) { return escapedRelativeUrl(url, protocol, false); } public static String escapedRelativeUrl(String url, String protocol, boolean noParameters) { int queryStart = -1; int referenceStart = -1; if ("http".equals(protocol) || "https".equals(protocol)) { queryStart = url.indexOf('?'); referenceStart = url.indexOf('#', queryStart != -1 ? queryStart : 0); } return escapeUriPathSegments ( url.substring ( 0, queryStart != -1 ? queryStart : (referenceStart != -1 ? referenceStart : url.length()) ), noParameters ) + ( queryStart != -1 ? ( "?" + escapeUriQueryStrings ( url.substring ( queryStart + 1, referenceStart != -1 ? referenceStart : url.length() ) ) ) : "" ) + ( referenceStart != -1 ? ("#" + escapeUriReference(url.substring(referenceStart + 1))) : "" ); } public static URL escapedUrl(String url) throws MalformedURLException { return escapedUrl(url, false); } public static URL escapedUrl(String url, boolean noParameters) throws MalformedURLException { int colon = url.indexOf(':'); if (colon != -1 && isComposedUrl(url)) { return escapedComposedUrl(url); } int pathStart = colon != -1 ? url.indexOf ( '/', colon + ( url.length() > colon + 2 && url.substring(colon + 1, colon + 3).equals("//") ? 3 : 1 ) ) : 0; return pathStart == -1 ? new URL(url) : new URL ( url.substring(0, pathStart) + escapedRelativeUrl ( url.substring(pathStart), colon != -1 ? url.substring(0, colon) : null, noParameters ) ); } public static String extractComposedUrlEntry(URL url) { return extractComposedUrlEntry(url.getFile()); } public static String extractComposedUrlEntry(String url) { int index = url.lastIndexOf("!/"); return index == -1 || index + 2 == url.length() ? "" : url.substring(index + 2); } public static URL extractSubUrl(URL url) throws MalformedURLException { if (!isComposedUrl(url)) { throw new MalformedURLException(url.toString() + ": no sub-URL"); } return new URL ( url.toString().substring ( url.getProtocol().length() + 1, url.toString().lastIndexOf("!/") ) ); } public static URL extractSubUrl(String url) throws MalformedURLException { return extractSubUrl(new URL(url)); } public static URL fileToUrl(File file) { try { return escapedFile ( new File ( file.getAbsolutePath().replace(File.separatorChar, '/') ) ).toURL(); } catch (MalformedURLException e) { throw new RuntimeException(e); // We made sure the path can be parsed as an URL by escaping it. } } private static String getExtension(URL url) { return url.toString().substring(url.toString().lastIndexOf(".") + 1); } public static String getFTPFilename(URL url) { // According to RFC 959 the file system conventions of the involved // server must be followed. The applicable information is, however, not // available anymore in the URL, because there the URI rules are followed. // Therefore, we assure to have forward slashes, which are widely accepted. return urlToFile(url).getPath().replace('\\', '/'); } public static String getHttpReasonPhrase(int statusCode) { return getHttpReasonPhrase(statusCode, new String[0]); } public static String getHttpReasonPhrase(int statusCode, String languageTag) { return getHttpReasonPhrase(statusCode, new String[]{languageTag}); } public static String getHttpReasonPhrase(int statusCode, String[] languageTags) { return getResource("http_" + String.valueOf(statusCode), languageTags); } public static String getJarEntry(URL url) { return unescapeUriSpecials(extractComposedUrlEntry(url)); } public static String getLastPathSegment(URL url) { return getLastPathSegment ( isComposedUrl(url) ? url.getFile().substring(url.getFile().lastIndexOf("!/") + 1) : url.getFile() ); } /** * A trailing slash is ignored to determine the last segment, but it is part * of it if it is there. */ public static String getLastPathSegment(String path) { // We're not interested in the last character if it is a slash. path = path.replace('\\', '/'); return path.substring(path.lastIndexOf('/', path.length() - 2) + 1); } public static Properties getParameters(String queryString) { if (queryString == null) { return new Properties(); } Properties result = new Properties(); StringTokenizer tokenizer = new StringTokenizer(queryString, "&"); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); int index = token.indexOf('='); if (index != -1) { result. setProperty(token.substring(0, index), token.substring(index + 1)); } } return result; } public static String[] getPathSegments(String path) { List result = new ArrayList(); StringTokenizer tokenizer = new StringTokenizer(path, "/"); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); if (!"".equals(token)) { result.add(token); } } return (String[]) result.toArray(new String[0]); } public static String getResource(String key) { if (bundle == null) { bundle = ResourceBundle.getBundle("be.re.net.res.Res"); } return bundle.getString(key); } public static String getResource(String key, String languageTag) { return getResource(key, new String[]{languageTag}); } /** * Try languageTags until a match is found. Return the default * otherwise. */ public static String getResource(String key, String[] languageTags) { for (int i = 0; i < languageTags.length; ++i) { ResourceBundle bundle = (ResourceBundle) bundles.get(be.re.util.Util.getLocale(languageTags[i])); if (bundle == null) { bundle = getResourceBundle(languageTags[i]); if (bundle != null) { bundles.put(be.re.util.Util.getLocale(languageTags[i]), bundle); } } if (bundle != null) { return bundle.getString(key); } } return getResource(key); } private static ResourceBundle getResourceBundle(String language) { try { Locale locale = be.re.util.Util.getLocale(language); ResourceBundle result = ResourceBundle.getBundle("be.re.net.res.Res", locale); return result.getLocale().equals(locale) ? result : null; } catch (MissingResourceException e) { return null; } } public static boolean hasBody(Headers headers) { return ( headers.get("Content-Length").length > 0 && Integer.parseInt(headers.get("Content-Length")[0]) > 0 ) || headers.get("Transfer-Encoding").length > 0; } public static long httpDate(String s) { String[] patterns = new String[] { "EEE, dd MMM yyyy HH:mm:ss Z", // RFC1123-date "EEEE, dd-MMM-yy HH:mm:ss Z", // RFC850-date "EEE MMM dd HH:mm:ss yyyy", // ASCTIME-date "EEE MMM d HH:mm:ss yyyy" // ASCTIME-date }; for (int i = 0; i < patterns.length; ++i) { try { Date date = new SimpleDateFormat(patterns[i], new Locale("en", "US")).parse(s); if (date != null) { return date.getTime(); } } catch (ParseException e) { } } return -1; } public static String httpDate(long date) { return new SimpleDateFormat ( "EEE, dd MMM yyyy HH:mm:ss Z", new Locale("en", "US") ).format(new Date(date)); } /** * Extract the status code from the status line or -1 if that is * not possible. */ public static int httpStatusCode(String statusLine) { StringTokenizer tokenizer = new StringTokenizer(statusLine); if ( tokenizer.countTokens() < 2 || !tokenizer.nextToken().startsWith("HTTP/") ) { return -1; } try { return Integer.parseInt(tokenizer.nextToken()); } catch (NumberFormatException e) { return -1; } } public static boolean isAncestor(URL ancestor, URL child) { try { if (isArchive(ancestor) && "jar".equals(child.getProtocol())) { return isAncestor(new URL("jar:" + ancestor.toString() + "!/"), child); } if ( "file".equals(ancestor.getProtocol()) && "jar".equals(child.getProtocol()) ) { return isAncestor(ancestor, Util.extractSubUrl(child)); } } catch (MalformedURLException e) { throw new RuntimeException(e); // Would be a bug. } if ( ancestor.getProtocol() == null || child.getProtocol() == null || !ancestor.getProtocol().equals(child.getProtocol()) || !ancestor.getHost().equals(child.getHost()) || ancestor.getPort() != child.getPort() ) { return false; } return isAncestor(ancestor.getFile(), child.getFile()) || ( "file".equals(ancestor.getProtocol()) && "file".equals(child.getProtocol()) && isAncestor(urlToFile(ancestor), urlToFile(child)) ); } private static boolean isAncestor(String path1, String path2) { StringTokenizer t1 = new StringTokenizer(path1, "/"); StringTokenizer t2 = new StringTokenizer(path2, "/"); while (t1.hasMoreTokens()) { if (!t2.hasMoreTokens() || !t1.nextToken().equals(t2.nextToken())) { return false; } } return t2.hasMoreTokens(); } public static boolean isAncestor(File file1, File file2) { return file1 != null && file2 != null && ( file1.equals(file2.getParentFile()) || isAncestor(file1, file2.getParentFile()) ); } public static boolean isArchive(URL url) { return url.getProtocol() != null && url.getProtocol().equals("file") && isArchiveExtension(getExtension(url)); } private static boolean isArchiveExtension(String s) { for (int i = 0; i < archiveExtensions.length; ++i) { if (archiveExtensions[i].equalsIgnoreCase(s)) { return true; } } return false; } public static boolean isComposedUrl(URL url) { return "jar".equals(url.getProtocol()) && url.toString().lastIndexOf("!/") != -1; } public static boolean isComposedUrl(String url) throws MalformedURLException { return isComposedUrl(new URL(url)); } private static boolean isPChar(char c) { return isUnreserved(c) || be.re.util.Array.inArray(PCHAR_SPECIALS, c); } private static boolean isReserved(char c) { return be.re.util.Array.inArray(RESERVED, c); } private static boolean isStartOfEscape(char[] c, int i) { return c[i] == '%' && i < c.length - 2 && be.re.util.Util.isInteger(new String(c, i + 1, 2), 16); } private static boolean isUnreserved(char c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || be.re.util.Array.inArray(MARK, c); } private static boolean isUriChar(char[] c, int i) { return isReserved(c[i]) || isUnreserved(c[i]) || isStartOfEscape(c, i); } public static boolean isUrl(String s) { try { return s != null && new URL(s) != null; } catch (MalformedURLException e) { return false; } } public static Headers readHeaders(ReadLineInputStream in) throws IOException { Headers headers = new Headers(); byte[] line; while ((line = in. readLine()) != null && line.length > 0) { String s = new String(line); if (s.indexOf(':') != -1) { headers.add ( s.substring(0, s.indexOf(':')).trim(), s.substring(s.indexOf(':') + 1).trim() ); } } return headers; } public static String resolveFullPath(String basePath, String relativePath) throws MalformedURLException { return resolveFullPath ( relativePath.startsWith("/") ? relativePath : (basePath.substring(0, basePath.lastIndexOf('/') + 1) + relativePath) ); } /** * Resolves ".." segements and multiple slashes. */ public static String resolveFullPath(String path) throws MalformedURLException { List segments = new ArrayList(); StringTokenizer tokenizer = new StringTokenizer(path, "/"); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); if (!token.equals(".")) { if (token.equals("..")) { if (segments.size() == 0) { throw new MalformedURLException ( "URL specification goes outside of its root" ); } segments.remove(segments.size() - 1); } else { segments.add(token); } } } String result = ""; for ( Iterator i = segments.iterator(); i.hasNext(); result += "/" + (String) i.next() ); return result.equals("") ? "/" : (result + (path.endsWith("/") ? "/" : "")); } public static URL resolvePath(URL url) throws MalformedURLException { if (isComposedUrl(url)) { try { String path = resolveFullPath(extractComposedUrlEntry(url)); return new URL ( url.getProtocol() + ":" + resolvePath(extractSubUrl(url)).toString() + "!" + path ); } catch (MalformedURLException e) { // This considers a jar URL to be an ordinary directory. return resolvePath ( new URL ( extractSubUrl(url).toString() + "/" + extractComposedUrlEntry(url) ) ); } } String path = resolveFullPath(url.getFile()); return new URL ( new URL ( url.getProtocol() + ":" + (url.getAuthority() != null ? "//" + url.getAuthority() : "") ), path + (url.getRef() != null ? ("#" + url.getRef()) : "") ); } public static URL setScheme(URL url, String scheme) throws MalformedURLException { try { return escapedUrl ( new URI ( scheme, unescapeUriSpecials(url.getUserInfo()), // Avoid escaping escapes by URI. unescapeUriSpecials(url.getHost()), // Avoid escaping escapes by URI. url.getPort(), unescapeUriSpecials(url.getPath()), // Avoid escaping escapes by URI. unescapeUriSpecials(url.getQuery()), // Avoid escaping escapes by URI. unescapeUriSpecials(url.getRef()) // Avoid escaping escapes by URI. ).toString() ); } catch (URISyntaxException e) { throw new MalformedURLException(e.getMessage()); } } public static URL setUserInfo(URL url, String userInfo) throws MalformedURLException { try { return escapedUrl ( new URI ( url.getProtocol(), unescapeUriSpecials(userInfo), // Avoid escaping escapes by URI. unescapeUriSpecials(url.getHost()), // Avoid escaping escapes by URI. url.getPort(), unescapeUriSpecials(url.getPath()), // Avoid escaping escapes by URI. unescapeUriSpecials(url.getQuery()), // Avoid escaping escapes by URI. unescapeUriSpecials(url.getRef()) // Avoid escaping escapes by URI. ).toString() ); } catch (URISyntaxException e) { throw new MalformedURLException(e.getMessage()); } } public static String stripQuery(String url) { int query = url.lastIndexOf('?'); int reference = -1; return query != -1 ? ( url.substring(0, query) + ( (reference = url.lastIndexOf('#')) != -1 ? url.substring(reference) : "" ) ) : url; } public static URL stripQuery(URL url) throws MalformedURLException { return new URL(stripQuery(url.toString())); } public static URL stripUserInfo(URL url) { try { return new URL ( url.getProtocol() + ":" + (url.getHost() != null ? "//" + url.getHost() : "") + (url.getPort() != -1 ? (":" + String.valueOf(url.getPort())) : "") + url.getFile() + (url.getRef() != null ? ("#" + url.getRef()) : "") ); } catch (MalformedURLException e) { throw new RuntimeException(e); // Would be a bug. } } public static void testUrl(URL url) throws IOException { try { url.openStream().close(); } catch (Exception e) { throw new be.re.io.IOException ( "The URL \"" + url.toString() + "\" can't be opened.", e ); } } public static String unescapeUriSpecials(String s) { if (s == null) { return null; } int count = 0; byte[] result = new byte[s.length()]; for (int i = 0; i < s.length(); ++i) { if ( s.charAt(i) == '%' && s.length() - i > 2 && be.re.util.Util.isInteger(s.substring(i + 1, i + 3), 16) ) { result[count++] = (byte) Integer.parseInt(s.substring(i + 1, i + 3), 16); i += 2; } else { result[count++] = (byte) s.charAt(i); } } try { return new String(result, 0, count, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); // Would be a bug. } } public static File urlToFile(URL url) { return new File(unescapeUriSpecials(url.getFile())); } public static User userFromUrl(URL url) { User user = new BasicUser(); String userInfo = url.getUserInfo(); if (userInfo == null) { return user; } StringTokenizer tokenizer = new StringTokenizer(userInfo, ":"); if (tokenizer.hasMoreTokens()) { user.setUsername(tokenizer.nextToken()); } if (tokenizer.hasMoreTokens()) { user.setPassword(unescapeUriSpecials(tokenizer.nextToken())); } return user; } private interface TestChar { /** * Return true if the character should not be escaped and * false otherwise. */ public boolean test (char[] c, int i); } // TestChar } // Util css2xslfo/src/be/re/util/0000755000175000017500000000000011434532510016262 5ustar mithrandimithrandicss2xslfo/src/be/re/util/Array.java0000644000175000017500000004162011434532510020206 0ustar mithrandimithrandipackage be.re.util; /** * @author Werner Donn\u00e9 */ public class Array { public static Object[] append(Object[] array, Object object) { Object[] newArray = (Object[]) java.lang.reflect.Array. newInstance(array.getClass().getComponentType(), array.length + 1); System.arraycopy(array, 0, newArray, 0, array.length); newArray[newArray.length - 1] = object; return newArray; } public static byte[] append(byte[] array, byte b) { byte[] newArray = new byte[array.length + 1]; System.arraycopy(array, 0, newArray, 0, array.length); newArray[newArray.length - 1] = b; return newArray; } public static char[] append(char[] array, char c) { char[] newArray = new char[array.length + 1]; System.arraycopy(array, 0, newArray, 0, array.length); newArray[newArray.length - 1] = c; return newArray; } public static short[] append(short[] array, short s) { short[] newArray = new short[array.length + 1]; System.arraycopy(array, 0, newArray, 0, array.length); newArray[newArray.length - 1] = s; return newArray; } public static int[] append(int[] array, int i) { int[] newArray = new int[array.length + 1]; System.arraycopy(array, 0, newArray, 0, array.length); newArray[newArray.length - 1] = i; return newArray; } public static long[] append(long[] array, long l) { long[] newArray = new long[array.length + 1]; System.arraycopy(array, 0, newArray, 0, array.length); newArray[newArray.length - 1] = l; return newArray; } public static float[] append(float[] array, float f) { float[] newArray = new float[array.length + 1]; System.arraycopy(array, 0, newArray, 0, array.length); newArray[newArray.length - 1] = f; return newArray; } public static double[] append(double[] array, double d) { double[] newArray = new double[array.length + 1]; System.arraycopy(array, 0, newArray, 0, array.length); newArray[newArray.length - 1] = d; return newArray; } public static Object[] append(Object[] array, Object[] objects) { Object[] newArray = (Object[]) java.lang.reflect.Array.newInstance ( array.getClass().getComponentType(), array.length + objects.length ); System.arraycopy(array, 0, newArray, 0, array.length); System.arraycopy(objects, 0, newArray, array.length, objects.length); return newArray; } public static byte[] append(byte[] array, byte[] bytes) { byte[] newArray = new byte[array.length + bytes.length]; System.arraycopy(array, 0, newArray, 0, array.length); System.arraycopy(bytes, 0, newArray, array.length, bytes.length); return newArray; } public static char[] append(char[] array, char[] chars) { char[] newArray = new char[array.length + chars.length]; System.arraycopy(array, 0, newArray, 0, array.length); System.arraycopy(chars, 0, newArray, array.length, chars.length); return newArray; } public static short[] append(short[] array, short[] shorts) { short[] newArray = new short[array.length + shorts.length]; System.arraycopy(array, 0, newArray, 0, array.length); System.arraycopy(shorts, 0, newArray, array.length, shorts.length); return newArray; } public static int[] append(int[] array, int[] ints) { int[] newArray = new int[array.length + ints.length]; System.arraycopy(array, 0, newArray, 0, array.length); System.arraycopy(ints, 0, newArray, array.length, ints.length); return newArray; } public static long[] append(long[] array, long[] longs) { long[] newArray = new long[array.length + longs.length]; System.arraycopy(array, 0, newArray, 0, array.length); System.arraycopy(longs, 0, newArray, array.length, longs.length); return newArray; } public static float[] append(float[] array, float[] floats) { float[] newArray = new float[array.length + floats.length]; System.arraycopy(array, 0, newArray, 0, array.length); System.arraycopy(floats, 0, newArray, array.length, floats.length); return newArray; } public static double[] append(double[] array, double[] doubles) { double[] newArray = new double[array.length + doubles.length]; System.arraycopy(array, 0, newArray, 0, array.length); System.arraycopy(doubles, 0, newArray, array.length, doubles.length); return newArray; } public static boolean equal(Object[] array1, Object[] array2) { if (array1.length != array2.length) { return false; } for (int i = 0; i < array1.length; ++i) { if ( ( array1[i] == null && array2[i] != null ) || ( array1[i] != null && array2[i] == null ) || !array1[i].equals(array2[i]) ) { return false; } } return true; } public static boolean equal(byte[] array1, byte[] array2) { if (array1.length != array2.length) { return false; } for (int i = 0; i < array1.length; ++i) { if (array1[i] != array2[i]) { return false; } } return true; } public static boolean equal(char[] array1, char[] array2) { if (array1.length != array2.length) { return false; } for (int i = 0; i < array1.length; ++i) { if (array1[i] != array2[i]) { return false; } } return true; } public static boolean equal(short[] array1, short[] array2) { if (array1.length != array2.length) { return false; } for (int i = 0; i < array1.length; ++i) { if (array1[i] != array2[i]) { return false; } } return true; } public static boolean equal(int[] array1, int[] array2) { if (array1.length != array2.length) { return false; } for (int i = 0; i < array1.length; ++i) { if (array1[i] != array2[i]) { return false; } } return true; } public static boolean equal(long[] array1, long[] array2) { if (array1.length != array2.length) { return false; } for (int i = 0; i < array1.length; ++i) { if (array1[i] != array2[i]) { return false; } } return true; } public static boolean equal(float[] array1, float[] array2) { if (array1.length != array2.length) { return false; } for (int i = 0; i < array1.length; ++i) { if (array1[i] != array2[i]) { return false; } } return true; } public static boolean equal(double[] array1, double[] array2) { if (array1.length != array2.length) { return false; } for (int i = 0; i < array1.length; ++i) { if (array1[i] != array2[i]) { return false; } } return true; } public static boolean inArray(Object[] array, Object object) { return indexOf(array, object) != -1; } public static boolean inArray(byte[] array, byte b) { return indexOf(array, b) != -1; } public static boolean inArray(char[] array, char c) { return indexOf(array, c) != -1; } public static boolean inArray(short[] array, short s) { return indexOf(array, s) != -1; } public static boolean inArray(int[] array, int i) { return indexOf(array, i) != -1; } public static boolean inArray(long[] array, long l) { return indexOf(array, l) != -1; } public static boolean inArray(float[] array, float f) { return indexOf(array, f) != -1; } public static boolean inArray(double[] array, double d) { return indexOf(array, d) != -1; } public static int indexOf(Object[] array, Object object) { for (int i = 0; i < array.length; ++i) { if (array[i].equals(object)) { return i; } } return -1; } public static int indexOf(byte[] array, byte b) { for (int i = 0; i < array.length; ++i) { if (array[i] == b) { return i; } } return -1; } public static int indexOf(char[] array, char c) { for (int i = 0; i < array.length; ++i) { if (array[i] == c) { return i; } } return -1; } public static int indexOf(short[] array, short s) { for (int i = 0; i < array.length; ++i) { if (array[i] == s) { return i; } } return -1; } public static int indexOf(int[] array, int i) { for (int j = 0; j < array.length; ++j) { if (array[j] == i) { return j; } } return -1; } public static int indexOf(long[] array, long l) { for (int i = 0; i < array.length; ++i) { if (array[i] == l) { return i; } } return -1; } public static int indexOf(float[] array, float f) { for (int i = 0; i < array.length; ++i) { if (array[i] == f) { return i; } } return -1; } public static int indexOf(double[] array, double d) { for (int i = 0; i < array.length; ++i) { if (array[i] == d) { return i; } } return -1; } public static Object[] insert(Object[] array, int pos, Object object) { Object[] newArray = (Object[]) java.lang.reflect.Array. newInstance(array.getClass().getComponentType(), array.length + 1); System.arraycopy(array, 0, newArray, 0, pos); newArray[pos] = object; System.arraycopy(array, pos, newArray, pos + 1, array.length - pos); return newArray; } public static byte[] insert(byte[] array, int pos, byte b) { byte[] newArray = new byte[array.length + 1]; System.arraycopy(array, 0, newArray, 0, pos); newArray[pos] = b; System.arraycopy(array, pos, newArray, pos + 1, array.length - pos); return newArray; } public static char[] insert(char[] array, int pos, char c) { char[] newArray = new char[array.length + 1]; System.arraycopy(array, 0, newArray, 0, pos); newArray[pos] = c; System.arraycopy(array, pos, newArray, pos + 1, array.length - pos); return newArray; } public static short[] insert(short[] array, int pos, short s) { short[] newArray = new short[array.length + 1]; System.arraycopy(array, 0, newArray, 0, pos); newArray[pos] = s; System.arraycopy(array, pos, newArray, pos + 1, array.length - pos); return newArray; } public static int[] insert(int[] array, int pos, int i) { int[] newArray = new int[array.length + 1]; System.arraycopy(array, 0, newArray, 0, pos); newArray[pos] = i; System.arraycopy(array, pos, newArray, pos + 1, array.length - pos); return newArray; } public static long[] insert(long[] array, int pos, long l) { long[] newArray = new long[array.length + 1]; System.arraycopy(array, 0, newArray, 0, pos); newArray[pos] = l; System.arraycopy(array, pos, newArray, pos + 1, array.length - pos); return newArray; } public static float[] insert(float[] array, int pos, float f) { float[] newArray = new float[array.length + 1]; System.arraycopy(array, 0, newArray, 0, pos); newArray[pos] = f; System.arraycopy(array, pos, newArray, pos + 1, array.length - pos); return newArray; } public static double[] insert(double[] array, int pos, double d) { double[] newArray = new double[array.length + 1]; System.arraycopy(array, 0, newArray, 0, pos); newArray[pos] = d; System.arraycopy(array, pos, newArray, pos + 1, array.length - pos); return newArray; } public static Object[] insert(Object[] array, int pos, Object[] objects) { Object[] newArray = (Object[]) java.lang.reflect.Array. newInstance ( array.getClass().getComponentType(), array.length + objects.length ); System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(objects, 0, newArray, pos, objects.length); System. arraycopy(array, pos, newArray, pos + objects.length, array.length - pos); return newArray; } public static byte[] insert(byte[] array, int pos, byte[] bytes) { byte[] newArray = new byte[array.length + bytes.length]; System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(bytes, 0, newArray, pos, bytes.length); System. arraycopy(array, pos, newArray, pos + bytes.length, array.length - pos); return newArray; } public static char[] insert(char[] array, int pos, char[] chars) { char[] newArray = new char[array.length + chars.length]; System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(chars, 0, newArray, pos, chars.length); System. arraycopy(array, pos, newArray, pos + chars.length, array.length - pos); return newArray; } public static short[] insert(short[] array, int pos, short[] shorts) { short[] newArray = new short[array.length + shorts.length]; System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(shorts, 0, newArray, pos, shorts.length); System. arraycopy(array, pos, newArray, pos + shorts.length, array.length - pos); return newArray; } public static int[] insert(int[] array, int pos, int[] ints) { int[] newArray = new int[array.length + ints.length]; System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(ints, 0, newArray, pos, ints.length); System. arraycopy(array, pos, newArray, pos + ints.length, array.length - pos); return newArray; } public static long[] insert(long[] array, int pos, long[] longs) { long[] newArray = new long[array.length + longs.length]; System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(longs, 0, newArray, pos, longs.length); System. arraycopy(array, pos, newArray, pos + longs.length, array.length - pos); return newArray; } public static float[] insert(float[] array, int pos, float[] floats) { float[] newArray = new float[array.length + floats.length]; System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(floats, 0, newArray, pos, floats.length); System. arraycopy(array, pos, newArray, pos + floats.length, array.length - pos); return newArray; } public static double[] insert(double[] array, int pos, double[] doubles) { double[] newArray = new double[array.length + doubles.length]; System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(doubles, 0, newArray, pos, doubles.length); System. arraycopy(array, pos, newArray, pos + doubles.length, array.length - pos); return newArray; } public static Object[] remove(Object[] array, int pos) { Object[] newArray = (Object[]) java.lang.reflect.Array. newInstance(array.getClass().getComponentType(), array.length - 1); System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(array, pos + 1, newArray, pos, array.length - pos - 1); return newArray; } public static byte[] remove(byte[] array, int pos) { byte[] newArray = new byte[array.length - 1]; System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(array, pos + 1, newArray, pos, array.length - pos - 1); return newArray; } public static char[] remove(char[] array, int pos) { char[] newArray = new char[array.length - 1]; System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(array, pos + 1, newArray, pos, array.length - pos - 1); return newArray; } public static short[] remove(short[] array, int pos) { short[] newArray = new short[array.length - 1]; System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(array, pos + 1, newArray, pos, array.length - pos - 1); return newArray; } public static int[] remove(int[] array, int pos) { int[] newArray = new int[array.length - 1]; System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(array, pos + 1, newArray, pos, array.length - pos - 1); return newArray; } public static long[] remove(long[] array, int pos) { long[] newArray = new long[array.length - 1]; System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(array, pos + 1, newArray, pos, array.length - pos - 1); return newArray; } public static float[] remove(float[] array, int pos) { float[] newArray = new float[array.length - 1]; System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(array, pos + 1, newArray, pos, array.length - pos - 1); return newArray; } public static double[] remove(double[] array, int pos) { double[] newArray = new double[array.length - 1]; System.arraycopy(array, 0, newArray, 0, pos); System.arraycopy(array, pos + 1, newArray, pos, array.length - pos - 1); return newArray; } } // Array css2xslfo/src/be/re/util/DigitalTree.java0000644000175000017500000000570411434532510021330 0ustar mithrandimithrandipackage be.re.util; import java.util.HashSet; import java.util.Set; public class DigitalTree implements Cloneable { private static final int BITS = 8; private static final int MASK = (0x1 << BITS) - 1; private static final int SIZE = (0x1 << BITS); private Set keys; private Node[] root = new Node[SIZE]; public DigitalTree() { this(false); } public DigitalTree(boolean saveKeys) { keys = saveKeys ? new HashSet() : null; } /** * Returns a shallow copy. */ public Object clone() { DigitalTree copy = null; try { copy = (DigitalTree) super.clone(); } catch (CloneNotSupportedException e) { return null; } copy.root = cloneNodes(root); if (keys != null) { copy.keys = (Set) ((HashSet) keys).clone(); } return copy; } private static Node[] cloneNodes(Node[] nodes) { Node[] result = new Node[nodes.length]; for (int i = 0; i < nodes.length; ++i) { if (nodes[i] != null) { result[i] = (Node) nodes[i].clone(); } } return result; } public Object get(String key) { Node[] current = root; int i = 0; int length = key.length(); Node node = null; for (i = 0; i < length && current != null; ++i) { char c = key.charAt(i); for (int j = 0; j < 16 / BITS && current != null; ++j) { node = current[((MASK << (j * BITS)) & c) >>> (j * BITS)]; current = node != null ? node.nodes : null; } } return i == length && node != null ? node.object : null; } public Set keySet() { return keys; } public void put(String key, Object o) { Node[] current = root; int length = key.length(); Node node = null; for (int i = 0; i < length; ++i) { char c = key.charAt(i); for (int j = 0; j < 16 / BITS; ++j) { int value = ((MASK << (j * BITS)) & c) >>> (j * BITS); if (current[value] == null) { current[value] = new Node(); } if ( current[value].nodes == null && ( i < length - 1 || j < (16 / BITS) - 1 ) ) { current[value].nodes = new Node[SIZE]; } node = current[value]; current = current[value].nodes; } } node.object = o; if (keys != null) { keys.add(key); } } public void remove(String key) { put(key, null); } private static class Node implements Cloneable { private Node[] nodes; private Object object; protected Object clone() { Node copy = null; try { copy = (Node) super.clone(); } catch (CloneNotSupportedException e) { return null; } if (nodes != null) { copy.nodes = cloneNodes(nodes); } return copy; } } // Node } // DigitalTree css2xslfo/src/be/re/util/Equal.java0000644000175000017500000000147411434532510020202 0ustar mithrandimithrandipackage be.re.util; /** * The Equal interface is meant for generic algorithms that need to be able to * test two objects for equality. The comparison criterion is kept out of the * algorithm. * It is also kept out of the objects themselves. This would not be the case * if Object.equals were used. That method implies only one * criterion. */ public interface Equal { /** * The actual equal method. * @param object the object encountered in the course of the algorithm. * @param refData the reference data the encountered object is compared with. * Normally this data is constant during the algorithm. * @return true if the objects are equal according to the * criterion, false otherwise. */ public boolean equal (Object object, Object refData); } css2xslfo/src/be/re/util/UUID.java0000644000175000017500000000715211434532510017700 0ustar mithrandimithrandipackage be.re.util; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.security.SecureRandom; import java.util.Random; /** * Generates a version 1 UUID according to RFC 4122. * @author Werner Donn\u00e9 */ public class UUID { private static final Random random = new SecureRandom(); private static final long startGregorianSinceEpoch = -10010304000000L - // Gregorian in milliseconds since NTP (1/1/1900). 2208988800000L; // Epoch in milliseconds since NTP. private static long lastTimestamp = 0; private static long timestampCounter = 0; static { random.setSeed(System.currentTimeMillis()); } public static String format(byte[] uuid) { if (uuid.length != 16) { throw new IllegalArgumentException("UUID should be 16 bytes."); } char[] result = new char[36]; format(uuid, 0, 4, result, 0); // time_low result[8] = '-'; format(uuid, 4, 2, result, 9); // time_mid result[13] = '-'; format(uuid, 6, 2, result, 14); // time_hi result[18] = '-'; format(uuid, 8, 2, result, 19); // time_hi result[23] = '-'; format(uuid, 10, 6, result, 24); // time_hi return new String(result); } private static void format(byte[] uuid, int offsetUUID, int len, char[] result, int offsetResult) { for (int i = 0; i < len; ++i) { result[offsetResult + 2 * i] = toHex((0x00ff & uuid[i + offsetUUID]) >>> 4); result[offsetResult + 2 * i + 1] = toHex(0x000f & uuid[i + offsetUUID]); } } public static synchronized byte[] generate() { byte[] clockSequence = new byte[2]; byte[] node = new byte[6]; byte[] result = new byte[16]; setTimestamp(result); result[7] &= 0x1f; // version random.nextBytes(clockSequence); clockSequence[0] &= 0xbf; // variant System.arraycopy(clockSequence, 0, result, 8, clockSequence.length); random.nextBytes(node); node[0] |= 0x80; // multicast bit System.arraycopy(node, 0, result, 10, node.length); return result; } public static String generateFormatted() { return format(generate()); } public static boolean isUUID(String s) { if (s.length() != 36) { return false; } for (int i = 0; i < 36; ++i) { if (i == 8 || i == 13 || i == 18 || i == 23) { if (s.charAt(i) != '-') { return false; } } else { char c = s.charAt(i); if ( !( (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') ) ) { return false; } } } return true; } public static void main(String[] args) { System.out.println(generateFormatted()); } private static void setTimestamp(byte[] result) { long time = (System.currentTimeMillis() + startGregorianSinceEpoch) * 10000; if (time != lastTimestamp) { lastTimestamp = time; timestampCounter = 0; } time += timestampCounter++; ByteArrayOutputStream out = new ByteArrayOutputStream(8); try { new DataOutputStream(out).writeLong(time); } catch (IOException e) { throw new RuntimeException(e); } byte[] bytes = out.toByteArray(); System.arraycopy(bytes, 4, result, 0, 4); // time_low System.arraycopy(bytes, 2, result, 4, 2); // time_mid System.arraycopy(bytes, 0, result, 6, 2); // time_hi } private static char toHex(int i) { return (char) (i + (i < 10 ? 48 : 87)); } } // UUID css2xslfo/src/be/re/util/Util.java0000644000175000017500000005145011434532510020047 0ustar mithrandimithrandipackage be.re.util; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.reflect.Array; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.ResourceBundle; import java.util.Set; import java.util.StringTokenizer; import java.util.TimeZone; import java.util.regex.Pattern; /** * @author Werner Donn\u00e9 */ public class Util { private static final String[][] DATE_FORMATS = { {"yyyy.MM.dd h:mm:ss a", "0"}, {"yyyy.MM.dd h:mm a", "0"}, {"yyyy.MM.dd HH:mm", "0"}, {"yyyy.MM.dd HH:mm:ss", "0"}, {"dd.MM.yyyy h:mm a", "0"}, {"dd.MM.yyyy h:mm:ss a", "0"}, {"dd.MM.yyyy HH:mm", "0"}, {"dd.MM.yyyy HH:mm:ss", "0"}, {"yyyy/MM/dd h:mm a", "0"}, {"yyyy/MM/dd h:mm:ss a", "0"}, {"yyyy/MM/dd HH:mm", "0"}, {"yyyy/MM/dd HH:mm:ss", "0"}, {"dd/MM/yyyy h:mm a", "0"}, {"dd/MM/yyyy h:mm:ss a", "0"}, {"dd/MM/yyyy HH:mm", "0"}, {"dd/MM/yyyy HH:mm:ss", "0"}, {"yyyy-MM-dd h:mm a", "0"}, {"yyyy-MM-dd h:mm:ss a", "0"}, {"yyyy-MM-dd HH:mm", "0"}, {"yyyy-MM-dd HH:mm:ss", "0"}, {"yyyy-MM-dd'T'h:mm a", "0"}, {"yyyy-MM-dd'T'h:mm:ss a", "0"}, {"yyyy-MM-dd'T'HH:mm", "0"}, {"yyyy-MM-dd'T'HH:mm:ss", "0"}, {"yyyy-MM-dd'T'HH:mm:ss.S", "0"}, {"yyyy-MM-dd'T'HH:mm:ssZ", "0"}, {"yyyy-MM-dd'T'HH:mm:ss.SZ", "0"}, {"dd-MM-yyyy h:mm a", "0"}, {"dd-MM-yyyy h:mm:ss a", "0"}, {"dd-MM-yyyy HH:mm", "0"}, {"dd-MM-yyyy HH:mm:ss", "0"}, {"h:mm a", "1"}, {"h:mm:ss a", "1"}, {"HH:mm", "1"}, {"HH:mm:ss", "1"}, {"yyyy.MM.dd", "2"}, {"dd.MM.yyyy", "2"}, {"yyyy/MM/dd", "2"}, {"dd/MM/yyyy", "2"}, {"yyyy-MM-dd", "2"}, {"dd-MM-yyyy", "2"} }; private static Map bundles = new HashMap(); private static Set countries = new HashSet(Arrays.asList(Locale.getISOCountries())); private static Set languages = new HashSet(Arrays.asList(Locale.getISOLanguages())); private static Pattern timeZonePattern = Pattern.compile("\\p{Digit}{2}:?\\p{Digit}{2}"); private static Pattern timestampPattern = Pattern.compile ( "\\p{Digit}{4}(-\\p{Digit}{2}(-\\p{Digit}{2}" + "(T\\p{Digit}{2}:\\p{Digit}{2}(:\\p{Digit}{2}(.(\\p{Digit})+)?)?" + "(Z|((\\+|-)\\p{Digit}{2}:?\\p{Digit}{2}))?)?)?)?" ); public static void attemptExitVM(int returnCode) { if ( Util.class.getClassLoader() == null || Util.class.getClassLoader(). equals(ClassLoader.getSystemClassLoader()) ) { try { System.exit(returnCode); } catch (Throwable e) { // Only attempt. } } } public static String createDate(long time) { return new SimpleDateFormat("yyyy-MM-dd").format(new Date(time)); } public static Object[] createSet(Object[] collection) { Set set = new HashSet(); for (int i = 0; i < collection.length; ++i) { set.add(collection[i]); } return set.toArray ( (Object[]) Array.newInstance ( collection.getClass().getComponentType(), set.size() ) ); } public static String createTimestamp(long time) { return new SimpleDateFormat ( time % 1000 > 0 ? "yyyy-MM-dd'T'HH:mm:ss.SSSZ" : "yyyy-MM-dd'T'HH:mm:ssZ" ).format(new Date(time)); } public static String createTimestampUTC(long time) { SimpleDateFormat format = new SimpleDateFormat ( time % 1000 > 0 ? "yyyy-MM-dd'T'HH:mm:ss.SSS" : "yyyy-MM-dd'T'HH:mm:ss" ); format.setTimeZone(TimeZone.getTimeZone("GMT")); return format.format(new Date(time)) + "Z"; } public static String enumerate(String[] s, String separator) { StringBuffer result = new StringBuffer(128); for (int i = 0; i < s.length; ++i) { if (i > 0) { result.append(separator); } result.append(s[i]); } return result.toString(); } private static String[] findFormat(String value) { for (int i = 0; i < DATE_FORMATS.length; ++i) { SimpleDateFormat format = new SimpleDateFormat(DATE_FORMATS[i][0]); format.setLenient(false); try { if (format.parse(value) != null) { return DATE_FORMATS[i]; } } catch (ParseException e) { } } return null; } public static Throwable getCause(Throwable t, Class theClass) { return t == null ? null : ( theClass.isAssignableFrom(t.getClass()) ? t : getCause(t.getCause(), theClass) ); } public static String getCommonPrefix(String s1, String s2) { for (int i = 0; i < s1.length() && i < s2.length(); ++i) { if (s1.charAt(i) != s2.charAt(i)) { return s1.substring(0, i); } } return s1.length() <= s2.length() ? s1 : s2; } public static String getCommonPrefix(String[] s) { if (s.length == 0) { return ""; } String result = s[0]; for (int i = 1; i < s.length; ++i) { result = getCommonPrefix(result, s[i]); } return result; } public static String getLanguageTag(Locale locale) { return locale.getLanguage().toLowerCase() + ( "".equals(locale.getCountry()) ? "" : ("-" + locale.getCountry().toUpperCase()) ); } public static Locale getLocale(String languageTag) { return languageTag.indexOf('-') != -1 ? new Locale ( languageTag.substring(0, languageTag.indexOf('-')).toLowerCase(), languageTag.substring(languageTag.indexOf('-') + 1).toUpperCase() ) : new Locale(languageTag.toLowerCase()); } public static File getPackageStorage(Class c) { File current = new File(System.getProperty("user.home")); boolean first = true; StringTokenizer tokenizer = new StringTokenizer(c.getName(), "."); int count = tokenizer.countTokens(); for (int i = 0; i < count - 1; ++i) { current = new File(current, (first ? "." : "") + tokenizer.nextToken()); first = false; } if (!current.exists()) { current.mkdirs(); } return current; } public static String[] getPathSegments(String path) { return split(path, "/"); } public static String getReSystemProperty(String name) throws IOException { InputStream in = Util.class.getClassLoader(). getResourceAsStream("META-INF/services/be/re/" + name); if (in != null) { try { String[] resource = readLineConfig(in); if (resource.length == 1) { return resource[0]; } } finally { in.close(); } } return null; } public static String getResource(String name) { return getResource(name, Locale.getDefault()); } public static String getResource(String name, Locale locale) { return getResourceBundle(locale).getString(name); } public static ResourceBundle getResourceBundle() { return getResourceBundle(Locale.getDefault()); } public static ResourceBundle getResourceBundle(Locale locale) { ResourceBundle bundle = (ResourceBundle) bundles.get(locale); if (bundle == null) { bundle = ResourceBundle.getBundle("be.re.util.res.Res", locale); bundles.put(locale, bundle); } return bundle; } public static String getStackTrace() { try { throw new Exception(""); } catch (Exception e) { StringWriter writer = new StringWriter(); e.printStackTrace(new PrintWriter(writer)); return writer.toString(); } } public static String getSystemProperty(String propertyName) throws IOException { String result = System.getProperty(propertyName); if (result == null) { InputStream in = Util.class.getClassLoader(). getResourceAsStream("META-INF/services/" + propertyName); if (in != null) { String[] resource = readLineConfig(in); if (resource.length == 1) { result = resource[0]; } } } return result; } public static TimeZone getTimeZone(String s) { return getTimeZone(s, getTimeZoneOffset(s)); } private static TimeZone getTimeZone(String s, int offset) { if (offset == -1) { return TimeZone.getDefault(); } s = s.substring(offset); return TimeZone.getTimeZone ( "Z".equals(s) ? "GMT" : (s.startsWith("GMT") ? s : ("GMT" + s)) ); } private static int getTimeZoneOffset(String s) { int index; return s.charAt(s.length() - 1) == 'Z' ? (s.length() - 1) : ( (index = s.lastIndexOf("GMT")) != -1 ? index : ( ( (index = s.lastIndexOf('+')) != -1 || (index = s.lastIndexOf('-')) != -1 ) && timeZonePattern.matcher(s.substring(index + 1)).matches() ? index : -1 ) ); } public static boolean isDateSet(String dateTime) { return isDateSet(findFormat(dateTime)); } private static boolean isDateSet(String[] format) { return format != null && !format[1].equals("1"); } public static boolean isDateTime(String s) { return findFormat(s) != null; } public static boolean isDouble(String s) { try { Double.parseDouble(s); return true; } catch (NumberFormatException e) { return false; } } public static boolean isFloat(String s) { try { Float.parseFloat(s); return true; } catch (NumberFormatException e) { return false; } } public static boolean isInteger(String s) { try { Integer.parseInt(s); return true; } catch (NumberFormatException e) { return false; } } public static boolean isInteger(String s, int radix) { try { Integer.parseInt(s, radix); return true; } catch (NumberFormatException e) { return false; } } public static boolean isJCEInstalled() { try { Class.forName("javax.crypto.Cipher"). getMethod("getInstance", new Class[] {String.class}). invoke(null, new Object[] {"PBEWithMD5AndDES/CBC/PKCS5Padding"}); return true; } catch (Throwable e) { return false; } } /** * Supports only the primary and country subtags. (See also RFC 4646.) */ public static boolean isLanguageTag(String s) { Locale locale = getLocale(s); return languages.contains(locale.getLanguage().toLowerCase()) && ( "".equals(locale.getCountry()) || countries.contains(locale.getCountry().toUpperCase()) ); } public static boolean isLong(String s) { try { Long.parseLong(s); return true; } catch (NumberFormatException e) { return false; } } public static boolean isLong(String s, int radix) { try { Long.parseLong(s, radix); return true; } catch (NumberFormatException e) { return false; } } public static boolean isMac() { return System.getProperty("mrj.version") != null; } public static boolean isTimeSet(long time) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(time); return calendar.get(Calendar.HOUR_OF_DAY) > 0 || calendar.get(Calendar.MINUTE) > 0 || calendar.get(Calendar.SECOND) > 0 || calendar.get(Calendar.MILLISECOND) > 0; } public static boolean isTimeSet(String dateTime) { return isTimeSet(findFormat(dateTime)); } private static boolean isTimeSet(String[] format) { return format != null && !format[1].equals("2"); } public static boolean isTimestamp(String s) { try { return parseTimestamp(s) != -1; } catch (Exception e) { return false; } } public static boolean isWindows() { return System.getProperty("os.name").toLowerCase().indexOf("windows") != -1; } public static String list(String[] list, String separator) { StringBuilder builder = new StringBuilder(256); for (int i = 0; i < list.length; ++i) { if (i > 0) { builder.append(separator); } builder.append(list[i]); } return builder.toString(); } /** * If the date is not set the current date will be used. If the time is not * set midnight will be used. */ public static long parseDateTime(String s) { String[] format = findFormat(s); if (format == null) { return -1; } long time = parseTimestamp(s, new String[]{format[0]}); if (isDateSet(format) && isTimeSet(format)) { return time; } if (!isDateSet(format)) { Calendar calendar = Calendar.getInstance(); Calendar now = Calendar.getInstance(); calendar.setTimeInMillis(time); now.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.YEAR, now.get(Calendar.YEAR)); calendar.set(Calendar.MONTH, now.get(Calendar.MONTH)); calendar.set(Calendar.DAY_OF_MONTH, now.get(Calendar.DAY_OF_MONTH)); time = calendar.getTime().getTime(); } if (!isTimeSet(format)) { time = setTime(time, 0, 0, 0); } return time; } /** * Parse an ISO-8601 date. Returns -1 if the date couldn't be * parsed. */ public static long parseTimestamp(String s) { if (!timestampPattern.matcher(s).matches()) { return -1; } int timeZoneOffset = getTimeZoneOffset(s); Calendar calendar = Calendar.getInstance(getTimeZone(s, timeZoneOffset)); calendar.setLenient(false); calendar.setTimeInMillis(0); calendar.set(Calendar.YEAR, Integer.parseInt(s.substring(0, 4))); if (s.length() > 4) { calendar.set(Calendar.MONTH, Integer.parseInt(s.substring(5, 7)) - 1); if (s.length() > 7) { calendar. set(Calendar.DAY_OF_MONTH, Integer.parseInt(s.substring(8, 10))); if (s.length() > 10) { calendar. set(Calendar.HOUR_OF_DAY, Integer.parseInt(s.substring(11, 13))); calendar.set(Calendar.MINUTE, Integer.parseInt(s.substring(14, 16))); if (s.length() > 16 && s.charAt(16) == ':') { calendar. set(Calendar.SECOND, Integer.parseInt(s.substring(17, 19))); if (s.length() > 19 && s.charAt(19) == '.') { calendar.set ( Calendar.MILLISECOND, Math.round ( Float.parseFloat ( "0." + s.substring ( 20, timeZoneOffset != -1 ? timeZoneOffset : s.length() ) ) * 1000 ) ); } } } } } return calendar.getTimeInMillis(); } public static long parseTimestamp(String s, String[] patterns) { Date result = null; for (int i = 0; i < patterns.length && result == null; ++i) { try { SimpleDateFormat format = new SimpleDateFormat(patterns[i]); format.setLenient(false); result = format.parse(s); } catch (ParseException e) { } } return result == null ? -1 : result.getTime(); } public static String patternToRegexp(String pattern) { return pattern.replaceAll("\\+", "\\+").replaceAll("\\.", "\\."). replaceAll("\\$", "\\$").replaceAll("\\*", ".*"); } public static void printStackTrace(Throwable e) { if (System.getProperty("be.re.stack") != null) { e.printStackTrace(); } } public static String[] readLineConfig(InputStream in) throws IOException { return readLineConfig(new BufferedReader(new InputStreamReader(in))); } public static String[] readLineConfig(BufferedReader in) throws IOException { String line = ""; List result = new ArrayList(); String s; while ((s = in.readLine()) != null) { if (s.indexOf('#') != -1) { s = s.substring(0, s.indexOf('#')); } s = s.trim(); if (s.length() > 0) { if (s.charAt(s.length() - 1) == '\\') { line += s.substring(0, s.length() - 1); } else { line += s; result.add(line); line = ""; } } } return (String[]) result.toArray(new String[result.size()]); } public static long setTime(long date, int hourOfDay, int minute, int second) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(date); calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); calendar.set(Calendar.MINUTE, minute); calendar.set(Calendar.SECOND, second); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime().getTime(); } public static String[] split(String s, String separator) { List result = new ArrayList(); StringTokenizer tokenizer = new StringTokenizer(s, separator); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); if (!"".equals(token)) { result.add(token); } } return (String[]) result.toArray(new String[0]); } public static String toRoman(int v) { return v < 1 ? "" : ( v < 4 ? ("I" + toRoman(v - 1)) : ( v < 5 ? "IV" : ( v < 9 ? ("V" + toRoman(v - 5)) : ( v < 10 ? "IX" : ( v < 40 ? ("X" + toRoman(v - 10)) : ( v < 50 ? ("XL" + toRoman(v - 40)) : ( v < 90 ? ("L" + toRoman(v - 50)) : ( v < 100 ? ("XC" + toRoman(v - 90)) : ( v < 400 ? ("C" + toRoman(v - 100)) : ( v < 500 ? ("CD" + toRoman(v - 400)) : ( v < 900 ? ( "D" + toRoman(v - 500) ) : ( v < 1000 ? ( "CM" + toRoman(v - 900) ) : ( "M" + toRoman(v - 1000) ) ) ) ) ) ) ) ) ) ) ) ) ); } public static int waitFor(Process process) { while (true) { try { return process.waitFor(); } catch (InterruptedException e) { } } } } // Util css2xslfo/src/be/re/xml/0000755000175000017500000000000011434532512016107 5ustar mithrandimithrandicss2xslfo/src/be/re/xml/sax/0000755000175000017500000000000011434532512016702 5ustar mithrandimithrandicss2xslfo/src/be/re/xml/sax/BalanceChecker.java0000644000175000017500000000507611434532512022367 0ustar mithrandimithrandipackage be.re.xml.sax; import be.re.xml.ExpandedName; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.util.Arrays; import java.util.Stack; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLFilterImpl; public class BalanceChecker extends XMLFilterImpl { private Stack elements = new Stack(); private File file; private int indent = 0; private PrintStream out; public BalanceChecker(File file) { this.file = file; } public BalanceChecker(File file, XMLReader parent) { super(parent); this.file = file; } public void endDocument() throws SAXException { for (int i = elements.size() - 1; i >=0; --i) { write("Element " + elements.get(i).toString() + " is not closed."); } out.close(); super.endDocument(); } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { ExpandedName element = new ExpandedName(namespaceURI, localName); if (elements.isEmpty()) { write ( "Closing " + element.toString() + " while no open elements are left." ); } else { ExpandedName name = (ExpandedName) elements.pop(); if (!name.equals(element)) { write ( "Closing " + element.toString() + " while expecting " + name.toString() + "." ); } } indent -= 2; write(""); super.endElement(namespaceURI, localName, qName); } private void openWriter() throws SAXException { if (out == null) { try { out = new PrintStream(new FileOutputStream(file)); } catch (IOException e) { throw new SAXException(e); } } } public void startDocument() throws SAXException { openWriter(); super.startDocument(); } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { openWriter(); ExpandedName name = new ExpandedName(namespaceURI, localName); write("<" + name.toString() + ">"); indent += 2; elements.push(name); super.startElement(namespaceURI, localName, qName, atts); } private void write(String s) { if (indent > 0) { char[] c = new char[indent]; Arrays.fill(c, ' '); out.print(c); } out.println(s); out.flush(); } } // BalanceChecker css2xslfo/src/be/re/xml/sax/ErrorHandler.java0000644000175000017500000000211611434532512022134 0ustar mithrandimithrandipackage be.re.xml.sax; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class ErrorHandler implements org.xml.sax.ErrorHandler { private boolean warnings; public ErrorHandler() { this(false); } public ErrorHandler(boolean warnings) { this.warnings = warnings; } public void error(SAXParseException exception) throws SAXException { System.err.println("Error: " + getMessage(exception)); } public void fatalError(SAXParseException exception) throws SAXException { System.err.println("Fatal error: " + getMessage(exception)); } private String getMessage(SAXParseException e) { return (e.getPublicId() != null ? (e.getPublicId() + ": ") : "") + (e.getSystemId() != null ? (e.getSystemId() + ": ") : "") + "Line " + String.valueOf(e.getLineNumber()) + ": " + e.getMessage(); } public void warning(SAXParseException exception) throws SAXException { if (warnings) { System.err.println("Warning: " + getMessage(exception)); } } } // ErrorHandler css2xslfo/src/be/re/xml/sax/FilterOfFilters.java0000644000175000017500000001433011434532512022611 0ustar mithrandimithrandipackage be.re.xml.sax; import be.re.io.FlushOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.UndeclaredThrowableException; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamResult; import org.xml.sax.ContentHandler; import org.xml.sax.DTDHandler; import org.xml.sax.EntityResolver; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLFilterImpl; /** * The given array of filters is connected into a filter-chain and encapsulated * in this filter, so you can insert the whole in a chain as one filter. The * wiring of the event chains will be interrupted for those filters that don't * implement the corresponding handler interfaces. * @author Werner Donn\u00e9 */ public class FilterOfFilters extends XMLFilterImpl { private XMLFilter first; private XMLFilter last; public FilterOfFilters(XMLFilter[] filters) { this(filters, false); } public FilterOfFilters(XMLFilter[] filters, boolean debug) { setupChain(debug ? addDebug(filters) : filters); } public FilterOfFilters(XMLFilter[] filters, XMLReader parent) { this(filters, false, parent); } public FilterOfFilters(XMLFilter[] filters, boolean debug, XMLReader parent) { setupChain(debug ? addDebug(filters) : filters); setParent(parent); } private XMLFilter[] addDebug(XMLFilter[] filters) { XMLFilter[] result = new XMLFilter[filters.length * 2 + 1]; result[0] = new Tee ( new ContentHandler[] { outputHandler(toString() + "_input.xml") } ); for (int i = 0; i < filters.length; ++i) { result[i * 2 + 1] = filters[i]; result[i * 2 + 2] = new Tee ( new ContentHandler[] { new BalanceChecker ( new File(toString() + "_" + filters[i].toString() + ".balance") ), outputHandler(toString() + "_" + filters[i].toString()) } ); } return result; } public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException { return first != null ? first.getFeature(name) : super.getFeature(name); } public XMLReader getParent() { return first != null ? first.getParent() : super.getParent(); } public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException { return first != null ? first.getProperty(name) : super.getProperty(name); } private static ContentHandler outputHandler(String filename) { try { TransformerHandler handler = Util.newSAXTransformerFactory().newTransformerHandler(); handler.setResult ( new StreamResult(new FlushOutputStream(new FileOutputStream(filename))) ); return handler; } catch (Exception e) { throw new UndeclaredThrowableException(e); } } public void parse(InputSource input) throws IOException, SAXException { if (last != null) { last.parse(input); } else { super.parse(input); } } public void setContentHandler(ContentHandler handler) { if (last != null) { last.setContentHandler(handler); } else { super.setContentHandler(handler); } } public void setDTDHandler(DTDHandler handler) { if (last != null) { last.setDTDHandler(handler); } else { super.setDTDHandler(handler); } } public void setEntityResolver(EntityResolver resolver) { if (last != null) { last.setEntityResolver(resolver); } else { super.setEntityResolver(resolver); } } public void setErrorHandler(ErrorHandler handler) { if (last != null) { last.setErrorHandler(handler); } else { super.setErrorHandler(handler); } } public void setFeature(String name, boolean value) throws SAXNotRecognizedException, SAXNotSupportedException { if (first != null) { first.setFeature(name, value); } else { super.setFeature(name, value); } } public void setParent(XMLReader parent) { if (first != null) { first.setParent(parent); } else { super.setParent(parent); } } public void setProperty(String name, Object value) throws SAXNotRecognizedException, SAXNotSupportedException { if (first != null) { first.setProperty(name, value); } else { super.setProperty(name, value); } } private void setupChain(XMLFilter[] filters) { if (filters.length == 0) { return; } for (int i = filters.length - 1; i > 0; --i) { filters[i].setParent(filters[i - 1]); // The following connections make it work also when this filter is // inserted in a chain that is already running, i.e. for which parse is // already called. if (filters[i] instanceof ContentHandler) { filters[i - 1].setContentHandler((ContentHandler) filters[i]); } if (filters[i] instanceof DTDHandler) { filters[i - 1].setDTDHandler((DTDHandler) filters[i]); } if (filters[i] instanceof EntityResolver) { filters[i - 1].setEntityResolver((EntityResolver) filters[i]); } if (filters[i] instanceof ErrorHandler) { filters[i - 1].setErrorHandler((ErrorHandler) filters[i]); } } first = filters[0]; last = filters[filters.length - 1]; if (first instanceof ContentHandler) { super.setContentHandler((ContentHandler) first); } if (first instanceof DTDHandler) { super.setDTDHandler((DTDHandler) first); } if (first instanceof EntityResolver) { super.setEntityResolver((EntityResolver) first); } if (first instanceof ErrorHandler) { super.setErrorHandler((ErrorHandler) first); } } } // FilterOfFilters css2xslfo/src/be/re/xml/sax/GobbleDocumentEvents.java0000644000175000017500000000113211434532512023620 0ustar mithrandimithrandipackage be.re.xml.sax; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLFilterImpl; /** * Blocks the document events, which is useful for inlining another SAX source * in a SAX result. * @author Werner Donn\u00e9 */ public class GobbleDocumentEvents extends XMLFilterImpl { public GobbleDocumentEvents() { } public GobbleDocumentEvents(XMLReader parent) { super(parent); } public void endDocument() throws SAXException { } public void startDocument() throws SAXException { } } // GobbleDocumentEvents css2xslfo/src/be/re/xml/sax/ProtectEventHandlerFilter.java0000644000175000017500000000311511434532512024633 0ustar mithrandimithrandipackage be.re.xml.sax; import java.io.IOException; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLFilterImpl; /** * If the parent already has an entity resolver on it, it will not be * replaced by this filter. * @author Werner Donn\u00e9 */ public class ProtectEventHandlerFilter extends XMLFilterImpl { private boolean entityResolver; private boolean errorHandler; public ProtectEventHandlerFilter(boolean entityResolver, boolean errorHandler) { this.entityResolver = entityResolver; this.errorHandler = errorHandler; } public ProtectEventHandlerFilter ( boolean entityResolver, boolean errorHandler, XMLReader parent ) { super(parent); this.entityResolver = entityResolver; this.errorHandler = errorHandler; } public void parse(InputSource input) throws IOException, SAXException { if (getParent() != null) { setupParse(); getParent().parse(input); } } public void parse(String systemId) throws IOException, SAXException { if (getParent() != null) { setupParse(); getParent().parse(systemId); } } private void setupParse() { if (!entityResolver || getParent().getEntityResolver() == null) { getParent().setEntityResolver(this); } getParent().setContentHandler(this); getParent().setDTDHandler(this); if (!errorHandler || getParent().getErrorHandler() == null) { getParent().setErrorHandler(this); } } } // ProtectEventHandlerFilter css2xslfo/src/be/re/xml/sax/Tee.java0000644000175000017500000000614711434532512020272 0ustar mithrandimithrandipackage be.re.xml.sax; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLFilterImpl; /** * This XML filter delegates everything to multiple other handlers. * @author Werner Donn\u00e9 */ public class Tee extends XMLFilterImpl { private ContentHandler[] tubes; public Tee(ContentHandler[] tubes) { this.tubes = tubes; } public Tee(ContentHandler[] tubes, XMLReader parent) { super(parent); this.tubes = tubes; } public void characters(char[] ch, int start, int length) throws SAXException { for (int i = 0; i < tubes.length; ++i) { tubes[i].characters(ch, start, length); } super.characters(ch, start, length); } public void endDocument() throws SAXException { for (int i = 0; i < tubes.length; ++i) { tubes[i].endDocument(); } super.endDocument(); } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { for (int i = 0; i < tubes.length; ++i) { tubes[i].endElement(namespaceURI, localName, qName); } super.endElement(namespaceURI, localName, qName); } public void endPrefixMapping(String prefix) throws SAXException { for (int i = 0; i < tubes.length; ++i) { tubes[i].endPrefixMapping(prefix); } super.endPrefixMapping(prefix); } public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { for (int i = 0; i < tubes.length; ++i) { tubes[i].ignorableWhitespace(ch, start, length); } super.ignorableWhitespace(ch, start,length); } public void processingInstruction(String target, String data) throws SAXException { for (int i = 0; i < tubes.length; ++i) { tubes[i].processingInstruction(target, data); } super.processingInstruction(target, data); } public void setDocumentLocator(Locator locator) { for (int i = 0; i < tubes.length; ++i) { tubes[i].setDocumentLocator(locator); } super.setDocumentLocator(locator); } public void skippedEntity(String name) throws SAXException { for (int i = 0; i < tubes.length; ++i) { tubes[i].skippedEntity(name); } super.skippedEntity(name); } public void startDocument() throws SAXException { for (int i = 0; i < tubes.length; ++i) { tubes[i].startDocument(); } super.startDocument(); } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { for (int i = 0; i < tubes.length; ++i) { tubes[i].startElement(namespaceURI, localName, qName, atts); } super.startElement(namespaceURI, localName, qName, atts); } public void startPrefixMapping(String prefix, String uri) throws SAXException { for (int i = 0; i < tubes.length; ++i) { tubes[i].startPrefixMapping(prefix, uri); } super.startPrefixMapping(prefix, uri); } } // Tee css2xslfo/src/be/re/xml/sax/TransformerHandlerFilter.java0000644000175000017500000000156511434532512024522 0ustar mithrandimithrandipackage be.re.xml.sax; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.sax.TransformerHandler; import org.xml.sax.ContentHandler; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLFilterImpl; /** * Wraps a TransformerHandler in a filter. * @author Werner Donn\u00e9 */ public class TransformerHandlerFilter extends XMLFilterImpl { private TransformerHandler handler; public TransformerHandlerFilter(TransformerHandler handler) { this.handler = handler; super.setContentHandler(handler); } public TransformerHandlerFilter(TransformerHandler handler, XMLReader parent) { super(parent); this.handler = handler; super.setContentHandler(handler); } public void setContentHandler(ContentHandler value) { handler.setResult(new SAXResult(value)); } } // TransformerHandlerFilter css2xslfo/src/be/re/xml/sax/Util.java0000644000175000017500000001240411434532512020463 0ustar mithrandimithrandipackage be.re.xml.sax; import be.re.xml.CatalogResolver; import java.net.URL; import java.util.Iterator; import java.util.Map; import java.util.Properties; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.Templates; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.sax.TransformerHandler; import org.xml.sax.SAXException; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; public class Util { public static XMLReader getParser(URL catalog, boolean validating) throws SAXException { try { return getParser(newSAXParserFactory(validating), catalog); } catch (ParserConfigurationException e) { throw new SAXException(e); } } public static XMLReader getParser(SAXParserFactory factory, URL catalog) throws SAXException { try { XMLReader parser = factory.newSAXParser().getXMLReader(); parser.setErrorHandler(new ErrorHandler(false)); if (catalog != null) { CatalogResolver resolver = new CatalogResolver(catalog); parser.setEntityResolver(resolver); trySchemaLocation(parser, resolver); } return parser; } catch (SAXException e) { throw e; } catch (Exception e) { throw new SAXException(e); } } public static SAXParserFactory newSAXParserFactory(boolean validating) throws ParserConfigurationException { try { String className = be.re.util.Util.getSystemProperty("javax.xml.parsers.SAXParserFactory"); SAXParserFactory factory = className != null ? (SAXParserFactory) Class.forName(className).newInstance() : SAXParserFactory.newInstance(); factory.setNamespaceAware(true); factory.setValidating(validating); tryFactoryProperties(factory, validating); return factory; } catch (Exception e) { throw new ParserConfigurationException(e.getMessage()); } } public static SAXTransformerFactory newSAXTransformerFactory() throws TransformerConfigurationException { return (SAXTransformerFactory) be.re.xml.Util.newTransformerFactory(); } public static XMLFilter newTemplatesFilter ( Templates templates, Map parameters, SAXTransformerFactory factory ) throws TransformerConfigurationException { if ( !"net.sf.saxon.PreparedStylesheet".equals(templates.getClass().getName()) ) { return factory. newXMLFilter(new ParameterizableTemplate(templates, parameters)); } XMLFilter result = factory.newXMLFilter(templates); try { be.re.xml.Util.setTransformerParameters ( (Transformer) result.getClass().getMethod("getTransformer", new Class[0]). invoke(result, new Object[0]), parameters ); } catch (Exception e) { throw new TransformerConfigurationException(e); } return result; } public static TransformerHandler newTemplatesHandler ( Templates templates, Map parameters, SAXTransformerFactory factory ) throws TransformerConfigurationException { TransformerHandler result = factory.newTransformerHandler(templates); be.re.xml.Util. setTransformerParameters(result.getTransformer(), parameters); return result; } private static void tryFactoryProperties(SAXParserFactory factory, boolean validating) { try { factory.setFeature ( "http://apache.org/xml/features/validation/schema", validating ); factory.setFeature ( "http://apache.org/xml/features/validation/schema-full-checking", validating ); } catch (Exception e) { } } private static void trySchemaLocation(XMLReader parser, CatalogResolver resolver) { try { String schemaLocation = ""; for ( Iterator i = resolver.getSystemIdentifierMappings().keySet().iterator(); i.hasNext(); ) { String key = (String) i.next(); schemaLocation += key + " " + key + " "; //key + " " + resolver.getSystemIdentifierMappings().get(key) + " "; // The postman always rings twice. } parser.setProperty ( "http://apache.org/xml/properties/schema/external-schemaLocation", schemaLocation ); } catch (Exception e) { } } private static class ParameterizableTemplate implements Templates { private Templates delegate; private Map parameters; private ParameterizableTemplate(Templates delegate, Map parameters) { this.delegate = delegate; this.parameters = parameters; } public Properties getOutputProperties() { return delegate.getOutputProperties(); } public Transformer newTransformer() throws TransformerConfigurationException { Transformer transformer = delegate.newTransformer(); be.re.xml.Util.setTransformerParameters(transformer, parameters); return transformer; } } // ParameterizableTemplate } // Util css2xslfo/src/be/re/xml/Accumulator.java0000644000175000017500000001705611434532512021242 0ustar mithrandimithrandipackage be.re.xml; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Stack; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLFilter; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLFilterImpl; /** * With this class a SAX stream can be accumulated in a DOM document. An * instance of it can be reused. The client must call * startDocument and endDocument. * @author Werner Donn\u00e9 */ public class Accumulator extends XMLFilterImpl { private static final DocumentBuilder documentBuilder = createDocumentBuilder(); private Node currentNode = null; private Document document = null; private Stack prefixMappings = new Stack(); private Result result = null; public Accumulator() { this((Document) null, (Result) null); } public Accumulator(XMLReader parent) { this((Document) null, (Result) null, parent); } public Accumulator(Result result) { this((Document) null, result); } public Accumulator(Result result, XMLReader parent) { this((Document) null, result, parent); } public Accumulator(Document document) { this.document = document; } public Accumulator(Document document, XMLReader parent) { super(parent); this.document = document; } public Accumulator(Document document, Result result) { this.document = document; this.result = result; } public Accumulator(Document document, Result result, XMLReader parent) { super(parent); this.document = document; this.result = result; } public void characters(char[] ch, int start, int length) throws SAXException { currentNode. appendChild(document.createTextNode(new String(ch, start, length))); } private static DocumentBuilder createDocumentBuilder() { try { return DocumentBuilderFactory.newInstance().newDocumentBuilder(); } catch (Exception e) { throw new RuntimeException(e); } } public void endDocument() throws SAXException { prefixMappings.pop(); currentNode = null; } public void endElement(String namespaceURI, String localName, String qName) throws SAXException { prefixMappings.pop(); currentNode = currentNode.getParentNode(); if (result != null && currentNode == document) { result.report(this); } } public void endPrefixMapping(String prefix) throws SAXException { ((Map) prefixMappings.peek()).remove(prefix); } public Document getDocument() { return document; } public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { } /** * This installs an accumulator after filter. You would call it * in startElement, before you let the event go through. */ public static void postAccumulate(XMLFilter filter, ProcessElement process) throws SAXException { final XMLFilter f = filter; final ContentHandler handler = filter.getContentHandler(); final ProcessElement p = process; Accumulator accumulator = new Accumulator ( documentBuilder.newDocument(), new Result() { public void report(Accumulator accumulator) throws SAXException { f.setContentHandler ( handler != null ? handler : new XMLFilterImpl() ); p.process(accumulator.getDocument().getDocumentElement(), f); accumulator.endDocument(); } } ); filter.setContentHandler(accumulator); accumulator.setParent(filter); accumulator.startDocument(); } /** * This installs an accumulator before filter. You would call it * in startElement, and initialize it with the incoming event, * which you don't let go through. */ public static void preAccumulate ( String namespaceURI, String localName, String qName, Attributes atts, XMLFilter filter, ProcessElement process ) throws SAXException { if (filter.getParent() == null) { return; } final XMLFilter f = filter; final ContentHandler handler = filter.getParent().getContentHandler(); final ProcessElement p = process; Accumulator accumulator = new Accumulator ( documentBuilder.newDocument(), new Result() { public void report(Accumulator accumulator) throws SAXException { p.process(accumulator.getDocument().getDocumentElement(), f); accumulator.endDocument(); f.getParent().setContentHandler(handler); } } ); filter.getParent().setContentHandler(accumulator); accumulator.setParent(filter.getParent()); accumulator.startDocument(); accumulator.startElement(namespaceURI, localName, qName, atts); } public void processingInstruction(String target, String data) throws SAXException { currentNode.appendChild(document.createProcessingInstruction(target, data)); } public void setDocumentLocator(Locator locator) { } private static void setAttributes(Element element, Attributes atts) { for (int i = 0; i < atts.getLength(); ++i) { if (atts.getURI(i) == null || "".equals(atts.getURI(i))) { element.setAttribute(atts.getQName(i), atts.getValue(i)); } else { element. setAttributeNS(atts.getURI(i), atts.getQName(i), atts.getValue(i)); } } } private static void setPrefixMappings(Element element, Map mappings) { for (Iterator i = mappings.keySet().iterator(); i.hasNext();) { String prefix = (String) i.next(); element.setAttribute ( "".equals(prefix) ? "xmlns" : ("xmlns:" + prefix), (String) mappings.get(prefix) ); } } public void skippedEntity(String name) throws SAXException { } public void startDocument() throws SAXException { if (document == null) { try { document = documentBuilder.newDocument(); } catch (Exception e) { throw new SAXException(e); } } else { if (document.getDocumentElement() != null) { document.removeChild(document.getDocumentElement()); } } currentNode = document; prefixMappings.push(new HashMap()); } public void startElement ( String namespaceURI, String localName, String qName, Attributes atts ) throws SAXException { Element element = document. createElementNS("".equals(namespaceURI) ? null : namespaceURI, qName); setAttributes(element, atts); setPrefixMappings(element, (Map) prefixMappings.peek()); prefixMappings.push(new HashMap()); currentNode.appendChild(element); currentNode = element; } public void startPrefixMapping(String prefix, String uri) throws SAXException { ((Map) prefixMappings.peek()).put(prefix, uri); } public interface ProcessElement { public void process (Element element, XMLFilter filter) throws SAXException; } // ProcessElement public interface Result { public void report (Accumulator accumulator) throws SAXException; } } // Accumulator css2xslfo/src/be/re/xml/CatalogResolver.java0000644000175000017500000001760311434532512022055 0ustar mithrandimithrandipackage be.re.xml; import be.re.io.StreamConnector; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; import javax.xml.stream.XMLResolver; import javax.xml.stream.XMLStreamException; import javax.xml.transform.stream.StreamSource; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; /** * This entity resolver uses a catalog as defined by SGML Open Technical * Resolution TR9401:1997. Only PUBLIC and SYSTEM statements are supported at * this time. Relative URLs are resolved using the catalog URL as the base URL. * @author Werner Donn\u00e9 */ public class CatalogResolver implements EntityResolver, XMLResolver { // Alphabet. final static int SINGLE_QUOTE = 0; final static int DOUBLE_QUOTE = 1; final static int OTHER = 2; final static int SPACE = 3; final static int WHITE = 4; final static int EOF = 5; // States. final static int TYP = 0; final static int SQ1 = 1; final static int DQ1 = 2; final static int ID1 = 3; final static int SQ2 = 4; final static int DQ2 = 5; final static int ERR = 6; final static int[][][] FSM = { {{SQ1, 1}, {DQ1, 1}, {TYP, 0}, {TYP, 0}, {TYP, 0}, {TYP, 0}}, // TYP {{ID1, 1}, {SQ1, 0}, {SQ1, 0}, {SQ1, 0}, {ERR, 0}, {ERR, 0}}, // SQ1 {{DQ1, 0}, {ID1, 1}, {DQ1, 0}, {DQ1, 0}, {ERR, 0}, {ERR, 0}}, // DQ1 {{SQ2, 1}, {DQ2, 1}, {ERR, 0}, {ID1, 0}, {ID1, 0}, {ERR, 0}}, // ID1 {{TYP, 1}, {SQ2, 0}, {SQ2, 0}, {SQ2, 0}, {ERR, 0}, {ERR, 0}}, // SQ2 {{DQ2, 0}, {TYP, 1}, {DQ2, 0}, {DQ2, 0}, {ERR, 0}, {ERR, 0}} // DQ2 }; private String catalogSystemId; private Map publicIdentifiers = new HashMap(); private Map systemIdentifiers = new HashMap(); public CatalogResolver(URL catalogUrl) throws IOException { this(catalogUrl.toString(), null); } public CatalogResolver(String catalogSystemId) throws IOException { this(catalogSystemId, null); } public CatalogResolver(URL catalogUrl, InputStream in) throws IOException { this(catalogUrl.toString(), in); } public CatalogResolver(String catalogSystemId, InputStream in) throws IOException { this.catalogSystemId = catalogSystemId; load ( in != null ? in : ( isUrl(catalogSystemId) ? new URL(catalogSystemId).openStream() : new FileInputStream(catalogSystemId) ) ); } private static int category(int c) { return c == '\'' ? SINGLE_QUOTE : ( c == '\"' ? DOUBLE_QUOTE : ( c == ' ' ? SPACE : ( c == '\t' || c == '\n' || c == '\r' ? WHITE : OTHER ) ) ); } private static void error(int in, int line) throws IOException { if (in == EOF) { throw new IOException ( "Line " + String.valueOf(line) + ": premature end of file" ); } if (in == WHITE) { throw new IOException ( "Line " + String.valueOf(line) + ": \\t, \\n and \\r are not allowed in an identifier" ); } if (in == OTHER) { throw new IOException ( "Line " + String.valueOf(line) + ": white space expected" ); } } /** * Returns a map from the public identifiers to the resolved URLs. */ public Map getPublicIdentifierMappings() { return publicIdentifiers; } /** * Returns a map from the public identifiers to the resolved URLs. */ public Map getSystemIdentifierMappings() { return systemIdentifiers; } private static String getTypeToken(char[] c, int off, int len, int line) throws IOException { StringTokenizer tokenizer = new StringTokenizer(new String(c, off, len), " \t\n\r"); if (!tokenizer.hasMoreTokens()) { throw new IOException ( "Line " + String.valueOf(line) + ": PUBLIC or SYSTEM expected" ); } String token = tokenizer.nextToken(); if (!token.equals("PUBLIC") && !token.equals("SYSTEM")) { throw new IOException ( "Line " + String.valueOf(line) + ": PUBLIC or SYSTEM expected" ); } return token; } private static boolean isUrl(String s) { try { return s != null && new URL(s) != null; } catch (MalformedURLException e) { return false; } } private void load(InputStream in) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); StreamConnector.copy(in, out); char[] c = new String(out.toByteArray(), "ASCII").toCharArray(); String from = null; int line = 1; int position = 0; int state = TYP; String type = null; for (int i = 0; i < c.length; ++i) { int[] next = FSM[state][category(c[i])]; if (next[0] == ERR) { error(category(c[i]), line); } if (next[1] == 1) { Map map; switch (state) { case TYP: type = getTypeToken(c, position, i - position, line); break; case SQ1: case DQ1: from = new String(c, position, i - position); break; case SQ2: case DQ2: map = type.equals("PUBLIC") ? publicIdentifiers : systemIdentifiers; map.put ( from, resolveSystemId ( catalogSystemId, new String(c, position, i - position) ) ); break; } position = i + 1; } state = next[0]; if (c[i] == '\n') { ++line; } } if (FSM[state][EOF][0] == ERR) { error(EOF, line); } } public InputSource resolveEntity(String publicId, String systemId) throws IOException, SAXException { InputSource result = publicId != null && publicIdentifiers.get(publicId) != null ? new InputSource(publicIdentifiers.get(publicId).toString()) : ( systemId != null && systemIdentifiers.get(systemId) != null ? new InputSource(systemIdentifiers.get(systemId).toString()) : null ); if (result != null) { result.setPublicId(publicId); } return result; } public Object resolveEntity ( String publicId, String systemId, String baseURI, String namespace ) throws XMLStreamException { try { StreamSource result = new StreamSource ( publicId != null && publicIdentifiers.get(publicId) != null ? publicIdentifiers.get(publicId).toString() : ( systemId != null && systemIdentifiers.get(systemId) != null ? systemIdentifiers.get(systemId).toString() : ( baseURI != null && systemId != null ? resolveSystemId(baseURI, systemId) : null ) ) ); result.setPublicId(publicId); return result; } catch (IOException e) { throw new XMLStreamException(e); } } private static String resolveSystemId(String baseURI, String systemId) throws IOException { return isUrl(baseURI) ? new URL(new URL(baseURI), systemId).toString() : ( systemId.charAt(0) == '/' ? systemId : ( baseURI.charAt(baseURI.length() - 1) == '/' ? (baseURI + systemId) : (baseURI.substring(0, baseURI.lastIndexOf('/') + 1) + systemId) ) ); } } // CatalogResolver css2xslfo/src/be/re/xml/DOMToContentHandler.java0000644000175000017500000001425211434532512022531 0ustar mithrandimithrandipackage be.re.xml; import java.util.ArrayList; import java.util.List; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.SAXException; import org.xml.sax.XMLFilter; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.XMLFilterImpl; /** * With this class a DOM document can be fed into a SAX chain. * @author Werner Donn\u00e9 */ public class DOMToContentHandler { /** * Extracts the attributes of an element for use in a SAX-environment. It * leaves out namespace declarations, which are emitted as events. */ public static Attributes createAttributes(Element element) { AttributesImpl attributes = new AttributesImpl(); NamedNodeMap map = element.getAttributes(); for (int i = 0; i < map.getLength(); ++i) { Attr attribute = (Attr) map.item(i); if (attribute.getNamespaceURI() != null) { attributes.addAttribute ( attribute.getNamespaceURI(), attribute.getLocalName(), attribute.getPrefix() != null ? (attribute.getPrefix() + ":" + attribute.getLocalName()) : attribute.getLocalName(), "CDATA", attribute.getValue() ); } else { if ( !"xmlns".equals(attribute.getName()) && !attribute.getName().startsWith("xmlns:") ) { attributes.addAttribute ( "", attribute.getName(), attribute.getName(), "CDATA", attribute.getValue() ); } } } return attributes; } /** * Runs a complete DOM-document through a ContentHandler. */ public static void documentToContentHandler(Document document, ContentHandler handler) throws SAXException { XMLFilterImpl h = realHandler(handler); h.startDocument(); elementToContentHandler(document.getDocumentElement(), h); h.endDocument(); } /** * Runs a complete DOM-element through a ContentHandler. */ public static void elementToContentHandler(Element element, ContentHandler handler) throws SAXException { elementToContentHandler(element, realHandler(handler)); } private static void elementToContentHandler(Element element, XMLFilterImpl handler) throws SAXException { String[] prefixes = startPrefixMappings(element, handler); startElement(element, handler); siblingsToContentHandler(element.getFirstChild(), handler); endElement(element, handler); for (int i = prefixes.length - 1; i >= 0; --i) { handler.endPrefixMapping(prefixes[i]); } } public static void endElement(Element element, ContentHandler handler) throws SAXException { if (element.getNamespaceURI() != null) { handler.endElement ( element.getNamespaceURI(), element.getLocalName(), element.getPrefix() != null ? (element.getPrefix() + ":" + element.getLocalName()) : element.getLocalName() ); } else { handler.endElement("", element.getTagName(), element.getTagName()); } } /** * Puts an XMLFilterImpl in front of handler in * order to provide the possiblity to the latter to insert an * Accumulator dynamically. */ private static XMLFilterImpl realHandler(ContentHandler handler) { XMLFilterImpl result = new XMLFilterImpl(); result.setContentHandler(handler); if (handler instanceof XMLFilter) { ((XMLFilter) handler).setParent(result); } return result; } /** * Runs a complete sibling list through a ContentHandler * starting with node. */ public static void siblingsToContentHandler(Node node, ContentHandler handler) throws SAXException { siblingsToContentHandler(node, realHandler(handler)); } private static void siblingsToContentHandler(Node node, XMLFilterImpl handler) throws SAXException { if (node == null) { return; } switch (node.getNodeType()) { case Node.ELEMENT_NODE: elementToContentHandler((Element) node, handler); break; case Node.PROCESSING_INSTRUCTION_NODE: handler.processingInstruction ( ((ProcessingInstruction) node).getTarget(), ((ProcessingInstruction) node).getData() ); break; case Node.TEXT_NODE: { char[] chars = ((Text) node).getData().toCharArray(); handler.characters(chars, 0, chars.length); } break; } siblingsToContentHandler(node.getNextSibling(), handler); } public static void startElement(Element element, ContentHandler handler) throws SAXException { if (element.getNamespaceURI() != null) { handler.startElement ( element.getNamespaceURI(), element.getLocalName(), element.getPrefix() != null ? (element.getPrefix() + ":" + element.getLocalName()) : element.getLocalName(), createAttributes(element) ); } else { handler.startElement ( "", element.getTagName(), element.getTagName(), createAttributes(element) ); } } private static String[] startPrefixMappings(Element element, ContentHandler handler) throws SAXException { NamedNodeMap map = element.getAttributes(); List result = new ArrayList(); for (int i = 0; i < map.getLength(); ++i) { Attr attribute = (Attr) map.item(i); String name = attribute.getName(); if (name.startsWith("xmlns")) { String prefix = name.startsWith("xmlns:") ? name.substring(name.indexOf(':') + 1) : ""; result.add(prefix); handler.startPrefixMapping(prefix, attribute.getValue()); } } return (String[]) result.toArray(new String[result.size()]); } } // DOMToContentHandler css2xslfo/src/be/re/xml/ExpandedName.java0000644000175000017500000000230511434532512021303 0ustar mithrandimithrandipackage be.re.xml; import javax.xml.namespace.QName; import org.w3c.dom.Node; /** * A struct to represent the expanded name of an element. * @author Werner Donn\u00e9 */ public class ExpandedName { public String localName; /** * The empty string or null indicates absence of a namespace. */ public String namespaceURI; public ExpandedName(String namespaceURI, String localName) { this.namespaceURI = namespaceURI == null ? "" : namespaceURI; this.localName = localName; } public ExpandedName(QName name) { this(name.getNamespaceURI(), name.getLocalPart()); } public ExpandedName(Node node) { this(node.getNamespaceURI(), node.getLocalName()); } public boolean equals(Object o) { return o instanceof ExpandedName && namespaceURI.equals(((ExpandedName) o).namespaceURI) && localName.equals(((ExpandedName) o).localName); } public int hashCode() { return toString().hashCode(); } public boolean noNamespace() { return namespaceURI == null || namespaceURI.equals(""); } public String toString() { return namespaceURI + "#" + localName; } } // ExpandedName css2xslfo/src/be/re/xml/Util.java0000644000175000017500000006347511434532512017706 0ustar mithrandimithrandipackage be.re.xml; import be.re.xml.sax.ErrorHandler; import be.re.util.Equal; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.Comment; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.AttributeList; import org.xml.sax.DocumentHandler; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributeListImpl; /** * This class is a collection of untility functions. * @author Werner Donn\u00e9 */ public class Util { private static DocumentBuilderFactory nonValidatingFactory; private static final Equal elementSelector = new Equal() { public boolean equal(Object object, Object refData) { return object instanceof Element; } }; private static final Equal nameSelector = new Equal() { public boolean equal(Object object, Object refData) { return ((Node) object).getNodeName().equals((String) refData); } }; private static final Equal qnameSelector = new Equal() { public boolean equal(Object object, Object refData) { return ( ((ExpandedName) refData).localName == null || ((ExpandedName) refData).localName. equals(((Node) object).getLocalName()) ) && ( ((ExpandedName) refData).namespaceURI. equals(((Node) object).getNamespaceURI()) || ( "".equals(((ExpandedName) refData).namespaceURI) && ((Node) object).getNamespaceURI() == null ) ); } }; private static TransformerFactory transformerFactory; private static DocumentBuilderFactory validatingFactory; public static Node clearNode(Node node) { while (node.hasChildNodes()) { node.removeChild(node.getFirstChild()); } return node; } private static void collectChild(Node node, List children) { if (node != null) { children.add(node); collectChild(node.getNextSibling(), children); } } /** * Returns all child nodes of a node as an array. */ public static Node[] collectChildren(Node node) { List children = new ArrayList(); collectChild(node.getFirstChild(), children); return (Node[]) children.toArray(new Node[children.size()]); } public static Node copy(Node node, Document owner) { if (node == null) { return null; } Node result = null; switch (node.getNodeType()) { case Node.ATTRIBUTE_NODE: result = copyAttribute((Attr) node, owner); break; case Node.CDATA_SECTION_NODE: result = owner.createCDATASection(((CDATASection) node).getData()); break; case Node.COMMENT_NODE: result = owner.createComment(((Comment) node).getData()); break; case Node.DOCUMENT_FRAGMENT_NODE: result = owner.createDocumentFragment(); break; case Node.ELEMENT_NODE: result = copyElement((Element) node, owner); break; case Node.ENTITY_REFERENCE_NODE: result = owner.createEntityReference(node.getNodeName()); break; case Node.PROCESSING_INSTRUCTION_NODE: result = owner.createProcessingInstruction ( ((ProcessingInstruction) node).getTarget(), ((ProcessingInstruction) node).getData() ); break; case Node.TEXT_NODE: result = owner.createTextNode(((Text) node).getData()); break; } if (result != null) { for (Node i = node.getFirstChild(); i != null; i = i.getNextSibling()) { result.appendChild(copy(i, owner)); } } return result; } private static Node copyAttribute(Attr attribute, Document owner) { Attr result = attribute.getNamespaceURI() != null ? owner. createAttributeNS(attribute.getNamespaceURI(), attribute.getName()) : owner.createAttribute(attribute.getName()); result.setValue(attribute.getValue()); return result; } private static Node copyElement(Element element, Document owner) { NamedNodeMap attributes = element.getAttributes(); Element result = element.getNamespaceURI() != null ? owner.createElementNS(element.getNamespaceURI(), element.getTagName()) : owner.createElement(element.getTagName()); for (int i = 0; i < attributes.getLength(); ++i) { Attr attribute = (Attr) copy(attributes.item(i), owner); if (attribute.getNamespaceURI() != null) { result.setAttributeNodeNS(attribute); // Why does this method exist? } else { result.setAttributeNode(attribute); } } return result; } /** * Extracts the attributes of an element for use in a SAX-environment. */ public static AttributeList createAttributeList(Element element) { AttributeListImpl attributes = new AttributeListImpl(); NamedNodeMap map = element.getAttributes(); for (int i = 0; i < map.getLength(); ++i) { Attr attribute = (Attr) map.item(i); attributes. addAttribute(attribute.getName(), "CDATA", attribute.getValue()); } return attributes; } /** * Runs a complete DOM-element through a DocumentHandler. */ public static void elementToDocumentHandler(Element element, DocumentHandler handler) throws SAXException { handler.startElement(element.getTagName(), createAttributeList(element)); elementToDocumentHandlerChild(element.getFirstChild(), handler); handler.endElement(element.getTagName()); } private static void elementToDocumentHandlerChild(Node node, DocumentHandler handler) throws SAXException { if (node == null) { return; } switch (node.getNodeType()) { case Node.ELEMENT_NODE: elementToDocumentHandler((Element) node, handler); break; case Node.PROCESSING_INSTRUCTION_NODE: processingInstructionToDocumentHandler ( (ProcessingInstruction) node, handler ); break; case Node.TEXT_NODE: textToDocumentHandler((Text) node, handler); break; } elementToDocumentHandlerChild(node.getNextSibling(), handler); } public static String escapeText(String value) { return escapeText(value, true); } public static String escapeText(String value, boolean minimum) { StringBuffer buffer = new StringBuffer((int) (value.length() * 1.1)); for (int i = 0; i < value.length(); ++i) { if (value.charAt(i) == '&') { buffer.append("&"); } else { if (value.charAt(i) == '\'' && !minimum) { buffer.append("'"); } else { if (value.charAt(i) == '>' && !minimum) { buffer.append(">"); } else { if (value.charAt(i) == '<') { buffer.append("<"); } else { if (value.charAt(i) == '"' && !minimum) { buffer.append("""); } else { buffer.append(value.charAt(i)); } } } } } } return buffer.toString(); } /** * Searches the ancestor chain of a node for a node called * name. If no such node is found null is returned. */ public static Node findAncestor(Node node, String name) { return node == null ? null : ( node.getNodeName().equalsIgnoreCase(name) ? node : findAncestor(node.getParentNode(), name) ); } /** * Does the same as findAncestor except that the search stops * when a node called limitingElement is encountered. * @see #findAncestor */ public static Node findAncestorNotBeyond(Node node, String name, String limitingElement) { return node == null ? null : ( node.getNodeName().equalsIgnoreCase(name) ? node : ( node.getNodeName().equalsIgnoreCase(limitingElement) ? null : findAncestorNotBeyond ( node.getParentNode(), name, limitingElement ) ) ); } public static DocumentBuilder getDocumentBuilder(URL catalog, boolean validating) throws IOException, ParserConfigurationException { return getDocumentBuilder(newDocumentBuilderFactory(validating), catalog); } public static DocumentBuilder getDocumentBuilder(DocumentBuilderFactory factory, URL catalog) throws IOException, ParserConfigurationException { DocumentBuilder result = factory.newDocumentBuilder(); result.setErrorHandler(new ErrorHandler(false)); if (catalog != null) { result.setEntityResolver(new CatalogResolver(catalog)); } return result; } public static DocumentBuilderFactory getDocumentBuilderFactory(boolean validating) throws ParserConfigurationException { if (validating && validatingFactory != null) { return validatingFactory; } if (!validating && nonValidatingFactory != null) { return nonValidatingFactory; } DocumentBuilderFactory factory = newDocumentBuilderFactory(validating); if (validating) { validatingFactory = factory; } else { nonValidatingFactory = factory; } return factory; } public static Element getNextSiblingElement(Node node, String namespaceURI, String localName) { if (node == null) { return null; } return node instanceof Element && new ExpandedName(node.getNamespaceURI(), node.getLocalName()). equals(new ExpandedName(namespaceURI, localName)) ? (Element) node : getNextSiblingElement(node.getNextSibling(), namespaceURI, localName); } public static Element getPreviousSiblingElement(Node node, String namespaceURI, String localName) { if (node == null) { return null; } return node instanceof Element && new ExpandedName(node.getNamespaceURI(), node.getLocalName()). equals(new ExpandedName(namespaceURI, localName)) ? (Element) node : getPreviousSiblingElement ( node.getPreviousSibling(), namespaceURI, localName ); } public static QName getQName(Node node) { return node.getPrefix() != null ? new QName ( node.getNamespaceURI(), node.getLocalName(), node.getPrefix() ) : ( node.getNamespaceURI() != null ? new QName(node.getNamespaceURI(), node.getLocalName()) : new QName(node.getLocalName()) ); } /** * Assumes pure #PCDATA, no mixed content. */ public static String getText(Node node) { if (node == null) { return null; } NodeList list = node.getChildNodes(); int position = 0; int size = getTextSize(list); char[] array = new char[size]; for (int i = 0; i < list.getLength(); ++i) { if (list.item(i) instanceof Text) { char[] chars = ((Text) list.item(i)).getData().toCharArray(); System.arraycopy(chars, 0, array, position, chars.length); position += chars.length; } } return new String(array); } private static int getTextSize(NodeList list) { int result = 0; for (int i = 0; i < list.getLength(); ++i) { if (list.item(i) instanceof Text) { result += ((Text) list.item(i)).getLength(); } } return result; } public static TransformerFactory getTransformerFactory() throws TransformerConfigurationException { if (transformerFactory == null) { transformerFactory = newTransformerFactory(); } return transformerFactory; } private static boolean isWhiteSpace(String s) { for (int i = 0; i < s.length(); ++i) { if (!Character.isWhitespace(s.charAt(i))) { return false; } } return true; } public static boolean isXml(String mimeType) { mimeType = stripMimeTypeParameters(mimeType).toLowerCase(); return "text/xml".equals(mimeType) || "application/xml".equals(mimeType) || mimeType.endsWith("+xml"); } public static boolean isXmlChar(char c) { return c == 0x9 || c == 0xa || c == 0xd || (c >= 0x20 && c <= 0xd7ff) || (c >= 0xe000 && c <= 0xfffd); } public static boolean isXmlText(String s) { return isXmlText(s.toCharArray()); } public static boolean isXmlText(char[] c) { for (int i = 0; i < c.length; ++i) { if (!isXmlChar(c[i])) { return false; } } return true; } public static DocumentBuilderFactory newDocumentBuilderFactory(boolean validating) throws ParserConfigurationException { try { String className = be.re.util.Util. getSystemProperty("javax.xml.parsers.DocumentBuilderFactory"); DocumentBuilderFactory factory = className != null ? (DocumentBuilderFactory) Class.forName(className).newInstance() : DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); factory.setValidating(validating); return factory; } catch (Exception e) { throw new ParserConfigurationException(e.getMessage()); } } public static TransformerFactory newTransformerFactory() throws TransformerConfigurationException { try { String className = be.re.util.Util. getSystemProperty("javax.xml.transform.TransformerFactory"); return className != null ? (TransformerFactory) Class.forName(className).newInstance() : TransformerFactory.newInstance(); } catch (Exception e) { throw new TransformerConfigurationException(e); } } /** * Passes a DOM-processing-instruction to a DocumentHandler. */ public static void processingInstructionToDocumentHandler ( ProcessingInstruction processingInstruction, DocumentHandler handler ) throws SAXException { handler.processingInstruction ( processingInstruction.getTarget(), processingInstruction.getData() ); } public static void removeChildren(Node node) { while (node.hasChildNodes()) { node.removeChild(node.getLastChild()); } } public static void removeIgnorableSpace(Element element) { element.normalize(); removeIgnorableSpace(element.getFirstChild()); } private static void removeIgnorableSpace(Node node) { if (node == null) { return; } removeIgnorableSpace(node.getNextSibling()); removeIgnorableSpace(node.getFirstChild()); if (node instanceof Text && isWhiteSpace(((Text) node).getData())) { node.getParentNode().removeChild(node); } } private static void selectChild(Node node, Equal equal, Object refData, List children) { if (node != null) { if (equal.equal(node, refData)) { children.add(node); } selectChild(node.getNextSibling(), equal, refData, children); } } private static void selectChildNotBeyond ( Node node, Equal equal, Object refData, Equal equalLimit, Object refDataLimit, List children ) { if (node != null) { if (equal.equal(node, refData)) { children.add(node); } if (!equalLimit.equal(node, refDataLimit)) { selectChildNotBeyond ( node.getNextSibling(), equal, refData, equalLimit, refDataLimit, children ); } } } /** * Returns all direct child nodes of node that meet the * condition expressed by equal and refData. * @see be.re.util.Equal */ public static Node[] selectChildren(Node node, Equal equal, Object refData) { List children = new ArrayList(); selectChild(node.getFirstChild(), equal, refData, children); return (Node[]) children.toArray(new Node[children.size()]); } /** * Returns all direct child nodes of node called * name. */ public static Node[] selectChildren(Node node, String name) { return selectChildren(node, nameSelector, name); } /** * Returns all direct child nodes of node with namespace * namespaceURI and local name localName. * localName may be null; */ public static Node[] selectChildren(Node node, String namespaceURI, String localName) { return selectChildren ( node, qnameSelector, new ExpandedName(namespaceURI, localName) ); } /** * Returns all direct child nodes of node that meet the * condition expressed by equal and refData. The * search stops if a node meeting the condition expressed by * equalLimit and refDataLimit is encountered. * @see be.re.util.Equal */ public static Node[] selectChildrenNotBeyond ( Node node, Equal equal, Object refData, Equal equalLimit, Object refDataLimit ) { List children = new ArrayList(); selectChildNotBeyond ( node.getFirstChild(), equal, refData, equalLimit, refDataLimit, children ); return (Node[]) children.toArray(new Node[children.size()]); } /** * Returns all direct child nodes of node called * name. The search stops is a node called limit is * encountered. */ public static Node[] selectChildrenNotBeyond(Node node, String name, String limit) { return selectChildrenNotBeyond(node, nameSelector, name, nameSelector, limit); } /** * Returns an element if there is exactly one that matches and * null otherwise. */ public static Element selectElement(Node node, ExpandedName[] path) { List result = new ArrayList(); selectElements(node, path, 0, result); return result.size() == 1 ? (Element) result.get(0) : null; } public static Element[] selectElements(Node node) { List children = new ArrayList(); selectChild(node.getFirstChild(), elementSelector, null, children); return (Element[]) children.toArray(new Element[children.size()]); } /** * Returns all elements that match the path. */ public static Element[] selectElements(Node node, ExpandedName[] path) { List result = new ArrayList(); selectElements(node, path, 0, result); return (Element[]) result.toArray(new Element[0]); } private static void selectElements(Node node, ExpandedName[] path, int position, List result) { if (position == path.length) { return; } Node[] children = selectChildren ( node, path[position].namespaceURI, path[position].localName ); for (int i = 0; i < children.length; ++i) { if (position < path.length - 1) { selectElements(children[i], path, position + 1, result); } else { result.add((Element) children[i]); } } } /** * Returns the first direct child of node that meets the * condition expressed by equal and refData. * @see be.re.util.Equal */ public static Node selectFirstChild(Node node, Equal equal, Object refData) { return node == null ? null : selectNextSiblingSibling(node.getFirstChild(), equal, refData); } /** * Returns the first direct child of node called * name. */ public static Node selectFirstChild(Node node, String name) { return selectFirstChild(node, nameSelector, name); } /** * Returns the first direct child of node with namespace * namespaceURI and local name localName. */ public static Node selectFirstChild(Node node, String namespaceURI, String localName) { return selectFirstChild ( node, qnameSelector, new ExpandedName(namespaceURI, localName) ); } /** * Returns the first direct child element of node. */ public static Element selectFirstElement(Node node) { return (Element) selectFirstChild(node, elementSelector, null); } /** * Returns the last direct child of node that meets the * condition expressed by equal and refData. * @see be.re.util.Equal */ public static Node selectLastChild(Node node, Equal equal, Object refData) { return node == null ? null : selectPreviousSiblingSibling(node.getLastChild(), equal, refData); } /** * Returns the last direct child of node called * name. */ public static Node selectLastChild(Node node, String name) { return selectLastChild(node, nameSelector, name); } /** * Returns the last direct child of node with namespace * namespaceURI and local name localName. */ public static Node selectLastChild(Node node, String namespaceURI, String localName) { return selectLastChild ( node, qnameSelector, new ExpandedName(namespaceURI, localName) ); } /** * Returns the next sibling of node that meets the * condition expressed by equal and refData. * @see be.re.util.Equal */ public static Node selectNextSibling(Node node, Equal equal, Object refData) { return node == null ? null : selectNextSiblingSibling(node.getNextSibling(), equal, refData); } /** * Returns the next sibling of node called name. */ public static Node selectNextSibling(Node node, String name) { return selectNextSibling(node, nameSelector, name); } /** * Returns the next sibling of node with namspace * namespaceURI and local name localName. */ public static Node selectNextSibling(Node node, String namespaceURI, String localName) { return selectNextSibling ( node, qnameSelector, new ExpandedName(namespaceURI, localName) ); } private static Node selectNextSiblingSibling(Node node, Equal equal, Object refData) { return node == null ? null : ( equal.equal(node, refData) ? node : selectNextSiblingSibling(node.getNextSibling(), equal, refData) ); } /** * Returns the previous sibling of node that meets the * condition expressed by equal and refData. * @see be.re.util.Equal */ public static Node selectPreviousSibling(Node node, Equal equal, Object refData) { return node == null ? null : selectPreviousSiblingSibling(node.getPreviousSibling(), equal, refData); } /** * Returns the previous sibling of node called name. */ public static Node selectPreviousSibling(Node node, String name) { return selectPreviousSibling(node, nameSelector, name); } /** * Returns the previous sibling of node with namespace * namespaceURI and local name localName. */ public static Node selectPreviousSibling(Node node, String namespaceURI, String localName) { return selectPreviousSibling ( node, qnameSelector, new ExpandedName(namespaceURI, localName) ); } private static Node selectPreviousSiblingSibling(Node node, Equal equal, Object refData) { return node == null ? null : ( equal.equal(node, refData) ? node : selectPreviousSiblingSibling ( node.getPreviousSibling(), equal, refData ) ); } public static void setTransformerParameters(Transformer transformer, Map parameters) { for (Iterator i = parameters.entrySet().iterator(); i.hasNext();) { Map.Entry entry = (Map.Entry) i.next(); transformer. setParameter((String) entry.getKey(), (String) entry.getValue()); } } private static String stripMimeTypeParameters(String mimeType) { int index = mimeType.indexOf(';'); return index != -1 ? mimeType.substring(0, index) : mimeType; } /** * Passes a DOM-text-node to a DocumentHandler. */ public static void textToDocumentHandler(Text text, DocumentHandler handler) throws SAXException { String data = text.getData(); char[] chars = new char[data.length()]; data.getChars(0, chars.length, chars, 0); handler.characters(chars, 0, chars.length); } } // Util css2xslfo/src/xhtml1/0000755000175000017500000000000011434532514015532 5ustar mithrandimithrandicss2xslfo/src/xhtml1/xhtml-lat1.ent0000644000175000017500000002677711434532514020260 0ustar mithrandimithrandi css2xslfo/src/xhtml1/xhtml-special.ent0000644000175000017500000001004311434532514021012 0ustar mithrandimithrandi css2xslfo/src/xhtml1/xhtml-symbol.ent0000644000175000017500000003303011434532514020700 0ustar mithrandimithrandi css2xslfo/src/xhtml1/xhtml1-frameset.dtd0000644000175000017500000010026511434532514021254 0ustar mithrandimithrandi %HTMLlat1; %HTMLsymbol; %HTMLspecial; css2xslfo/src/xhtml1/xhtml1-strict.dtd0000644000175000017500000006160011434532514020755 0ustar mithrandimithrandi %HTMLlat1; %HTMLsymbol; %HTMLspecial; css2xslfo/src/xhtml1/xhtml1-transitional.dtd0000644000175000017500000007655711434532514022175 0ustar mithrandimithrandi %HTMLlat1; %HTMLsymbol; %HTMLspecial; css2xslfo/src/catalog0000644000175000017500000000055311434532512015653 0ustar mithrandimithrandiPUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "xhtml1/xhtml1-strict.dtd" SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" "xhtml1/xhtml1-strict.dtd" PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "xhtml1/xhtml1-transitional.dtd" SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" "xhtml1/xhtml1-transitional.dtd" css2xslfo/build.xml0000644000175000017500000002250011434470542015350 0ustar mithrandimithrandi