Merge lp:~fcole90/ubuntu/precise/python-reportlab/fix-for-1005187 into lp:ubuntu/precise/python-reportlab
- Precise (12.04)
- fix-for-1005187
- Merge into precise
Proposed by
fcole90
Status: | Merged | ||||
---|---|---|---|---|---|
Merge reported by: | Martin Pitt | ||||
Merged at revision: | not available | ||||
Proposed branch: | lp:~fcole90/ubuntu/precise/python-reportlab/fix-for-1005187 | ||||
Merge into: | lp:ubuntu/precise/python-reportlab | ||||
Diff against target: |
24029 lines (+8641/-4994) 195 files modified
CHANGES.txt (+49/-0) PKG-INFO (+1/-1) debian/README.Debian (+1/-1) debian/changelog (+11/-5) debian/control (+2/-2) debian/copyright (+6/-6) debian/rules (+6/-0) demos/colors/colortest.py (+2/-2) demos/gadflypaper/gfe.py (+2/-2) demos/odyssey/dodyssey.py (+2/-2) demos/odyssey/fodyssey.py (+2/-2) demos/odyssey/odyssey.py (+2/-2) demos/stdfonts/stdfonts.py (+2/-2) demos/tests/testdemos.py (+2/-2) docs/reference/genreference.py (+2/-2) docs/reference/reportlab-reference.pdf (+168/-168) docs/userguide/app_demos.py (+1/-1) docs/userguide/ch1_intro.py (+73/-53) docs/userguide/ch2_graphics.py (+8/-9) docs/userguide/ch2a_fonts.py (+1/-1) docs/userguide/ch3_pdffeatures.py (+1/-1) docs/userguide/ch4_platypus_concepts.py (+1/-1) docs/userguide/ch5_paragraphs.py (+1/-1) docs/userguide/ch6_tables.py (+74/-8) docs/userguide/ch7_custom.py (+1/-1) docs/userguide/genuserguide.py (+2/-2) docs/userguide/graph_charts.py (+245/-64) docs/userguide/graph_concepts.py (+2/-2) docs/userguide/graph_intro.py (+2/-2) docs/userguide/graph_shapes.py (+2/-2) docs/userguide/graph_widgets.py (+2/-2) setup.py (+8/-8) src/reportlab/__init__.py (+13/-9) src/reportlab/graphics/__init__.py (+2/-2) src/reportlab/graphics/barcode/__init__.py (+2/-1) src/reportlab/graphics/barcode/eanbc.py (+18/-11) src/reportlab/graphics/barcode/test.py (+4/-0) src/reportlab/graphics/barcode/usps4s.py (+2/-2) src/reportlab/graphics/barcode/widgets.py (+2/-2) src/reportlab/graphics/charts/__init__.py (+2/-2) src/reportlab/graphics/charts/areas.py (+2/-2) src/reportlab/graphics/charts/axes.py (+100/-45) src/reportlab/graphics/charts/barcharts.py (+111/-24) src/reportlab/graphics/charts/doughnut.py (+69/-25) src/reportlab/graphics/charts/legends.py (+2/-2) src/reportlab/graphics/charts/linecharts.py (+2/-2) src/reportlab/graphics/charts/lineplots.py (+36/-13) src/reportlab/graphics/charts/markers.py (+2/-2) src/reportlab/graphics/charts/piecharts.py (+478/-144) src/reportlab/graphics/charts/textlabels.py (+2/-2) src/reportlab/graphics/charts/utils.py (+70/-21) src/reportlab/graphics/renderPDF.py (+11/-5) src/reportlab/graphics/renderPM.py (+28/-19) src/reportlab/graphics/renderPS.py (+10/-5) src/reportlab/graphics/renderSVG.py (+18/-7) src/reportlab/graphics/renderbase.py (+1/-1) src/reportlab/graphics/shapes.py (+83/-5) src/reportlab/graphics/testdrawings.py (+1/-1) src/reportlab/graphics/testshapes.py (+8/-4) src/reportlab/graphics/widgetbase.py (+2/-2) src/reportlab/graphics/widgets/__init__.py (+2/-2) src/reportlab/graphics/widgets/grids.py (+18/-5) src/reportlab/graphics/widgets/markers.py (+2/-2) src/reportlab/graphics/widgets/signsandsymbols.py (+2/-2) src/reportlab/graphics/widgets/table.py (+2/-2) src/reportlab/lib/PyFontify.py (+2/-2) src/reportlab/lib/__init__.py (+2/-2) src/reportlab/lib/abag.py (+2/-2) src/reportlab/lib/arciv.py (+2/-2) src/reportlab/lib/attrmap.py (+2/-2) src/reportlab/lib/boxstuff.py (+2/-2) src/reportlab/lib/codecharts.py (+1/-1) src/reportlab/lib/colors.py (+47/-48) src/reportlab/lib/corp.py (+2/-2) src/reportlab/lib/enums.py (+2/-2) src/reportlab/lib/extformat.py (+2/-2) src/reportlab/lib/fontfinder.py (+2/-2) src/reportlab/lib/fonts.py (+2/-2) src/reportlab/lib/formatters.py (+2/-2) src/reportlab/lib/geomutils.py (+2/-2) src/reportlab/lib/logger.py (+2/-2) src/reportlab/lib/pagesizes.py (+2/-2) src/reportlab/lib/pdfencrypt.py (+2/-2) src/reportlab/lib/pygments2xpre.py (+2/-3) src/reportlab/lib/randomtext.py (+26/-4) src/reportlab/lib/rltempfile.py (+2/-2) src/reportlab/lib/sequencer.py (+10/-2) src/reportlab/lib/set_ops.py (+2/-2) src/reportlab/lib/styles.py (+33/-3) src/reportlab/lib/testutils.py (+2/-2) src/reportlab/lib/textsplit.py (+72/-35) src/reportlab/lib/units.py (+2/-2) src/reportlab/lib/utils.py (+19/-13) src/reportlab/lib/validators.py (+2/-2) src/reportlab/lib/yaml.py (+2/-2) src/reportlab/pdfbase/__init__.py (+2/-2) src/reportlab/pdfbase/_cidfontdata.py (+2/-2) src/reportlab/pdfbase/_fontdata.py (+2/-2) src/reportlab/pdfbase/cidfonts.py (+2/-2) src/reportlab/pdfbase/pdfdoc.py (+174/-7) src/reportlab/pdfbase/pdfmetrics.py (+2/-2) src/reportlab/pdfbase/pdfutils.py (+2/-2) src/reportlab/pdfbase/ttfonts.py (+2/-2) src/reportlab/pdfgen/__init__.py (+2/-2) src/reportlab/pdfgen/canvas.py (+132/-92) src/reportlab/pdfgen/pathobject.py (+49/-22) src/reportlab/pdfgen/pdfgeom.py (+2/-2) src/reportlab/pdfgen/pdfimages.py (+2/-2) src/reportlab/pdfgen/textobject.py (+16/-5) src/reportlab/platypus/__init__.py (+3/-3) src/reportlab/platypus/doctemplate.py (+18/-6) src/reportlab/platypus/figures.py (+2/-2) src/reportlab/platypus/flowables.py (+544/-17) src/reportlab/platypus/frames.py (+11/-5) src/reportlab/platypus/paragraph.py (+167/-53) src/reportlab/platypus/paraparser.py (+32/-2) src/reportlab/platypus/tableofcontents.py (+2/-2) src/reportlab/platypus/tables.py (+106/-41) src/reportlab/platypus/xpreformatted.py (+4/-2) src/reportlab/rl_config.py (+2/-2) src/rl_addons/renderPM/_renderPM.c (+5/-5) src/rl_addons/renderPM/libart_lgpl/art_svp_ops.c (+28/-1) src/rl_addons/renderPM/libart_lgpl/art_vpath_bpath.c (+13/-2) src/rl_addons/rl_accel/_rl_accel.c (+3/-3) tests/__init__.py (+1/-1) tests/runAll.py (+2/-2) tests/test_charts_textlabels.py (+1/-1) tests/test_crypto_algorithms.py (+2/-2) tests/test_docstrings.py (+1/-1) tests/test_encrypt.py (+2/-2) tests/test_geomutils.py (+2/-2) tests/test_graphics_charts.py (+51/-2) tests/test_graphics_images.py (+1/-1) tests/test_graphics_layout.py (+1/-1) tests/test_graphics_speed.py (+2/-2) tests/test_hello.py (+2/-2) tests/test_images.py (+2/-2) tests/test_invariant.py (+2/-2) tests/test_lib_colors.py (+2/-2) tests/test_lib_sequencer.py (+2/-2) tests/test_lib_utils.py (+2/-2) tests/test_multibyte_chs.py (+1/-1) tests/test_multibyte_cht.py (+1/-1) tests/test_multibyte_jpn.py (+1/-1) tests/test_paragraphs.py (+118/-84) tests/test_pdfbase_pdfmetrics.py (+2/-2) tests/test_pdfbase_pdfutils.py (+2/-2) tests/test_pdfbase_postscript.py (+2/-2) tests/test_pdfencryption.py (+1/-1) tests/test_pdfgen_callback.py (+2/-2) tests/test_pdfgen_general.py (+91/-19) tests/test_pdfgen_links.py (+2/-2) tests/test_pdfgen_overprint.py (+2/-2) tests/test_pdfgen_pagemodes.py (+2/-2) tests/test_pdfgen_pycanvas.py (+2/-2) tests/test_platypus_breaking.py (+2/-2) tests/test_platypus_cjk_wrap.py (+101/-0) tests/test_platypus_general.py (+2/-2) tests/test_platypus_indents.py (+2/-2) tests/test_platypus_index.py (+2/-2) tests/test_platypus_leftright.py (+2/-2) tests/test_platypus_lists.py (+106/-0) tests/test_platypus_paragraphs.py (+83/-3) tests/test_platypus_paraparser.py (+1/-1) tests/test_platypus_pleaseturnover.py (+2/-2) tests/test_platypus_preformatted.py (+218/-0) tests/test_platypus_programming.py (+2/-2) tests/test_platypus_tables.py (+22/-3) tests/test_platypus_toc.py (+70/-4) tests/test_platypus_wrapping.py (+104/-0) tests/test_platypus_xref.py (+2/-2) tests/test_pyfiles.py (+2/-2) tests/test_renderSVG.py (+91/-2) tests/test_source_chars.py (+2/-2) tests/test_utils.py (+2/-2) tests/test_widgetbase_tpc.py (+2/-2) tools/__init__.py (+1/-1) tools/docco/__init__.py (+1/-1) tools/docco/codegrab.py (+1/-1) tools/docco/docpy.py (+1/-1) tools/docco/examples.py (+1/-1) tools/docco/graphdocpy.py (+1/-1) tools/docco/reportlab.graphics.pdf (+4108/-3600) tools/docco/rl_doc_utils.py (+4/-3) tools/docco/rltemplate.py (+4/-4) tools/docco/stylesheet.py (+3/-4) tools/docco/t_parse.py (+1/-1) tools/docco/yaml.py (+1/-1) tools/docco/yaml2pdf.py (+1/-1) tools/pythonpoint/__init__.py (+1/-1) tools/pythonpoint/customshapes.py (+2/-2) tools/pythonpoint/pythonpoint.py (+2/-2) tools/pythonpoint/styles/__init__.py (+1/-1) tools/pythonpoint/styles/horrible.py (+2/-2) tools/pythonpoint/styles/modern.py (+2/-2) |
||||
To merge this branch: | bzr merge lp:~fcole90/ubuntu/precise/python-reportlab/fix-for-1005187 | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Dmitry Shachnev | Needs Resubmitting | ||
Ubuntu branches | Pending | ||
Review via email: mp+158774@code.launchpad.net |
Commit message
Description of the change
Fixes bug LP: #1005187, edited the README.Debian to show the correct path in which the examples and documents are.
To post a comment you must log in.
Revision history for this message
Iain Lane (laney) wrote : | # |
I just fixed this up and pushed it to ubuntu:
Revision history for this message
Iain Lane (laney) wrote : | # |
I'd appreciate it if you could forward this to Debian too BTW. See https:/
Revision history for this message
fcole90 (fcole90) wrote : | # |
Ok, forwarded also to debian.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'CHANGES.txt' | |||
2 | --- CHANGES.txt 2010-12-06 12:45:44 +0000 | |||
3 | +++ CHANGES.txt 2013-04-14 00:52:26 +0000 | |||
4 | @@ -8,6 +8,55 @@ | |||
5 | 8 | The contributors lists are in no order and apologies to those accidentally not | 8 | The contributors lists are in no order and apologies to those accidentally not |
6 | 9 | mentioned. If we missed you, please let us know! | 9 | mentioned. If we missed you, please let us know! |
7 | 10 | 10 | ||
8 | 11 | ################################################################################# | ||
9 | 12 | #################### RELEASE 2.6 27/09/2012 ################# | ||
10 | 13 | ################################################################################# | ||
11 | 14 | |||
12 | 15 | This is a minor release focusing mainly on improved documentation. There are a | ||
13 | 16 | number of minor enhancements, and a larger number of previous-undocumented | ||
14 | 17 | enhancements which we have documented better. | ||
15 | 18 | |||
16 | 19 | |||
17 | 20 | ###General changes | ||
18 | 21 | * Manuals have been reformatted with more pleasing code snippets and tables of | ||
19 | 22 | contents, and reviewed and expanded | ||
20 | 23 | |||
21 | 24 | ###Flowing documents (Platypus): | ||
22 | 25 | * Added support for HTML-style list objects | ||
23 | 26 | * Added flexible mechanism for drawing bullets | ||
24 | 27 | * Allowed XPreformatted objects to use Asian line wrapping | ||
25 | 28 | * Added an 'autoNextPageTemplate' attribute to PageTemplates. For example you | ||
26 | 29 | can now set up a 'chapter first page template' which will always be followed | ||
27 | 30 | by a 'continuation template' on the next page break, saving the programmer from | ||
28 | 31 | having to issue control flow commands in the story. | ||
29 | 32 | * added a TopPadder flowable, which will 'wrap' another Flowable and move it | ||
30 | 33 | to the bottom of the current page. | ||
31 | 34 | * More helpful error messages when large tables cannot be rendered | ||
32 | 35 | * Documentation for images within text (test_032_images) | ||
33 | 36 | * Trailing dots for use on contents pages | ||
34 | 37 | |||
35 | 38 | |||
36 | 39 | |||
37 | 40 | ###Charts and graphics: | ||
38 | 41 | * Support for UPCA bar codes | ||
39 | 42 | * We now have a semi-intelligent system for labelling pie charts with | ||
40 | 43 | callout lines. Thanks to James Martin-Collar, a maths student at Warwick | ||
41 | 44 | University, who did this as his summer internship. | ||
42 | 45 | * Axes - added startOffset and endOffset properties; allowed for axis | ||
43 | 46 | background annotations. | ||
44 | 47 | * Bar charts - allow more control of z Index (i.e. drawing order of axes and | ||
45 | 48 | lines) | ||
46 | 49 | * Pie charts - fixed bugs in 3d appearance | ||
47 | 50 | * SVG output back end has seen some bugs fixed and now outputs resizeable SVG | ||
48 | 51 | |||
49 | 52 | ###Contributors: | ||
50 | 53 | * Alex Buck | ||
51 | 54 | * Felix Labrecque <felixl@densi.com> | ||
52 | 55 | * Peter Johnson <johnson.peter@gmail.com> | ||
53 | 56 | * James Martin-Collar | ||
54 | 57 | * Guillaume Francois | ||
55 | 58 | |||
56 | 59 | |||
57 | 11 | 60 | ||
58 | 12 | ################################################################################# | 61 | ################################################################################# |
59 | 13 | #################### RELEASE 2.5 at 18:00 GMT 01/Oct/2010 ################# | 62 | #################### RELEASE 2.5 at 18:00 GMT 01/Oct/2010 ################# |
60 | 14 | 63 | ||
61 | === modified file 'PKG-INFO' | |||
62 | --- PKG-INFO 2010-12-06 12:45:44 +0000 | |||
63 | +++ PKG-INFO 2013-04-14 00:52:26 +0000 | |||
64 | @@ -1,7 +1,7 @@ | |||
65 | 1 | 1 | ||
66 | 2 | Metadata-Version: 1.0 | 2 | Metadata-Version: 1.0 |
67 | 3 | Name: reportlab | 3 | Name: reportlab |
69 | 4 | Version: 2.5 | 4 | Version: 2.6 |
70 | 5 | Summary: The ReportLab Toolkit | 5 | Summary: The ReportLab Toolkit |
71 | 6 | Home-page: http://www.reportlab.com/ | 6 | Home-page: http://www.reportlab.com/ |
72 | 7 | Author: Andy Robinson, Robin Becker, the ReportLab team and the community | 7 | Author: Andy Robinson, Robin Becker, the ReportLab team and the community |
73 | 8 | 8 | ||
74 | === modified file 'debian/README.Debian' | |||
75 | --- debian/README.Debian 2006-02-14 14:38:23 +0000 | |||
76 | +++ debian/README.Debian 2013-04-14 00:52:26 +0000 | |||
77 | @@ -6,7 +6,7 @@ | |||
78 | 6 | Python. | 6 | Python. |
79 | 7 | 7 | ||
80 | 8 | Examples and documentation can be found in the python-reportlab-doc package | 8 | Examples and documentation can be found in the python-reportlab-doc package |
82 | 9 | in /usr/share/doc/python-reportlab-doc. | 9 | in /usr/share/pyshared/reportlab/. |
83 | 10 | 10 | ||
84 | 11 | 11 | ||
85 | 12 | 05/22/2000, | 12 | 05/22/2000, |
86 | 13 | 13 | ||
87 | === modified file 'debian/changelog' | |||
88 | --- debian/changelog 2011-12-31 02:12:00 +0000 | |||
89 | +++ debian/changelog 2013-04-14 00:52:26 +0000 | |||
90 | @@ -1,8 +1,14 @@ | |||
96 | 1 | python-reportlab (2.5-1.1build1) precise; urgency=low | 1 | python-reportlab (2.6-1ubuntu1) precise; urgency=low |
97 | 2 | 2 | ||
98 | 3 | * Rebuild to drop python2.6 dependencies. | 3 | * Edited example and documentation path in README.Debian (LP: #1005187) |
99 | 4 | 4 | ||
100 | 5 | -- Matthias Klose <doko@ubuntu.com> Sat, 31 Dec 2011 02:12:00 +0000 | 5 | -- Fabio Colella <fcole90@gmail.com> Sun, 14 Apr 2013 02:31:26 +0200 |
101 | 6 | |||
102 | 7 | python-reportlab (2.6-1) experimental; urgency=low | ||
103 | 8 | |||
104 | 9 | * New upstream version. | ||
105 | 10 | |||
106 | 11 | -- Matthias Klose <doko@debian.org> Thu, 31 Jan 2013 21:08:28 +0100 | ||
107 | 6 | 12 | ||
108 | 7 | python-reportlab (2.5-1.1) unstable; urgency=low | 13 | python-reportlab (2.5-1.1) unstable; urgency=low |
109 | 8 | 14 | ||
110 | 9 | 15 | ||
111 | === modified file 'debian/control' | |||
112 | --- debian/control 2011-04-16 13:00:22 +0000 | |||
113 | +++ debian/control 2013-04-14 00:52:26 +0000 | |||
114 | @@ -3,7 +3,7 @@ | |||
115 | 3 | Priority: optional | 3 | Priority: optional |
116 | 4 | Maintainer: Matthias Klose <doko@debian.org> | 4 | Maintainer: Matthias Klose <doko@debian.org> |
117 | 5 | Uploaders: Igor Stroh <jenner@debian.org>, Debian Python Modules Team <python-modules-team@lists.alioth.debian.org> | 5 | Uploaders: Igor Stroh <jenner@debian.org>, Debian Python Modules Team <python-modules-team@lists.alioth.debian.org> |
119 | 6 | Standards-Version: 3.9.1 | 6 | Standards-Version: 3.9.4 |
120 | 7 | XS-Python-Version: >= 2.4 | 7 | XS-Python-Version: >= 2.4 |
121 | 8 | Build-Depends: debhelper (>= 5.0.37.1), python-all-dev (>= 2.6.5-9~), python-all-dbg, libart-2.0-dev, libfreetype6-dev, sharutils | 8 | Build-Depends: debhelper (>= 5.0.37.1), python-all-dev (>= 2.6.5-9~), python-all-dbg, libart-2.0-dev, libfreetype6-dev, sharutils |
122 | 9 | Build-Depends-Indep: python-imaging, python-sphinx | 9 | Build-Depends-Indep: python-imaging, python-sphinx |
123 | @@ -37,7 +37,7 @@ | |||
124 | 37 | Package: python-reportlab-doc | 37 | Package: python-reportlab-doc |
125 | 38 | Section: doc | 38 | Section: doc |
126 | 39 | Architecture: all | 39 | Architecture: all |
128 | 40 | Depends: ${misc:Depends} | 40 | Depends: ${misc:Depends}, libjs-underscore |
129 | 41 | Suggests: python-reportlab | 41 | Suggests: python-reportlab |
130 | 42 | Description: Documentation for the ReportLab Python library (PDF format) | 42 | Description: Documentation for the ReportLab Python library (PDF format) |
131 | 43 | ReportLab is a library that lets you directly create documents in | 43 | ReportLab is a library that lets you directly create documents in |
132 | 44 | 44 | ||
133 | === modified file 'debian/copyright' | |||
134 | --- debian/copyright 2010-12-06 12:45:44 +0000 | |||
135 | +++ debian/copyright 2013-04-14 00:52:26 +0000 | |||
136 | @@ -71,7 +71,7 @@ | |||
137 | 71 | * | 71 | * |
138 | 72 | * You should have received a copy of the GNU Lesser General Public | 72 | * You should have received a copy of the GNU Lesser General Public |
139 | 73 | * License along with this library; if not, write to the Free Software | 73 | * License along with this library; if not, write to the Free Software |
141 | 74 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 74 | * if not, see <http://www.gnu.org/licenses/>. |
142 | 75 | */ | 75 | */ |
143 | 76 | 76 | ||
144 | 77 | /* | 77 | /* |
145 | @@ -131,8 +131,8 @@ | |||
146 | 131 | Lesser General Public License for more details. | 131 | Lesser General Public License for more details. |
147 | 132 | 132 | ||
148 | 133 | You should have received a copy of the GNU Lesser General Public | 133 | You should have received a copy of the GNU Lesser General Public |
151 | 134 | License along with this package; if not, write to the Free Software | 134 | License along with this library; if not, write to the Free Software |
152 | 135 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 135 | if not, see <http://www.gnu.org/licenses/>. |
153 | 136 | 136 | ||
154 | 137 | On Debian systems, the complete text of the GNU Lesser General | 137 | On Debian systems, the complete text of the GNU Lesser General |
155 | 138 | Public License can be found in `/usr/share/common-licenses/LGPL'. | 138 | Public License can be found in `/usr/share/common-licenses/LGPL'. |
156 | @@ -152,9 +152,9 @@ | |||
157 | 152 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 152 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
158 | 153 | GNU General Public License for more details. | 153 | GNU General Public License for more details. |
159 | 154 | 154 | ||
163 | 155 | You should have received a copy of the GNU General Public License | 155 | You should have received a copy of the GNU Lesser General Public |
164 | 156 | along with this font; if not, write to the Free Software | 156 | License along with this library; if not, write to the Free Software |
165 | 157 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 157 | if not, see <http://www.gnu.org/licenses/>. |
166 | 158 | 158 | ||
167 | 159 | As a special exception, if you create a document which uses | 159 | As a special exception, if you create a document which uses |
168 | 160 | this font, and embed this font or unaltered portions of this font into | 160 | this font, and embed this font or unaltered portions of this font into |
169 | 161 | 161 | ||
170 | === modified file 'debian/rules' | |||
171 | --- debian/rules 2011-04-16 13:00:22 +0000 | |||
172 | +++ debian/rules 2013-04-14 00:52:26 +0000 | |||
173 | @@ -11,6 +11,8 @@ | |||
174 | 11 | 11 | ||
175 | 12 | include /usr/share/python/python.mk | 12 | include /usr/share/python/python.mk |
176 | 13 | 13 | ||
177 | 14 | build-arch: build | ||
178 | 15 | build-indep: build | ||
179 | 14 | build: build-stamp | 16 | build: build-stamp |
180 | 15 | build-stamp: $(PYVERS:%=build-python%) $(PYVERS:%=dbg-build-python%) | 17 | build-stamp: $(PYVERS:%=build-python%) $(PYVERS:%=dbg-build-python%) |
181 | 16 | touch $@ | 18 | touch $@ |
182 | @@ -142,6 +144,10 @@ | |||
183 | 142 | rm -rf debian/python-reportlab-accel-dbg/usr/share/doc/python-reportlab-accel-dbg | 144 | rm -rf debian/python-reportlab-accel-dbg/usr/share/doc/python-reportlab-accel-dbg |
184 | 143 | ln -s python-reportlab-accel debian/python-reportlab-accel-dbg/usr/share/doc/python-reportlab-accel-dbg | 145 | ln -s python-reportlab-accel debian/python-reportlab-accel-dbg/usr/share/doc/python-reportlab-accel-dbg |
185 | 144 | 146 | ||
186 | 147 | rm -f debian/python-reportlab/usr/share/doc/python-reportlab-doc/html/_static/underscore.js | ||
187 | 148 | dh_link -ppython-reportlab \ | ||
188 | 149 | /usr/share/javascript/underscore/underscore.js \ | ||
189 | 150 | /usr/share/doc/python-reportlab-doc/html/_static/underscore.js | ||
190 | 145 | dh_compress -a -X.py -X.pdf -Xodyssey.txt -X.xml | 151 | dh_compress -a -X.py -X.pdf -Xodyssey.txt -X.xml |
191 | 146 | dh_fixperms -a | 152 | dh_fixperms -a |
192 | 147 | dh_python2 -a | 153 | dh_python2 -a |
193 | 148 | 154 | ||
194 | === modified file 'demos/colors/colortest.py' | |||
195 | --- demos/colors/colortest.py 2008-10-19 23:16:31 +0000 | |||
196 | +++ demos/colors/colortest.py 2013-04-14 00:52:26 +0000 | |||
197 | @@ -1,6 +1,6 @@ | |||
199 | 1 | #Copyright ReportLab Europe Ltd. 2000-2008 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
200 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
202 | 3 | __version__='''$Id: colortest.py 3269 2008-09-03 17:22:41Z rgbecker $''' | 3 | __version__='''$Id: colortest.py 3959 2012-09-27 14:39:39Z robin $''' |
203 | 4 | import reportlab.pdfgen.canvas | 4 | import reportlab.pdfgen.canvas |
204 | 5 | from reportlab.lib import colors | 5 | from reportlab.lib import colors |
205 | 6 | from reportlab.lib.units import inch | 6 | from reportlab.lib.units import inch |
206 | 7 | 7 | ||
207 | === modified file 'demos/gadflypaper/gfe.py' | |||
208 | --- demos/gadflypaper/gfe.py 2008-10-19 23:16:31 +0000 | |||
209 | +++ demos/gadflypaper/gfe.py 2013-04-14 00:52:26 +0000 | |||
210 | @@ -1,7 +1,7 @@ | |||
212 | 1 | #Copyright ReportLab Europe Ltd. 2000-2008 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
213 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
214 | 3 | __doc__='' | 3 | __doc__='' |
216 | 4 | __version__=''' $Id: gfe.py 3269 2008-09-03 17:22:41Z rgbecker $ ''' | 4 | __version__=''' $Id: gfe.py 3959 2012-09-27 14:39:39Z robin $ ''' |
217 | 5 | 5 | ||
218 | 6 | #REPORTLAB_TEST_SCRIPT | 6 | #REPORTLAB_TEST_SCRIPT |
219 | 7 | import sys | 7 | import sys |
220 | 8 | 8 | ||
221 | === modified file 'demos/odyssey/dodyssey.py' | |||
222 | --- demos/odyssey/dodyssey.py 2010-12-06 12:45:44 +0000 | |||
223 | +++ demos/odyssey/dodyssey.py 2013-04-14 00:52:26 +0000 | |||
224 | @@ -1,6 +1,6 @@ | |||
226 | 1 | #Copyright ReportLab Europe Ltd. 2000-2008 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
227 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
229 | 3 | __version__=''' $Id: dodyssey.py 3660 2010-02-08 18:17:33Z damian $ ''' | 3 | __version__=''' $Id: dodyssey.py 3959 2012-09-27 14:39:39Z robin $ ''' |
230 | 4 | __doc__='' | 4 | __doc__='' |
231 | 5 | 5 | ||
232 | 6 | #REPORTLAB_TEST_SCRIPT | 6 | #REPORTLAB_TEST_SCRIPT |
233 | 7 | 7 | ||
234 | === modified file 'demos/odyssey/fodyssey.py' | |||
235 | --- demos/odyssey/fodyssey.py 2010-12-06 12:45:44 +0000 | |||
236 | +++ demos/odyssey/fodyssey.py 2013-04-14 00:52:26 +0000 | |||
237 | @@ -1,6 +1,6 @@ | |||
239 | 1 | #Copyright ReportLab Europe Ltd. 2000-2008 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
240 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
242 | 3 | __version__=''' $Id: fodyssey.py 3660 2010-02-08 18:17:33Z damian $ ''' | 3 | __version__=''' $Id: fodyssey.py 3959 2012-09-27 14:39:39Z robin $ ''' |
243 | 4 | __doc__='' | 4 | __doc__='' |
244 | 5 | 5 | ||
245 | 6 | #REPORTLAB_TEST_SCRIPT | 6 | #REPORTLAB_TEST_SCRIPT |
246 | 7 | 7 | ||
247 | === modified file 'demos/odyssey/odyssey.py' | |||
248 | --- demos/odyssey/odyssey.py 2008-10-19 23:16:31 +0000 | |||
249 | +++ demos/odyssey/odyssey.py 2013-04-14 00:52:26 +0000 | |||
250 | @@ -1,6 +1,6 @@ | |||
252 | 1 | #Copyright ReportLab Europe Ltd. 2000-2008 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
253 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
255 | 3 | __version__=''' $Id: odyssey.py 3271 2008-09-04 12:45:58Z rgbecker $ ''' | 3 | __version__=''' $Id: odyssey.py 3959 2012-09-27 14:39:39Z robin $ ''' |
256 | 4 | ___doc__='' | 4 | ___doc__='' |
257 | 5 | #odyssey.py | 5 | #odyssey.py |
258 | 6 | # | 6 | # |
259 | 7 | 7 | ||
260 | === modified file 'demos/stdfonts/stdfonts.py' | |||
261 | --- demos/stdfonts/stdfonts.py 2008-10-19 23:16:31 +0000 | |||
262 | +++ demos/stdfonts/stdfonts.py 2013-04-14 00:52:26 +0000 | |||
263 | @@ -1,4 +1,4 @@ | |||
265 | 1 | #Copyright ReportLab Europe Ltd. 2000-2008 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
266 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
267 | 3 | __doc__=""" | 3 | __doc__=""" |
268 | 4 | This generates tables showing the 14 standard fonts in both | 4 | This generates tables showing the 14 standard fonts in both |
269 | @@ -9,7 +9,7 @@ | |||
270 | 9 | 9 | ||
271 | 10 | usage: standardfonts.py [dec|hex|oct] | 10 | usage: standardfonts.py [dec|hex|oct] |
272 | 11 | """ | 11 | """ |
274 | 12 | __version__=''' $Id: stdfonts.py 3269 2008-09-03 17:22:41Z rgbecker $ ''' | 12 | __version__=''' $Id: stdfonts.py 3959 2012-09-27 14:39:39Z robin $ ''' |
275 | 13 | import sys | 13 | import sys |
276 | 14 | from reportlab.pdfbase import pdfmetrics | 14 | from reportlab.pdfbase import pdfmetrics |
277 | 15 | from reportlab.pdfgen import canvas | 15 | from reportlab.pdfgen import canvas |
278 | 16 | 16 | ||
279 | === modified file 'demos/tests/testdemos.py' | |||
280 | --- demos/tests/testdemos.py 2008-10-19 23:16:31 +0000 | |||
281 | +++ demos/tests/testdemos.py 2013-04-14 00:52:26 +0000 | |||
282 | @@ -1,8 +1,8 @@ | |||
283 | 1 | #!/bin/env python | 1 | #!/bin/env python |
285 | 2 | #Copyright ReportLab Europe Ltd. 2000-2008 | 2 | #Copyright ReportLab Europe Ltd. 2000-2012 |
286 | 3 | #see license.txt for license details | 3 | #see license.txt for license details |
287 | 4 | __doc__='Test all demos' | 4 | __doc__='Test all demos' |
289 | 5 | __version__=''' $Id: testdemos.py 3269 2008-09-03 17:22:41Z rgbecker $ ''' | 5 | __version__=''' $Id: testdemos.py 3959 2012-09-27 14:39:39Z robin $ ''' |
290 | 6 | _globals=globals().copy() | 6 | _globals=globals().copy() |
291 | 7 | import os, sys | 7 | import os, sys |
292 | 8 | from reportlab import pdfgen | 8 | from reportlab import pdfgen |
293 | 9 | 9 | ||
294 | === modified file 'docs/reference/genreference.py' | |||
295 | --- docs/reference/genreference.py 2009-02-22 14:19:44 +0000 | |||
296 | +++ docs/reference/genreference.py 2013-04-14 00:52:26 +0000 | |||
297 | @@ -1,8 +1,8 @@ | |||
298 | 1 | #!/bin/env python | 1 | #!/bin/env python |
300 | 2 | #Copyright ReportLab Europe Ltd. 2000-2004 | 2 | #Copyright ReportLab Europe Ltd. 2000-2012 |
301 | 3 | #see license.txt for license details | 3 | #see license.txt for license details |
302 | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/reference/genreference.py | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/reference/genreference.py |
304 | 5 | __version__=''' $Id: genreference.py 3376 2009-01-19 12:05:41Z jonas $ ''' | 5 | __version__=''' $Id: genreference.py 3959 2012-09-27 14:39:39Z robin $ ''' |
305 | 6 | __doc__ = """ | 6 | __doc__ = """ |
306 | 7 | This module contains the script for building the reference. | 7 | This module contains the script for building the reference. |
307 | 8 | """ | 8 | """ |
308 | 9 | 9 | ||
309 | === modified file 'docs/reference/reportlab-reference.pdf' | |||
310 | --- docs/reference/reportlab-reference.pdf 2010-12-06 12:45:44 +0000 | |||
311 | +++ docs/reference/reportlab-reference.pdf 2013-04-14 00:52:26 +0000 | |||
312 | @@ -1231,7 +1231,7 @@ | |||
313 | 1231 | % 'R71': class PDFInfo | 1231 | % 'R71': class PDFInfo |
314 | 1232 | 71 0 obj | 1232 | 71 0 obj |
315 | 1233 | << /Author (\(anonymous\)) | 1233 | << /Author (\(anonymous\)) |
317 | 1234 | /CreationDate (D:20101206144432+00'00') | 1234 | /CreationDate (D:20130131201657+00'00') |
318 | 1235 | /Creator (\(unspecified\)) | 1235 | /Creator (\(unspecified\)) |
319 | 1236 | /Keywords () | 1236 | /Keywords () |
320 | 1237 | /Producer (ReportLab PDF Library - www.reportlab.com) | 1237 | /Producer (ReportLab PDF Library - www.reportlab.com) |
321 | @@ -1440,7 +1440,7 @@ | |||
322 | 1440 | endobj | 1440 | endobj |
323 | 1441 | % 'Outline.49.7': class OutlineEntryObject | 1441 | % 'Outline.49.7': class OutlineEntryObject |
324 | 1442 | 94 0 obj | 1442 | 94 0 obj |
326 | 1443 | << /Dest [ 44 0 R | 1443 | << /Dest [ 45 0 R |
327 | 1444 | /Fit ] | 1444 | /Fit ] |
328 | 1445 | /Next 95 0 R | 1445 | /Next 95 0 R |
329 | 1446 | /Parent 86 0 R | 1446 | /Parent 86 0 R |
330 | @@ -1458,7 +1458,7 @@ | |||
331 | 1458 | endobj | 1458 | endobj |
332 | 1459 | % 'Outline.49.9': class OutlineEntryObject | 1459 | % 'Outline.49.9': class OutlineEntryObject |
333 | 1460 | 96 0 obj | 1460 | 96 0 obj |
335 | 1461 | << /Dest [ 45 0 R | 1461 | << /Dest [ 46 0 R |
336 | 1462 | /Fit ] | 1462 | /Fit ] |
337 | 1463 | /Next 97 0 R | 1463 | /Next 97 0 R |
338 | 1464 | /Parent 86 0 R | 1464 | /Parent 86 0 R |
339 | @@ -1467,7 +1467,7 @@ | |||
340 | 1467 | endobj | 1467 | endobj |
341 | 1468 | % 'Outline.49.10': class OutlineEntryObject | 1468 | % 'Outline.49.10': class OutlineEntryObject |
342 | 1469 | 97 0 obj | 1469 | 97 0 obj |
344 | 1470 | << /Dest [ 46 0 R | 1470 | << /Dest [ 47 0 R |
345 | 1471 | /Fit ] | 1471 | /Fit ] |
346 | 1472 | /Next 98 0 R | 1472 | /Next 98 0 R |
347 | 1473 | /Parent 86 0 R | 1473 | /Parent 86 0 R |
348 | @@ -1476,7 +1476,7 @@ | |||
349 | 1476 | endobj | 1476 | endobj |
350 | 1477 | % 'Outline.49.11': class OutlineEntryObject | 1477 | % 'Outline.49.11': class OutlineEntryObject |
351 | 1478 | 98 0 obj | 1478 | 98 0 obj |
353 | 1479 | << /Dest [ 46 0 R | 1479 | << /Dest [ 47 0 R |
354 | 1480 | /Fit ] | 1480 | /Fit ] |
355 | 1481 | /Next 99 0 R | 1481 | /Next 99 0 R |
356 | 1482 | /Parent 86 0 R | 1482 | /Parent 86 0 R |
357 | @@ -1485,7 +1485,7 @@ | |||
358 | 1485 | endobj | 1485 | endobj |
359 | 1486 | % 'Outline.49.12': class OutlineEntryObject | 1486 | % 'Outline.49.12': class OutlineEntryObject |
360 | 1487 | 99 0 obj | 1487 | 99 0 obj |
362 | 1488 | << /Dest [ 47 0 R | 1488 | << /Dest [ 48 0 R |
363 | 1489 | /Fit ] | 1489 | /Fit ] |
364 | 1490 | /Next 100 0 R | 1490 | /Next 100 0 R |
365 | 1491 | /Parent 86 0 R | 1491 | /Parent 86 0 R |
366 | @@ -1512,7 +1512,7 @@ | |||
367 | 1512 | endobj | 1512 | endobj |
368 | 1513 | % 'Outline.49.15': class OutlineEntryObject | 1513 | % 'Outline.49.15': class OutlineEntryObject |
369 | 1514 | 102 0 obj | 1514 | 102 0 obj |
371 | 1515 | << /Dest [ 48 0 R | 1515 | << /Dest [ 49 0 R |
372 | 1516 | /Fit ] | 1516 | /Fit ] |
373 | 1517 | /Next 103 0 R | 1517 | /Next 103 0 R |
374 | 1518 | /Parent 86 0 R | 1518 | /Parent 86 0 R |
375 | @@ -1521,7 +1521,7 @@ | |||
376 | 1521 | endobj | 1521 | endobj |
377 | 1522 | % 'Outline.49.16': class OutlineEntryObject | 1522 | % 'Outline.49.16': class OutlineEntryObject |
378 | 1523 | 103 0 obj | 1523 | 103 0 obj |
380 | 1524 | << /Dest [ 53 0 R | 1524 | << /Dest [ 54 0 R |
381 | 1525 | /Fit ] | 1525 | /Fit ] |
382 | 1526 | /Next 104 0 R | 1526 | /Next 104 0 R |
383 | 1527 | /Parent 86 0 R | 1527 | /Parent 86 0 R |
384 | @@ -1548,7 +1548,7 @@ | |||
385 | 1548 | endobj | 1548 | endobj |
386 | 1549 | % 'Outline.49.19': class OutlineEntryObject | 1549 | % 'Outline.49.19': class OutlineEntryObject |
387 | 1550 | 106 0 obj | 1550 | 106 0 obj |
389 | 1551 | << /Dest [ 55 0 R | 1551 | << /Dest [ 56 0 R |
390 | 1552 | /Fit ] | 1552 | /Fit ] |
391 | 1553 | /Next 107 0 R | 1553 | /Next 107 0 R |
392 | 1554 | /Parent 86 0 R | 1554 | /Parent 86 0 R |
393 | @@ -1575,7 +1575,7 @@ | |||
394 | 1575 | endobj | 1575 | endobj |
395 | 1576 | % 'Outline.49.22': class OutlineEntryObject | 1576 | % 'Outline.49.22': class OutlineEntryObject |
396 | 1577 | 109 0 obj | 1577 | 109 0 obj |
398 | 1578 | << /Dest [ 56 0 R | 1578 | << /Dest [ 57 0 R |
399 | 1579 | /Fit ] | 1579 | /Fit ] |
400 | 1580 | /Next 110 0 R | 1580 | /Next 110 0 R |
401 | 1581 | /Parent 86 0 R | 1581 | /Parent 86 0 R |
402 | @@ -1722,9 +1722,9 @@ | |||
403 | 1722 | % page stream | 1722 | % page stream |
404 | 1723 | << /Filter [ /ASCII85Decode | 1723 | << /Filter [ /ASCII85Decode |
405 | 1724 | /FlateDecode ] | 1724 | /FlateDecode ] |
407 | 1725 | /Length 1186 >> | 1725 | /Length 1176 >> |
408 | 1726 | stream | 1726 | stream |
410 | 1727 | Gau0Bhf%7-&:P.Os5Dh7%%4/gQFoDhfX_5ZJLo?u4lh;0:Gs#He4;'gpXek)>BZRWF0K,X@+aHdhKRk*G>nVuI?O*Up&OPrGl9gW,_`g^,bO0p?c,\4q:T-<B?:on<feu?=]I%'H6t2^@EC(HcY.rA[q>ke:]$uML&LSpn!;##,g.Z@XuSnZ3,%?T=T`S\Y2C'W1oOTjJGN'?^Ottcd%8<siHdg<.pbOiTBIPcVj"!L:/]*<H'V3QY*:`2O0'(!m784+Nj=IJ`$3m_a<6=lb(3#]YCm(jg^8ZJAs*3VD8P,B<)PQ-RIq!F8dWDf8C9aSRC-]]Tc7!>Dh0>I4h?p@o\8^hNOWlH*gK)&.uH'N(60],Q/@bW#AkLF/u5^Ib2I!rdqqPt*O*rUSiP1R.G)oah$<^CPkf^B3[<.;6rJQ:?#;@2gh,c6h'G$P0S=\jga`bnX#1.f,7+JTOjJiWq>:=(Y7oN$eLLl&l[*kAZh?BAeu-J9b*RpJ5-)qf6tR$qFr1k[[$:ELZ@kLOjm3L*UM#@ApdIk3q,ELS+R6o7pd0'=Ktt_0abf]&MZE7RT,"0CO4iX;@8@%?D?X2eO?hUe0e/4'[b@C`1:6+\6$K8\K+SX<l_fAg4a!sHcq!C%jk'l.32,3q%'j(_jl&cm"?S`o7dT!8;lIDHc3(KuKV:9'%OsqC5&$+#;>s4FdeWoCU@d251m*-n7&WF\W#HUnZ)%*)Mafd_%fRE,^:OXXj6$H&#[K"=m&OSL=J'q7R5[9oS>2pXA,AH5BH>(%Uab9>;p1:@7`oY@CChDZmnn?Ch<7<pgdRq^it-uX%G^/Un0G\%2OnCKDX@PSfO2ki+q9^;2l7guh0<<V*iL;4<l<Yg%0s%g@q^mI>jp\_]Ais/CW,/tBh-CJQ]-l>G?j5qr,OSKL^[M9).D6aE7k#g:BiB0s$!4C0Xq#.,O+D0[c.2KT!\5<"?#l^)F*HQfPFF9&)\S.D_&F?Db$ZC?"oR@aAgY.Gn*8'&!UG9Vh+f%DJ!UNa).!D2G:YN<YV'J78/_M"gUR^G4;7:gP+7H_`W;t"XU.9`m@)8B!bbs%t>mQ4HRFTin1:DI6]D%r1^1O?a;iu=5cRqb2A#rT#R!>1Yh9/OhZ@>%%S,]&q)!emp@rd7aAo=N39Q4(ju7G/0MM!q%A/VoneQFIeF;:J!@D~>endstream | 1727 | Gau0B9lJcU&A9%PJ!aI(_I`Kk;TU@RRb"DV,S#anTZ`K<8m@Lkm-`:3qs->U&uisW,,7G4_QYnY4)`ugR8jLnrIjT_eH*<8i;)+=_?c#'_Sf6C\;"@Jo<Z3Xcb^\\b9:$.I\&36HH1^@(K0Sj1HHYKcci*Hke%11G?tp7duqKWj#ErU;1j(F]i=-_Q14);(#32L$:TXb;#CL9:[mrVg(O5>Sd0AsoI4mFM,'FB3`0GPKN[4dib7=m-&e#[:`1n)9]?V)PXY'e(?(9C$t8'nFu6j@__oeN2X$r5P8)A7jZ_KneacTm2>ZgBD4r&oQ<-nj9P`.Ecj[drf>'c`*L_thl#/FplIE0Y3YVd6fME'-$61QIc@2Rn5GU1[)csnj."blc/[l^ECOcj`G0KH5[I"6ZP+@5$7%(.^Zr()08L+>XWm/!3b?]h1fX\dh![!:/1X@o5DarXh"qh2f+s@\4Zh6Bu<i9,q(=*Dr;Vo82WmTgb),H0SAks!dH;pC./M`;.Ud8($,MQ8U;jG^&/rY7!14+C.LgT6hP><2j%^Jh<NsE=_k7SjAKI>c[$O<oC*u-%qNnNO:?q1[dAckpRO?g5(@h:LI>tKb$b#"583IO4GlkR9F<^5goltC]LFE99"BT3H;K]D(RClgYJb/8jOE-AahK@m;c;l["\`WC<4\=sg_#6c>"T/9*GbeDQ#B^pS[./NHL:#m@4&IR,,RRRK=?dj8%]Km'GK)\+_<u4V?r6hA"DMm28qlV>heuu3QbaP,,?DFBkA,A8EW"%juUb-$1>O-hh7`oZ,.hPB"Dc'ULc!U`BX?>@$EJQtB6EOeU>E[PS>>@Ap*c45I)bfHU;r=m#CH@(4XU!GTN[Bp0Q)qRQEi>gU%.+XblYPF,^+MZPMYBT4G/PSSb0#P'lRHo6BA8\;AD!@=#ZY`O_9,f,11;+!pDm8D]kssEQEHg.Qenn58UK2Y&49NnZAW$"jUS-S!d8V<Z-p8WG%@Z$'BSbM9MVpV,`lUG8,;sb>1fHYksnkh<+3kJ3,4b!RauVF#36Ve,$X2,")jtsc@([4XMa05OHGu/!$.k49W+]ppMUE]&#?G.+L#TWohnY<!e-?_orj2oiq*'ZIO"SNrYD'8_=Be[Y&(B"J(+0.\Std$]9\%VnF9GeK]LsmQgj2,%n)*BZ[W!o=Hs^~>endstream |
411 | 1728 | endobj | 1728 | endobj |
412 | 1729 | % 'R120': class PDFStream | 1729 | % 'R120': class PDFStream |
413 | 1730 | 120 0 obj | 1730 | 120 0 obj |
414 | @@ -1749,81 +1749,81 @@ | |||
415 | 1749 | % page stream | 1749 | % page stream |
416 | 1750 | << /Filter [ /ASCII85Decode | 1750 | << /Filter [ /ASCII85Decode |
417 | 1751 | /FlateDecode ] | 1751 | /FlateDecode ] |
419 | 1752 | /Length 2140 >> | 1752 | /Length 2127 >> |
420 | 1753 | stream | 1753 | stream |
422 | 1754 | Gau0DgMYb8&:HLqJ!^Eg@Q-%o;N`?<8HJ!`+DmRY[aOfa5d2G6d`*Q!h-F2^d#[X`V5T;`a-S,./5aT]fe^)n6\X%.?g-D-N9FiFp.n!^,O,dgC^4hB^S<admB(lH\&.stDNEN!@F4E_p)p]Tp#E$66Z"U;S4l\3&_gMa^X\:O\"KskCE65%3ae3j%d?lPcfbNq5%<^"<+JEIO,eC_s-`^J&c_;2;&kB;q4i&2b2o,JRG#R)PG'b_Od31M3e,SN-hGONai/-LJ"*OVVbYC2BP9b\L(0#=D.W8^]N`EA-aU@"`3OS[,gm!aL:*+-1:jYkZk//`-Pl#1:.r4+Y]W0p_pZ'"1h<CQ<'I=9mu%rYd!>2ai_hf$+jm7do:SXW`[,q9>bXa/-2KiGM)ODR<K(H@NBeeQY*;b_oqeKa?/AC`Zq"oN[#0P9h4rN!>ee=.?XNEJF-ka0-b?Hnl'32uY*m#4@uo1smf).:h#RFo5l@eZg.?<piUA10:fUhbZL`/HD@r<$P%'R&k;"Q$BQQ_C]TO^daQ`M3M[$#Q>e:.l^TYU<3_-F'3hZ&4Ef%kI\M3kP-'CZbZ6,mQP52-X]OFMYNC?J3,c?Qk2Kf-8,8O<dlioj.Q78.m^9_oVXOEE[?uVHQk&1=^_GKY>Ir;V'FHqK6[Z2\SS)Ca&=`56!T0s.q2016:nspW=oO>k`FP*5f$h)9?6.X:Yq;T*5-!q&?k19bH=&].\@e])eW*>%4615BpYD.J-gAro53dlF^!)69l,Q9`e?70E8(]S48c=<UVpI](daHP>=EV1(GdT1?>0sQ2`>uA62E0,$?(u6qfA-8WMWfY7F,t;W4dOJZO&i_L"RCcjZhtZkA\a^;[ZU)_WnWD$dlRQ[]1lrrIF*WigqB-nT;!6NXCHTD9adO]d)Q8Hb@rO>l;.r0->]kg(e6&4l5nrWtU?FdA9S0_V-o[Ba]%L[?D4*Eh^#G)@(/S^:kB*6XJUD3H$u,c\*UR-J'XbL_<`]"V'EBnF.P;TN_q2<HR<0p2Z^=l,"J;U3;[PN0Ap&FP?j#V4D"I^.["B]#!"m=eToE9q$X:P9*Ae:,.[c(>..Z\Gmqmj=,6]](*_VcpFB7(?JAZC=Vp7g-QM</gMUdGZ\C*oEnqLKGc,c:,-M4"I)Y=fNq,7i/XsYJ!BVo0.9W2>gYd1%PqHH0<:%h`e6u8kDQ9"hY0Vat\5ed\:a%XR1pg7];g'"Yjb"GJIEmjf]S\lW>j>7P4P.I4HVH;*?oUA&[a`%5:T8J=aK4=!''DW*/`@\YHpoX,e6pp4Hm`$oBcdn<D9#]^YG..*=Y@L(RSm(@c;+STUIp.VX-=[dODod3a\1tdO.XeG#_ZFq"<m?3FOgelEJl@<.=l%IjU/hsrhjsgB>k?c.Cs5`/e#5!Zjpg?1+#.],6;Zl!%\%\4?hh_*UL*DTL@NuR$!.J<-nq;^j"6@Kkkk](F!FcUS.(P$:?3W6;IrF2a<Eh)+EfRkZSi:G(`CFM7Q=leC>o\f\b3Xd/"5#BF]B0%1`*Np7Un'9B@DcEY>42anPp7gP(UH'E@APk-nCXph&f:+Y[^t9$&un=6[q:Z]_j=.5)\!Kr=oS>As[C!l_l(#-+YNAg)7C#TRN(/$l8O0]DH9tbCbbr1._4t#J6&C=93(G2?R?EA@8Q[%P*u@L7"h?9JongY49*>oOL(2<M]&:[D?5V$F/o)@2l)JOZ%/W`oA1R4Wcnd@YD%Uf2M?20^1>MYST<,b#E>5(Pi!i1-/;#MhMJ1-;/d_2n9PX_C>$Q_qDXH)EV"?mI*gtP5m<QT*6&YgE4KiaR:g56,.f\\AI\iSb`82!_mfojWXfAUj=60PRGZAc1hW.^h_JNk.f..25'V).<H(A4E:"2q*?3eE@Qq>dAT/)aG9n&BBQCcj,_2)]K*\^B$3k0hUp(?^/U\"]p*I382K3N)a*$<Z,DWg3mQ-#8Jh:eLYT,4.Xm8m-@O#7!B&"W#*@K#.5l?(7bURTq;6@!'K5o.4&Pt"cAFit&U!D*(I$M4P>',d:[.ZH/K3tP_@<bT<P9U4DK^YMVfT)F_g!3$(^*i!Ja*JoLbF=!<DQpA*`dk1FeVnJFhP*V>"[sna$m[b&0;td*?W';*i5iac"u+jq@D`qM5(~>endstream | 1754 | Gau0DgMYb8&:HLqJ!_-&Cc=+";HGs%KA.Y:J2DCY[s9\>XN6[61!+!MQ^.pLj*PAel=0SG7#!"&\MJTpG%R\7g@u'SH^k]HG!WmW$Rq%u@SC2hkgIETH@)p/o5/\!>jNI>W>ci_h;Rl81:oV4T,BZ?-54\Hj@gDq]@6IXc")#'$6-NNT/oiA<G"4$5XR_F(_$4rK=>oa'ra;U3M_S:FR]b/rrE_NJOkqg9:)Y`^<N4J/e@Zqb#h/7`_PcGY=3erbAcq@Y`Z[n<oHt)j[qA:+[3dZ`Mp:$Go])MA#,<'+WI]Q_\.fJ6D\*8jH#6@.i'_UU;r,03fhb<Xt8p%%ct2WDCQ)5.2%nA)WA`2720j8I':'0:3oMhCB$CFP3[+ESemaWfl;lJ:L'X]\9J`%R7ec$M54o5P\PVX.90HY<#6S&7PV"iTmr,:4XrDZZ/7Llr:7_$GM\0ol</Do(7?,=DsTHXc&@!3p_UDiIi]09l_AWdgf-8GaTb_8Q_`sl*J6FA.U>q'Er&sO"c\Me.$`C>V&hY1\EqS@FHgRM`9$`9GXq3*G$5,M?;iHgGq9b$?`QSX85o571tOKipRbN'Bqhk'M4WgNH-jN*?t.'kb0.\QB[&<o;TX,`cA?\4nehl(8lkp<5V<N-^@BfUlTeP95IGX@M;&0BNS\:%i:nR<9W4@80p*Qr8>_^Y<i4mm'j165AhC<k9',B"3gY4GN*BO'3*a`,Qcm:1HVo!IO+ZCI)I<OC7^iJ)&p3j0h%DP1@>"?(,f<s8rZV9iet'iN(%-::AKjng5K<@tpe+i1[D^"0^Up6.i9;BCXt[Fs3ljc]lVo$g77rNgHDG]#8gJ@\AhnSH(;KD*ZZ=M0pi_R[6fK>YOk/.4<&BaOQ#h54*r@'&9i1$+b7,NNf5*eh=q+HLV(jqKb:'`a"BR`/(:BGU9+]))R4,Ym23ZrM!Qm!*W,B&s86_sO6*L)/OTe]fdQ*jFH6i5:9gK6HXcoM!NM9;E\!8g73<t(.U5DTug%'9&FXE[%i%/IU"Ms9#nWZAcLoO#W)f,O<NK#!qMJge\#p:EP0=5`bG[ZM4We9H=8gX'_)F]+=m_/!AI%nDfX(/-;PWmW@p2O1Eimdc,h\%#C>I3$c$<J,P9&@u(^DRo1gOqa)=Gu$'2W"bEja'C*KOtRG`.SJ0"=lP`XhXNBe)U[JT8@Emj"b8>N@Od!O6@*_m$%eo&cW(f9:I'T6$^Eu6V^hBZu\4fK:HSk>g]4rhY-6FP^`4j+rQGlk"Dt$B2DPk5*=a\=ko`EK&:>CcSUmCk\g;2H*s&.f.$thZEprWH6k'SZu;ck6m3!EI_Q0ic))t^hNIIMEFXM(<Vf0fLBZo$XBGU<,&bSh"fDQ;Z[/9q7%G`^^-;Xe\Db&FfW%d$o;GYXMhZ5?:RF(;+Xm!7a6eZW00B`:`IH8XLi+NS2b)$$;Lh2e!@8Y&JODoh8'%&:\UkW.LdZD1T:h9\956h[naQggUJ[G=EH&b48<,FA)/E%^DlCotmKHkCXO_9hWl_$LUa7mdEiH^=?QON9.Z]RmRTPmrlm%HVn^U<9\]X;tWPf!&eRb2r<*V6O=7aMV=5g20\j%LX62q1cK^T9:TW(MA>\'dj<6qA.F#s)sMQ`,T]N1(.r_)p_Yp'S]c[(W>G4-8!&fIUa80<\c027BR:n`'[?oUuU9B".cI%IGAEOrQI7oQBL$[=,XW_h0]9=B'p`A$\V.imed)5IXh$:,W9a9@%d^a=KKXG4sYbQ(1MaV5]+*.Cqf[2=/e+e3l"&:\!7$K".9ddWNZ_5Q/+3INU$ejZgmdnBt;G-Va^Ln3`sWJWFW<[a9=KU6.u^uXrs@1G;uf`^C5Z'!p9[;bShj)0oq48JuQY#!4siMLa$5*TN/@qMH$s/@Gj*;"0oYYPlp2!8a1`WUmm#"V:G^4LG<-H9VFE7$H=K1H(+>'j`:+*m!^o+Nt?-Eaa5SBI@L2P_`Qlb/8?(oQnsZ#-99WN$%Jqk'm_k(fro.g?Te?d.mk"jjg#@,.X.ZhKh'(6Ms*]dDQP%t[*NfAG(d]T,sM!jl;sCSPs1$5$Vg=4['*p#0=2Qr,O%"OY"8>HFZC^2[C7lipl?!UKOnpjetFW-cEug>2Q8)EGB"~>endstream |
423 | 1755 | endobj | 1755 | endobj |
424 | 1756 | % 'R123': class PDFStream | 1756 | % 'R123': class PDFStream |
425 | 1757 | 123 0 obj | 1757 | 123 0 obj |
426 | 1758 | % page stream | 1758 | % page stream |
427 | 1759 | << /Filter [ /ASCII85Decode | 1759 | << /Filter [ /ASCII85Decode |
428 | 1760 | /FlateDecode ] | 1760 | /FlateDecode ] |
430 | 1761 | /Length 2191 >> | 1761 | /Length 2177 >> |
431 | 1762 | stream | 1762 | stream |
433 | 1763 | Gau0DCN%tI')c^`s']<n_FbrWU)oU?+Lm6T"t<BEDCPeVKn5-s3KghJ\BOBhZL[=.Ak>jA@U$:f8s&i%SXDVsF(U^mp$dsYJ$L90SC.r:@uC.?SPqY0L,Aj_I[V<"I5sKKl`oIVN<eKW34YDacLK;3Xt7nY>q,5&]i%lO+8*KI]/W!+_!SeN3Q2Yo\:T_q9glrGRYZ^DXRq_r:EmhJ7+3H;F'@l\$Vsad%92OZA_DfM9Q"Rq3U*(3P$cW/0:KVP:25r4`OR?.\14&9OaL5@3mf#??n#=*'2GNK3aY]uhMW;..F`rT,KMO'a651Q[O`>K2:;-&+S+92T_/-/q+F$<OWYd&N:%oWpnU$-r<o0'.DNO`36p[<YMMBU`;)hTlMm'>q8C"S\KaOabAIWRr0#:j02=Y-,_k7q0Ie(sonHAFed[Ln=VVh3d9J=sbcVsjbm(a')7/HPbKSZDQj[]B8PI]kJGmhH>&0s95J@r9^K*[Cm_"-9T*AjhH?m"acSJM6o9Et"FSE5qV9RcO?6>0dBQAWa/u%rM\]D[cSVsAWX.?/3EGe=D.:pXSR+09C3C]E^OFbNg1PaF"p*-ZVrol:l+aX.ijBje!#4ECJj*0+q&\kpYNqhE>E?+E>!n-b'9\Gm0N>!psBp=kUQGH`qP);+h9+-0k3@-$Hemq_s%?-o;X`jcYmK_(*S!C9<+,n`W@>r@;5i2"-Mfd0.YIFGMme"gX]mbC9hM:1UiW.tb*6E>6,K-1h#;iQe\[O&4PuMVkDR1#cdZ0X<Jt==Qd<PT[]K6,EG;Em;ddoVH]d^OWn_=LDbdDqIqT#6.4+/HknR84W)EbkRQT@o.(Cc>TSWo\sH%>YcQ10#;IOU80HDk"D,EA=\i=4q?O2ahp`'Ba'BoNio_(F&)5p<lVEWgbi#`[FCJYt!(L06R1.SHp@$,a^SP3Z9[_4Y*H;X6[F^d(1%Bni'c[i36VlW9'.Kk4=CaYUL/]uUX6+I-kg+U1["4KDu:U#TN#DKq/b0YY-SLh*,CQrQB\-LlI9bE8OL#&n!NZ.+UT'J%LP)+:IArRD8+l<WEnLmZu^=Vc;n^i^lMMC\##2a0S/,g0RXW<0@4X!*t>k7sDte]:]<4ImD._;LF)3:CdtL-<Xu-%9O(6Xq0#plYJ6H*@1g^4@H$5+8#9%7L%UCY[-YoU4#DMBH.f:\e'jMqg++*tQ<M_hb`c*(Tr4M-qh2R92r>\2GKm6i_!jn<+ElM_4SPTqSnpldo+LWo1_>`0oYI[nZXOM<H1GTpY*.QL+nUc<6;u909X8PQm163,<i,=>NmiPp.[e8J?Wn$tqp+c3APgREfU>2>YS^"/LNoG^dP8"Cm-q:0k2*&P8!GfPofL.[2BkRuKldlnBClE'kd72dq=?0QQ:ik+l7$Sk@S&qn&&&Bf)asgiSDZT5G!"]oNOfSigm`<i6\_i=?B:UD0%60j-QJ2tuI+&IM.LJI(sa*G5m,$i\8k/8GD6QLU6B$%sO6fWZau8_=K1APaSAAuon);61bmJ1B[iSb0MgSl@e[#2RF'^pem%2>cEF7.4"Uj??Qr"d-'q_*:AE/34A9:ZP"6e4&7G=Pu4bi$+Yt&>Od+#nO4:i6;&pi?&+ZBAl'0`hoG]huYF3k&bT:&]]Ire!@6m!R`&DiH#2!fs^n0;SuL-m#m&U=op2`[G:5iI]=YmKN+(.D1%^QbPc%afEp'(W9UpJFGk18njURm'O5jrPZ%!FrWYGl>%:$)'ZPGQK_Ca<d=:s8"C\h1\WL6]J8?Hr&1]3pYj6gjEX$e'7kstH9j&B&^&RNcn&(qZqDZ!k7,&u&9$Z8m'1OG.<!S>+73:7RgK7Xa/DIpNMhcqODeC,0EFk=B\qQ8c,]#f)E<r$!:1\1E'J2c(,cOb0N\$b+a.f8"PRBUj=f)SIq]P<&?J[p7LD[%80.+9+jPg/Qj2"%MOrf0TX:e]?!ua0,eDQlF9t6Q]=WO.7ZhU>dIFa@soW!3&<'qte[L\ZqBZOLne)RZK9R-t1(@7l+7*,Y^LONFQ;8%!ABC&i8N'[lKrnasM@W4SP0>&.gDdNm\FH?;U^::+>)&@<XYn5&2C.@ZpIKmX?&@=m8Ae20.*KN\QpLVu",?(qI8EUAcXdifYE!*+YbK29roim[rNV\:+57YQqHPud2:L/H*N8ep3>(us`,Q0'N^0*?7+8lZ>/*\_~>endstream | 1763 | Gau0DIrF("&H+gY^;D,0&@ZU8s0bk!(`I3Z#8CIp)FZ^j(hi/MZ^+%FUuJnVId\[f[[T*KJi/*29BI6:+7J&,h51tegYk;%&m^I\f@OkSGA'+8Ft`..pauG!5!JghI+5==%S&ABpS6='Hj#r!UL,W*:Q8X0ml@pX<ZN9i_GE<U5(^\3?$AQ]LrN*30Vjh)0Tu=Be:9D*b*ATgaVTtcFSYh"9AKI\mRV!9X"<CG2#]i%k5iod[ik?I;<P3G=uE&R4sIjN_Gcom9P7kLnQ-1?l*O#@03_.S^MI1=HZ;9?p)k89JYD[KE$n*CfbZPfTP8/oc,g&$<GW8,[s&ZuR0q!V#%,7e;Fs3SZ83i81e!-rAf?'4p]GU4\E.&PQ/(93``>/>r<19XBsonVD:"9o9a=b4DS!@;Fjn79GA%csUZ)4jV\]@P`J)!;>%s%7QnqH2@;2UB3MY5;hO9[LUVZL!d"\*`&[02*QHCi:(otCPN(Q#s/pQ1tbGk%tqJ#isF-E1[?`X_mfcN\ss,Y9%A0]$acj)H\B:cb9R4GscP;V[&@$#OgY87o/O0dG`I,7#;elNMtd_bSs^#%gE8pT\j,c9;14T4pJT@8Q-g`J^S;Z#8l.)ptd'$*L9j&I=4kB.R(]m9meHh?Jn`50?#9/Y_]Bc15uhKWZqe7+Gh@_CP8.tW@C1*;2VZ"kLQTNA\FGVpZ><(0t@9*8('alP!a5[;ReEYo#$OBup)c'=_4"q%t51Rm?E25;;/H<0oA=E\MHH-2`-2<e7UJ:LV-hM)kZ$D5csem,:S`aut:A;9X9j4YgV(s]2aCOj@PW@UPseh2M0X7Ef]*MHS\(/Yi`f&6@E$+.:pK8)'h18cKK#<,;`d+O@_;6@Og1B]s*&)^%@n<I2ehkWCga^eV,Y?8;!21"G\Vkh>*,@/(eP2fI6@4*(1G]`,@jN#AXm8"3$$jlUPA:/&5ddKK^-H:D=I*b[miV[,JIl!A5"60mU5c=K9U$_K,;<L[t(lNj_Q4Z,p<tOd4J/'8Q:9iNmeqB1$;oY1m/F'6:(-Lq>EU#OED&n)A&:F[:'UFc^frhU;),$.NP1536i%#)YMI+9Q9U+F+&XA$F$,j[^1Lu`V6!dKiZO4Ei;96*470Rl0I_hNZYbEkMY$S-<,f^s@3-/XG8sS.7UJWM,/7$\%XXPOZRPNpNRo%+p!)CBkB8L0$ai$J^)paLuPX1d6&`MbmcDUQP+QUZ)Z".uT8fcd8!8!FoFtJfPPC'QIHU]D3V$8-rbB9?2aXm'3/(/Me(pT$<CeYH\&]7d8ThhD#==cfPkqlso]c4r5@2i%^S=u-I'E9G9Ji);h>OE7$XXW)2IWlCOX2KP!pZ7]-aB7-"5C&&93YA/8nt:-jU@/jKFIa"gdC'`L&Ip0L]L%0*X4tPL"E)N%HYeX863Y17<a=?8ED7"b62$K_Y^c`BG<kq*P('j=5F'i>\)VYWU),m$b8DeE\)"bO4d:OtMG47<(fl+#1DcQh?&GYRC3[397k1")]JmZ,j(feAhdeAg6/obUaE(iS'LM\TVTaP[-3Rb%n?M[oMLZZkk&;h"l>Z"g5ktP4e;i8TlR$2B)mt.Lf&+).Xn+?[Z<5j@X\6sa^G2LJYKMhm]HRk%r3@oV=IL9pZ?9?g`uerCgu9Y]XWY(QM2_WbU_nl[\S@@*"&cK?AWro&>r].b2Jao_W`Zg),FkVlGC4r#p3HE&rSq=D0t!Oi2^BoaGs&M%iTTfeSKCc\W'lqPTLQ(N20A#1#_VR*lfpcb&l(Z+7Up`^Ul;X)'9Al)#ANEcTd0Fh/Se:TJrgjsBc'^QU%G%Nel,PO9[XgAed8+56E0EDf'WHiUO?TX_p'No1=Vj^%#k=IiS^sLFmhL-Kq_2u"RtZZaVUp#S"@FVB^eGB-+I)0pPZhaHQ.b350Vj<'PTn86g`_CMe.VuN:"C2VJrM6nt"F74b[7/KFWm6#k]d3cco1j1#^h"c7!L+cMsE/n!Ab7NQ<\iS&(1&-Wn#fi]JG_E"d:6Q5+/CFE:&9:83%`\+pP!!d:R!$9nT82Eq610Ke^KnGKqX&FeJ"cVdm%WX6AMr"Fdu8qgR&44ZP#mBGIim/+$'8#dn5SkNc0UW!A6_?ER2Y+Mec]_^`(8c;CCl3r<Ol<-_$p87/7H;T#38*k2TBui;gqVNloNfX/A)/S&G~>endstream |
434 | 1764 | endobj | 1764 | endobj |
435 | 1765 | % 'R124': class PDFStream | 1765 | % 'R124': class PDFStream |
436 | 1766 | 124 0 obj | 1766 | 124 0 obj |
437 | 1767 | % page stream | 1767 | % page stream |
438 | 1768 | << /Filter [ /ASCII85Decode | 1768 | << /Filter [ /ASCII85Decode |
439 | 1769 | /FlateDecode ] | 1769 | /FlateDecode ] |
441 | 1770 | /Length 2347 >> | 1770 | /Length 2320 >> |
442 | 1771 | stream | 1771 | stream |
444 | 1772 | Gau0DD/\/u')ldas'Zi(@&HN$'(tMiq2k6;2Ls2P[X]E<^(2`7q%AlrAp:5@J)=m^79MMpV^_$J306]!ln^HD4>Y/(%Ie<"rf8S(pC$iV_iTTb/Q*LI__E`\kblDqfpD<:iU5CPS7[sV31+(!Z0(uN+.oo6Q*,eJ1AN3&3'S@l7s0!(#(shl*oWV)'fMH+SF+YupC1C@5)Dr^;'03.rmJkC%B(&-]RTnB2(_#@id1pipZFN5o3"'P<ZIk`9h+*k6^^)kdMb]/fF%TS\)h6PC5Q5tASk!r;@?^-RZ,cp<+1Q@s-sVt=le!a2n<\HKOeM4W@8W68P:LJG-n2Z6B.;36FE]G;JV.Nl`BJ*/S.u4*"WIpOCXpOpOJL*8o/KkDlFFOlB(4>8qj+Y:p"Q[>5,8*A/L4V.N+>H8T&"j34II-=gD<b$6taRmn1o,pL'`7R[;\I@=js_X4k]*6C%D>]?"Pe1jK\&SfqSE4a]9-ZRD@Cn!OC@n&chA7..-GoK1K<!nmjs:'B&\.qO4SKmrnKI.]?DNlTUe`sF(^>\Zcbpb*aHTV?Gq89hA7I%\qT)bV"+"l3O;&B]":iM@BA71;Z@^HToh(hqB\)J'8BqH^t0=kG)?<<;5!g4[-RhC1id[7EHeS`B!$M^$=rQ/EY)HHiCrC9nn?P]!Ni`^M1G_\FME<b#.<Q%N)GeP^/"<!@r$b?W41k>Z6%e]pokDG/ZhV82L9gMZaOjOF7(;!U#06#^h8N"s3_P#Cee1tW1?l*eMs7CargDbJ#f^UB);QZdaF7K.nh(Ob$#C5j.^%"%0o,Q-_m^.=L%#jFgX#Hh?;lC#80GIJ^,<c?jeDY5X?1Q6q5GS3\_a)9mX%8@j<:>DXbFR7<'0Si3YE&'Sjm/D#fR>/'DrTb9fT=RT.c+oK%Qi0Hu/rel)9(f.j,LQb''S\uS-'OPSdOCMj.cLM%?VmiYK^[VFk[nj/T,eBl/o=<3]]G%%>&iir'Wl@D@NR;@D;*Ab(8d_A[3JkWFsRF6V-m78:f:hXKb/42C2$MR!A.OQkf1>?HT$:"@$fLMkkKqN#fTj@JX.L/TN%u7R6l8b7)1<Jce9Ru4iYcj"^-tL.Ff=d_/OF:a0aqPdt%;#UlS$`E;k?LoH0X*SX/n?-1^H,W9(4^q<7\ODp9$73DW=UQZK@Fq]apJInG?)g^`S*')`t,OS\\i3c/oa5u^im]c&e*<0oJmC1^NR[EZF4frs)imtC\OS!IB:rPqN@ZAX"E5J#4FMo=a1liAr,qnhbk--V#AHF0msht9UUj3"X94F=d?J<o0VQ8htBm6uEm[7nm/@5P`j9u"4lcVBIU5*_Wrk9\'i\UH%tJmqR"cN)-e>$@0=c`l1c?1k*!k,P29k*<:GWZ1=ZQ[.V^&N5H'rLLe-Sa/^aj*7lc%=_\?>fi9eA^/[]gIVpGiE!Yse'R"K,:#3l5B$%eBkYU$`H5E9A@b>1+F>YX24VP/#:%?#VL)Aua#_@&n=D=/s&dLN@O:?U!U`,2*U1b?Et$dZ'H>-rLY9p./<'jtJ`N(`$pt21<V5sXIkp@Xqo_eH@/B9&8W&Q=(9K.HNDdLCZcS-\HI<(kW&"EqOiF-W(('J1[J?`T);hXq`X(uEKZ>3VP"j[f;!V:saNnT;9uDGXJ-:4WR(E&X;6Qe(`j[lcKdE?qA,FN\@iJ32/7r%q4["?s&d)5;(N$3go27o3?.\2(WO:1i_k$]ri!PfVQ!+;$3CZAVh7")&2_:8_Jr\uYF42.^N$ga^_nsHJB>L0NB&:7PI3A$\B!$Er6`:q]&/i!81?3m8(Ip&lKBmn?i[110:9Fof,M4@bJ8*_sKfpQ;gD@1,),+V%^:->AVj/Z7>[QNiQ1#%".(I[3:6YJ2$L-m2I0'd=_H@O"6W#^'j7%m%T0X"lj$>AZK&LC#^[(n\G.;sjX4ZD;hJH>;IScnGJ8mjQlnQ#-!r?'k_:\]-&$Ena]@f"5I_Q*a?X\F*)c_;g__=!:S3$BA.bB()Ylls(<hq,`]V3BsL"W>HI9Gi*q/m>oe;_r56\PHN.MC)?&MI]CH]FscYrVJ%pWDE.5lH85@Z'o@#(/<F:kfG=AA5E%-G2Qn0]S7BKB'f91rRG1&tA5_E)!L:l>su:_/75G.'XHuCKsM@7cL@YrAhsLK('s4RRRY?*U\uG'QElW%S$Yold4qJql1/qn;6+&G)s#Ra6rBP;2o6KE:9a"mL@]4s.2Y9_Z]-L*OP=Z>KMo^LaBb3oFVd20l.p[aKsFW_(;*N-I\kN['NVeA_88B#/6OLfq<`OfV+kiDn_][/"/l$0Ub"3]5&_K4kVHVO2KojUWUN7NgH@t<7>Jte+q[h_MFj\~>endstream | 1772 | Gau0D?#SK='n&%!s)8pMYg_$*M>D=E4=&\+2F+K;D#sN1pL,<W7E-U.4#=7FJ)>>9LpA!mG-aGF=:g7Xqg%V?G;uB!reC!WWe`hkkbh3D)CDi4BK2$m[.lu&/C)T@3'SAMSt4,?2P.q1r-FAdk@];CC3=-)V7bFE=(TqXfg$Udlgln<m.QF9F<+.k;*i0[k,_u4cWS(1m67#6/8;(4[;&Y#b3)2f51d.s[F^J29GT6bCN]#YD,lc9/,,>Fhe;Ph-UH$.YN'Mg*V`^^LX@dss/6G1@Z/ol8`,/"B4C[lZ<5^>^%Jh4f6<QVQWZ_;&T&b%-R*;_#NL<ZQ$rZZIWP8Wh2?GO#*U.<'<t:lM+;%R%p8$d+[g,fWF.9F&Ep4"cI5406$J[8P/3Rrp<j9PX-M<1md33Dc[rmhbTJK<;e'(k$cq*LloPON7(3Z+Q(uC0QblsZLm]$XDp),>)N7_93qlSh2.0lOCpc.f3enrVW(Q`_W)W!ecqus*.oWmAQrUWG;Hjs"WaS6-AZW!;F/JV,[?Es1(B]u7-d+?\=@)=t+%4rp,E1+H<h=@)TMNQ7@4E8VY/rQJ"]_u_Z-cCNb9k;./%Ar5[VV:Rr/?L3M;8trf]Qj62*Y/cmQI!<IASYqj"Fm<@a%!O<%R^\IJIio+MTZ"hXtdZ(@W1gd:bY!VR'bkn[Y7;io/t:9c>D"mT^3rA2K;oe)T3N0#s/i4Ib6AIGt1)Rmb@,-s>ZC+3Dg)dAhNKpKIpN'%Bf>%].\a:8G`7F")hf(/Xjb<jk`uY.r,:3^l)ViWKH)8R#,n+M"5+24XMI6Q<+?kQ)kqBa:8qEr?tq"DG3rPopX)!E!Q!BsB9QLk)PVC59B[B\E502tkeUP6iE!RL1eMa5=j*0Xe7\ZrF)Qb,hR1PX]f_80BT]:YI"J4LUgB.e5&8=.0S#K$DD3UU-8Ebehkr.=HS,Lo:7h9)i%-m51Y@-IqR76S6'mk2XS]:NatAS9selF<:4$?f[9`T<UX![mPJ]7)/$qV#I+m:V.Tc:fUNj^kN:8<O-4?bNLFl[d1]@lkbQO:P=0]&A/SOc]q]"0'3=EFJ7S+WQumW&NH!O_X=-rmQUP2>1eFNqk-/mjnKdK:A+T">)$Y`=1PU)03/mmAb(/kM4@:i1m=\FqI1p7D;lk_93f6Z.Rc(ZjYn#LW;3MCFfd-$NE`;[Iobe*Gb]O/ZJH]L>A403:3\.>"_+a?.6c\#?5+Ib-X4k.2e(_S.G7U3b^$X/3SAs>gr_Q@)Z!Z6RPaamDe-e^Zt,&'3%k^r?"B<9q!(E,C,cCA#:%>hVL'hcZN(jt4oe(IO3)3D4Qng=K6toI8,>%jNe,rSi_f<_iHFf$;kq6@TR#]3_bbne'n(KISrEQDrQh>^Ql4CtP8*:hHaL)C'kP&1PKB;)5?WY8eS?!MOiF9[('t7Hp%WaYN8I]&0nObj_IFp6P$Qg!@-_""Oe7D71`cJ`'+u91@d5GiMs:Oa]aO4%VQf\sl[6GbGA-#NLrjI=DGO'$Q,Wfi_F<A9g:`_I@b5J-ASCIU`Gm7i'"C96CGLt/+ie7edX=crQ!pq&)t7NIM4<Q[osk'ImY=5e$dXDfac*l\!J`qu=j((EJqm_mC-XOn'kPAc2\JW]C56pq)0$<r>>D>Zkqg\amU=SO)[h"IYhc"?6c^Bb/b$ILoclVuZGlYE8$..L34=DX9e2_:oV'7"IC[\J!ffJ'@K!.)L1_JIEW81XP%Zt6`^r!,:%<`3+$k\G&Qb[cLqVQGm)#Dh2_[]0%C=+5.Z*@j$t=@h*Y5En$+nk(ol7_OqQHQaa$ruLehDbO-Duke^Zc3"G<>oNNYs:&#OglUF^__XV(ZW]7)(JhK&&EB4c@[:+,UbO7)VaSd@S.<-T5BtA-hi%4J:ZK<&)>g7g$O;.Po!O#lUN011C,8KFs"#3uecSV]e5NPu+bJ_)8dnVN7-q#>rNl.'XL!CS[d\,&pTRi>a,NTE5G"VU<P0L\mhl"hS7&P9Yb,Fm*Z]I'n_Tpe:0+\Z`EaA#sjjMM50KEl68>BkotI>=j'`\38:.JdGXAXbm#R;d(NLL`eiXoe%#oH_`$K\R/!?q'`d`[LDsf)b*N"h+.gEIN$D+-S_A:%FiO"NH,MOd$1XW9LD-j(Lan&FYoOmo,ET0+-!itr5@?`4_\g/MuRqW%!dI_U>\Ao?mXY+Wrkes"9r2QF.QF+md`h'=MLd\IJEXV1m6h5FO13*gH?V%in7itI4iEpN)D7f-I(*IZtl!;-lC&hPZ%hK_m$D?8MZ0eR0_QLQ#ums>r!MB_^W>)P*tk2/&Qf3S_J78p0T1_U7M~>endstream |
445 | 1773 | endobj | 1773 | endobj |
446 | 1774 | % 'R125': class PDFStream | 1774 | % 'R125': class PDFStream |
447 | 1775 | 125 0 obj | 1775 | 125 0 obj |
448 | 1776 | % page stream | 1776 | % page stream |
449 | 1777 | << /Filter [ /ASCII85Decode | 1777 | << /Filter [ /ASCII85Decode |
450 | 1778 | /FlateDecode ] | 1778 | /FlateDecode ] |
452 | 1779 | /Length 2341 >> | 1779 | /Length 2296 >> |
453 | 1780 | stream | 1780 | stream |
455 | 1781 | Gau0DgMZ%2&q(:PJ)JKol%W5SbOKEc5pJJ)!J235A/!9nJ,q6!2CB3<-)ikqYMW9SjBV&[PG$Z]*8.3H<Muil<O'krq!3_0]OL6b1\QmQ53lit<jM^-HH'R3YlDq-O8a?Ne8Ns!-Ytcdda;Sd_)',%J%N.`1q)E#MrL10IXKWQ9C:a6#QhX$"s]H,"t;rAfOW2Q[)XG_ck`O\I9i,>[_`@J+>-nNEdu!?1e]qgZ].MC?OFeq^,-Vk9J*>QZ^beh(T_VN@,?9?ZTm.0o92]X,KhrKRMD#$?O4^-dPRt3V=[GrDh?JmHk;BL*`Hb2]-U\0Y`TS?q_4cK1M(g>1eO1$e-kuc<?iLUjS+a:>#U+Y[D>$:bI?Q[YIUWImMri#X]=E68U^_t(B9*^<h.rnqIfQTMatCG?I9]t@S;+CU*V@g[r8Hi[)gW@G4%;AWeDjHUO9G4h""Y%Ph%]W5aH5')ReYZduE0Q;Yl:&NhGHJ`Rg-SND^,Y(fsuNDAi0L,]DrXmZ"91D.gaF0g<lY1b$m'D@ne:(<.%^4S#LQ_F8IK60]TD1qml*Q:P1*SH#?:b(\2li"D?VZsN2(l$'8j4`I]SFbO$OXsi@o\5@,ILFdTm*keeHX#;(rfP2l,jjr"YZI*F3S2Z+YdCJJJ^&E>7!*4]r)rIIlmAa=.opU//$(#O$]S^#="IY4a3aRXc8^iZ+aW0RQ65[c[Z7H"tI&K_6WMnX]QLL0'Io4icj@Uo@X?\\`e<&7,B(EU>&4<1ShM<:H(0JGYr<)JsK]9IK*=33;7,1@d?sC4IKm!eGh[!NobKTl[n:o\X%C-e1F9#N12&l/q%R:55:IZrsS@%@'!O1b*C)$3K/9Ya;O^_L8V,);i`0G5*=$b`0=m1\R,s_R!$f27fk7m6c"))KE7O*Lj&@ge?-6fMC`5O;V07_Ve+Q>N>L)dKaaHYdb?kBgIGDk=aC"dne^%^/9*CXifDK@maj0_I&VbX0GM&o4?A$Si@4G@.6rsEL8Q9m3i52Pb(X;uHCr/rQXP)]P5kL@&kd^*bSAfiF3P@3.*3d*$FGr:Fmh0E7hCkZ]nMNu]:_ej+VZ58)`$7Mu'(H_?//5\H>IUEAh*Qf>B<YEmq.:Ze3%>@XY^p1NZ]H+!cSdW1?MQ-g2,d(_7MS&bFW#D%&!mDCOZri0g&@$#N"PSBP+1P9tY!ah8n:l37&K/!=(ER;ti+9chGU,9aOUX`JoC,Gp[K8P'!:;8gB^D2YS5VRo?+EHd&NNHb/%u5U:/P]@&LE27m(]JV!9)Vl8[T;aRqD(M%6>QS7;FATP3`V-$Zs!s^q/UWJ1.6P$JH0lr^J.S.?Wmiq38A62h_rAW>iGa)7_Zdn@_<OJtJZC6hP11*(].sIQouBIj0*A]dJlE\R0LdbiqJ]6"TK'Gs<H:Wq5)@g`&pW+)3"7Oa1<-<?'23fbT.A<`Z(?MCf)k;=)nLdSD5T"L8sR\m'(bllC,-#m9F;F9>+]0sKJ"gd^>uZh&Y$*7a#@)7-.#h`3G[,:\O4!eQKk'k:)G!T8Fo0H.Tn;;[&apOI-8IXaPo)7h`Y@]/7=DYRqJ`.9H[A0729h?;L?.VuDT55Z2EiZLq.nb[Cc0MDM/R$`60c_c>UZl]PB&5('uD7Y`tnC/B.@tt$:qq3LCL*$c!iLoM"G4?A`8?4-&/1CbclgV%%Q#Rs5!?W4ZPh;POk-)d_=D[G$@H4qKpF0&RI*.Up7\?bqVbW/IoY>/:k'_`'Jd/a"Up(XnmlDOI,8_[OdK0"OI<@hcf3m*\FUK^C%4K`;8p&306/RIGI:MCVo@_G,R.f]?f'iQf4;,68KU`l<LSCM-q%u%d^C_0SC590V<-"`J*'q7=k0csk7jfIb+^gg<NATKWMf1;f-r(F$RcXih)@(IW)As>he(Xc9p;]CLdn9fDERKP13u+"KEjKUk0i*838D"C<NFMtK7H"\uX-BM=Y.!4lTci8ZSG*Ziq=FRMTUU\n[glY>;s9hoO2Re$:@2LA%UZqtfrrfVO/N'ei@hd&r">[62b#M7kp',(ImOBp3rli(^9K^cUa2K9PjI*`J"'YFHV>*/CiZG#2F-V>R9LS@\LkZY&,P9F"''`.<1r87bRb5l'!ZE_E^_i%"V'tu@sf3YHp%8n%eqJbmPUa4V\n$(F2B2affKrFG)Sm,YX[)M,:5mK5J'$&GB<sdLOle*BkIZYiI#mcqRpi3S9:aIcSQJOCcn9.p&TJIhqD34$_Ob`lRV%:4%2:KrTrc)F<9K$E:d%_%5JJ1Bfq#XY*mm(^OLDZ6?72']^=T,2TuA>2@dUXmhEB^Z!B7J9D]qpnHa,]8krjU=(\f!U]1F<2guM~>endstream | 1781 | Gau0DgMZ%2&q(:PJ#J]&\f4hTmri:S1pYRL+MaWtP@XEeJH7?"2CB-:-)ikqYFeahls/nc';Lc0N\"+O3E:3(`@c<&gC<US7J-%QqU\0&\imVVW&mNTFSdTekP"]7s2RXcG3sN@UWtP69MQs[k4n-^=&p*V<l03O?O86CO#g^KSK/e<i9IlPLq:J6Ml`R^9G>u38LLV!"24J4n6<nNnfuui8[k<Mf/R*tppFH"Cu+J`;D&@)Pb.;3fgo#$:9kOb[J2D_\+1g+FcB$b'soe,/VNhF@5l\2Q*3UCa;YcR67a-O,t07C$&r"l94:D:o$H_t9r82_1Nb?.:!H&2+k0)EB=#.RB.'.-BaqP7"C<loEfps-W_;TN3;B.g&8N1k2h"+>YEI32;<Pnll9Fd$<g7=3g^;JZFfFeZP80!K>\\OeM4%&3U<H41=`bi0]X1k,V"e/<6ArCsjr:>RA>@<o3H#`LUGKHdp?Kg)'rmKTD*2Ar1O?-&;^M(!]W.c#2^D_LW%`h!,-XgA1.]i@i>3tr\WRO/o!p4WJ;4u--50]'m5D(7XIT,[EmQs$<*>BLNKZYSTrdirZE1;B_kO8Ta<7<lm"p8hHX(Ip`HT-[(*#/!gt@;;>IsN^2$K)FV9#JZ1]:6ahJMBZqhm^#J1Y2u%JGJU:hI(I-g(OsRL;7\fMeq>cM1)pgFQT&0s/(1Vd!*Z;RaZ4_-T&Z9pl6m6^@iWi,4O[QN8<Hq'(AJZo8m@m"3$`5VS='q)U0HC7,7P)@]*)kK?[h('p>&GYAP.U>K>+d;[N.-Z>iV%\9Jla@4!@/cot(FQqNb-d*]j&P2+/=XH\2gs=<\)D./`<3s,rf39[3GWBL,jgg#QrgHdGlp?q3-7]/=:;2/SBr@k]nS-];J9WHX[k57>,G.@]M.OAX\7XD?WYq(ZkiW5_o*AQhVXuEZ?3#]P*+DF!bS$anjTfC:S#O&TCnX*WOYUNLe1eu&+f%aGGan0RGV8JD.&rFsZac<D/)fpIU2"(68MF4ndUFM?+_-kO'5.L5]bd[_dk[.85*jL,OGJctb6nig"Rs(^=ZhS32j#sd7JH:FW4!ZaSq2&&Ho-#gFUje`_R8aQji$5Y>[<45E-EV+('7>="Mk"1F0bl*g#UPf"kK/Tl;nb&GVG>`X'eNm1[JG@gN`nPjerAO\[8W84jre;9]D0IH+tdLldkkY=7WV<3LNm@,1hPf^=-]1?U)D^h5ahcViV.Y6/$[4+g5p57ibqC5@5/0i"$,AQ+<)kh1XfjSosbXhVe%!VWU%+pB=U*g$Inh-Eu2S/!Dd.k)>bQG?`T>Un`-bm$a.+``j_c$FtqF5^FL-5S@lACpt4imciKZGrKW$pYfKt=gmmn!YqGlPtW5"_$BIeZ.K9^i,7l-b.a9@?\RAJJ?FCUH$_]e)S.i[@]/7=D>7jKaurbY+!8l.^C%8NR'<_krpX,?MnLg(3cD3Qr@eC?@U\\*58YHiIdFm<QDLV;]'FS@:G)*_ki%$[mHiBl*5E6'W&IIuhrcZZ+g%;OZf2Uf0#LtcQ,\LZ"aju[Z,LTt2SU.`j(A2U"+4?s^O6OpEAWK(/fU6BlU+)qm..)9qg1[d:d4W+:EC"l`8+:VL!BDlZqa/aNN=MuZFoV:^19tXBV,_)>VC[9&DpT=2f3OZ@gAqK"cM>a$Y<g,J9G42[0b0c?]eYR7:S;rMRjlTtpAd;A^&q"B<_=]nF,cb<(r%P^[ZA@'pZ4N2C\SiqE>!PW=WED9(CSQJm<pKX#e646SV01T\m+M1;h+F,=lu591]QNp,+]k^mb&dOJ,]@k[mdu_k+4^Ic_Nd4[D`p^e\*Sn]9C.dU[I2)7mbhU2c`G)9#X/C6!))%S'7ndUSUImF#`!>/q,=ih!dETC`X'jd%&*AU_6=b!a8TAj;Y%\Z$QasAMo`5:XQdq]K:S'jpM4b-!'FKZM'WPf<5TL^OK&k^<?(%#aidk;t0k2A)OB83$9`/WPdNCnBeF'#[piQ+,5ZI.2hbs\AV(cLE)Nba-#Fm1aoVkQCqW:X^QkHB,KIAfhiAkAe7]h1KZ$+imXebU"-2P$BruqDV1&(mh/,#i7A1TA7$4h:B*iXb-58:0TuuiXG?$&Ocp2UHXqh5Ff1@cE!A$<rG].CVrU1uX7a#$9C7,RZk^)i>29EsiO$2*3id_(Fkib^BtM2K3RYGrf)I4sFFJ@h9qkY[<:lBP#G#iq*Y(]dA_8+-I$;P`<cZHl(>7N-;_OH3U[j_E.iS-XBl=uE[J*;)H)@`')5Q(#T4\<or4pEAitlU^n^65^BpgO~>endstream |
456 | 1782 | endobj | 1782 | endobj |
457 | 1783 | % 'R126': class PDFStream | 1783 | % 'R126': class PDFStream |
458 | 1784 | 126 0 obj | 1784 | 126 0 obj |
459 | 1785 | % page stream | 1785 | % page stream |
460 | 1786 | << /Filter [ /ASCII85Decode | 1786 | << /Filter [ /ASCII85Decode |
461 | 1787 | /FlateDecode ] | 1787 | /FlateDecode ] |
463 | 1788 | /Length 2346 >> | 1788 | /Length 2325 >> |
464 | 1789 | stream | 1789 | stream |
466 | 1790 | GauHLCN&7A')`jos'`,sO_!Es/\faY+4An]&Ko_#ZYn0b.107QCt<pB,SaN"rUKUjoroGq[UUT70s$2*L;TE8B4g@)$\+cFoja`b7eGZ77p_ZS+aMmUQU\IV_s$aRn'_rRS3%S9T\FCnLR1B@F*dE-SX*]a@puJJmXu@R-S78W:JO\.Y^3M%Vor\E7PU2Gd#_<G2M\r\3L-5a<#NP31G[/u;@3/&$EK<r=_TG__FR$<#tPmX[8gpM-k0lF(&!5KJ'mKY9%YDs'POaB)RN=aRV%iukt>N><`)U]4L3bQQp@HA.8XVWal"3>['f.YfBg4ndk0Q2ns4XW>7P17'5?p._P\q+9DrgIA/%44I'[#hYM\[g@Jrf^-cUoGA>djYJeFsd6)#=i1Tb4tMe?PA#+N\%C4X?m]9R2Xc/Dl/lPCi`;R8UpeU1NPX>.c25/[&KK4aHB%%!mF=VS,9J0[^g@C.JJ+r+"=-Bb7cOf]rD1=GUACs[WV5TO=9Gn:1sMSjtpmp*T^B<[FUA>8i8$f+IFBnRm%l0eG0`2_`b=B_M''Ym>&+!DKAOqq50V1_35:oGR@j6QUiA-m'S;^9_I'(fb(/i\=TO^(LCK<caXRmM&TZg<sEld/7Y25[6l`\?VO5e0E,KqUI.`?\h#BEJGG.*ONO],Tu4G44Ocg@%))JeHbDN0LRVb5&?pKrlRjC'QQPMB(1KFUG%0UZBi*OTNI\c/C+G0A1^_5I-.hjP&ZfNf9LjWDS\WGFPls4G)5ZRW9n%8'%[2R>=u5ZXRil"F3.+'L-/,k=AL6dDXfYe$#CaIh?]?K3p6>2++p]Hd'r#K"grI7jZ=W3RM;"<PJ:X=A\m'CshPi_-,)'l/=`j&l/BV#.TQC1fbj]4C%5RUHNjS[&fGDFTO17MH%smdf^(j9nR>Hfe&_;oa*J4TR5p)s,%r'.;-gSYCKe:Y%7`5O7K=$T_InfMnR.'g96q)O#:hLEps99S=--!2m8@]<6KG0DsoJSGL1cgZBM=V&6hG2El,8Y:o?$2S3+,"/iXg/VGId&E?PW*7&b'C,4T:Pl:EU!CW9"QN'f%r`^iQ')b/D8Ys^k;I&!X?JrY_]]@\/&h;764i10OZ.UV\i+\APPU`[CPm=3G;C*lSQ4Bs^Vc3=@q`ZiM4%G;95b-%8t*5pABBD5DHkDE7l76HWA?+ku-P%j_d]pZGpph-^3q"ecR2k#MOT$6qOC<TX*D<Qk+IlMAU)Qa3m]G<$`mQ5<Z>7QlnnQXdM:Yif.CMOZ=8$d<SC7RLbg$,o)acgia4HG3Lp"6';B&tr4"_b\NijaVdm1@k'C<?6LLCI1U$`-`l+O'I]CQXtXLX9SDI9a>CH+dj`W3Ik89X73&B+P2iPm6M/#,/]V7FMCOM(Gr;05<7`iNJNK,<T$.XJ\C==%^TMB3BDD9pM?jgsjcaC$LSUffPE*b+I7*:cP-5MI8>K=J=h1&hPeqG]_1A7n5.m]AlN2[H21<,mg]aZakX2G3eEV"8G>7el[MFpmO,IV4P;Cf,VHEn`Clj,f<V,cC27'>"tmX+]AOeEP'N^f@E4W379!*OXSq/I]FSgbJW[CZP&*Ai9&'UTC7:)*f@)AEW0-YgX$)F2K=^@VO0AUeNulDm;h"rY`kKdIK^G(Dn7+Y6dReeB<ff>:(?PG:mPm/+PSV72C8%=oVeNjPHd#Ub`FEp<r(FJ?Zk%;Bu.pd/^<&p$\=/e$++n0cXaa\20p?-.>3)(4/oF/IWmO9`u-5UMAWilF64r+ACNSBo*Am&=UD;Tj!qn(N3<Z9h.b"nY$sADRi%Qs_FpqEbkjVDPkW=#b:\NQ1j.8b'H%D:FX4(#Y)4p7T.oKQ$u?Q(cn%m,rYK-0=@7jRTF,kI=FNMT6d$#9DBleooeQF?rjDksVPAlEFL0gffUF[^"BY&@^;"r;QtM0pm`,P1Q[6*tIce<(5CD/kUMm@T2FqK%%;)3c1G4./mKL;+89CoNi=C=KL@jKdK>5M46N!'n_rSh[\5?)k65d<K(jN/PK?H)I3-04ub@l_9)G;bR3\P21$otT^_ILV[,`ipPVSnhYXq*%h-*\lqOLVGj,)lc]bGR1biH#6JGZbd@i5>ReSapo\'Lp5_X*9PlZ<XDklccX7V;h(1o*B]l[`VLe4tYP&DcHOt0Gb+u$kgL1>b[gB0O=>?3S%JncJI/fDTd#oaHZd@CqM0KDn"]e:>e4p[G2(9]/kFK"43]8K?NhY%Nn*TSu:<!MD8Doh15IHF4#-XCN"E$KBAiYlYjqm:.?MKc$9jqpqSX(_n.^@IpGfI/7'BX`9=lrc1\pZ/&rk1ZE[Y]fPPq_G?Wo?EbBO4-ekNIPQ([J]&^!~>endstream | 1790 | Gb!#\D/\/u')ldas'ZJs?oq1%;:]LjIrI&8c[_.fNXFR8/rCCSPZUdfFa%PVL]7'4Z[<?"a-%u!LU.H3I+d3+B:aB\G(",cf6<k'K'7tE]m]@5hk>$XIb3o6pm-@KT:Yt+HK(:[%Ych(ot:!;1rPd1PCMA%)(E61f#mJWBQ8@HG-C2qkm7c!j"C5i%;EJj$j.F="@Ko;V=Rr'B1YEgBh>*G[8r`.;G2ll8l[?T-6=I-UeJm$HU6[VB`-Spp%&jC\o"YB;U=()A%ca"#X>#AfX#-+Ku/_&F!Hn4iSqK*?F0son-FF>+X?siK^P\]FDAnB,i-.\:[AE@KVasVOq9%XIZialM,l[W9IX+5Jtb5e?KLMK9uIea=@5BO[7kFG9$jK(>2>%7HR.2uaP\V+bUWB.#Ae`sjuTeG_\-9U9<%H58tBaK80<PZ7:n)UZKt:t?mj)Rcg0s$XZsCE3N;_-:<-cTZkfd-f[pu$r3\22rVjn(*YH8OfDf:_Dab/C1,.Lo6ucC#+GiC(@rk%qkYnop,*)"6WMkQ!c'a^C;ONp"2LD+`FhRcULN4`cHe>=E9Z9?d7IbD?<$FFL'L-5.kHp[LAeVF$qY/%P+/G_X^K^ju6b0RNi9;4)?[Lage(FX`eRCOs"7s.0_TKdGU@01t=jM`mE1SNd<KJdtXs,faeT!Wu\Cg%8Dq'+oit"CdI[re5S0Jbk!gQ*GXD-'V3kn,1Y!,,5>BDNNl<b-X<\5Ic=+3HCo"LCr9KgP!G)K\AT!.j=gDdS.SdO?Tgj\_RM6Ie$<fUA=r)O<+et#jufaCE]EtmZ+'=Uer'ni\#1-&o^.+2ir&*M6?LC:7S\1!lbJ#h5I5_DJh()N-ASk<LcEFGtob2kUQdd[IZaC)i_3X\UndNgKg9du`8dSZ-K(V@#gf,8r<T(CZir^i#%L.cYc^s]m_JjULu[pm^uf("pREfGGPYJrWX/#b\HoD_)>mc]HBk9(I5"Wh"j;Q@?!+u8Z$cBi<h4I9Vs4^9+39KUahKh1gP6Y8-#)lA&+Q(32#mZBCZ&mR[u`F>6+Y#C@`;*<+1r2s@bH]_D/=$;N+bo?R<XrC0[4+UGPbXANA?.#hdkFHdsh84s)AnTrmV7Y,,Dj4&f=^5$(h2U;1Eu")3<sE(hcQ4Q@%S+R(dooG:kJI.C@T8Lnq6Y*odb$O%K]VK<8F>%r[JHlALC8u4cdG?4bj8MKOdF[T'Uqkd\9>peHd>Mc@oX_DAr4kE&4g>39PY5k+Ki(o'E`4s9.Y;CR`nY4NTP_LkA^e"i[Dg.dPCT#2X_%k=<4=D#VP>k9Y&_rrX'*9*6`.ZBYVp+-@h('Nj3R[cn8tj0pX?H)5rN\8:'Z:A,=n_.HQP.H<Yd[Y\qGuco4gh@h!_An%;)&R,,1Ic;@k,hqURkA5mI`ce0!+NfL"n$`@GF#sG_d^IA;WpfNI(,gI3-P,KctQ>^h0c,M$;;E$ggpiui!4#kfqj5RIL[\5-RQBYY)e']f;<c+X#CKK^`,<M<]g\!jaGbhs*FU4Ea2.$VPk5rg]K4MME+`+d%M+("LJKDE8[oI4V0k&3?AuhZagm9JYo46K%Y0P%:<9>N1$+u(Z^jA"b0(Y@VfKne:@H7Yu8UYaTX36(OcL>lALd>-"fDgFi-CuKBLqnbf8qMa7QR9a/rapKE0(tjZr\<R:LM.>Wo;h*'VPj+e(E.F,[=#.OgSI^s:O@8c<HIN01MObr\4FO6$'WZYTdJ`&c.6D;Io4dL#!8=V<O>tdoineZ[!nM5"Mt+=h95__qqHuBR8-r2dHt5__9ndnBF/&EEe!]GYfQZJ]+=`cp=6r^CoJ<g88"k1AuY,72a<7J+`A;3IF@-E%q==%H?"DPJ*@_9!l_`ZEb"4*<ClR.2Y'FK?s(YX=(skIbj)mH;rr_Kp)Js`QDLZQ&Jl4SGiFsE"A/c(8d"m;o6+rA==i/i'Wu5Y8/$RDnl]%+q".&0`c_Q4pg:!8J'Us..(2q-]1,S!:0#qhYcJtHq"jK"N4!A(<N0Gu(1C?^m?K/2/f3.X'SmL76G8%[]'SD)^cQ,/$$<hejaBk%Pp(Hi%$]`F:I00hDaX_.@hWaTQ`CPT<p=M`/M_.hs10Z!#lI>_G6]5/%c*i<$f-&V]6'6+MP;X2SA)[Feo9C1\pm1B\>)o"*Mrln,Mb@<Su#>>gfYNb.%gA&NnuG2DnDe=:3H'_n7p=D_5M0(i>YsqV:,'<9^)?@#'D8U8>'A6FCTF%4n&Zh?@U^aFuBsfnWmT?jTG3mJioL>q50^iR+s>!0!L,FoK!(eXLsnHVlf2E_li1sh-#B"aMBV/CtWoVni)&_ht-~>endstream |
467 | 1791 | endobj | 1791 | endobj |
468 | 1792 | % 'R127': class PDFStream | 1792 | % 'R127': class PDFStream |
469 | 1793 | 127 0 obj | 1793 | 127 0 obj |
470 | 1794 | % page stream | 1794 | % page stream |
471 | 1795 | << /Filter [ /ASCII85Decode | 1795 | << /Filter [ /ASCII85Decode |
472 | 1796 | /FlateDecode ] | 1796 | /FlateDecode ] |
474 | 1797 | /Length 2019 >> | 1797 | /Length 2026 >> |
475 | 1798 | stream | 1798 | stream |
477 | 1799 | Gau0D9lK&M&A8=iJ!f%\;5[5j9E&7*&)0g2?!n1Wi`f\&Zp\&5A5Z&uZ/&dE)+p4^`3p:'G$lPX.J!#RRl<\>d)Ni9I7A:.hoG6@9`RHbirjt:hhCTEpg\\sn`00aW5]=%0^/3-p2Dk,B.bid]%&o?HHrVRnL`5VntPN+lIk8&::PbUdg(@.j#O7rJ0?KuV!IKrK'FX5#Qof-gfUcf@a,[m;M>=_OT#uRs+Ttr%aL]m&9Z`Vpf^)Q)Gol_TU7*gZPiecbVc_CdP<pX-<D:M_[(U<p[*e4-5-PS+X8M%KO9;l3CHR#43NF3Q<:<+UhXn-8;T+>3J`@&PFTYt(t/6$O(/[RIfJf7;u&Yt1<\o<H?^<UrDCl_^)_WcQ:)=aW0hX_:l%JK[?.`:eSuGDi:ZYYAu%-F$'b)ZY8?mM.-Uo=(Nq#LRRaf^_1SQh.h<C>[]'K\(UMV;KM=W!:Orb-aKeV/7^bAVf5(19>@^!`6\LZF=iM&G9d*FC9Y662(*]S$rm*,h>"`ck\H4,<EYn/YE[/@.bet`E0X6'D]O(Rj+PC]qek@!NcFcho]jCFYg%@CTJ%q8bK#s"Q)`?e:7GT,*I-+EQKL3[`B0pWk9J1_[>9@\(BcjFt//3j:/nYd"R;C^,rnJn)W5\<JN)M2NW@G1jVOS]bnY8@u>YuaZQ!jg?a-m#f%C1]=qWO,MhG]_8>+;%\^O8T6m[+O!n(7HS9bdt\Z)lnGjJWrm@tQ$#c#/g'/.Wh1VI59nna:Y/3hs#lk;JbFW@$uGAboC,>\n&Ajf+%iXosN%<(/oi.\`l\eTZ\3_^:CFa0Vr#*h=PAe:olBY[S!f^g;4=32q0/L=E-giU7.hMA^mQV#p0dp$Qt#8m7A+a?9^UQ+JM_cTR0(3\AZ7Vu/[&C:>:VTrZNI*TF6$C1nB@_S!U/F>8bMBkp3D4R[TGq/Dfg[?e5<p_X=3]t=EDlZTCarLR%_JJ^@Mf8kNW[n(:",rfZcFHgdKSC=;?<L@Om%D`?HE;.B1:r^2m-T\"9$JdG5hrE/)(#139VUY/'ohF9,O9sB!eA52Ipm09$1`.b[;5#iVN3Uu)EpqUC21EN24=Um]YehlC.B*2OD5R-q\o:;28*+!B?.Dt&bmQYZ87h*jPSBS;4W^@.]#!,[Tj-(7-%QDYSWbg<fKL.LP*q3pkH9gb<ONu:`e[_RU?tS6n+Ek'V(k_]SnIu]G$1qSALr51hD\'$ID#U&ZU[cqI.'ARhC[d6SiY@7e?:7Mr:%"!n2Mr.`^NCq:%bk`fK8d/*<M(26N5`NNoj$._75q*?V9[<UcWVK>Ta]qAkY$<WaUC%%fa>WinMK0W6W\&a2PqS63nQLWRBcjA;=_-$ZlqI3K6X93g66LO'FaoTY%6c#a8;'n_E2=qWg%N^YH:jBPU8U[:W#l6GMnRg[A!,N)^;(pV;@?lDq4?`]dI.LFQ`@+`-*tcF'V<c\4e%ld2p-WZcW'i.SNHK,5$qE,Y56N"h2GC0MY^'Y$WuIhY@GO]Xf>ni.uE"9p]3?7%T#fU@FaWN)`!$NLrRcLe]B\2RbuWlaQ6"4P,uZ1W5"r]AY_Hk*bfS<EHi*HC@BA`-GT"ckf*O1TN/le/3E>E?c.+X\RFq;XB-pMgWFr=aXkH\hs@B[5s6"As<pUk6kuD;qf7?>+nDKWWkH0NC,(EH]1'.A#*,9)e`F,dB%K``ChNmfpe[f)35%93aljGps!*NgZ!Q.A`VPJU*kc0QUh78^K=5%c&/O0nmBKWCO,);?^gUV"KtH+fg6'E/*rl7eE.;[*EBfg$7$nIs[9Tbjab$3bY/:3?1!cNY`&RBh07#Ym?Y5(7<SiRsgX&,u3WX%d-]F6W_21rA,!tq+W_JSIk>:c$erh+5]0$SGVh>>lXH1[J1kt_5OY6`6bNL".sMHToKb%AnA?Ul`I(sm=@Lcp%l:ABK&H$VLBR61Gg=T9QLt4@.UunO";*NqXuojofIU^E0F;r1:Z4E/f]'5TMGf/Q`2Rg:61u_)_NfC#DD?8\,~>endstream | 1799 | Gau`TgMZ%0&:G(NJ!f%\;5Xu4Q@*$^&)5p;%Bq8/`,Bcqck9opO[Uinq9lJ8$mj);@U"[$UC(I7&iDd6F65f7d)J;rIKjkDT?$Hk`WOPBE<KV"mDAW;r%c"!pjRMIQ"(%d)"`,lHT2r'1RAnBgaO:92.squn;\r@H-s&fea2i.%=6PEmL[BZS=g*SZ9P/VDpSPJ668E>ZbNnVL=9f)3,*)u7$FZI="sUY`]mTGIlrA3D7fd_Tlg,GQGG2>8Lp&;arm>J'VPf#Ji65sZcUa;(k0fu^-*^ON_c=dCV0QFT9B2Pk76C>'#d2RP$dG]i=pr)Y]=.=fR(/P+HVFZpmju.#d:uA?)HBX^+qe[YK&-U9cWk^hWko*"qLP/f;lNO6QS?uDCImc3tQHfMiC*Vj<MG5*/I"G>dk[*l?TR7s'`?&`KhF0`Q?P2_@`Ds+d#F#+Q8GK&$$Co1BWilb#qNCJ>H\Z$N$l+#VZ]DZ/DU.*.=abqKR8dadS^(@]:\qqIQATl]4f(?*E;^pJQ8E99pJMW'2IA[%)1NU[F4&5''=.6Crp:,pMFhR9[>G2(k8`dlLU&(s"RtXYUa^MTOF4Xj<"oJ4cp"_)N2KF=d#/KINgS6N"o-P,ub=O\F,SqGY@`21o]K/7#cS/bfEZ\k-ZV'@koOAF>KRi4<g65$V&.73L"c^."'NOXej?Eh@J!eTQ96!&Fp[9XsPOH`Pa]96Ab4]LXoNd9D?4$,HC\VH=Ul!<#N/84TMs"03X:>$0W+X;nZt]K.*V4hl?(W0:H>*5ZGm'78PtIo6O1%B2ME_qu9['[uIS8dXLVlKrRE$X/\A^chqN[66%gSp_<0[9B.N:@WV"ea?gaL-A!sbRjMC<F\sV?X#\)R(Zh^.%gZ3#BJ\QrT1pL!nCK(%dfu<M"]g:R,V+P?s0Af8g"=uWU"oV0XmiIK8e/l+B4GAVm'l&KIT[+p]fo':<;j_cCp&@=e=ic:FL>*Pl?23CKkb17-[+ZG@,9g:5=ud>sfX^.`ZBo(GWa6\Hm5PBOJnXkR8MA\\)E.H],(PO<ZYk\WI.r"B7t$Aj/]hX-00N,;ZK[Y,W7/o3<5*V5\3,PUi3s\;rZqmgNK;Xh)3a;>t6J;FCrJ#Mi?5;mQ?aX!:,Gg(,?86nB[ZH6mV+k-#`'cqeJL-2^]TXB%jM$Q#l<NMLarrGOf$E:W+;#Q4:5)1VA0Tq7o<SlG=!dsdFi&mXCkUXMn"m1K⪻a]Lg\Ug-VN,7^@"PX@PA[8M#uPALW45)>JBaHpBN4q=k8a:"j,2G%H_WWKVsQ,JV\)7'H&JL3rusNUJP]_Yd1k'.`0F%P1h+:dbli-2>rc?A.T/C\)(,;VS$HDh[1_2nl*o)76&4p;*GE&JC5B-PU&,lkE1D>^oZu1Q.Uu=EbVZi3F,l56CAW'i&B2Y3X>k!7Si8^(m6^"3"4uGr4:rdV+tD=_MZF!a0_I)P(/lKEc_il6M)9bn%A/uDXZpPY=IRBQX)&f,7@>s>W@7H^p[_@J2\cOo\ZoWpF-QWIWX%WGlr)4V`M),I<2E4)6LZ93*G`]e>5XXClG>HSYsHH%M-0be$0_E!#/%e94<"!h3&=bN"Qa?]$G%UlM8qr-W<<tL[[A5n<5p'VffI0l\6E=_oZ*j^$&-Y;[]\)llPMu^F8'Q*EKZR2$TVV[R#.&1V,YI#)##aF1LjUP"DsoBdG=C&6hhUi3g@&(1.U`q\2#KOU>"r.B@stl8&$f"=#$fk>@7F+QNLC71iMfY4n#c'iP8K5]TfW,6gC%q75/g<a.T;RCc50!S2M<iSAue]cVh`<35]Z,>?*qA3u8jg)\-R039\*hHRoGIAnW\-j_6D_XmpAmF!hBe3-OEo]kuHDfETVJ=&QB9RG"b$3GSGg^4TtM2td144addk^k]b)bW:Q_<TtMfhqb%',Ab3F@)mBVl#(k+%XPhfXpnrZ,])aX@5Pk9Wq0rEJk'Y1lZU]co!4INj'KL\q?(N7]U$@Nc?0&il[!u*/R\0CbAIAN:R2HV(]OM6-+*I~>endstream |
478 | 1800 | endobj | 1800 | endobj |
479 | 1801 | % 'R128': class PDFStream | 1801 | % 'R128': class PDFStream |
480 | 1802 | 128 0 obj | 1802 | 128 0 obj |
481 | 1803 | % page stream | 1803 | % page stream |
482 | 1804 | << /Filter [ /ASCII85Decode | 1804 | << /Filter [ /ASCII85Decode |
483 | 1805 | /FlateDecode ] | 1805 | /FlateDecode ] |
485 | 1806 | /Length 2337 >> | 1806 | /Length 2285 >> |
486 | 1807 | stream | 1807 | stream |
488 | 1808 | Gau0EgMYb:&q)^sJ#IctfNBm:8_l2L6Saj5ZJugI'*4$-GS.=(VUR?BB"FI4ZsQ$t`JZ9S,g3EV5R875])'pUdoE4U!rN`&GFScJT>@"X+bUHO;@*/K+(c>Y@<QtfrU_@OSfNf!1`6#(GV[9_:/Ck7Bk45</tA-IV(gp$,iD2;iq*?_[dWmDi/_<4isI"JdfO$j^4:8:a0Ke&"Jf$0?_+Cjj5mh<,i3S+jds/3"dP>Z3"<-T_F]jb>UBd6l;iWBn%XJ-2jjQ%?2i/5YPWkm*U7do3Bc#<)Xrs3'WcBuMV,"'GBIe7Q?j[Cb?&V+\hfjMScrR[ntQFur$!/kV/4ab\u8In]6q@e;HV",)F8>ef6C4sLdc;.XP^U8r[D[nJ>/--B2l,94oZj=kCMXICfa^sMuP\3$>W_sCb>@ZblUjQSL@qR3X$a$D-SFMI\u6k^=PL4J&+Vf@?M/WI_=Crg(uTr/^Ueu?)@2oB(WaW1;0uTCEk!&Kj5IGh[.64E(4K5Dksq%*/<#&^,Nhi*5cdr30a8qY-iX,D2MDKaJB,Br?&d1.2!!1'`QI5ge5#'n&:,aLS"G7!AM0g7tl+o9,Xd0ai't1Lao0t22#Z17i*n+Q$;9+B;)CPWaTWi@\.!JIZP[K(f\Y"aYLC<)6_Xp^qe[(/2LN:I3?=U0LA,Dk#ba]g<.8^Vf(Q[i&<)XoYQFZ\hell9A?ppQ%[t%!p:1f+7G,91d574^S!)or5l&i"hG*>oLWI%H[c"V7%/bb71Bg)2WcOOQF_*U?0E#/\'0A%`4Hb00H'c*@mKgY>a$)Z(;fD2H4OV?dIRjVM*HA![$=L5=:*'5Fej/^+"2Z,&HpVF0-=&TORoNLMO._;Uf=@E7)r:[&]E,];AuIo/WKa[LneM6C7_1AUIHKpBVLc,e#`>a<FrTd!lH7RM&3+p5DufV5d$<aKH9[i01jf(3j5(F_Ptp_Oa,:'I]lQdG.Z*/N^H?hj54#T#N67)r:*G>JRgJ`+tXuM:$;(:B"OT>_S\1hWJLIR-#VC&ZJpd*R.SG:_tj-g-<KAamSZd/#<sT`eZ7MDN5EK3q@lnX8%gSm$7"*<P4?LT=9c[\H$]ZrqVgClI0qNl@Y&9WAaf0eDLpbQ@37,<1\,fmku0Mh-+`\<Q"+%(_U8SL<,Z0$OoPP0"j/efJCS2Y8N+aMe/thbnSaFfBXUC4?>=o5FU)[[_FR=rC8%.E`&FFJ]FBP3D+s)N8R2pILP4hGSH*[$J%MbKhY7s4oAl"t]VPKKJ\#<6qt;l%(W%65i]0ML^]+SM0/]n+<T]:^.P)D%ass2s1Uu8Gd!\*Pq)M!*cG=$uZ"ZbZU'j)+*a=V!h5/2]!n`]o%7ck(;dnJ4:)L1IMO0k7RhLnmQNYkA4MegiCT`[RjW&T;l!csG9%ODk\ODQtgo.h+Y)U!aB#[ek/&,.j;P7f=*&h+;:1Xr*CQn!^BG^5pCH0%`:1877H@d.7V(sSk/XMX_qFTdfe9g%d3fI_Znc4a-eQq8L3sYXdVpqZD]G=/AoE`Q>4>"3o]tnb?R?92+OTS8D42qVb.\BAo;&,I!'KHT//@]6[i*C0k>WDM;"Hqo=3&&rPEl6.E;dse:R#WA5h!)->'Pgqdfpl/ZPN=r+/\8;.15!gb[o:eA3=5akSYt\iRl"(62;4<Jp/-ETVGK5&aHh0RH0c[4XL3M3mFn;;FOAnkd'IVhT:-olD:%,qa,VV8hlu?5',`8KV3Q"*%f.-\Q"_^Xl3CI.Oj3XEh+a'gA<3H0eOG5.BC3.KDY2d8+:;G^3;QV4TjPbK&nT6[XO4X!7C65R]EfpL9!Q=-^)?Kd'ClB6$n"OpS-ZF4:%LQ]_Vs]]P42S_\!^_qYIX>#'J?ZUkK]KMA0lA8m?E/Elkmh8LHFkWm<nq:USlE3h,%uEYa]BJo$FJ6R725_)g_8LkjBfqL,'8]%_Mqn[G\Ckm+4$Hf6mJ^e(MHK9mFFJiM"Za4WH"f]UQ_[e+f6AeQ].cL?CY,js[tPFb@ibm;u"Y=_"7i4F4<u#6ql@0cF!c^n834=_h[.>@eg+.T.K44n=5%:\hAs7pG;*B%cB.QBs]JgQ2X2%Ui1.S[-*H<=W'`>]4uMQ?[q1>F/G$TU=bZ@)ReEXo'A%Z.!YkSIcZW]e+#md"/c=HFl78UC!dliIQ;CL:6mK(#=Qmr"XI?^^J26(QF%Hh=lYRa65f+nF%2kq^][gogTPi3N:IL=$?T-;s4TDLNf)Wn8qBEqo/:(lIO_g@-!@QKAj7ubp9npdKOXq'=u*h*9hV#:/N\$Zq<=eU7NHdfN<2JK.gHP7H;`:%XCIZ$W2Z<k3hRT:/Cin'L*mk~>endstream | 1808 | Gau0DD/\/g')ipps'bW=+mHjD/bq7epd=ea`HF2LaL/i)%[Y.dQ7/5^,cW+)2uDq0)=#1\SD$OGVaXF]e8Y3,1Cn+FUd"d2rcakGrH(VL5(jV>FI?#d%#/kL:@BisO1lYWL!A>nPU</&d%?n(n]gUOh_'j][E4,D1:[rc*$=kP;R8>HK#+\G,FHnjNX\H7Ac#DT5,V>r:Ei`Cd_.;CF'H5V;_,2]8$[Dfp%B,+I\Fq,]eBE>E[Mh0e#0c5(fN6tU=uBaVFR8T,I`p)r^mu+=d]ifqY+QadR"_t#jakK>J*q$@Stnd)mlc>IS<rJK`;ctSPd@Xo_aW+?&t5"mHk8Hc/RW88n%*ZRuP\,CU5-`==8u.P"s-?;B(sZH'#"NJFAr'_.P;jKLt$EkNUMLf=o%"[t4:ol#)j="1mRd,0TW$;Qc"T<#'F^"F_^4lbXO1OhQt?5&pq0_n"C74;c!+g"Bd^o`;5'Hn&ujVaBIM7ooSBhjG/b#A$B>lU("ag3>H"EMD!WB>4KlKX^WQd#MokA!JO3o_:8;b':=k&D"R<&`Z[cB`e,VPa+p""!_9H+V*C==bf;>Sh=.m(F&JJFVYNj>ErcSNSjm@7Z7of+j@3qo!Oa:<DMAk+6YX496al5I,,Y?pX8acm#lU;4FqP[d`;5o59(Xqp7L;9)h3$H`e!OZ5C6A^UM19&,ODOb%gBY))?HZmjt#PZ\oMmukS6=kbb.qREjpsg^u6FZr(Z%R)VGnClh5T7Au"VDZVom9(dA;[as[L4;5UF)X_[lc!$WX)W/I945a0"ZePa@ZZ:e4J<D]FM.[L.?1qJpk.="FYhZIjhQEB:0oGAJUfO:M>C=DPE``6TY3s)2!JaUHt.-s/df`iSNa^2iE`r25LCk"@HSEkkbUT5U'75OhKJi)h;@5p:V+W6;I[47c$a.ON5?P3m2`BZgp6n"MKjc.K-3t[LESe7#Pj?G,6b8-8+J(TNJ5C>M!^Q6LeBq`.<'D9?5PN_;^:,dpVn^FK6(f^J@]eJUVO_S=Hr50RXL6M,k]KH6GU[ceNq\WEf_ua\:AO#/QDLkB[,2S5Npl'UW<VlJb:J84hH^.sO!bo!"k$2ht6qIYL8HB^l"fNc3:9qQL;uP`l;Z+d:Kk@g@lD<(`^@$O&09!8CWYW`k7XQfac.Blngr3gl0rZZ)Y-VTmbBsE1c2[16@YXhoLs2V]VXots!s3Vam,mV:\1`Mf@JHoSGrY^3\M#d_jsoslA/38+]!;\=g?d_a=STSEUA[,FNR#XVJ"gXJeY3F6G9.]_:>MbfRKA=b@a1%tfN]9&[1hPb=7NRP?umZXnKibR&T0:Cin@JSR;rdDB=_2a]7N;C??W`7Ieh]W]'JmoYqNdRA#d))?RoJ]^bltLJZHYem(mA;1S"p@6@Ntba*6!HJBU#E4i%X->T#1a/XMX_q,-6m1j\"q3f\HVn,SO+eQq8LSV)?m;f5Q6?Ag*Z4[u^l:J5V5YOUC=Ae;s>EaZG+8$&Yfo!pS?Xod(0,DSP-_NtZoH5@M`(QL\15gjJ*KBJ[oDL?N]PaFXZSrP";^=2c7;qthTYW8uD-Hdu>/\6<J2M:/6[o;(I3=Z$pSYgAc9q&'V)Kqs8"%X!L'^E[VCtZ,Z`t"8->3dPLf+rM*$[8(*?ZoZP]bs_t#47^:n!HHAL8GV21+4TLQ#L"=#&D&?Be!W\#JJcAc!0>u-cp837tUoo7Z>/2m5E%'o\M&?MI*YLqH2\(Y@:"YZ=PA#iSBK&=tMnM!7[3)H&7*d)>8:qnqUN;+/j-faR2"3qsXrjdBb+WHek9LH#1<#*PM0K(T25/Wo&$G4<uGfCMTgV$t71A5C^2`^>7(qSi(iZI,>Cp3Wm!nVGA8)Pr,h':4:%:<Z^)s8X/2X_r?+u6+Rj2mQ^O/UmGlsqW-\Y^1c'5RZ(TI^q',U7Y@;RG6G'4C`PCgn7^)j^^G8eD<]?WU$uB"Ulg-$ACWVl]r<b*;crNr?1G;01[q6HNYWAqOWQd`KiHCo[&Jgb\+S7V;03M>IOqq)%5JGZW2<Hq+\@roPr@6`*k<T"&9>6+l2esd/d*EMe8#4)lpS&9\3==^hYC@+5f&#_BR9Q!lSe&qr$UjYN;hGtSb7?g[,6cgrBE1WdP7D#b!_ndJ"QYD9`RE4+&LVaZi-hnm,&->,biC`1U]T::I"Z#o!t.:]8M`[-W;"[fGm<8q0L\c"I%5H]P1k=P:i&@J_22)9@VC_a^$ts]m3PLjtqr"5rA,ORWfWthUjHLL;A-$-OkMLc8?U0hRVnGkl4/kk[a~>endstream |
489 | 1809 | endobj | 1809 | endobj |
490 | 1810 | % 'R129': class PDFStream | 1810 | % 'R129': class PDFStream |
491 | 1811 | 129 0 obj | 1811 | 129 0 obj |
492 | 1812 | % page stream | 1812 | % page stream |
493 | 1813 | << /Filter [ /ASCII85Decode | 1813 | << /Filter [ /ASCII85Decode |
494 | 1814 | /FlateDecode ] | 1814 | /FlateDecode ] |
496 | 1815 | /Length 1610 >> | 1815 | /Length 1619 >> |
497 | 1816 | stream | 1816 | stream |
499 | 1817 | GauHL>uTcA'RaVKs)@k^8ROZ`SaXqaJaKc!SRG[4A9K%Q9LlAL7%d)R,j1qnrqBa@G"<aoOF`/F_a:pq3]]=rarpo_'tU$b']@dIIeaOAfRQ6h@EWT*hu_1/LBi;L*eZu>D@\eQd-pZ(4WJNfnFMp>M,[D_%#qHH,)6DSl`.s[#8jZbfBcmM$ol3T]$Rc>o_b;OTFUaRfouigV"g.P0q?+Ag;fWe[;WIB,8f4Qi&L0`Q"I_UVj^]a;S.Kg>oTLH&-E?9`"]!KR2Pnbn>M<(U'rABK-;I76'J."q1M0MOFl3;4'Fc,";q7rqW)0s[)HuQ`cRjZc==,L-OGck7QCEa+LRiqFip,OS\U;R.I:&"pXYXMj#nIVN\_:5I+T>f>J&%3mC,16GF$Yq4@HHVkBj)6jKlMn[LU(4H43f]P6\?6p&'#d[Z=rg+j%YuAZHQr+-1LYG5^?q\dH6QaJu8R79)/F:!If=\j`j%'$:juFRaTtZ4g!Fht1-"aLptc[`X!#R%Zdfku"ELJsfHFHN+!YL4V5q'_#@b)Cda'&gq0$iI$K[6`6G*="H/d#0&E=.KsGNb5C)=l1Y&#>Hg1sL=;;iiuY4fD7<lddEc4O:&_p!g'[bt>O_KKd5b2b+B;B/-,h;kGVd4CC76+/]`_S,Hb_C'Z9ARME?l]YE_^,;@Up0?qg:Z#L7)6GUoP6oh/L9i/He+so.QLt9.^FN@]b@IjMh"1ZWkc5T&-VK)R3h@X7.Z<EeM3B;A(35Lb@^BjOn=obf!@,F1blpV9#BCR&sC5XP4J<a>gqpnD@\W+!(Fpn`E0C/Wq=:/2G!&+YfM;4Dku`g8onN0jjA"GH8'*%6eQ3Ca+;iT!\4\Y,@Q_)jd!S>,"\>HdG]Ei`JmN[WF0\/Wg*O7F8U2:r-):q=:PaR\r5.0>3Y?F@&),;*uf>$i>92lk>$]lU%`a2R-C,q,'hEmu+760S7k[Gb^c)4,_?oQ$2B.G`YI)0$0?L?D?6Ha(tBmr`I-AZe'\$ZQ)n#^q#/4rK7k^991(!)&3WgIWQ1_DK+F_)d&j]m7[eRmq>9=qM)9Km@d$=VP'*jZ'"_gS;&)@H\rR"3-[ng!tUEQn)fld\,1MX*M-[7I$%=GS1$B=N6GmZF]W!bc.3rd7l?_.7URIC:9->E+trYg=(uTt7ej!K-AcXeZd+7j-F>1FmL_c_+-ktI<[>XgO1(X8FVOONCiQ(c/u?C4NoUn"N\Q#k#kXcE'8!56We8T$kgh?hFgih]irslbX&s93R]fn;:?=$&,#U.+!tloX)nZ[HJJV]@:2r'`8c#ZOBJ%lLH,]?YmaAkE3jk<,SQdp5g.cphZUY=#8NR]7it^[6cs*4Z//mBNiT82P9]4/2/Ht[u(+&F>>@7W[:P6g7C$jku4#Z8RiE`%R.!Gje1uW?:-*;u#XX[Jr3D9$KL%SS`".?#X`gtg^L-m;t7.'@;MF=)Y[_&VfJ's!(E:6R@jkGtV`8(W>qh51tm.seP8nBWr#gTS:U#?c@np9N-dB0)-GMDN1Admd1E&."53#Q44_$ajIU-!J_of+.f]QeQT`S3]-Dff9hU5d(``cR2Hk]])UMW6%hobrMBK6>)j_1+4pihH~>endstream | 1817 | GauHLgMZ%0&:G(NJ!`D6FojspjI;;V&(tj/?!o>M`ooUf(BlBf2Ii1T8]mA8rV$dNagkW4&N>9)L`$[5%u4e0'LI?-U&18%!T"7DVfs;;&I^H$]7(QN+5gUQGjs>D6!2eM@d&"<^E9)d39Teha%JiWWTM,9RU-Uq%M&VRW[<K+kcgZ1ksH<]HuqNl70X=X2.AeY9=+`7k0bq4rZl4[BCN%r^?)ad\%]bYXUS,3L]JhZ9.<C8Z7u!udErO7Y@2Yap<t'XR0H$uS:W)'%Eg1nVB?&MUGH(:ir[2i$DUBmn'&3W0$/bV'u>#DQA[;hM9uUlTA%^rfrrt,cC&C;_RGaY[&TdG\$kh_HT:=#B-Pmf1^'M]RECf&g[=M\b@q@PUNk#R/^mno7;;^f_6:?j6WNIET!&Bbs5'I:2mT*<(#k!peAf]#%mhW.q=.*F-3+u+2I(P=_^2,sBPO]-nMPp;.%rcp5Za":Vq^/5OWWs%_'a^3dJ-usAgiaeH&P]I_+Z:_^3p5(_gjRB%,drr/WAc-86h*"K_%'s9]qqI2_6cD-DiP<;$tP"SbZL!du+H[G9?/]RGkO8f!pJ>ApaL%b7FFebdtdnG@%m/I]s>hs'Tq?Q$#V4'hM,>NW\-in=l?5:3WT9Y+aZ])'N.R"IV95O?g@P.8V`WMP5FS,>Z4oD#j.O%eOqSiQ47bF@stUFP6sH-B5qIh48T<'?#ma6>gH[<\m#dAJW<e(eDY1oPc:HT*p93VP9oDNG`Y>iNS_4[^EprHsGbi@G/6)QKO*fA,Q:Zi]/HGY2Canl$UUseA[Y'nUaW&@T[?!l$IJ%gNH*U$I5gfr3mNN7n5g4H?Z,DQ:R-XQC+:;Qfu_P!(JXig2*92Z%1JUiOdq0jjEV"A$M<<1X@<bm%g:M7-H:/C?fJ($DjipjTri1QqM;\?<9XKYtI@/V))fC.I?Cg(h[qn?Y@7I.Ige>%;@#fEtZ6b(@HLF4)nmT)X!Fcb#1%OjC,VT*b809:Lm5H5%1sfO&t]:o!+=^If,WY32)]OQ562h+JckZ-]JF::uUo/<u4/?#M7_(JnX5mP'/I2/5NXM&p;+EI-.+l-)RE"UoBLM%\/4oL`;3djZ%NOcN4W;O(ZX*Q9.0-%o9NZZ-'%T/gr_dN5ClDC=XM@SS3d>Tp\U/,$@^2gZjd3`(N8Y29K,NfWBFHW^%io[:E=Kd)hMQp"p3FW!^OJr$I<^fEQ)kH!"1C]je%3I.KoJ4Qf,XOlmGM#J*/0RP5n`C7mVFpX/!1NF:OYlC;sMT61gj;?(bXS@Mmh8OP%_Cd=lYr!op*G2NOkM/tcf;j0C[,?bJ`*8[n^C:j,AW6T7h[.T5E7h)hLpX/kGofLi'^'_P29#3"Jera#\bB&6:5"Z1A[3J;hS6B;n_U!hR_hh^/8,C#5R*\i2WWHq(E3Cj.=qRO`PkL>_QKq`iejl\K'UiV;GL<!<S2/&8C+%W",l'tPC[U#jU(2j-HWLp3Di/EU*^h\AWQJJ!h>T`^WQYT&L@`U_.(E:?E81&fg"g&o%skqg>p%5bi+23;Bf<f?JfT&1Or::mD*Ob"4=hl*TneRs"6Za(j)B-R\L7sdIc'gGDBW5f5oAJ52]Nn:#Ni0/I/~>endstream |
500 | 1818 | endobj | 1818 | endobj |
501 | 1819 | % 'R130': class PDFStream | 1819 | % 'R130': class PDFStream |
502 | 1820 | 130 0 obj | 1820 | 130 0 obj |
503 | 1821 | % page stream | 1821 | % page stream |
504 | 1822 | << /Filter [ /ASCII85Decode | 1822 | << /Filter [ /ASCII85Decode |
505 | 1823 | /FlateDecode ] | 1823 | /FlateDecode ] |
507 | 1824 | /Length 1667 >> | 1824 | /Length 1847 >> |
508 | 1825 | stream | 1825 | stream |
510 | 1826 | Gau0DmrRJH&H/2gr"&\$F%OOmC]cS^]?[4_hFuZtS#1;)+.29uHa.^u-!-6s\A,a.),/s,#V!;k>VOl[qt0TaKF^6BmCRk3'&\O"F?fTZ#;Da#htQt$^4m`MV^MM7T(pLT7PR=0TbkbER+Ac;4nhKYV^E1oDe"MU/h(+#O^,Q?7QXON8S&5eor<,"U$sODE]O)WM1JR%Fb/^0rX@h*?/jbtT<7bbZdRU02Lc!]cfG[Brc*rp,,IulMMZ\W]d[Pug^jg#73Uh4C5ki<OcW,-NN*:&K:@polt:cg838NOH'/9]OQ)3,9S&*:mWFBBVSqo67'Bd=HgBu$?>ij$2`D(V;O,HC9Q-;-:Y+jN9t^XbD7QqMRHhI8R+@bjheaOh9KrpihXJna^0TnR)36Zfgg[*VUG/-MbS7+63j=in!43[PJ^N?XQ!mq5)\N2:2jSmoh/\r62Wl:M!#$fGm#M'@d54mWaWN,<7#UQ.OrD1(VlYuOEn\Jj%LQJT)DF0(R_5r-$Dcrpc=r,sTPF#Jn</C[UWS^qK_&+![395J;E@(mXJO;IaO'jBo/53bZcW"H.Jk0GlkUi]H>,_m[Bf7bRYV0j"q+SOS-a6;/1!]p/.cpK.b#9;Elouh,Apo3Ou4X?.#^T\1rpXP.B&&jHWsp0pCqkoM,_(:Tj-FDjUc4J9;U^69oB00@\AgKH;-Zh!MuX6Pg5#m(%%<Nhck<js&Lr&0BtM`QqYd^(:+K5pmm+700s4_&4XR%\J3_P?AG=a89H"D]ug(faU^`/\jJ3,_l"f17JnPtXf\[\W/@KeJKtnr0&Tc*8a>dQ.a`eimRH$[W83B<O/-i['Zo'J<WEm=Y=QrDk_'!i<D%,VltKpra@IKa#7UiR-qB!W'@YArjCJZis&MgM'tF3-6e(B=aW3!N=M5TPd8UXB6;p"i%8>']H^L>8E*OXqRC4\I$\R_];TRp:c8DcJUOLfqdBYB&aP"7\rr+'[lPKQt7Bia`CY#T.UnZ)0F^$128dnLO*V*5DF2>W$-=9@#DI-U&Hu-nho+F6,o0r8VPi@[W1&_?RVEV48^]3p!qAnY:<:@ESq0_TBD<s(Ma;_]hr'FlamBl_=gUajnjGsd0cK?U(/<?b&rb-QOF<RbbD>u'XCOTn*4Qujf*NVt>S%#g+1F:5aPA6qq^a_o67Jb]AdRIHRft6>Vg:>L196^!bO*rZ@3r]Lf8V-75r1+t<m@nl'Hc[<=?Xt]<9NtbcnQU#Q8?4q]PB8a>Jc?(gUup6$>5#65%M'W^:U@:!0foMH2*pV/F:,m,2k])r-`iUG43TX0'pd)O[Tah?H4BUheVanRn^C`;cKINWb+pYhM&M_V'.nM/jEr>6E"j9Egq=+JVch1S&OIjZSsm:o3SJbaO.J%_%bL9cL(`m@I;V]32#32^W1g!H'chaqf2Q0CIZ][U_8Os'\dNiqZ;[;`\Y,G>@Q0f2Hj0,L3$*2Vl")M"IXFi0I<#;Z_H653H]'kBNZa@CBtZ0r,Dc3"@(=?bY?pQA_-h@YX1`>(oD2:tdnJOu/Xp*AfS>MC70,eu1N9rrq<TtB.W`k3E-_$ggu=7sSk(al?]S7B3>)c*_p'%Q?bV&nVmc2"[Ll"dao,g[$%mbs4*&0'mhP?47_4,q?GiI""M5$R>phG(ZF9%Qe!#7^qMXkn~>endstream | 1826 | Gb!#\>Ar7S(jupVs7!]19f?(]jI=r3"0uG@[KTm$H,(I0%(&FWCa;n).6Ht$h]_)SPW!\),f"_ID2$m/n=8t,OBVE"qL=^!kbfR]5DBkA1n7Cp#s'oUU7[4]8"Yj'_U[!+A*S8a5o^DESFMYDrfNcn+2L4PZ.Z!_%XTo]H$asPm6pP4Bq)AI:o':(QU/IS9T;:,`)<bd1?58hr'\Hk^#M?UT*Of%-b4G-Sc:U%/akppreE:)3JYeB/sr.b'9)`daD410/BcP[:hdEtA/-C_)QQM!`p!9iU\gHDI&%3TbX=32@4:4N+aH[HY2eB9fW7teDGpt$A[",.<YVplq0dIhq*aJ;=j,90VV.a?#'#oHQXZ;!m+ruEMi8NPO8dsf#jUiiK0^%hl9:.UNn4m8lOhqA6?C&@21T\H=TRa-5nXaf2Dce9^BrMX#t]&#!cHjSp_!-&do<Z-OOFCgR8V=JnUFXs]Kf/Vdu$CM`:"%E3;NGN"ijPm>MRlidZfQBm#3SJ^FCllNpLF&E'u2(V0m&I%\n*JB:PfSoA&,=9]5,l3Ws-)e>NdL\c&'P[U>.k7]0m,p7,@;bWloUCeQ.OG+XC]J-"M?WCg>JC!VU3LhNY@:1hKQDU*Xln1FS`@;3rKD,<R9N/K6d,4i&fM'OGIA'HenLZ&sp8t-8#rV6dR+0k@G'O$LL3*QFr9:9hI)[)$'E!sj.kKLPsC5.*E\3_%#Q8ri2XX^ah%4;1>O(s)/#"]O5QRT'\'cKBRYu."WfNa9_?+E$"]s5eL\:C()</shn?;*qD?Vifs91C:`B9NPUKoKZ"Q`.0JJ<+9qT$-AR<Wb1caSj#L2*0P<[oRmdg=ndU77$++EkB-CBJD+[V#b]^dPU!W.#jR8UW/B5rPl6]:_Ykc9o+4Mng-,ICP&@`!5^kA6ie_CBbD7f.0L9cplnl-Vk@[V5m>*EP_[+ke8AXpGZ2k\4\+SOM9Gi_"k<AdUdjOmXJq\hptVSYagIM]/<*DR\/UubF$_4B1ZPE89$?n^,ZDhP65[F2&%0D:25r?(Bu]9fo_3Ql5JIWa0;H*&>bb][<,$U&?);2>K#EPbo1stMRJ>bLbZ\WHo#cp]qsE<COjcg/^DN*r9"m#:jSt;nTg=J)qnI'PhU0R$ia&n$==aNh`]gX-Ff@C`?U2'HFikdJ[Z*>+3eR.b7JeN-+0$.<HD`\-HI(M1:48>k=5qf]RA<-A41Q-cb)@iB1smeVl=$[",?UX9,/KmT)6^OrWk2KK0tuXqF`\/nh9L0jGqo41Tp(FR0&YW?6ak2'7ILDlds>&'H)-@nl1c1b6X&g&Fn+9R7,:r&-,aY$Yj=e%C`V@6*_2pD1"Uqih7[)ap'fsFc@FW$mbo):O,+`#C0II!=NRQ8Y)V',5-3IXlYmJ$Nn*=r_c3WK56Y"d'%8[ProeHJ(qnc6cG+.J<o%SE&-0N\02alId#>ScZ59*MGW;&a#tf*hlr,4\DYIIGW*,*Y:D6_i$D1>=+$noPM=SmX@'6Q*Q"/IiQFk%Koj4?e\iB+,$@LM39/Ln5iqDs>M>I0PW4?eu3=lZZUAb\]kk&5Ui+g$\4hI"JmH>ihm<R6P[mTsiMb+UHA,Fmh%YjKFAiE&D?s"mNZOa$Sn;JB*a38e=lJPmJr+b1Xk&)j"R-V#4%/h75hme)Z]8@BVN:-m9i7LmkQOG*iqe?3@^j8%V<$pE)9Z7tZH^3hS-:n/j>Q"pZp[DK9rJ:=&d6(KlNr(S#Bm[h=FFO/rh=(_?&"1qui-V@`Xa\XcG'e?N&&3]@;iY,mB%*1h=ZI"nK/n'!lkk.hD"Uq#J(<=C1&=5_/[^$b4h6;9V"GjK3^3BN:2Ypq~>endstream |
511 | 1827 | endobj | 1827 | endobj |
512 | 1828 | % 'R131': class PDFStream | 1828 | % 'R131': class PDFStream |
513 | 1829 | 131 0 obj | 1829 | 131 0 obj |
514 | @@ -1839,9 +1839,9 @@ | |||
515 | 1839 | % page stream | 1839 | % page stream |
516 | 1840 | << /Filter [ /ASCII85Decode | 1840 | << /Filter [ /ASCII85Decode |
517 | 1841 | /FlateDecode ] | 1841 | /FlateDecode ] |
519 | 1842 | /Length 1110 >> | 1842 | /Length 1172 >> |
520 | 1843 | stream | 1843 | stream |
522 | 1844 | Gau0Bd;I\s'R_puIlMd'l416PagNJ(a?qk%5QPBb)?JS[?YGS-fgqi0;K_s4]9FPbDUZ**RMZ;]RJ5RUF7-SL!1uG@q`cT^hbq,d1I)Kqbn814):Bi18;Dgn_a/7V2GOh0kFS:s&rIP:?ECNTPqJK4K!1PR_h$\teXPNJ&pA9D#[W+iU^Agh=!2M/98mii(ZPkSSAQgeKrf&mD,<%#I>.;<dU-3$It*)^k'Q'`=Ss5_r*(RSj=nHJiepMgX,K^H@:VcgO28h<O-,F<`t2bA+'uX+**kPuAj;?UV7[H^[MpeWZ6DDj"]rQ+/'G"noZC^GE9%=pH&oiNHnTdUo);LThps=l*HA^j`>Q[i34W9i@Ot&T[m%U\2?2;G$X$W+-Op=hi?3G/+PfYBN)`sf1e-sEfn`fc0,h0f\6,0f@>SttYZD8l_SU0oG*:T3<:1h(5Zb`tT2Zeh>1oiP[.OQeYWF!X\%6rlPpi)-hD@Hkb.fH<3^NP-ZV!oD-b9/e9&*UIXT:d8G+]$S"9ND[p;jWk>>C/^nhm=JUU@&e+_62>DUSOe]&.6k!rmjV"e#+9:+`b<!U95H.J^p/@Sp^th&Wg>ak,0$@Kb(7bSSl+9A3.=L3pX\q=:%$o0mo7?V-E7(Hn]fXbeo&XD9aIQp%;;!6`&38u#@XBuk8$X*VWP^QWf=j6t%sA;*X,ktP*f"CrW"bIZ?8ELg&]cUikHG8\G-nnaQb%PY?5*VEU%=2A&%_^Ah9k,47Q?T*V'PI@ZO)7"tnb4#"r0gaYU@9Ug(S*J'.W`57Q=eH'jA:J?Y'kFGAN9`fAGHUDV"raPUh,6Y<\9Qb@0p8V'i_YYuCe.K$<no]gNjn]<dDdT,Z]AV<@(2D%[,\5`U%01TOd"LfDXR2S>RNTc.b_[B2gc*'q[RGEKb=1QdF@OST';2AHML,.U!C/^m'.AQ[DQhNZr?6OkPF:(A=6K<4MY!EKps:UgFHO]?/U`N`$+-Zim>pQB(TEZ9%tXrj*LA.mmSk9Ruk[iO.p99m*Ybb3mFAQ*!KPn2:"4'b*cj9Eo+(G8Y53D4?*J0jJo0q`bi$YG6Mk[b(WFF7?NeJ4]=g#b"+J?YP*t7i'5J!kS!~>endstream | 1844 | Gau0BhiHJN&:R./J!bS]QC]3h!r5-_IFpXSUm"hbg5U4Kckd?Wi,3#%[aUK@ral4'@ClbUFh;<!(shB5n!e58+/\i(g\7cPpcX>grq+#;+O.`pHZM_riE\JaHl3FlrSBMbGSYYtA<C9DE:@UV7'98+S.g:l$l]\Rm8gP7%M5k&Rml6_KNR4O0dLj/i[&]`#kia&>f.$6i&"tuX=C4#:bfG)%I%LrIg,];2m_9G"-!<HQuV!cE2BY<;cgK;@;7C0D/`'f!@sI!5cpP-p<iNU]<m3g8jE5MC_1j=V8Z2\.\fVR+"QFs#:j%/^:D`IAI7kTaGM/`!uo-m%+uKm(rR9^:TrZGc>FPIaYTaVdX*7XXaC[cDKeRQV8@Up#@%WE7Q]b.`[.+ZJuBG;o1l/!/S<l3--5sf)h)/!9Q\31rPBGlU1ek`Su8%OL4@3d"0&Mu-Bn^:bQI,"Y[9?;6H0_@"OpKA0!c.5G[AmC1SIp=Do!UW0S-@/@4ba=R#U0E"$3>5I39P<Ytl&=L/,"b'^^1ugqkp8.,%su;.UeThD@Hlb!/O94$iYNZV(#!s*'FWdibm15`#]L5m8S9XC5>SN@nF1GI-9@Vcdkq:i7()JbOBQpOM\@8u'2:^qBr?pOT+U>+kpfqEl_-`8YC&1A#J%>__h"m^*hi,'eb86LAlQj`G7apZnl\F-;2rGe%0YP(a]8WCUT^22eOT)AgU<e%&,0euUbhTtfTKiOVlL@A?'63nWs5kQS>Fd_O)</dVLeA7\mYgGZ3uMK"ReSur\r5k&6IpC=F1cA?ilbA7,/oDUOd6KVo.M(e23a[t7=a:-dS54ZB.3(Auk&uMK6i(b;;6C1m'bQ=;B8G8BR4+YsD5[5$BY>ae7["3eienm)b_gD)oO('D=!Q@?`&oEG':b#3M_<YsG-/'3qOaW$3$dD.%d>kOS6K^?7L/)L0Uq,*(F!^=-;HU_=)Ep6WVj)"/KGEY8_:7gk:Nsg+&RIYaI]>3lC3Sm\F6tYWSp*j+a1Zr4%p<MO[84$W4sS@gT=3(%62-%WO@C3T]NFN<(eeQ6;,l8Z>IK-Qj^7LSjMK8s4G5nST&UJY*/;iqL1r@L[dko>YORpboa9f.@-]$W[6*1$"dT](1G=PgYl.`+pIE7-M=3kF)6geQ7S?.f8)HgZ_f5)u@%[_l~>endstream |
523 | 1845 | endobj | 1845 | endobj |
524 | 1846 | % 'R133': class PDFStream | 1846 | % 'R133': class PDFStream |
525 | 1847 | 133 0 obj | 1847 | 133 0 obj |
526 | @@ -1911,342 +1911,342 @@ | |||
527 | 1911 | % page stream | 1911 | % page stream |
528 | 1912 | << /Filter [ /ASCII85Decode | 1912 | << /Filter [ /ASCII85Decode |
529 | 1913 | /FlateDecode ] | 1913 | /FlateDecode ] |
531 | 1914 | /Length 2014 >> | 1914 | /Length 1981 >> |
532 | 1915 | stream | 1915 | stream |
534 | 1916 | Gau/XCN%rcn9]]`LP(AV8J0.3j4MWm#>;[@/!(HJCMX+8I@qiXi_5IU7E+qKrU-V^'.7XJc>dC[hKM*=*ISdaTC8@[#4Qp>K52S,&M.D\a5.XK2t2!1Gjs&<JR?f"B.t?%]\2Y!L-,r'F=<=m*hWMJOa.:l%-<IFP*7gNBh-cQDce--ILM.L@I_L^s4)N>BK7)Y_ck6A42YQF11i,!m[.EYC@u28g,#+Yeeu/rg,G2V3=oh4fK0!1JbEC"UU+Cpi0UJ;B/#oN]htbX\uWPB]KELtP<FKPDC%MuTTG>k"bPn*[6d."ErM3%>Zc!lkPk%^2Uq6t6Ui;"!]n>$&]\9:,T;?Q?^l(<f8@4qdA[204(_Yc4;J8=BE]qW<\Sp'NKl'aU^0(QPdgRmND>92]d@&4/*fiR"DW4*gjgB$Cl6GMj:F]f>@#%!.I0[QQrt/>YUgs^&]',$%(?g7@CbD*\;O$fW4\GM.!#_3,X-=>lo^9.1dc!$,-QT=%hTOI*Ngf@'[ap0(I?Wl%lV;%#Y7dW.KfEA@jg!g_F&')XXqAWrc*;6QX\LT-WDLPLpi=k->/ef4LteN_=Ke!(uV,!JX0/k'/`Mr:08i3R():R7Mg_1<5ab1MRN_Q0IpI.eSfja=(mT@7?ViXM`!F&H23'A[)bTZf!\3i["L_:(-Ek"0d*,k`oj^d=XN3Q5YH];\>2$(pN5l7p_O75B(iMFU")qnD+YrpPL=;!5.R3X=LmW)3qNKKn-T)9oY$[o2s6do9j75hH;4NrE-4__QR!@LpYMQ)\VY#g\9:6\!U&<0njF3qK->:?0agYHHSUUH%6dMkV!JQ0@aKs)HOs>iEf^=(9"H.u7iCjP%d5&MUOtS2bTtsR;ClD)Q[&mN*G1X3KrHtq^[*C^9<-S!]q55lrfJ:DH?:,Te"]t_\CPnrGBU>i,#"E(W9?rGR!o<MU#dSJ0>fr:7@/WJO2[#.J_YqMhO<-)LW(LDl+H0eeH7@88SY:BPU7##mfhEKSTR@dor2%P07)"6?U>dk=.=b**$S]W*6Xi!)19d32d!JjA<-Qb85QEIXX$bHE5GtY:=Ou+Nq#WYD8m8_n:5kZc9,\k+'#mHW[63$/X>>.0N^1$O@9^siI\)f-.[V;QV-!WG,fL\gSpXP6GF+1_FC"0eR_epK0i+e"l=Np_t*"-0(6=c@I)TS+Yla/!PHg6&_npu4b.>/f-nF6N7;&G8(0.IL*n1Ch8P2\_UF=X<$#*L78?jnm=FRO%^=R3DoOO+_q_<S>U.,sA?BSL'fgL#ZRECrlSXNV$Pg8@8j/T;T7k81C7*\?r<NGF<Z07E2C<2j"n![R5BZk:gSRX(77OMAp@d9"T]OSEhmd)J:LND#jkK?nP2n\nD,GbBbHJGPmp,mlREKL?/@466m(^Q[<jV3N\L/6m0&o.?/uQ:DS@!LK9J9(X2`[+DJ;+c;EQ-ECDXitJhE\g;Tnik!bKkq7<EfsenRqlPGWPYTZRInf1DH:H#XsBangNZV5(QKWY[&<"Al]rJhWS`L3Lr"84;_%a7nQ.E_]n,#a1*ZQ-dHlJh/C;Pif1^$6k!_/)m!7h*>2Gh4r9FS0obYNak+PnI-OH"7ca`]Ki'[.#"Ge8*i)t3JLNoRE"B1m)9aZ0[i=^(e_M-gKkYm>'tPC2X=WO;f27+a%g"4*WIbD`/h@c`QI%NL/mVS2M0u5H?aW:E/fQa[53`?#=Q*?bEu==2eIDDOBf@C^3MUTe"Ic4$LQUSXccHZR"gXSOGlEN)r]H$^bJLWFC5R3J$DOaeleFh@=H`.3'T?$P.W^=32m-FND:HY%:)#])T$==hOA>c+kLC5Ym5660n(:9HIuV(6A_OX5$f8-B&lf^SC%6R;ZmND3r$hD.GOHU'\+kt\dh,:"cc\s6RYD,DD<-ETE-:mb54BBu;BbLdmVn5B^,J&8S*\;]FAU*GG$X0N*E_>MLSI:>Ot,#Z-#3]tUJl(fFlFm<KTA2%7l++(_&YKS4&pJQ&M)`@cf+BO5CbQ\#Q~>endstream | 1916 | Gau0CD/\/e&H6"/s5Dn0=Am)Cjg_S-`PL92fa=NDf,DPWGonGkOuQC97T+BB?b\\feVVbX6g$Ea`Hsh@Si_W[`P9c,ir\07)CF&ZKJQ`.&C,ngXDd%YqVd(A*^0iKhSg*Co8@"eI(D]`:RZTmaW<W2"_">#*7b;YS"V14DaE)PY,1![890%alT\hVf^&RVIrAIMT*<]pb+lG#VqMj/3M*lpL>?W&=Oq)V^lkcOkoS*`ON^lNaiptEs6c3G6drC;IkVlq@D97MN@td$G@ic]Ndl.`@,5/[1PdM0\Qe+FlA\iS&MqVfF(L%=+8@>@S@3<]3FF7KKZZQX\>mskS;'^i;#'?s%V9E(kQJRJ&Cq6<1?#3/BL"(U(.H(/;B$ud'M&f>T#p]s]oQKV!aUs?PE#=E52,:5%`/4(9J/hDFE.^4KtXWsa-?0J(X-]r&ff(cHU<(r!%-HVW,gZd7GMNf/<k"ZG/h2225uZ8&c5,JVT;RQF"")^5!^G_;TE!6+D%qOfOp<=q1G5W3GrA@9%Ad1D/kYSnED)PYuZln:4IV=1R;M)KdThNX+ZLn@]!PF$9YkXXrmuO\=DJd%$?iI:D5<S&5>,27;R<keWMF,="</u$H7>r.[Vf+\_=YMe1:12kUOa\r)Lj5a'RXG2_Ai^7-TH-;9p*0Csd*s'GCP*'mrHNPSHOQ-a][49UF7@jfe[?MSG9NC?DZ'G"PHp^K(rOG^I3ZqC#GE8u."UXaW*C<u[$bPeMV9b2mBVlG[Eli"qdIO79dE+12/P"!<otWd"*UV_m='D6N0_C[lH)mlU*u&\r-->(>rSOAE]>MG.#=7j3('.>r!4)fgtI3dR5haOgmCc")p6rcrGR2ka6r(M1WH'5lWZ/j_:=r[3_oN4VZAGj/^@eJiqPm#%c%f;=Ckh%snPeVAK.df2HoMIT)A5lc%QN+rSjNNdDAU6Q@2c:l,EG<3PQ`@Vie?LJsNpqUDtPb?3*oqKOCRWp\>REJ*V;2NItUJRm$+DPN!CMlt<aOFr=C$0Rm;ut7A&`#Sg_0C>2D1Wku-K0'(FHLN1;54MDV^$'j*1of\kBocsCH$/g&c-b6O)qMidP*?LKAs%AMIhSg6*,upRB&E"]$%K,aP7HggWCWsiBrnr["h9UgFIrGqNhccN]7%g[1EC6hbSD^9%[ja-2@5U)c]3clm"]'$_*?P\bs76M#57?CJeIW:>gi/N8S;h)?=$;]LE(%&Yp2>34aj40g$,8:)>_K_5U@eV*&Z!.SJ^W\(WT/,A_)d>B$\BfESILCD?Q8]N(Msb&Zr799Ro./4iiFWRs.LCAf.4,W[i&_p#i4HanW9N<=gR`Y=uA^k8_,g]"hrVh*QI;:+18HN2cD>FUgpJ)uE5HNmFKXm\0G<$^?LlFuh1;ILe-Ic]<h.pP$H:C;ljamjH=T<7<C0>0k0*"!anlt^@7a_Q7blLMg_p&doMDJ7+R)co`#iAEfqYA_4B4;Op3@en,b^?smPT<aJQTsI0Aqe?3e"b`Wh\s`poo?-46Eg`N8a"u@d:-UNGLU1CfV66=qFM?P!LGpSQ6_`V@i&E@b.]s$2Ic*BS7eh';>^ZL/(s]QKLg.;^M$L92j^`X&mg(oCIpl)#L8.msa'E6jNN\Jl>9#^29.;SqN!(1%@[t9W_LK&DINgto^h6cXf+$)0HtHqQ2Z&LAKKluo3(XB"<*;3aH'Zi4GUZoYg(X/[kF_E@D(Q\k+Q)DfA(]dC"=oi\+ghdVXD9b-+??3rp^Fa2I701f?ruEE7"B*NTj+e>Xj9WUkB-iII*842$-*DmHr;@$E.g]^:$N(YQQtC@m2`+YcRbagP'G%8<f;I"5)4+Bhg];+g[q-[(,K&TI9OB[@ng>?&CTF>#bJ_X"n-\n-a$oB<'?>7:W),Mr5lpON^8kkbjETrdU6D@["I1YW(GP%_cjEt-aWDP[d`RN4ULQf%*k/Pn,eOJakWA3M]*2*DFG$G+8c66bMU8~>endstream |
535 | 1917 | endobj | 1917 | endobj |
536 | 1918 | % 'R141': class PDFStream | 1918 | % 'R141': class PDFStream |
537 | 1919 | 141 0 obj | 1919 | 141 0 obj |
538 | 1920 | % page stream | 1920 | % page stream |
539 | 1921 | << /Filter [ /ASCII85Decode | 1921 | << /Filter [ /ASCII85Decode |
540 | 1922 | /FlateDecode ] | 1922 | /FlateDecode ] |
542 | 1923 | /Length 2096 >> | 1923 | /Length 2111 >> |
543 | 1924 | stream | 1924 | stream |
545 | 1925 | Gau`UD/\/e&H3^ns5C[#8;9O=j>XV<5,@G#V9QTQ2:)d<0[LFYZ_9pTUuHX6IWr/0kLFLT0blA\R62N4hECTQ*C:/6L&NkW!8\1DQOb6m&I^H$4$a++=7GPFnDM@G6!038a3a.ZJmLQqER*OZ:Y1>6g(_akSmF4j%M)`lW6#P\csSZ5h1IEJ#&(T`7J[SE)K?>;&k@Ju3Fmm+"]l1MaV0dCDI=[Dp_\bC@JKG1'L&F6.oZjg&3g+`$H;BM)3_oud+R3Q"jW8cN7jau3M:A[g8FNa4f?*aSRJs;$&=up`HfU)^obKJauXPr]fBD-+k+S^('!h>_^=*5p5D2KgIk&cj*0L<$OagS/i-lCpg+$hflP2md$4dXSO5g-=SPJ*0cILG</IXaLP.)nEMtDii&!')Kq(JEfE=f/n_C?hD#LZt`dDZm8WbNaI5#m.Dd@X0[OOqW_/Tr+1BWP!8<,T+1ns5/F+F7TIHrIXMDC%r.Hr*<D16A+17TI,0>R(?1CQdPPS4ZD:UmgV9EU63k`ea.@Iafa5&je0-"/RkMAF&,i_)0gRu/c7QT--%`]>2NJ,tIEhNF@3jlhjdQKUr<KN)DmlQ]LL98!uhs+CO87MdaE\/&C,UFV:8@1:I4aUIC\GFgpIN:QG`B.4[?K6YiZC]U@OV-itBqP?<,&\<C;74E?Kn^G_p`RW'=s-r%-bPc-D6*peA%"d>oKQ*oD'26R5M*LaA.RkBY0"&)r6udeqQB]Hak1X2S'oNX8?qP-gnY&i#8L`jJOu]5d$<Xo[5NqGR<_ASoR]Bi_p7naW[;k+2MTAs>;Opc$msb;$e-Of\\6a?RgYYA?&I^M2%]knUWr/s+&sBK.'dQZVQ!3c#h8&qp0Ggr=5q]!I_L/2!bJbJLW2>_2_WhM!/l^C4aFn"8VA,*._oeL!5LL#t4Fk`pJ!OX[I:dBT$!$8J$69luX@to$^dhE\bWPlJ*o%-`BS(WOI(;`G5o5XK<ePNEgqu/7gg*Q"e.CqUI?oK;:h8%]cW]j=-edh*46;>-Xmih'='2B,8gXI%W(phO.'[5(^lu$rMTLqen?B/7bb;.7S4]3erLD)mk-*[G^p2Z!Y^A7?p)Y'G&F,a_h6g@[dtr:j)X!-2F-I(^a)YB\_.2Pi.&m=PK;pr!4C%;V]=j!pZR+2O3q1cB'@K6j!ri57EKQ=<9#SS4d/*cf[aXMXSd?q;+o5l0pQkT]j2'kT]mG.\rQaPVr@0uI-kItXOF"btHrg:ZD6\*u'*^+ee-Pfl&dKXn;$VD;4@>*"H;g]7BVbL'!e='oMFnN7XE=0\,?Z&lE9Z:]l%tc*.%26b(6SVPp!lbbs1P!P[,c!AktaCKUlKAR*6EQFIoO:(?dKj;$f8kolV$fK2#7]m*O?jD=-gr"k31rP::&-e:V/L:PDo9(2$&`N`#Z03E.7qf(&tPr<\'&@d+r:(%loqd0r%Ak,BZ5JI5=atLSsuT"0#1Ha,NAUQ[9RYp:q&<[m+k=I_u6]H!\'`K%92TOpOf6U./<ZNbr0&?q>ZR"6Q(=Jk_qkOO^<;G3g.ule&T/1,4;VC+OSB]>ZYH3[fG'eTROXkA+PZhP+.WNT!u8TVt]=bcW@/O>8C"[M_EG)&=)DN''GXs#h</RfKjti2DA$'iHfE_Te9VD(sk03PHi/Xkm+LE@Wk=_\8%5pc=r<#eMOYi?6p.E1@5S2f7c`@/!`-XX20.mWP$IN9Qr'-"8.D$I!4T2K5sU[%-)M2a:UT+EZ7'4h56@g58<D6sZ8qM8(I,dmKtMO,D+p!(2q?gfAH-b0cJL@uooWmlBu0Xd)NC\d:qG5>1XeU%l+?Ja2Sh[0_2Z;LVE9BWX)sURb#ahmC,j&2dcN3m#6Q,?&2[PeVE8N4'uTr66':<6JPVG:DR\l]DBXMY)8-.f0-rF;EAK,ZF+i4]8DadPZ?HfSbk$*S[M_HJSd`?Z-#D:B55;>Q-"#W;-JP_:nhnqL_u(TaO@tGc?\7@O!NE^GI,(d.DtDSQ6U"g>1Uq)ogWoC_T^`4tZ#*\f)_(h]e+F[%q<Wf@LoEFJF!jot@p4SV42-(5u^-YXb$'Su%IMd3;WP-Td+$KDtrB_T,(~>endstream | 1925 | Gau`TD/\/e&H3^ns5C[#8;9O=jS'GcOL?[*2X@["5W0b#5YEJmNC9cl(!$4E];$[eUoBn%%]05$,*U(-_rpHZ@gF[_$2nLA!5'2c0CM76,8d6gG(L3_0&bF0iPE"@K<QEO+$d"M#(sa25][DGI_%;%C/YE$0Y%fc*$2Kb:m2n@OMPO8]17%d?pRHX@DFB%JcRNDo]G9QXs^0`:!b"R$\bJ8DB]d.75%VC3N*aV.YH6,X?bll!pIesf?t_XkUVU@L*NASHo]96(s>mQJZ3aT[8HRd_Q?cDS3crK2n;n$ce)>PXTP+HN*8IY:LGC7]K[&#`'0^+p7)3@4!SPj@YC3qKpZ8bH\/GdFmNFTF1fIYWg3H*s2?S-VV3<hN'G#1)b9M[GN+Ako$U[b;\2Us*WtfAk=ukn.gm-k#q`CNP=?3@Cn7P7=4+RuFKAu*aq=\Le+-Q%1J!Il6:q*sN$p()0C-rn0eIF6.?An]E9D.FH#pDD9<s,3)+;bSnf^N/OcU1"Djge#YO$%C3G6Vm/+T3+&pa'Ve%)+XdU<.\9,'d3W0EK+.#cPW@:fQ1,!*[_4\U;*g*^_fX`Bf3nQ@Ee-8J<[,u$q,Z-H:,#bKD4fBfA8)7egf`Oa2*7Og=foa.^!`%m[>re6_aUC3G%>YD8Sd1roh)M;1X$Nk_Q(#p%M31BmF/tg+2d!BRp[t)A__n!B#cHM%H;](_Q\!J($Da/W^3FZ<c5U#R!r=Rg)^Y7mMGM!Bd4!^5&d!IUk>U\j4aRe)A5Pq6+`^h5=g0-LKXq6U>#IDK-D2:a%P%JWd;VD^Q<'hfi$p?+pP?MgS[bDl,]tHeV_(nN&.u_18::[rUhuS_"\MPQmY*eg0ruBYogG4%;mRCja!XrQUG^`Ai"NOMcf%LI&X1o;n;*TjX"m$c85r$*t?6J6pngUo%@[?8EaZF%3AiVJXobf2#.dI>8;McB*bX^o+(%^]KerHIeJ5=*J.oKuO=VuCF/u]J80/-@rJh2E_U(e;ipj,6oAY*R+50n\GVAquV:qk[Xk70rBrm*;dGEiQ87T:VuZ]pslANDpM6jd>VM0=3_^#k3]>1%=]<)fpI9#^cp\5lNg.&gqm^se/$W[T>2cs]j==?p)_30uEkq`.e!c!S4mJeOO]@.S!ASJT?aKiC8)4tUPlg;A>NNH<.U3=^cHWT4h"oE>%:MlIoIT^!N@*c?-PlFm8uCe6Ll-D%^\1A=V9JH,L*PhEul74`6YdJohOgV`IN,@N)dS3EAC^*>i/60n?JIK=hBh<,IKL\SM.O_E^%Y,?m8]*3_(LQt7#q!jFadsaaP?n<jC619WU:_T/P*,-Z<\N["ni$6N<9i<l"SUImmc,0N6*8E#,p!TIco1F?Aq(ECgh5'W!l_u($^:(9N[55u5q<#c'`&IInOp6>#>O<9?Ms".Xlr@cl*T_I%IWAdu:8Ts?eGhC?G'!In\&&rE&V$a6i7(QX$$uaJ-U:l*++(\,;+-&n5(e?<<0H?*?#gg^HSXt-MV:9UeTVp6Q0LFfL*5==@6]-j]KgW:,@Ypm"n'j6FDh>`gY6?f0XZ]TCRl]XJk^f)nO60>D[74=71MXfLFUr5Dm$/TZ_l1s!gD-dm!<<"MiXd/pk;`&GtOYm&]8:;L2B#,'0V&D,$d">VPldQF\]0c&b6C99L06](g6n=I"6&>C.3]LKsN@/1('f>#L/IKI)G+9BkW7=r_E$(-T"JK0daC2c?b.l/th/GH3)ta(ZK>@d_K4aHBKfi]=VdOE"G-\;<TZr$ArPg1iS>K[%-1%[m+1*nGT&-GhLTR(!B(&]/D$HIp''J&!`=8.a2N+N*+5tXn'"Oa4EA34g)9.kKML\/!]Uh'.%5d/BJPqinnVXWr3R1:"fu?i'!!mVhIFD=,HX?f!c]p`f!;6=ZC8/b.NZ'GAjb6Q6h4!*M\@(Z`C3Vb.-8RUnO,!rSG8G^:tqaPIb?]a*uJ^e_2MK;30eAmb7l'^UfJpMu/d9q[rIUF^%?G*.>h))g<aN?CH:[J6t1I1:oorX4Qe5enl7B,8]BjgYuAX2o*t2dbQKdX&Vf-^3j3M$g:(I+R4;pot)3XX=Y7uBYg:T3q>pLO[Y)[%sAG<#QFfimC[c~>endstream |
546 | 1926 | endobj | 1926 | endobj |
547 | 1927 | % 'R142': class PDFStream | 1927 | % 'R142': class PDFStream |
548 | 1928 | 142 0 obj | 1928 | 142 0 obj |
549 | 1929 | % page stream | 1929 | % page stream |
550 | 1930 | << /Filter [ /ASCII85Decode | 1930 | << /Filter [ /ASCII85Decode |
551 | 1931 | /FlateDecode ] | 1931 | /FlateDecode ] |
553 | 1932 | /Length 1850 >> | 1932 | /Length 1892 >> |
554 | 1933 | stream | 1933 | stream |
556 | 1934 | Gb!#\muQ0l&H.(+r=>Yo<OqDS?t6uO9r0,K-s+f\-:k+8qI.2JhI+p[H@8'XqS'61F\rW.(S]\*-SW0=]5QQM]NLTdpiVMpUD_J&5!=8[P3Ytp9WmjZeF1g[s750ujb:;bgCC1L\kYEP"IO7UnO(XDEFNOs=rI$e&XO=,@]5]"?GPKF?DBs'mf_.4@?!/K]L9Q-]2\)d.\jP3@i@rXM)^eE%@8nEN2/!rnZ>e9!W+]3@O<ffP5:(4+0#8Re`K>s1_qRd*-uPp<+/n!bf)9Ua=KsS3$]_cDD_=`Y=#L&Gpgj[aMuM?BU6Z\P)\NRPOTYe#ecWZ.)oRA)/lE7S,'O'T!b@jN`7Fs?<GX4NKg#2T#ksnj(t0F3*$G'.ErMao>M`q^c&G$0p4Al8S@%E)UgI`.2$h;le>kKD[E:4l6MuigCk:mi!m,Q<=JS9P54&$RREYl>85XEfXH?Yl/#I=j`li/Dk5InD;P"=i?slM'%T;?TE\B9f8RWgG4bm>2hS0'pM["t3NWX9lSu#MdS4F+Fi\A#;Xb*9%EM8?J[8iG(:94TZJQKhhQ"XFfeP2(c2('fZFPe7e*T@fZg@lC8!UX"L:#mb#8Ps+p&9qMPK4e5f5!Er"a&RNo>C+Gb\0R2MNa"(.fpRj`Z4$\n=puVD'THN'A4)k0M*/)e7X&$Tb2??E7l4n`A-]jh:`UCZ[8Ca'3;8mQgE_YfoL\gIltW/E_\L32hQ:M%/UJOc\L8)#"7kCd`AIkA/Y@E10GS^c4:ub8N1l*\XS;?V9$14Hr!P#KSRYN"Lf!60J*9^i@I[$)P!,ti(L1EoX6Lh&J5%@5uX>)`$M+>Oi%;*L,6B+b]Zb/=dnR6D&M)\X8UOb2B$5L.i`=NE=Ystm8ThF"&`N'du;EtT1Nl'_ap2,mL?>mDkl`mS8Gl=p4M;4)NP+(XRk/+pM^V]?`^-1Lq5PD5J$J[n(l6lO8tIbd/h[(SQT\`k"M^MM$0!D>X0;\&?Em%+<E$=]1c@L=OnJol<o0=F"S:$KYNrpAYj[('VXnHFX8r>OYMe/;_T&fH#4?I%%l0oRW"'jNKqt8&IDR>-j.\3PQKugH70I(Lu6[>O5oKk,Fkc5_\:MPG:TJoK.tN60(cuB:t."+QIA4K#V%*ej5fG(<)/ErKq*2gJ=<%L;taEDb6Am!._>T.pir>C<lhR'gs3i+mQ\D:Y0\K,_8BP6`.m8_d27UQU+A]7WZ]<?KLR)1?'pD/bL8:&[M7Q2g[;E*iA,Esed%_7WOK63U<BH^%+]Q,2)N0$mg8KC*S>g<1rPVFSH+#B$JN2G9?+q^gMIbD4e@RC7O&=0GmGik9_'&YKr+QVJ[4r#])[UMaAR_XXm8*CWR>4pD0@Ho0=B#]g9r"W'7.2q^F3]0<c%4-+uP6k<&F6P'SW+s/',1*Ko%m-/'OQoYL7Ztk:UT8+49)GEXd5qXbn:G539rRPco,?[l]bV,rPl$J7*&TUYsl)7F,b@UZ4PPk]so>4VU'*CRq0_W=Z[<G.C4W1U6.9rVUN,j[!!RpNn<=DPofWpau'K)cZ%jc@A]kIDYh^k4c?1*<1cg3<2=N_Sm3er2B^1SE"AKq"3Nk'tU"nn=Y6QetM0@HbN?7qi;g5.];)`eWn%1o)@7fa#l_k'iS)B4C)5"F'lnQ#$dqU6[5gdYF(r&^GX-<,RX"c[C2`b8C;q?\O8Sa?+#*W*Yk%A%A6g.rd3t3s.)<^4_f1A=pc4P]osuY\me2`HFNNAN`#9<8FDr'RI/U3Vq#Ihmb9FLNE?T0oW;doEu$Gs^7.GTh6j'%j]<=F7SSuiCDZ,6cXM3MDa?%lK!"$-W*$(?-/.t*3&t8Nr!.:B[5.~>endstream | 1934 | Gb!#]D/\/e&H3^ns5?d^W&&OqojV.^ecP6iU)CTrCCPC'Z4F<2=_o?UQ)N@'YMXDchbl:SinA1sUp)HAN]]N"giKhqD>\JBs5T(%q2cZ4FNO2h(m>mu!=];+@X*4iiUk&oN9u>KlZAY?fFK_"o]3WB;T=!M$"ILf+\Ha#d^DNdals*?\gnjt8AbiG3Y\muOP^SI7JM^M9N@3)F4mR()F#Ec/QDRA74)0M:8F=(k47lZ1E+!*iV.LuIt"u7DSPL^pKa3EV'&kmY'4r,_aIK]<G>&M8Rmm[18<0dZFlE$jTV4o2&<DlE@EZ"Z&-uR-+9\I-n*+#.u2uM\kj60k#4!,0sXFB3fU)&VCjb)o<1NrV".]TlQIc?MkN$qA.k:R8CoO=oP2+5'PjC)?;GcGo?Up<2+O%S.[#$.%-cOm8l)CgA6c%bS)u<BMM">io7YYAHNJ!s9+YT)QS%Gq*)\N9o9p;3/`GU>!PB\F-E6T_P,rk8kM\8M0"dENCRIsOcZ$O2Q*6serHL]]$'#,#5P,S7Lr;/OoaZJTG2fXQF2C*0ep"]tKq$L[lA3i@8E"(rCP^c2/90;k%Ml:2`pgNY*-nNXU3qs1W%ODI`RrZaD0EC:'7kXdFCsmsRa&&(QHa=%l0]-h2e;'^HT#rPU`QFZ`Ncb+MubZrGWpF,a(Cm!!hY>7$M,rCPuO`Dne"<eQtjL#9p&SK_[b))=b+)pO\.`EEAZpMO#V0g`h:fLg`KsK3h6-[hs#E51$nprGi%6L4WnMN7jGdEU8mF\kP8pajF%",-g?Ap7de5hA-EfoanPE089gBF!-"-PLM;L9Pg%!tWkl>!&AH#[>d#Z1c%lK7'm-9nJ@GV:(cf`9@$o'DA@+-]=%0:Zb9j\OcZVS*m2pm\37f),mY#=:fF+^g8:esMk,=7)9PPe3N)U\7hW<GAAH6EL8)'o+m6M$U4hLl>roZR[nUfXt>tLN,YD0e&ki[j_0:kK19K".$+9sQ&@4F`?UelgLW)h3:%;*[\YTI8nqSCA`Q5kWZLO_:MiSB`V"[1d6do%&d4odl^ZaTn(eP%OZe-[D$7tWip.BWY^E:hQ^j;?aYQ_JAndj(=hn7Ltd"!"_!!F9M<EU.Pe?qHU;I'HocGO.^o->"a.Zc6W-ou*_3eF6BHIC6.1$`cMFV^p5P5`&0.&H8qCRR;<R=QrGDXM%$.UQM&pXdRn9l(f.D966*MK`lbtPTK88_nZZJ?UbQnLI&PeQUj/V*r>hFF=ip/<nQ1Z'Rn^6(+@;nG)iDo^JOLsSc'hkT`a?t96GYsHp%0&+?i,>g3`JF4)3Jp-73d1m_*!=iJ(fbCO6SH=6p]E)QAQK:lg<^MC^&EQ0>&%%g?,Q7;g3blLa(`nG"p^)5.kc4Qbpe\OghtI*12OefLbe.E_IGc=(8h[\#E6?U.X8p1+l+%_J$alf.c0^ig^^<6Qj2@j&os6qL_I+&NNY0!-*M4aYYl3:os(o"""qV`A$3*E??;;Xnb0AS(2QH:TCTI-KP>i?]u)QPkWH&K9DnLf=^3"ChVkR@q4_eUS7n[C@Y=g"-lR[e)q>=t5ltY-h+U']k*RQ()@:NqYG%npSYq+E%es9i/utfj=;5htsEBcZAim))uT0HL557p+!p/PaO2G%"`.8oon"<QFk#nL>fU<!8X5rKE?AuIWmm4[o!+[@#nW:#J\$Ve+?`&c]/!MHSg_Tpd5;%h4o0V+FWm!f@K8:AK6B3F1CBgG2V:1?NldgftRFY_'c^/^O>U;h`YdXmWm=J0:E2,BYBO5:'Y5rcS!N-NJp^ToiQ+#hO#=j?)R"4\i4Jjej_,Y%N8==Rl-Q0&RRhtr+oQbNI/.&RSh,s*Ns,#/Nuhlm1"hW#_u^"M6PToXU?ap?LZ(^l1F%$b^\TP~>endstream |
557 | 1935 | endobj | 1935 | endobj |
558 | 1936 | % 'R143': class PDFStream | 1936 | % 'R143': class PDFStream |
559 | 1937 | 143 0 obj | 1937 | 143 0 obj |
560 | 1938 | % page stream | 1938 | % page stream |
561 | 1939 | << /Filter [ /ASCII85Decode | 1939 | << /Filter [ /ASCII85Decode |
562 | 1940 | /FlateDecode ] | 1940 | /FlateDecode ] |
564 | 1941 | /Length 1284 >> | 1941 | /Length 1362 >> |
565 | 1942 | stream | 1942 | stream |
567 | 1943 | Gb!#]hf"uT&:V+Ls'bbCW`)@9r.^F3O@30XC3n#[Y57.E2%4(9f]AF<Nr.FP(Lnu@orp`lMIT.7YWK2Kc@"LXQnVNiB)Os:!Np))p:Ud0"g\>*a)GF0$\-F@UOU</ZanWt^is'o)MEY[1EQL7-SXL'-W4E$7g']jVY-cp3?G.+c+OQ2J6B#`\.Im""9&*4-8uek9DD]MfAaLe&cR%VZgTSp;]G`!5IR,^@<Jtp#(,D0U%.r3EJSm>jiA^0PVX_aTPQX'BQq@7%;.@#5eUW#?nFo(T9P]hQU"T)B&@8Qe)pN4Uru`_094t#:(=D-A%"<Q5$mFk_8%478!\BOO?Blpi;$EW#RLt/QOnQ,.g37ta[)d0$m-c0aq^SN5-RDpfQf?BV6kn5(CqfC2@sk/<k3ej8="hBS5?)4PrdQAP9bb@po8aJY!6=8D'?U=q"drl*NONp%A.m:jUWD72k7jbU0u^2WUKjaW(M`C!4(F1TF!;)!?&),.BH?:)Nh+X'MK-u,[FieWBG^6LX[rcHL-APpN/C;<&@Y17cgLUX.2</,('&CB6]B.gq`>!`krISlNQ+^q0*C[le:.sr!`AQiSYXS$*flf,q?bF7mO;KQ_<p;1d$E55Kb)2O??;%]EEA$r,=n6hVh?J)3t*cq5-=tNoK$jW'ns^LYJRPm7&G#_.!):9$[KmeY<=3_B#7?,^B4Om@]6_.FKmPh<=cGrH0-YhHH+7,V)m0D'0U)c!W`/"r]`QUniYc-oe"3^$j.[74%V?I)Ms]:;AnZVFR_5Q,Si`Dbl9U"5kY-j]DgD'h[]aduYtE"[H"87YIn.7@B%E7aQqcik)cC?>iWQDTBieTtX#A<F`=oe70)*]00\Kp^"9u*[:JCeDI]\aR0r80mi-QYprtS%uM%kfF#jjS(!\D)1B:PJR!e%au,H`8u+!_MbI[rcZ?s4[;eu_=%DmWF2]c;pF#Vt+.g,Er2f.nI9iF/?qJm3pFNdD@m#-T=n[r*Ck&^sX<%i<);pklhpCYN9*Ik4`Surhl>54;0Z-2G>*Vnlb#!5gHTsbAR/0)89Y2tW3SN$4PJm*"7!iZ0k@dXklW)hO]h0Q-'Ci;66p#.P6aic9n[R0!iJE(YHV!2dJ-:"-l?h]0_7ET"on*?N@8fBMY]c':Ss]4'nAD,=<$"`I@)7Q0,n%5oqZpO_6%LRJi.`VSSZ-=J[d+sZ+mM(P$l_W)jJJkJ.'&'Ud"c6b_m\]sZ6BP*Z45!\Ve_<(E.;7lf-$Z_DZS?6`C/T)<!)o4jY.bS"<?N83W~>endstream | 1943 | Gb!#]hf#8Z&:V+Ls'bb#`MlbXo%TH+OIUX.e)dV%imYU%AIX88JV>^L*;?Z*/B2Ce2T?ke8q+k_G%]rI^7"eIJP"b#q&AGr(CU$"4Tf<4+pR0H%P06kpVh7Ff6"m`C]+6\a"sf)*mgA?jMrd-E?TD+'Ll//o'+)//sWL%KJqVf@fad_%i.0nn0--o![H%rB'3!U4@BLbFeq@n405)-[g.JB#bhANEM=S=Hqai(.S7SdIYLh<W[<or+]bMF\:qmt0]TCs,qMoq&Hrll>7=MClqZkcrqoP[2D^l;&Xf<jfC?Asj*@!]We.DhIP%aG%);5>bril_JEG/P$SZL2U*.7g3_,mR8dbZbP(_H3l$bQbAd"kp!;%"7$u<u.RotGJHj9M?VqJO9;G$c]"/`+eh43oR`s[:4m-C&+NK'"^>Q'c",=Sd1$83[q]++t6?r2Tj`ja:54T`U)$;_%\^]t#h\H8aD%d_PfjNMG&U_Ts=Guqh&"(<@Q3nG),=U#L[SdPGRQE]a'Z/dqEYWjbp*\lcbOBuS=qG:;I]ROCM:HZsF7Sg+0Knp4,_%#Q*9Af%`e.q9&c+!EhdMPBG!(Bbg'"CH2dZA*YVI1BBBhn+OgGBtdf1R$KpNu6grTV[3WR?T?>H0Su[EA<_-&UUZ-j4]..+b$a:ZLsQPj>jXe+n>)E7[#F-hn;C@IE>BrY&bO-rrkB:Nh7rRW"nC4+Va30)pMbd"=H@ce_!4GME3DD'pr9RAK224l>Jt6RNr#J4]A=GZY'&dXK0r0K@^8WH<MIm.l/L[%helk+O@"7rN_V3ZSqE(22t+5Og[R*<#)mbX5CZr3g<=Q%5?,C7q7H<Pg9])eB%A>M^IB^h'Y?C4*h$-7<2lOMIS*l_;ZKM!<C;iQhK`cY+<!+A*q;qL8ZP(a9"-Nh7I2pLI,IZC)<sTrhpZPO5?5r>7Ns\o25YC.u((g6JA?4eV0`+[`@4:%ipUJ(ksiG/qYDRLeVs>uNZ/#NYtK[bP9;"-Zf3S>CG>/Ke]!8\%Sr6:AsO^<DC17@nQ4d>`Li?(KC3g+.?7rHM5tkN=5=W'9P<]K\$h*c\"@cTTGi+H2AC>AQtR41n_%q#E]B4rc*j?dS)'.fptV(X^9nP\gX<hPd07#dm>0P,`s&UNnK6"Z4NkpVf:M>WnT&b^L5rPZc%gV^/sE8$(mY6?s[plqPRKH.*OWml5Pskj@jn5_>jhp@Ml@5ajVA2DDI_j'_922`rhU>N!i^$mp&%03Auf?1K;3?[[S\(o'J25,7&"eW.`[cZ["bHcTe0l?5XbEO@7]$EADD\D=h@Ze1^b2+S4[AK-rmCtB`Oi;/j-.j0INo/NU%V4YV%s*kV@9IKi?M[Fas~>endstream |
568 | 1944 | endobj | 1944 | endobj |
569 | 1945 | % 'R144': class PDFStream | 1945 | % 'R144': class PDFStream |
570 | 1946 | 144 0 obj | 1946 | 144 0 obj |
571 | 1947 | % page stream | 1947 | % page stream |
572 | 1948 | << /Filter [ /ASCII85Decode | 1948 | << /Filter [ /ASCII85Decode |
573 | 1949 | /FlateDecode ] | 1949 | /FlateDecode ] |
575 | 1950 | /Length 1582 >> | 1950 | /Length 1552 >> |
576 | 1951 | stream | 1951 | stream |
578 | 1952 | Gb!#]?#S^l'Rc%\J%..s8;g_hr'dH1aK@GTW7anV6&I-8<J,]/;s^c54:\("^3@SaL27VZ"c5X(8FYE<3To2.K+38*[a"7h"*d%^?a"=N*>g)1]9Wi">PL2C>^YjBfW/Y;&-C1aqVa-(24]YtmNj3jba;9Fh_WA8(ObnRS9?O+@'ab/K,)6O,7ag.g-M\;^4l!b.rpI;W6.pbVKa_d<0E1(q!o%eJ&CJ_'>kpLL#M_WVem:LFVN\E'L6"[-ErT5(jAVHP9,'[4FQ:qRaj&U+eR'0q!to]@6'q@Sj@Mc^?$H=3Zh7#QLHtFE?hV4bA_e;r1RbWD4TG?Z"r9QG'fnM6qAl^i_HR/!YH)A4a?D2Z3PlEO72qWnDX7nHe9A]+22BsL[!+<n<fs.C=uQ6A'_V4hL3KLm]=UID\(J6eA\]I6hg5QiqJ(Hcs1MQ*)Ucm<Op6('X'oPS`U;<8[7&W#qlS<"8Bji''7f"$NpY_0,<OS,Y]8o6qfgfJD4T)SKj$Z>%gHEUV']kBbs)u2eW`W'-Lg>3'Y[\m-kuOfBWrBTXe!#%g@m\.T%Vg_hoCfkFf5#0K=X72YD<uc/G5tnV63LYHI2_i(.&f.9GDN+)'&N>\A9kLK^%!P2klps)-,7iU@h_G7YfLQgJJ3=!F*pZ>%QFaq,OHODX7+&t.1-H'7@^N6+)!!G[?c`6%^4]E9Lb]ird3@PVm5(qiZE#NpU\X;+kZHgK5,@b:q0@)jpT1H](1g;+4S#X<!BV8g-\$I0er-:A:jYadZ<n2Nc9.&+?ej;_YR"u"Ru="%^,Q,\?Ep`cD:E#$V?jq8o(/j\SAn6(`).oN*D'7#ol+>IA2:d(dn:_.Ck(KF@2_'.2T"*pX$ECoWGl$1@.?R1*$\;hc"^t$U)g8lJ_\R^kelR\*BZJ;[`<ak3rB']iKS&Q$d,kLBi=NS#R-IEgfaYO+#T=_8Xl'(uoCU.[`E`jLQeLW?mq\F#*[?KK%mDC(04>)kg'3lrF1g'40%lo2CW#^M_I7PApI1u;V%ZN;Vl7PG[J[IL7L-pWZBGHob"D4=)2tBF(+gJ*Wf]Y>pW<JJBO61asbS8M_.4@gkcF!h^H:39?O44QE)e*+K@L*uu;gcHh8*kJ$4gHl_03'p("9.D:-/,mR7>_Z7cb.\i&X69m&CVIJP&*`uS'_En.3V:pO:`dtkm]G%8&_:P]I-n]K/+NUDMJ(>MGU(jcWo8jjdK7*P4iF4H8[lkb]mV;#ZWo'U!'rS8)%_<BnE4_$@8B]LpbarKFNE*X/ETrR)Cr$\Oe]STj!cs+U,hU#H!/i&s=W.<nIM,GI+P8T[KcnnS<!^gJJ"/Yb/o)7mXbAAM_Tr/\arIJ*smR2M5i([hSu`JDE.Un@hNX2$pW&&G!%8Uf%+S\?O\J-/ibpE)A:K9&H:8.RiH#YP5?hRAZgHD;r<Pc,U@tYl!Qm#cIJ0i^H1b"$q"jVPLe1OW'1iAJ;Sb^O`SU:eMMM`gtA4eSa9Qr.4$Lg5s<DasNEl1s;U;6ran8K(E'Q5GE>9\gGY:Es@pD(iubXV=:_Jcj@gfDsh:tX*\+Ya+'@7F>!OrN8Ur$~>endstream | 1952 | Gb!#]D/\/e&H3`ds5C[#E&L(iAA*7R5GU`##"tGe0b=aI0[S7ijs!YP7E+eGrJm-(`GK,(Y(\l%![ecP*Zgr#mZ+_a8DglO*G#4h-h-Gu%CQA&"Dl\1@<)hG-bZi>]eb$6C_/qkH.FYhLU<q&p=$.^,aTBI$KG>;=mp0?*gQ?R)&]e?5-,;B)*.1/eFl9.pGMSo^1'd//5iXJr=[Ri^`F@hms1uM"#-oC+J1=:o_c1>R/@DWT+.eb^&d@+/SAEu,Cb=sfL@ddM]C_=W\P9G.@pnqQ/lC<4l6^dnLXFunQAIbHlJZ*U14]cs8S.?5PD2JB[M*lZEf/@&W8/Z.9VD;A)N.9rm\?nUW:1EpEs]+6Xn0'2e(#DLmWE,^s`9a"8Jq0Iktp$L[Wpne$]@-N;WWgg):nO'+1mC9lr/aFH,;)Vd*VF>TA*?_KHKW@F0SjriiDIA*4O_f*d0TC2U.'<uILfKnqD2I*#tLQ7\6gSc+EBZF3/H2WFji6-;h(GlgQi".4o/VZsXMP8bK=Cc=[JEZ=,Z3gj.h1)fOUg^Y01LSq&\hJdQDRd5]:#F[_EF]YdQ0+s!0F^/p=d4&b2l]"!Qg*RkZ[5iVG5[=$tjOJCm*ON1DB_bpP;bj!b*KA)[kj/frk>?K>Ut.hRJck/@QK!98U.$](dbGH>msot*7qJ"-PV11d4FbG>HiPca/J*e!fo<m4?ik[T$$r/0N19u>Y7Bc(+#&B8Pq;Y3p7X&TcM2o-m.eD9_?6[<QJ=0Hn=:=r._I?139858;SrelkIY`D?_@B5;-jQLN\Mga0/p!`P`*1H@mEfb,,&7^'eLQj&gN[E5ij-X8PLlh;G+1uH(QH,0k4Hb4K3'l%;euqWhcG@6__$ujGDUNP2;o#Gg;1R,^u`&7Zg@%C@-FZ<fs"Z1<IX\QH)*jD:qm((`LtW4ed5N32-l(4Sq<Cnu[F61i5="-D:4GbBf`Igt0.bX2Z9KFaL;-H.giZ@/$XCI`(fX$p'@U-+ed;V26Pb:%Bna&e!5Fpt:G@_:BEC0BCJJVbCB-LbZ+g#Kl*=E@"cjZPm5+HMSbf'GM2'b)hUSP<-*ZQKHSI?5PK;FIEoN91.!a"g`MAKJ\b>$a^kq](4Mc3pij?M!9Gqj%0^$c5]&Kfo-jIo.<UWE^bk=&E(mIdZY9-<DcSi0j5jUSB/.3"('B0BS1ho;SngX1.-Fg9IcV-PZIgWbbsXYORH!XCK1+lMeg"2k>dJ:4dhn59qEsR]J0o7._Q^n_mj8JgM#Y^L8LsXHD-X\[FFCLS,>.?T(WW1Cj[2I<O.U=@U0U5!l[\8k/;$JP"1g=2upj?F0HQZBiN"F[<D,Ck'Q#.2u?_t^DD!,=>nX054Y2=q.GU&e/,04JpLQ.hH&l.SH;t"Lj)t=BQX:99_]-hq)Djep<\2WiA;Wg4S'XS&2]q>U$-tqWX%gXc/@UT$9hrd'hh#"="MZu]0k?D8"RJ46Q-mmRp!<TXGVl@:sGqN4a_BT,AQu=bJalPB4O#R0t7-h$?o\aFg'a#k$#g8]%&'Jr3(8R]sE1hK\sO]~>endstream |
579 | 1953 | endobj | 1953 | endobj |
580 | 1954 | % 'R145': class PDFStream | 1954 | % 'R145': class PDFStream |
581 | 1955 | 145 0 obj | 1955 | 145 0 obj |
582 | 1956 | % page stream | 1956 | % page stream |
583 | 1957 | << /Filter [ /ASCII85Decode | 1957 | << /Filter [ /ASCII85Decode |
584 | 1958 | /FlateDecode ] | 1958 | /FlateDecode ] |
586 | 1959 | /Length 1651 >> | 1959 | /Length 1696 >> |
587 | 1960 | stream | 1960 | stream |
589 | 1961 | Gb!kugMYb8&:HLqJ!`D6YmZ*t8Pu9%jM>gL,_2AoZ%0J(-s#D*g3C0Oln7ZR?f0N_V)gQ_<[C^1D:k/"R2qj)F63lG_N;K!s#[CaSkn=sQQ_"o9M5X]_$HnSn7$]ko^V])m&j&=8<Y;9As82A3Bm<8;Ic\J`N7&<P%f)e2"[."q=,%#>hp3W+in%pd0_=5DLp%1IfUqDI@6t8`=hM=/$KBCBYg>uHmTD(A*_-dP3t/k>T4'^OhiJ?5JZn-TB)X%j>e+_d:;bfY1$(Y9s_VJ=Ac_m<\LXP%#T'*!cLpE^u?_'J==aQ9iDMZ#+*Zm.#HQR^MV274IL#>AX!DHGL8N'$:?crTM*]6kn(2FUKBjcUnokZNL]lK;_VKr"&&uCB7S01@n#!)!OIN=U8_S0"9sS&/QT8e(=uF7&`2KeL2/WQ.^P@lC?>mXFt)Vde*%A(&rY#QNO."RLmtq/ptWQJQFgI@`fjf;]7#-V,*`86nXs&\S(Uogjo"ssEuN.K)"/H(>ThL5,BG[PKHm&kf`Al#D4s/,E"nbs]p5XecC)=VAcSG-YT1Gck5DVp+$.LhH9=iR:7+&0r=2$+/,@*r5ZC=X-nQuLKg3*d708@gK'@k"'uBr&"e7'jQRa5hY"JGkY"u2rT>DWFnlmMb6Pm*a\HJ`:e4q7r'KE"JL9ldGY8H]Yqk<GB^0.EA<\l96/69&3qgc65>gc345(<+qZ:7":_TD83':9M[ZBqS2]Z^<I%W.u;n]5sOo6g>A!-1=b9%;)4!^mq]Q7q%Z:(q?n(Ke3]]EG2be0LX(@Lnp&C_$Thc"gJ?-Wbm1&qhNj%m_9N.\Y\a,<&\gK./fEYZiBjp^lMK#hahmda$q8g@C>Y'E^t*.=4o0-0*h(U6@g6%F86XS>:ENFF'`Jj.%&]U..Y#U;kk-.`NR!Sl\J"f]aV.G=2U*krEm614=N;^#"r*!0sTeDD'2].,9I%R9FRAJtLjS0&H3:0"TZ<OO"`OQ\sa@.k6!a2/V)<W#NuEK%-llK]N\82C$Q)k&&k5dooYT)hWX/$Ji^YV[ndYo3Or/?j\+)Ole4WZ>N@jAkW1i8XlTOs887g%cc49qHDLT@+6a$<h@E5_burL\KiC]FckOHkFE"K>1_5GUs%;O4sP]i?@4!)EL,sBoK1=_J&uu+L:_8EB>dg)o4tICe<\_iZVZW0aBlcD<-Qb"$1t\30Tq.G26_/<N.EKtJU@jk!@?U>WeD<aK(4%^3S-gIa["A^bIbd?>oNIGc,m>6#B$/s]l\5TNE$_n9NpKQ583^Ac-Z#$(<FR_dFP(=TX,namK-CS4eRQ,n5s&D]3>cVnSkD'lg0BolGbBLC`g[]d?A.+*e\TlP'o<fa%r#KkTHs*'^`e![56Hf?jO5dm'1mS_T<RS4n_*JLZ<J,!Vr>rfO5E[6.oqe55/%T_/<)!a^4'=4_nC0m8^h>`p"Z1?5RNf!$6aB9-<>.,P)DF2K1<#_^uf$mU;OY%\8Uji>GATqt)+Sq<ss'peO^q,1M*o'!4>^\X-eE5s"6OUf+(S=fo'E?o'dSHk#PKV"msOGX(i6]19am(mB7E15>KW"IfS\Oi]GdRcQKhddBVgmIK(d>!We?6'V4bh(\q3?S!%*[,BS$Eq2k/\kt+Q^O#'^I.TAS53ub~>endstream | 1961 | Gb!ku;/b2I&:P.Os)<<%l3rDZag*1qkX1fHBS!80&d*Og0[S7i@O%!b8_*K_rJm-/->d6=SrEnU"#Q#i*KT*uqsHQ!LCsL[mf0WqGWCC`?i/ad0[%9C]b"f=n7m,oo]c.ln#hW`Lr7:AP%d8W*$>-,TeMh5@`Df!_%\sp)S&MkiqS<2Y4!<"0_HWW<O>.&M-V:p'"bpZ\pnX>=NLbb">7M)#_nf]29[!A65oT!bn^SZWTL/Ocs<3bVT_eCp(:oOHjupA\h7(XQ3rS("WG`91nU*?Z8"4jPeol5\^C[],J8.1]AYuhg[j(l_T2(i"EoQDa-5t9S7)mYb?bLM<n@G5ANkb[5@Z\VK3ujLmIaa`%H.Lm0A]9Of-e=MbqYZIG2ag(^#4[aS7\09S.O$oBn:B50Sa+4cjN45kRDQV.$t`S""R$TeA+MQYbGo98TaMYCMK6?J3bM\K2l24KALet?K.l;.lm^.@"r]`c(Y2T<q]?DKbcs,0\]?-'Mf3(gt[Y#QZal2GJ2d",;7c%Rroe00QTAgdXp(1:^s>?XGu4KEIG,UNH!l'HUf;4OXYX=3U-jd600qL!c[or-s82CR:=A6@U7G3';$/!eJHZ7+oJ0$]GU=81J,TIB8P"*'._a#^uonjSf%Tc.`iI&JO3E4PH@\-TU<ffasbZCe3HY-Vi#TX8dK=7ddHCHE..9sQKZJpORe,YBOc&`;Iuf.87Yi^Jgq[6cd/.kfNW9L>"WqD<YH`1cSE_qZ82H9WS(V+PA'gf_pcdIon[Z>^K4HDf&VZoW[?\"RX<@H^-pEuTcGm`ko:eJ/V"[9NWKs%ZiH4XN2;5Vh.\((q@"nO!RG&lX@YO2`?$kVdfTk$f5F*4?Yg$48.[+6p_<@?17B7L+1]+[*-BKrJ__N?:7d&"L<0p[U)+8"R69A/*g2V$8EhsV5:U*S?Wjc,kHa&\Mi*cVVh8$2,Uco:D+N1?*LE_5[YKb1?ISKM8JjO;jQ)?"!%C(3NmD>+c^`U6ech^e/Q^\"1E;Gd+EY1I\QQhr4u6Moi0c%*f5Ha($I_MaGj=`c`Viid[!dV=dD@%tc,rX\C6<%Jo'C5MVX6@F,pg/Xr7Y-62GQA_Coj7Q3_BU_,Q]Q3embfI7^m5(HN9;;DCYM+N<u(.Q@5[7FU\MLAdPke9Wf>#<.)Lc);1F;oKGM*>]A<+So5fYXI"#HBuJ9UgS'Ve"-C5rXT#]!8&7Anh'm?opAA+9)O2I(5o4^7,C<-`TNhgc,gc!$^do77f>,[(VDVU=$fkJn%k,7(<m=G.SV>B(P&o&J25T8;j6&=[>K:>0leI%SVdqG4>\R\Y`W%9eZ2L;[Fi!3RGR=U0Z=S.MW#k/$&ik;ibjulP7u-S9hp/hq%_BJuYGUXXhB@#g(@`Q,e"\;6+F4[G.0pICS/smt#3.(>SV#c2eu>4V*X'AoLW:J5LV]VNnCZdj"1CEcFqTo:aaic6ir^\K%G5<RW^#,FWk7Utp8o.uCTkFOQbsqk$G,Et3uEL'@.i6mH/4:`K;oC9#KtWim5Xs'@7a^ZIUjAoHq*/1b8>jrEo1F2lYeOrXVM-Q:V3JmM[hAEQHG`(3LjEgKhKX(H4qaa%Xm[2E9)AnGS8hlTj3P>c+VB;Tpp>PdMqa:[j-`Qq/2(i?p[%4Lg@OY]b7L9//TY>?t>m,3!gL.fKgsB^Y(Ue+8l9V:!F+~>endstream |
590 | 1962 | endobj | 1962 | endobj |
591 | 1963 | % 'R146': class PDFStream | 1963 | % 'R146': class PDFStream |
592 | 1964 | 146 0 obj | 1964 | 146 0 obj |
593 | 1965 | % page stream | 1965 | % page stream |
594 | 1966 | << /Filter [ /ASCII85Decode | 1966 | << /Filter [ /ASCII85Decode |
595 | 1967 | /FlateDecode ] | 1967 | /FlateDecode ] |
597 | 1968 | /Length 2264 >> | 1968 | /Length 2319 >> |
598 | 1969 | stream | 1969 | stream |
600 | 1970 | Gau`TD/\/e&H3^ns5?d^E&+5X/N^Di/d'Or70=60ep?NaoF!6J2B,4e8Lg>+lh;AJ3DnhT9:'*;l:;V7GC8iGTa'#e^OcDZ$DJ=mqW[['"u4@X)N:C&c/-mLg&BiprOkKQG;?#:nT!'NSkQD$J+&.#,;X0DiLERpKG"*.I6Z75p@f\KYgF%WBi[L80hkgMPb6j]!T?X^7`q<hWVfDSMbaRYk1QZMB88>@9X>hS$,><%@apIuLKZDPDp4Sjc1lBWC.`VH(UA/".:&*ZL93JKhi.=i)LViE5/7Al.@L0.1^<nlr;WNH4unY#O,c]/S]]LaLa0K1AU4K#l>.gtj72Wtc2fDI.EDE'>\6VHXAMPSAZ>>K,pLZH8ktS4$Y>kcKFr.$-(U12!fAmN:$)D(Dg]6\7aanl^`QQcWPnWI\(($Fn>^SBh.oE?0(X4-s-?1(LBk[k%p8)]Wc`i7lWg$qe"o/nN4A#qM0U^<gj$5k,*g0>c:j4q;AAMV@*r\,&.a+X^aFd,e,Ct,N_Y<>Y<)$nd3'@biCmg^OD_$r.`A0jU`<Cg>(rNO2j:'d(XhagThhCV8\6:]><sJL@X%;I`X-e23hE,0T4R#nY4d)`V$Ur9dY/:`1;LtGC+C/8p`08[pt7'@*A%MH(_Hrmb3PWl@MfCZ7$EiISYK`*StuF+,9k'*;92]CQ`m)-ch.X]2.*[=b%t%]RhKWMH^-3^hFAlrnZje0f]0C7<oHp=^"4KL[4!1;GjmVN=tC[sQ-,+",Qkeu.uT1I#8X&.9_g5C@@L)(A0lqbeB0GP//-\hDYC`*HQ@>_`W95Xg28bN-`r[a=o.:]2.fs65\e4E)s$4Ck]_9hEF_&b`?tdUATT5X@sE';$!ifefZLaH.k0GR>S`lH5A9V<N>"/#3gZRW+Q]ki*[7eR!]!a'k)Dkg<OU&h3YV]Tgt)[F7#&`U)='2LEp:+-"A=C%?AmT*4:9<qg,dZiX(qDu(D8IgN:?O6=H<HH?=\n4QmN3paQ;45Sfo)b(:D8?4CH<19&fV^II,3\l^CiU%en&q%E'972`\it([;>3$@"(G8l/eCKRkd$&cE#US.^j%BP1^e_>Zo8O;oDp#89-jr(`\?;@Sj1'A/UVl8h^4</<W]`Fk`qSHllX%a,`gdjM6n8LSRSMR@s*KRWco;[#Lunn',#Hflf*4iKXZ$rZQ\`CkXoo;$S[+e24J:4.4dpaT@JXmk=BW;ND_h6OS@,<;B?QK[;gRn@cbM;kWPqQ'u?laY`O32j@c!^s1NF3UE&G5F>:5&De,dDfHoZU.q(d;RCN%-f]*QZF;pjHa"O[12d0)+-+3echYrS_2m2mor%Wd8Fp-=5%la-HK#CeO#PBJf.5X21)=meotrf&>!ec?*l)p797Qjo)#,?j6tpu'cPJLom)&X9bcn'ict`8KjoJ*co.k[[(.a\WoPGGhtmEnT#?]2K3m]W>5I9VR/:;0:*pK!_Lq)_oC:f7)bAH'YaHFZ0&N[,g,=1V*&kJrA^DM]*"sq8UV#g/H_8[!Y8VhG?@X<o"JJT[!f[8/h#qW_<oA$#%DPi+cTWAtCG73`)H9QWmW]Ar#.-kXS'-Phq@]Pqm[b:5S7aK=nO#hFWgTD`:U66ZE*bf/?tOJ\O$**U"?NCYQ<+s(a?+L/,CfGRrJ`ncLX]6VLIV5?kLs`Ta>hgN[\GEsIcT)(>6B8dikF`@jAO%6EL4#X[SG[?3/Gqb4ob)(_3DaebM*6j'h:2Tnk,CYl_>9cdDq"2(sh`0^f<cF)N@[u^%A^^k]%S!\-ls7!8Yf*J\NbTQ+'?,4P^(t<^<5\DAK/g;I@Q\;">3LRtgK@"V1!'f`oS>Y<BOrr9Fg+90HMI-Rmd]A%63)fN+NZat$nb7X)b4Nd]=Jj=Kro-9GE]jPpA[<!o\QG!-`#S<@\J&$REcdJfs3'ut1uTrk@&17Fud-A=f$q@h=)c?RDopQBUVH*\k*n<`2f?^#55)a57%,VZYZS]X6_'5=R&lNl@.T/OVP-jV(WX7Hd#&!8BF:N\,h:#uPM_hWVLk#f4XCo.Dj2aLQoG/(rur;\@cW<:'DO-Cb6FQ%TB[FN.X)H!PSVH_P1#]8KC4'9MPo=)j:0q7=E)@,VL8*BMO*f&qjrl\g,IWrGuAJ3JQj<X@.-q!7&ZuL$'SB`b4l+Q^s-M"%t)llJB4lbMk\1>IA)7c,))^8t]3O8&cFRuB*18o-F=$ams0T%5a>Vh\pLQ95r$ADtTHL*jA*F(:LNMg.NSG)^V!MqFtJ,~>endstream | 1970 | Gau`T@;jm[')`jos'\a^i8fu7D:u1bp2WE%[+GH!??YYRh?!RA99d[j,./[2YOC*#)cC^N`ec@^0$Zm+9-T//2`#@n2528nNP]m?&\V>o&+<"F8nh/LBTc&&nWDZ[NfSWR4rUh=B60N4T-qPP`>irZO8a0:ARTC$]U/H%Yi>Fk(l$bpnIZ1Qo>X^$k-V(k_MmWi^mqSmd`F/j2c`$2CIufi91c?XV7`'>kqcL7/ZnM7Y=RlI16J^7G8TScBZao*%objKGcIlf;Z#O>(11bFfAQYS%sBWE-L#Sq0\gO']Y=Ka-^OucpHe!5%s[jE`6#=[I/<,B0@KH&o)3P*I%h)3->P*t++OA1k:M%%qQq3:@5@cp_"\$S>bP^-hk;d<3)A]:Il+%odIWS!+<&<p<GWlkB69njIKk"bi\2jGq=B4@<(:r3hEAA":h@H^Psn['`n[5eb#7B_%9^5>c:^g?'-'H#'ng&GhX-2Xs+e;Xk=954D'TGc;&W@Zk+`tT%734je)"sIXU,\X\UD%KVrR=='B*=%**B*+!YEH5ngC3o)03[)^V![7o$b9BCFO:<h;uL3\C.,:*^l&A#GZB'3!2>JXBuGJ`H!`'5G*'XQBP0$I3b3&;'l1pjA^sTn=]mc)WqfX_U6TY6E_T8Fp)QqZ^,@-Ll'b);lJ%GhK"0Xc16e:Hp?,CQ<!!ZT";5%?FOa1AJu@V>B.:^EOJKrA]kB&7YY=\("Q\`@MfCb6sGl^I/mjRJYNKiCEhn?<QSJP?Z*,<=dfe_CUn"XPhdq-@Esg#maXei]T66(j1;4Uf]/OuDS`[9o<=6'eOm_;nDJ.e[9@ot.[Rh;:^m9/A!R*DhcP`($5KRSK5G'@.r-%"QBT'B;J3;)h!TH#pFbtsN$GWY[G,Fi:>2dL[LUn$C5d*OJD?"k2TXRBd'&7[kKNFmO&&H(g6u2Kcg[7c#&Da5@kX1sDkodc8m1herM6OtG#$E4Qr4:I6H]%3H&/b4$eS9Y=#U01>e.E[gIMV:Gi/^@7)mD:=m'uZQ-qJ_6r.=FhM]gu4:((Bj#iaLf+$_K.Z'\g<WrFK]LN%G?rH#K>a#oiluML]Y7OH7#B$iAN0s/I9q7h]N.W'Re'LQ,huVN.Kt)p,Y,9k>9&7?MLm9krJf:bQ#(]5VqA7@q8U/7K)hFt'`uE5F3CDF/#4rZ;4)+:W[8:m=?s@McRPH6f,O`,X?hGc>0)5%I31YW3I)/IjL_TTXg4gt.k_HqI=<Q$lE#U)cp]0Ru./o)\8;!s%Du!9^Zbb*Y3#t4jp`*o@\l?CRG]>65q4#P*])DT&jEa!\d:rGO'V3O4F>$!g[0bkUe'3W2.`g*j0[A*c.^S#`-TItTo:>9cKfL+A9$D`'ZnbOU<*Te7Tsjm-DHu6-<"-TWf2T96p2YpMHtWP'9l%S!>as*BgEZk?X-M,3Jd#BT8+G0gC$=3C+hZZ7]'bjm*]YZnMa%[<E:tX^I=k#]5K8(uOa`M4H:3!a+]a`,mh'D@ROFXED)Ri@*.ORbCcn287ih61'[G)jn!c<;$]=T06?k?ehKjQ3q$,5g0Q!+VMOTZ!9@kK9L@aP(Wm#)aa_^fiHC-h7&)H1\IFXc*oE#_@&-u!b#A=gulS`Kn^O_siB_X_g^A<4Ln"HP/C/@oi]]2<%%;:a:2kHr#9.k^j\U,)gE'_0j_N,`1X(HNt2osN)_g)8^_91n++*e`a$$8bV4c]rSaA;"LBAqGiol'b[I)ppCo4ZWl9kiscM2[)!A3W,T$[3YNHuO^&n$qfj,amp73::hTe_\,hDiPJ&l_)!Z@^%*`I/2+irhRY!9&:DSpLEh"1&A!e4>plc.V]\1Kgm#G]-r(J+8S/%)Eig2omlJs\u8uei\pS-A=;n;E%`=eUGe%Y%&GUg%Oh./^eI1M[fWIgbj5u(OiILZ9E#D25IN\$*X4(F$=ea&LY,q'ilkV8PsKW3OcEr!O5qMYo!US@.2;=UD,^k?cut$Yhjop84:cBV44E/anWh,^"JKVr)E-<Ed]S75(5<LO0$j<YHQ=Z(,3\/3'G)q>>J:d$_R4\L*_G:+UV/-#PV_QoYhK<.:LCQI5;!L9DUF\1W?*isgn!_0!L_(DJqf?Z`l_0UfBfAcKX]?2eoeaO`q9@5JPuf,%k]:u:7*O'niO%/2%@=O_jPDmPRt3!L[7qWiP"??7`4`P1@<q%hW*Ns9!aG6fM4`MT\\=(s%t?3lM:V],/Zl*H/J8-fomQhi8aEChhDRu9!M'5,0Vo;AGcn4hL/$X/jG4l.lpJH8NI7Ag3Y,ol7JCKZ/?<*k<-Dq3OrblR*NJ#3?94?#?!$8JH~>endstream |
601 | 1971 | endobj | 1971 | endobj |
602 | 1972 | % 'R147': class PDFStream | 1972 | % 'R147': class PDFStream |
603 | 1973 | 147 0 obj | 1973 | 147 0 obj |
604 | 1974 | % page stream | 1974 | % page stream |
605 | 1975 | << /Filter [ /ASCII85Decode | 1975 | << /Filter [ /ASCII85Decode |
606 | 1976 | /FlateDecode ] | 1976 | /FlateDecode ] |
608 | 1977 | /Length 519 >> | 1977 | /Length 596 >> |
609 | 1978 | stream | 1978 | stream |
611 | 1979 | Gatn"995Pr'SZ9Pr.hVXPZ1Qt'-:b/XjjA9ZCk,GFchXcQOFnMe99Qf^TU"fMTf!DNKGc3ja5:niL2!1%j1PO"$RKFs-\Lp-u/7-74=Js<;><ghrDb`WB_BB/.e4g4hgY;f2O9V8Sb<JV3\h3N(<Q\pRL0@NsdXmU2pen`83cGhj9`/0N>k[_!H@tDr6h[<SE`/S\8&e8la7BPeAFB[kWQE\KUm@]!=>R?RXckW8I$j7KEm(8fR\`NR)%l<^emeP]EEM[VJr#6Z%5P9=K(%^O2IrN*5dNQ::@HEiW?H:oSKiO\<tX/hLRUdr/:YV_NG3P#m^?<kWA8h'nE`IsWf/,`A(8]f`I=DKQJ86ttEfr?6%O\YpE9FYk,=#KCAg!"8:(]E$o)r$UW@Lc!9bcjmlp%SGKP>iS3N'j"@uVS8k*oV=PU3(k$,Eiu*+NE348cq:nh[K^?U*b9O@2ePb]_4D`P42g*0L$:"0XL7hPAf(kfR(/sPBXGpQ,/W]lQc&Rs!I54Zg&~>endstream | 1979 | Gatn#?Z2Df'ZJslp^[%0;DNA9-=C5"?+"Bro"\EYocYsu>S7gVRI.*#\"?$NMQBMrUk48QAY8SSE-*ORp86Y%DZDt6nF8"4l9eSR%7gKP'Y\+\o>c";IW#of'SaPaPLuIHSTh'M;Q>HjK13otG9*mAWYVaI"mN>uM'6Z95m[!]5Mj+M@0H9RY_9PR^7&((p!&PiZ]W8=]Rn2(0[&/EdhoCJOM1*jI_FYG4Q6n5RBU=skSU7`Pq]/Pa<&fU!'_aFRg!h2F0-VAR&(LFXU?:KO0G;d1d2Yk]uC,T"R(h!r96R$CT6[K%L[;[i"\eh7.jYrKXt>14S2q$=^%,E,_#=lU!@qAhb6rjqIB$:>cJ<ml0pa+Y0Uo0,SW"@2e\C2Ptamj<Je\2HldpFi@Vb\8L]@mb0;)jm=2a87nAEEq/d[eB\#cUhkO/Z7"8(uD(`*s/K=&ClBU(F;eZ<_l_]hpQq9I4aG208G(m4-f!:R`9_f[2e*h76,q9Thp8*,6"-4'Q$/)S<l836>-Z.,QVHmualZp\F'jhq0M4Hfc*Glqk-cD',\c#\@G=RD%/KA7YkqM>&;QC(Po&#ddlhghpb\BE~>endstream |
612 | 1980 | endobj | 1980 | endobj |
613 | 1981 | % 'R148': class PDFStream | 1981 | % 'R148': class PDFStream |
614 | 1982 | 148 0 obj | 1982 | 148 0 obj |
615 | 1983 | % page stream | 1983 | % page stream |
616 | 1984 | << /Filter [ /ASCII85Decode | 1984 | << /Filter [ /ASCII85Decode |
617 | 1985 | /FlateDecode ] | 1985 | /FlateDecode ] |
619 | 1986 | /Length 1887 >> | 1986 | /Length 2070 >> |
620 | 1987 | stream | 1987 | stream |
622 | 1988 | Gb!#\D/Yn7&H6"8s'aF@'[jl5n/I4Q8pRDjl<7JrB3fYC^FZVA[(t,G,u4I<bq.d\kJ^/1<>S/kJ_caIkBV5_((X[JGih*1!D]Q^C>sg-___C4i!a#i&`-9T5PtHXRFdB<#;@3D:(SBL36+.uC#6uFcH4JNa;Of&JCi6eI%Tc<RKVOPAD&g^3<r4J;Fm@`d)j]I%Uf,JL\]1K93#EBU2Oknc'.BbkcGf$d/Gg#)Zb9N!O`Is6M4$RY9n\e>dIlQV_qbU$6$qrM*ePU:r&a&nrQKU$03;519P#q8>?@X<%m`)Mdr]-R\fj!["'o,k.C[p`)(&>?^I%`6-*XJP8k%>bHc(4QRmb]EC^J)931%+FBXu5)DRe?694Gsqc5ier;13m)d:63+pJPhiC"k';K_agUTJjq>Jo\%gVHC7qkG).0c7>$-SXbVo->n!>GVom-=`]V.bS%aAX4*QLbbhA%No<JB2Gh&.gNe-Ls>;3jEg;&BI%15Z?DrdYk:m*Tfc7DnG1n>Z$Z3/h`i*J/i`D6Yl[6:"JoZEBc]Vc71P2^&n``DV'rC'8P"NYRBFG9R1e^.b,Ugr%narj@?kH9%:"QnH))2"!>H-YT76XH$@ZQs%JI427>cq9'qYqd+'H+W+I$PiT^'?>PGtJp7?>hGe.JgdA%>_V4\2Tir(pT8p&`9O)?0"inp8E6bQX3shX*c8'B-iO_N?T5c#C:73O9nkR2m8a"L-k@m5t;W]qaFfpD\FJVjFbb%A4?Ko8j*^`'"PQ70O+IH^XdQ^78>4$ol9R!fR#<n@1YDNSO2t??_(&M1[C382CrsArE3[_`tQr>[o$l$K%1[l!;(oA!U(VONdiF2-=aLTBsa`dAM3`mb#tGS:%#oi`$/JqU.Ym=kEn*lS8,51M>)_W$'C=4X&@G62WQgtDk4FKPMBO3SXc4ASt3P;ZgLhAEF\.l">D%*,C++Cl"PK)Q^ek8]uSIQRpf?;Qs$THRnRE!X#sTj.V`X:-da>7#%geD7];S>)$FdfL<p'GIbp%kYEi94<dE02)i`m<j`Rbj>)Hn22-'pXhuh+u<B8*69Z%o]@2MG@Qf^5,'S<qdoHrT).Se/$',cG.P'dF]g1CN2BING=7qn"5aE`S4In3TQ1XX@&hnUc+/hN_*`2k#8Yq-P]*j76Zc'pX4p$V8pk&5`mYd2kCnndp^4P6/b0n2uel<ZX0XZ%/Za1aM1Oh%T-d,@1YZbNtF=Z]3Y#Tq1'=/hu&Jrb_iR>&_?Z4rPC;>L_.SLo4j5e!(8Pq:o<V5kK"Br03U`!\+0a9Z/_e/aIu5:!bJ;@7]&C-_Tk0jraF3Y2W,'f**LdFCgMTl`Ek#[4DBEn_/Ta\Pi7cHl!&^SrTa\Ia'=2f7[T(WLE<`ZFNYRXA6Lh`k(YrF+S$rK;K=UnF0&$d2&j>JD981n?]o.*Aa.q3VO%,Q),n]MR86++%5Nnct4oNp_\gXA7/cbK3Ffg-DPd/.[t$YU!*'g:@*"JF;CVbPtVAc;SI^,<hl?e[$\CIiDADGk?7/4?>nlK0-pGb]P5DB=3ie,o1lu8/5J=JVe5oP/:<Yob@k>"I8*up?ae/"?[4%h),qt*lQ=WW7FUgDML+u4<JSpPGUNE:%H<!a%^>dc6Q+oO03@@h_q,Eq)`JnN?%k8Ba>:`'sa*b_0D<+25\A[RDrW?TIAI$ZUR^T4\oW$lO[[R/MQ/:EjpnP"SF&1]'bdUq9Oo,s*k`$0I5J58%W7WjslO.LkIH\N,:VK+1l`;@U<6?^VZ\"*EQ_m`eT=lW^2]slDtCA(E`/-S7$Q$#^&jcAe-Sh+-))NFW9XbY&;"R+sTPD\To!V_pHGVf@X2?mUbn^RP-npSC*/<O%(AF"hfNQ],QZ_kKj,0iMCZ;~>endstream | 1988 | GauHLCN%rc'`D@2s5C+H@Af;h;=Q/&>p)o-[TJH!SZuXS^JGP[X-H)<PiCc]mp>9ffl?@(lXm&K-'F&H5'RT0"qH*Mq;756``%+F@DH-8c@L-*/keLG]BSp"5Ft)LA`(<8#$kgOLSmKZA"%?RX-%?pN!OjDn%(l6Sd+,aK_'LF"?%N9a*cD=g.J/=AJ+\'..lF7VVeVI>BXfJge53XSM,Y1RD+9u-88<o_u+?`A=E_&$+Hig_tE]`"IN[M2E]aCAZ2;m(jq`^4A7SN8FkCH$KN19)<?q,YZce\&k&*=nN@BaaKmQ-ZWkKrUqqF%'&Z=]BuI@41tNL6<K?$1+AcWM)g_q2,KR9C0S+r;.<`U#dkhD[SqSrIG1HIRX8>9Yriho[YRKe^FS>pTp15M7DT'HbDAQn,U<u'egWgu*@t`MAdObMS!#+iF4_"IE`B6i@]fJOLE>8KDa]2u1O&;8q^lQ"VfR]PsZpDQ=Tl'QS+>BQ0K8\$_Y;%q.)-$brq)_ePMQ)F()16]o2RjQqs8L8tku(n[I%Gk$E^==fpG3Ds>fdhi\>HL\d&B_1Lb"ic(%\N"_]paQ%R8)<!?F^rk]h@iAJK4LI1q(,BaeAj_2%:<:Gqqd\KZA:5Z?)6AAo>u_b]''C%)f<OK1E]buH05:$e"E``+/Z)T\aPe1f2^o0\k!B0mh#8lj/TJNiQ`V._!"C*C>;1'@/m5hok2Zk?E5(3QpkhnFMsbMe%.C=[:%Kf<d'GA'"&1HTL!N^okH`h)eM14Q/=VCEC4(le%Pl2Jl)Cio"b9jt=*&5+$P?]-oMd46s>0QMNRRdNHqXAF]AL_jMa%.>?YL>XE6VT\e:?/q:&=QlFkYO'?]YBRhXna6(^'3%>=O_bN"*S3+7!(dP4XLA[AYl7_@>rD-lVaB2%,Qd'"lqOPK:pYD20)920_B"_PKip-DT^H@cADeqLg_V$s%Eu&pij)J!(C@4H-itr+g$JJBD#D(U4NbW)V5--S?gE^:TO9-2/33![P#r(BqW5m[PmPa0%i05Qfksg6?X>0YPW#Un='Y9BQ*i+.^!4ESV&@8b=t7l>^,8Eu[Kp]ome#o7@qS;G\OT^:iAE&>'^e:8GU*tRP]-&I'qhW*=7]e4=6RO3Z30:7B`;V^p6+d61;!Qb?1^G<PUU[u,7Bf?*;uHs\"a7EM6NYo2Y1n/JSb*<#J+T4]@2OIF&^7LW@9))-kJ<c>7*7.Ci`E-\Y%unV[8P\/26OMoX!hY`V7e/ShH?A)ACO)Q3iQ\nBP@m(<P9gU\"*Ipu:9:_)aNo_]%\8*0:ck-kTQ8*`nC1,t)2W>(0>^oPaii138u2A266L<N8;V$J2"];D/Z2,MoBs7HVrl!AVZN:m/E&CpLpU'a\GG%UYG62iot2SJ8&j7O#`ET[rTEdno3^MXQ^@E5]<Mq0k%kq7G#6S'n(t1/P#)L*Os.W*LKGl;'JX9_(ID@>pmGBg>IDSC]3%fO=kc]3!Eb18#h#XN,3\SE*9FS&S:4?Y=<CBPp#9L+(OtfmF_JgI!@No9>roc-rS%rP;n"ZJIsg<_7oW[O=>AUDE7Bk2?dF7u8=5W+`)b9ba^4)a,k'<75q!;ni`-@gVTJFOub4a@4pqW>K&qknaPS-PUXS+C^]]ZSiT1U'Pd5*TikX2=',OQ2taM-^)2n'<h;,Snp3":RecV@,1cP%_F7bi+K+4f-SE56$g_#rUgKf5LnL'OXg#><fb[5eofU-bFdc;g,?KR0293_5U76YnKW5(?1-Y@S"ol:F]"Ceib6HY!OQrSQD6Q=bs4jpo4d7PIY,dl]_ijneR_:l;d[a^hoREYiuW6kd%Qg9qN#b6)qs,=cMA`j>W&]r4HZaBn8TR"^60*:>8L3F\Rr4P=NVBB0FmW#^>>==\\C0oPGiXI-uC32=4Y7Z/C5iKH^%*sO*Om@l,[)HR(J.E!0:(7\Z%%G@^b`nW3Kdt^kKVhBsIT_i-'O;L\%R-Gda7)^&j-KTc9c=DV%)>p\L?rS(DG"YL<b&.:t1cb[TAtT@iSI+I2C>piBptGDIQF:YTq(Re@KPPFX[;7`4h1rr=,UZ[D~>endstream |
623 | 1989 | endobj | 1989 | endobj |
624 | 1990 | % 'R149': class PDFStream | 1990 | % 'R149': class PDFStream |
625 | 1991 | 149 0 obj | 1991 | 149 0 obj |
626 | 1992 | % page stream | 1992 | % page stream |
627 | 1993 | << /Filter [ /ASCII85Decode | 1993 | << /Filter [ /ASCII85Decode |
628 | 1994 | /FlateDecode ] | 1994 | /FlateDecode ] |
630 | 1995 | /Length 1977 >> | 1995 | /Length 2035 >> |
631 | 1996 | stream | 1996 | stream |
633 | 1997 | Gb!#\@;jmY&H*Xms5?d^YS3t(,hoUeTHBW(.uJITQ5U]sGmGgTZIML?7S7g9?b]*7G3lAoCJP,""L0LTa5aelHZsSR_67YR7leuIPeR+4-.eo+6LN2Ade#-)R\$/MFaiI2A&eV0]tj>o8Uu$1cb?rP4:s>]<Q3u;-JA3_@tr/%q&'TYhK&ei`\oC2Qt&g@Sg(B@4[VG*Mc`imRH1BB87\H\"H1ZZ.RED>2l(jfdgn:KUjaq*rkb@,VF<q4</$5j`E^NlXAVp^%s1D6Wg:W\aQTrt^!4o,5>G4tMMPKV)u5NUI!2b4XV(Bj?_Fn24#duiLGT&NOjQ?:0i'3+0q\-lqbgAt!K0Q&,@4>ccIM:@]2j.R^pSqF`5iC0e3=VAhcRjoU0&rS;K-=ZN$;<@%;`PO%(MEj&BcAVJuall#%YR]\*)#Qnl<#r5?u76!lsjPCZnlloB5K"1DZ2H,B)^\?b#PHT:E$'R.KTSQK]*>NQ5eb5D]<[4['a6rl0jlYb1Rr!T^":f?r3,gZ7pVSFd%rgZ]E1KuuM<%qkip7EV@k+:t,WHiF0jSFQ-]TcJrXYCXc#MfR.<`??X!'CR3tlkkW-Ghb#LAZ9;0D"XY*6^/bs;62_!X<0GF:]U-<cNjDo&>\9`>M=DX3(N5.GH0U6S$#m[$SY]&l1Xe87Fsd&rhEo/)h#+oLPG)cdp/*`Y:QaM.k-1J1hkGH9I4u3X/K3@;P8n;\b]WOV4U/``/k>/1c+h^Z]d\4*jJ'THZhJ?"/fX`'B+_YgUl']=,>MF#e?]_WD1-qQ^-.t8/*/VKVTF<+Wd&@ZbGM*24'gL<X@IkA[g]Cb]qe$?BhY]iJ9A#_F*f$"2@LGK8.g;XY^ZP+juBI,"8ZjCA24cK)W4\Tm3u-^WXgtjZt"Y-g5ODF>k22TZ!rl<5QH?Z[@PdTK\Q\$b'90<A2Re6b%@gBQD;q!V:sGX;'7<3E[\pMR4>@9_$'a/>J8pYhGXg:QXfg;7b&?;MIgR;XJ];SB4?]*s>@^10p[_oj`hb!i`KaHE*75rA?_WOpBI<=97YU0o^jlBZ2iR(53WamN7Y8F9WVAjLH\Sh6l5sZio3?8@VR=6NCq+&X^%)kN^an?X@>Lk:2P%VG'Ni/g2Dn70Y"`i"E*KDh//)^g8WkZor$(qa)iVF:hZS'0T9a;d)?=ZWEMaArX#?76P!cN1qA,ZY/q>EV>?eoe_*VZGO%9Z>c%H/;f+>iV;!"DR[tBPuum1MD0!Al6=[2c/'u4V[K8e4!XEY`4D:%hIC]^kN.:3#4RAlJJopX]=*`M$L1.O3:3H>m<@>1[1IHr;ZW!hnJJ8dLLlc:.@3`JC>Ydf&!^\;YNMQQ]SAR">2[@l(h_F0j,9q\;F#,!aeL[a,PZIY-JHUgK\1B*S(MD<R1Q$!K/O@D?)bNZYX>8<m?8li[2LKc-&9"M)c)JA^OcD!fA(85ZDpB;S$#G/lKcN"Mj,>*^#biL>%(>QD^)tZB<p>dJ(10(n"Rb7&>kS24Sp-(e$aQ#%knGf.#ebSUjI*lL<1Y/U#`/g'S#WTbLAg0o@t"t'u3O[s0Kd(a"PDdZU:VC(;pjW6D`5TGe;e$Qg_(02*5bn`DiI'-rY[iNr?\?j)6P=lPePMQTamedeB?"m0L9hVu<mZ1'gb\i0o&B<0ae:/UiSD0WKhaauF*"7WJAZ46?a5_ps9!4Q-t`GW_6g7ZQ)bT;o;DKDN(-_&=Q>p@[IKeGTTR)\*4!$7Af!>\f]B&ZN/DF3j\;PGf8(;&A,Q3m13pBp*CXd4Ps42u*g!(T(3XauaZ(nKmPb]#-/Rn'j[P@`lKks0]Z;67iJ%@NXi(7qe:MpAqgb3I^]\L[R;<NBJ1U)GS7oO;_EA]O`8"]QllR4@,N97!l?@cJ(^)BM\Pg^McIX)]9%N/.J:?@>P%&<Um5S@QeeMp,S,FJaJGVV<2)Rn+Yu8!n[-oF/!/V\Ud0f\=Y=@cHlIjknAe9~>endstream | 1997 | Gb!#\gMYb8&:HLqIi&;:,T@.b;E(U@*obrde4j1<BMh_tYU#PJ,Eg7:P*XY%n(AFu95Lk6q9UCCASO4eHY2E1R<?Wf?e>2tAjf]6qXL[\Y"+\CgqMUBaYgc"S=b3m5BH.u,G.GXJaN5B+7G_lrGX!,/7ccCP".H)ZL]lm/=!R51Dk5CHe:MV12JWe?eb>Jn(6'KGYFf%L%KuYZthk]^:Th?r,b5g0/U3r%fH0o%t2LlT'CsoDk.^c3\caJ=5!e^S?VtG,:WjO$;qWln3!H,4=N;\Y>oV`;P'6KE>Q<>h/=C4f81t[*ccmuC[$U\'3`:nn*(Dd>->&MhuUK.H!/6o!M-mG!\Pq[jc]3T05@/U&EU:RRpHYR/X(QOF0R!UA4ar)`m\h9']qrOKH\J%3CWVo.*5%a1Fo\#'eJE(dDn@T;5JN5K+]PWZo+&RN%9d.\E;F9*KS?^j?GeIN^b>S.[3MTJ?W*95ZT3Urk`B.8T/]K9Y?MT4W"hAMP?UC8laHX&hJcYPK1\P/N2FmP>oUK0+gZR8f]7K74(HkM#;4c9@?6+?tK,k;K&m`g>.G2>%d7."DW7&*#-_73BAmQFC[QMU0L3D$8+[[0:Qt3'Vg4D[f&,Mk''jHA:#Sf3AOg?_kbag(X9Cc;W("g7P'lOEiq;a)NY8T\36l'QEBFNrTQA'jZD&?Z20LB3Idat^:+q,GJ)f(pq]I;;uDT@0@Nmu5\)uXdr$E,_cAdHg<Be_&$&Ao?RK`^b7-HlkdSgsF-V&l(/2>]n=)j\,7m#Y*rZ\#E!K1BL>tNuHjrIJ+j3!+k)E1smRaM51),.dfJ67!M.Z0tof`UJ'I!]XX:#1mmsmY(colj7l^ploo`r0RC$W?R%_B=G:=VI9djt&aF"g_=FmEScX'bl$feD->rj5[\Rd-Kn9U!hA/?S[d.3[G;]\`qSSJ"978V&@7EqNUTV8!<eM'XHQWH[]BAg`3FmBAr#43.5KIW+!s_hm<pkM+>O5$oIBN=kaXD,QjP1Fl)"o:a7o\1DbE$\rt?*_s>18(LA.6aHjPhNZjA\7NZIOaCNF>/1a+eht:m)u&)44D6,pfh*Ii)'\GR`DU7#XlFkh:=0$95U]rVjR;Y[Z"sPPG_-F7:NsLg#tfRZLJes+50=BA%f.tAZga>^C&,V.Bu6]jJgMS=+#$J5^e-nHb"5O:<2A=mAst)2@k$5J_E.+LGCiLQMUJPi.:p$=+E\Y7cQ/RppqHd\5WhgVqSrZD"B&gKobbJdn#u!/O?AnJ`H"L.RV=%374YOWZdpr(/ud'*OMXPSM<u:<)6],Gk"6d-!O*G1?lm4Wfj4X$MNmF3jh#NYKI#Oi+qdad5Z.Y9YnI&upd-plR+*kaR(X7q7ScDgOk#*_1W;(TQHp'-*R+G&.B;&@CD:nVRiSP>LpLS:XeY+o+%qh-P(fZZ@ppcr"NP_=XjACtJ`GQ6#Qq!7b!THPp-C2nR2a-#>H'+ck?\M+_!/5Pb;lG7%=$.[5ReEgWi\U\K)SX6[[l$`rLSA3k+YHmaruoK^4pCJ@%"u1asE763qVX\I4<kKlPX@Ln)4Q\kNh*]Ch%G)0<-K/!P)&2&!JsZiST5\[$A%OfM"5nfP$JJ&;tjF7tMa_C<np!o&A'&dc6P%9/11WGT&M\NU*3UA'c/Y`\kB/PHmMuS#K(WlKcNb6jaKd0"L/@<[]HY9aI,!]8Ml.]c?]KeEhUJfY<)Ri'3e2Sd*YeGl8.,ohT7\)e%1$\6Qp^&bo1CoO*QkGfs"8W+E,UK"(llYs!IG\bc.Khf*bS1u!Ua,+bj2>T%Ih[<_T,l;Fqjf=,DhAjVmq>]S?kp5Qht'Z\PXZoK@\,CQ2/E?)g"dG<3SV/F(f)$DAkE-8m/Wlis\MkAu4N1*Da,)RJP7PVC94[<IodCmdFqVKdJO%/0@Z\/G%Fj6W3/>/=gn*-.Y+Ncf/BK#S@f!E8=3#E^jON'c4!]s*X'LGV]JK`567e65tmeX&E#%#XL7`J@)/>Z,IH[3>@%u99[`9_LHMpug_3Ad;!r<!SFIgH~>endstream |
634 | 1998 | endobj | 1998 | endobj |
635 | 1999 | % 'R150': class PDFStream | 1999 | % 'R150': class PDFStream |
636 | 2000 | 150 0 obj | 2000 | 150 0 obj |
637 | 2001 | % page stream | 2001 | % page stream |
638 | 2002 | << /Filter [ /ASCII85Decode | 2002 | << /Filter [ /ASCII85Decode |
639 | 2003 | /FlateDecode ] | 2003 | /FlateDecode ] |
641 | 2004 | /Length 1724 >> | 2004 | /Length 1704 >> |
642 | 2005 | stream | 2005 | stream |
644 | 2006 | Gb!#\D/\/e&H3^ns5@!dW)FtA-sJ@]4uHJ!AFk[0oe7(6:f,Tn<[3GN8]Ar'rJm-&`6%qO5f&lhJJD+r7h;5=mS40qqITA=;?35IiU&W-k.u9LCu>_04G*=f_h5.J#Agq/N$.b@a,Pfch/di1j/'\nO9O5Sdn;=hiIPd2b1Y_SD9,a4S-[+<"n3Zjqa]dp"?iEM'W7&RU;TW!@6Qi'oB(@]Wl`Xa7kjoDj#7alT20D7>fUW<UE?RfK^1l9;;Hhq@gU8IQSX:6T%Bn`/&@n3%`S%160FKVnJbnM38$k-F.Jsc1+'\45Uqr.^f#6EM%Z&==ZMrkD1rQ1I4'=a,5?U\";,E&cPKt5#hl>#-PLM9n&^1-g+.2"$Wj9B=Xr?o+VO<5f2[hR-uDCM;<!mfH\)D!TY3J^@:NYAGc\S2pRu(HC>#0f2semWcZ60&>b:oal1Zur$b;f7J*=;l-&XZ9_-@dcXtYQ0Hrsp*:?PQU9]#n);kci`6@[nsrX<.KV'40f&[&Ek/#X2#-d*%<%__Ni=Wap&_,oR&=70\7</!o`F%D*CP)H#l2M?ZhPGNfHMDj#IA!Kf5nC$d_"8hrYl2)ee$Ve^Ok7JGMKAd:ioH[I(lC>miT#FGKA-FmBgN.;D[TA9lcLDKuV]]5fYGSLmfjKs,-N8XY?a3"F@T%i41u^7N@O=e!j]$eBL86!8/=$0$[Fg;7iEnT!SnABKR'\utl]bEu;63%3A(HOXoX,AjO\/t"Y#g`l.sQJ3cRpc!Mh9:E24U$T^g]8MUSiWIVGPZA,kL(XQ(hG&9@(CN!iRB7^oaPd9*CjCA0r>(W>]q57CosZBo)tt.'655o(IiEljfb_6g5Q1e>W#8\'$?.+mW%tp7S:*RFpe-8NO/q*2_,.@i"j!(M'4]W7u=f6&48b@g,r/c_n0+i_X90eD#iE7rJ2+@A`s=OT43@3^ZUsi>N>cUdN$-_3pF#j!?<5$^j%+ebqpsBj_nEN_HSmD;C%l[EL6dVf+Q53@PbR+]G10ap!s1eY:``<)*Ee%<[se8@e(Ng0!/'_^7d/RV0/dOuJ`P#3#jKM9OC[a].?3=BGs+A3m1N<%D!dZ$&a^LuTgo-)aFt/=)V@F0+M'6C6;XLpR$I@`lG;5@Hi+QCes1hh.Jh1-Eeo6UkOs2.a,B4<n!d]g9q.a*B8scWX:%l+J!l18X/JmX#,9PKD4WZ'og^X4q*W[4'7i+)h7QKY1X+f@_dM^jgo1.)eO>f*V+u\'%P1\a=C/)T(otaAh`LSht\nbMi!E1q6gPr6!FTXC40qhQTqJs!912.]H@PZ5dQpfi3"Wn`Jms<"cOc'Lb]O,-%SfXrtH4/'@@%43Xp%f5I99*kD#h0Mm(Jn-'$=rA2IZHX0C2c_c8I*W"r_N4D8)B%4T_i550@96,+94I6Ek7@hbe&%J:HXk_2(lTYIO1IZ7MU\Jd<(d2SGN+br12+M1JC-&6AfZ7u??31-u0XV@8GS7j)H=hn+cZL?%1M2\H40[/537A&7.cX7#qkrC>;It?-EfmN^E)BFbF43O_L'=JGQ6s)-HKOm-,%L@*0'5X\6cKW'S/MV3QZ7_Aajl^I4/0R*;X`(+fN7@ph$`l\JO0maiNR;8$J2oAs1?G^b(_?;/<dJ-r5%1kDr;$+5?QfQD7g*R`t]=sdeCXRasQ]M[9*ID&Sl'(>5g11O))#5Lt[Qu%/k@8l!9aO\F2S,BK/-L(Q!3*XT~>endstream | 2006 | Gb!#\D/\/e&H3^ns5@!dW)FtAhBd*4encdmAOVo2(^_)c.-Y9CO[Oo!l=Re[7nU5UFR`"t$qYt7MFcU!8'a?2UB<FQ3p(?a!PFi9lO*q;(FD.%^?*8n&q6;i+5IqZ3W7SYL+!<Y4!)F!kP48].tK\s'iPIG.jip=O_oi1g$oY+kcA5q0ha&(&4!>KO7iGtN6Y'C-(ORiMk<aPnd-YH9[#`9$0sU;IqVq3L9VJ:JYUK*PBe;p2::Z_Q'd-^+KuG+YuZs$8/;cDWo5i68(,<A'P7EO5)#eKEJ\nX"@>t<RNi)=c]DU37i;uLdhBEn6[*f[Q8D'>/IQ\c4gDH1X:ndr?lT:IA=,_^W/<Gk@[9\X'$GZKZ@d2PZ/S,JGi9"L"3.76RR>*D[N[Vt.X2D#M5$S9:U\+Gj(L]oI7je!O,Yi6/b^-e&O_E;_+lo:Ou2%cE;JkMm37`Ul1!NH-2KSA.<"Ws!nECX9aZ;\P[RIfPt&)#MAmS=e")`InI&dX;]Ca@\3u,(7PKi5Qft#/m$T.cll@_)-X\-WT>3_6^\;ru+RktTHNr@%$/Dk"@UE!Brc><h^`G^kFm^geJ*[^1R+J9?;+k;-RoGTAWO=5f3-k>"@bD5=)F&dgmOno3r/NgY+$+H!MSn*QliF5pX(ni`s7lBd*i6"-"lE>65/Mt_gQ4*pd&uBGU/5q-5,S)X<bFgaCq+f;.f:/J[8K:ng`fu>'f3hu%^K>d5^.WIed$#7n7;i[/,+%tA:nU48k=fFY3[MB$)lK.=UI]9BMkTZRk3IBM\h(_@!<.<hUB<38;DS@&Q==Y0eB$8LcQ&!<65cR/.sJpU&bqnonD.]*E>4;9729J>7eN`<n#mbCcJ]fnG\'$[oalg0r_uS\mu,3I)^:X`i(F%"d4TgZXiS:'kgcE*WOOhdo:HDBm<gi)3'`j>.7**>KIM(/9jg`dUUPp.agrr0@/n=\H23&@P`B<B;W#`(f&3:.3K9A2"ZT7T&+(22fd`3&KJoD[Y-HHk:PoKN+JW>^;%k$=\FqG9jek`J1kYI'<JqJ@4/\TGX1M/a&FJ;FL94C4_i%Ce@bTRH!@1YpM9t\Z;c<IXms[fn-c;<6Kt7_a(="XT*AP-hRmR!(5G#M:VE;9fC]XR+HC=X*g-K[75dM%11:MfJYYZX$c/6nC6K\TR>&^_4oFLsE_HpH9D;?IMUp?V[&[VIkQO+XOHcPG8@Za&DCHAm[RQ1$>uEZ`d!M_AO3iXflY$sGCm&mr$l(9bW?n`d]*7tB'PF/]\fj'e9>3(q7`g6K'e!.bRa'Qd.3hU"Qjos!Jn39d.P.imdh^Zp=$.qSj\=%7oN,-,MZ.pQaVsMNDo6j_C,/[cX\"_AqAm[UbQKZ88]k'Z2i9OJ*PJuDF[kiKc$KJidcnlQ[[Kq;X(_lAMH>,dHX+?V/oEW2DEhuXmJ$u;TaWHc?R=c0@JC8B7u%GgiOd-(Yf31jK`6%+*?BW#LL3'qdMd:Ji!jGm^D:rb>A?o6<[+Xi\t,@+]K,cuD2Hc_&P8AT'@2E4\V0#bXsq9Sm4d?>?2luAL+9uOcqoa>/_DKL?Sf\AdsFK63Mq"eL\+qBLg5bUI<.o07dE,'Q`G=0CZQtK:,`O%Y@d[]XH17Agg"?a49aCb%1.h_YcekB]?'rEECF`ZB=X.-WW-<3+#[T=Z"&K]DU$F44M&s0S``1]BfJ<Q(BI9<&c~>endstream |
645 | 2007 | endobj | 2007 | endobj |
646 | 2008 | % 'R151': class PDFStream | 2008 | % 'R151': class PDFStream |
647 | 2009 | 151 0 obj | 2009 | 151 0 obj |
648 | 2010 | % page stream | 2010 | % page stream |
649 | 2011 | << /Filter [ /ASCII85Decode | 2011 | << /Filter [ /ASCII85Decode |
650 | 2012 | /FlateDecode ] | 2012 | /FlateDecode ] |
652 | 2013 | /Length 1800 >> | 2013 | /Length 1711 >> |
653 | 2014 | stream | 2014 | stream |
655 | 2015 | Gatm<hf%7-&:P.Os5E[Ug"BWLqI*UrYQ/Of@KfXPCL$5F09gRe\PT(O;K9CbIRhPHmC'H8f*N#,13n*Apt^.<ntAjo^AFD^!3[bhqp#F2JB85taGXGH%rWiI=.c\"r:Sc@%&:YSlc8%Qp0:u'r(uBHPrUW)ZNjO:l`7a(>0a=TaIqGcn7%dGjBqtm[3+/LpX"=5R+Ca=$WWXBQJAOOH?fUVIphiJoDR9"m\@K4SEesl)ul[]s3I&N<C5pO&1diJ&O;6%@#5b?#n2DOrsL)&n-An,X\91fF+MB,$jL$[0p$p717UX2ZK8Ho;9X?J1AT/doVMdD^[DV-N?]Da6>P;?$8RlI3<@&,<t_kh\XZH6NeT9IrG<CD^H-IM?25`2i:^GMbd/?LJO-cU)Gfk@6WrLhS?pso_0U)[='>4@NI2\aE9P8&;4L1B2i>o)-'ge=6E6h.+rK^`T<-8T$7_%g:TZ@)UV.Mi7q+sHS;Y<.4r=HoTC/?2=<G/+@2m67_Z_t=2&HL]^+/6g+='Qi^a(4c@=kEHN27kUBM^L`KB87SbZIWpC%H+DhqK]ZI@HnAKclc7>?H^bCrHMXbk"/oAR:pp)@POY3R5-`Jf,B'ItsgT+I.=?XF0/(!%SBc9=h$\od75\B#,Ga7[n%VhI%*)-(ch!rC>rBi,?!K>kT:2,lb7@$*f"U:*+).mQcA9M(%1t)gl]JGN'?.QD;?1COTTiWj)9F?a:McO'!c2N<+Gph"'BUdQ9q_Wtu.!-ceBS0gcNM)(ip+A@$r'm&dtK0oJpU/>43Y6<1mWYImo!N5>r0^""d%AKPZsV?BL`!@BlJkWtmo7W"SP(rVcB!(8EH,aD.UD,fpG[tlC;"`]CNpUS$"j)INH"Z>2s<Tq5cBt)GFfa:=_T.]bk6(t*Z5WHo(EjfTLrgb'jaUbj1EtLZr#msD^OhIR2gE;?mj4!gN(m<]+riHsJ?T.1<&?QOch]EAEeDH#R6PZ8%F4C+p4LYYcd;Vb2,P?$B%DRhB`%"FIb-iZs)G.,@L.d])4=Bs1!C@g#<@,VdRSCEnm3nV4l!eu!_8N/gIORggS?=aW7k6um@BIA7eEr)<N[6)gP<D2,N'\6b9.i$.e:8l_<OF7I:J[4MU_FNR:0E.4WTtL;V5?I>4YmRHo970tk)"k71c=^$j@pY7e`M*ErSYP%DjacaDZ2jM+a#(I'_Vp-'(2'S+3ITCT.?-T236q^C:IJQ:@DIq_.+-Dl:.pU<N`fMalU?c",pk2W4bsQG4_q]=C6UW.(H-\[l)BNb0X!(dEOPB:V3_C3iD$YL@*cA-TJ$r*/-]I_*DgO6R%>]9.&-@8.<NTDMej;dnYR(&7)R`3rA^2pjt(orN`6X_/TVCq]?8C7DOu^"82Xjjll?R.Vd8-*-25'oZDWcK`g[42D84<T_b`E[7KQ=[\W)p'KBf8E`Lj\@:pOHfVo1FWCkboe>9pu3Q[<1UW/%arh@D]/Pk*Fiu<R"p!hG^(GnP.<49/T>I&"PCH=j8IPdY-nWFkiFeEl[e`Z?/.!NV49B'W?4]9IdV,)8@A"3(i=gP-7Z.eH)24cFjosCM^;.F,%N=AaSk1Zb#&KEHncgI3Lf5l.[B?p[0:iEU:Q1=P^Yh?ase<BZ]ZD-s%&d"'\I'q*]@o%'`T('@=*5I=g[@5t#gV'<i_=,!;PelJcjUQj@ZQ+tV3Cb(W2K'Aie\cb/LbiKB!P)ulB6P%XhKV!smb?BpjIiQL+;W>Km2D+pB><;gdl\Cl_8ob_583Ork:<e*`.i/IFC$#)HP2'?*?))arW<S:[iP~>endstream | 2015 | Gb!#\?#SIU'R^LRs)@_:e_(q]P-#75:JK62):B[$?0oPG5Y5$8(Pu*Zb&6q=G:D4Nh(8,uWRqj9M.MkEnD&(L8/k%jCKKt%#&l_XX*6JS%a5Qi-e8E4\+"QaIeJ#8AoG]c!Vig5NIkk0F3`+G]dke!7E2^Spl6*Ur+o=A/JdM^[,?,afE3XS=[j0S#`O>MI(k<NHls]Q1+G'oRV=AX-s^esQsX+6ljoJ3?X`a&)2u\YE__<CC/DEq.,Lan.Cd.krJ`B!>Ifji\ACR@r*qeoa0d7lK!9ma\ZeSip[u%`/\,QX_=K\f+<F&hJ&fHCM/\Nd/G(M%_*G65k07ZAo^`Hn_77RJ'G\^1(5,KQZWmh[!"m3`kUZZgJCinW<#V:SaDTS.f!o>Q@5BCo3b*G1+*bd@oHu(u#&c/5ikl']=^K0LD<YA]>ei3d%p2s$lqCY7kfl6p7uRbf1-$F)9U#:k&at\Gs$O_N[b#$-2Dc+ar=<TbpR`G,rR9[/?N7jQ%2KU-m4>c]IC^8&:0B*+Zn.lK!2L=2.3X4t.)EcRP5kfI48Nb;`cajJ1c!KQ/5g:Sl2%;Np&qK++_"p"e1o4X'BaJ^IKe!KiuO*!0/bsOVJP-,\9\rfjYdm`^gPO!`_(MiTdV]#Q*IB6c=ZPgPB$EB,L91[VSOm8*`&*E)bGD=!Xg+`+d,0S&@Ab$4Y,Oa#tdh0h]0Vn9b/q"B-JKYSXH]h7+"uAc*eQ0FuV["SoW(QJX/R[.jIgN$UU9$^]Xh#AgreLeP1TgTE`RC9h8AUdqSA1N?<$Ce%DPUjXJTiRDK:V@S<""_*#n>1s2j$;diE>-GqQ>&!68peP?aB)MAfkUrjEb.8X#DYU2SO=)W\+TU3=McegoBnchh]]ASUDVZ03B(ArpL=VX(*!m*V8HpGp7Q)VAP7_OBbobp\,ZOQ\A5Lkdd5d1YIIWimf$<cMG+*sh"-bCt]_,YPAhiP8tp`S,DU@d!tP*Sb_3iOi'8GNT%acOP78?K^I@u[ogANs]KJP]!BV?Xd4ZK=@fa_9+4U,Vn+`US_PXuVUW&\r?]"%1.piTOB=)[FhU.f`.6XsqOae72A)A9]tjLBonSM:_a^Ge"i]hr.tjb#b_cXlk=A-/p=%?AIRZbG7t](a:HODI^+Un=e1^0hj^!/m8S/g;t(D7h!9Y5>'&->>tP'-2UR;6_3SXgL`+5BZ!sFI6/upj1J\J5YeGqidYFh.cC*<:9Z>CE,*(.bb<6YRkj@;Pt&pJOO1fjP$(9=b5d26TufoiRqsu)fN5dS&#/1`_Lbo*CA9fe>ZKn9-H"5e[#D98_2>PQ"/Rsm@TkEF";E@[AWF"W,*m!JW2$+jc1/e:G4A%d.3Vb)bE3ukj,mj"F=';GkO)+QlSMBu>bJ6FQN_<m86'N\&WOgo-[VW<JoQ2?.sB9P@dej_Hb\).X&rBs=JCVMH0c<Ip3q!A]m"l6*ub2WFl\Ej=nNP1E*7.TJalhC[FZRjNkXd!2@_D_;m*(N4USMg)/>EKH*2]^*upK+h503)J"^Ft.6XdiVumr/9h1VU4'^Ke"XZ\ZmV^a*!*&g)&;'2M`qTIjm8k+OA(l6O&aaD<U%\smrUZqVe3`:%]?A(CG;jK%$(Wrpe,)f,c(6m.C[/Iei>Mss##lK&/:*tR\%d`t/T5N'12n6`L46PYk#i$5%r=6,FXpd@P>GDm1J)[NraO>qIeFS"HPA7~>endstream |
656 | 2016 | endobj | 2016 | endobj |
657 | 2017 | % 'R152': class PDFStream | 2017 | % 'R152': class PDFStream |
658 | 2018 | 152 0 obj | 2018 | 152 0 obj |
659 | 2019 | % page stream | 2019 | % page stream |
660 | 2020 | << /Filter [ /ASCII85Decode | 2020 | << /Filter [ /ASCII85Decode |
661 | 2021 | /FlateDecode ] | 2021 | /FlateDecode ] |
663 | 2022 | /Length 2062 >> | 2022 | /Length 1761 >> |
664 | 2023 | stream | 2023 | stream |
666 | 2024 | Gb!;dIrF=9&H+gk^;K01.ceN.R%L5jOcm>O3pCt5?"d$!OK-9+lj[a6j'@Ge:Z%SJ0b=u-cpVU^.06b:oChRqRi,IEi3-qrqD#eI#gS/W\4mf7_/28N(k%."UZ8-(j!2$<g[h)ioUN)9pMeIKd8*g]T;jGS`phoDAaK2j@@(TbnIZ[EmW1O)p)LFZUQ6I@jMGt#nk]GdEDL"b"/E?E]CYW8d/;Hdpq7Qs:50t:1TjNnV]2\Fp+5)7k-&!nh3R(a(Nold,@U"V@h/8Jr.p2?>glqQl]AE2-`2n7Kabu!5OZP>mJ!0kF7HWK'qbdWNbaK'5l#\a&==%Z!GsTSKIbIlLZ,Y3k)7\$jDeA-ZBp;`heBhF%GrsM3;@bg2h;AkHtO/-#ZP[AD*oFJQmcg)YBL*7[%AH&H\j21/-Eo]30abh01i;Fo4.N/P"$$]Pc8q[i;klbcD?8>,r?'N/rb*'q&PeEKf7Z<NNLlZIN7h<WQ>!h-"#bjiS!.I9(k'kE"<;R^=.LpWc&l@#cZ0YOL,.s.hb,%0q!)%:%U7VG<B$&XOEr?;C7P$)5i_K+:LpZJ7ig$^@:r=K;L'A$nu0UgNgAjf6r@?,d+&#OPT00%[+'r$/'1a'pLH5+m'KbL)WHUR)]/OipUI7m2RAUY"'6*;;)CK)ApK2]ED_8*!d)*&nI+m"5hP=MXWUW"q6u@g6otpScM2/=_OiIYU%$URQO74o:d0%;XL$p"pDKdOhr'R%C&Op\r1]mCEARX1Z.AamW6]c@G\c3$=VE"+-iN\9UOsp`kK'"A&:DkL0hU8[sJ@Yia-eiRh'nhY["goW*(kj'Mj3L6e\(5,jf<#hFB+'9*(IN71i!^m3luA`m]*<ThRqT2A<e;Yd,G)a-(e"(@=rPl]h9U.P+GqKj2Dd8X[bPkc5>>[A\$S.(qeF1"#FECc>P$&:Gl<qOjk=nd_$o?9T`@Sc/u9m=VaSaHbL)#A6C7LGAA0"9u8mVb"F1'1[q:_^6o;lg&B>/D&H^($(NB5d1]lh-NPImF/Dr'5.?\N"u'A8!19?G,-g,(uC%4gf=n];lmDua<W]Lf8G=#d]C\[nu^J`)do`:K"Cqf19;c<QRpo4,0b76Sh]6!bW\5MSm3fq!-E[Ah)5@_E$q$+bDT`D\%kP4Ld7ti/']W)C_i$blljVuJ7A]Tl71^o?*>"jZ:4VBU:ld0^d=PblS.KL2N=]_jqI'Yb%SGV5kns?_4N34Qn:QK_B:u22i"pt&ZP#"AO0>P=1DuR#+!bYD:TQZ2<k\Ne7\N.]6jEqHjYMB3J?27TuJrj5FL?f0L*>V)m4Ur_]3#]'%[uS@\ke7iN%&t+AjQk(,Ep^5V-8[e+NL\^1]W/hZ=LRXVSTuCJVK2KUUQ3r<F5CGJ-6:G9V]qN`g\$%XGKLoXapAaRbuG@$n3d@slR<&uit^WfMm[UaYfA(1C+b"UntbO17F7JHNZR=qkR"NJ+JUpeFNb%_aFS5o&8,6-ki)0`_IN'WTA>B\HcO`X'$kL/A5ojhOd^Ti?\*__Pg#g<$A!ZAGsB)0"A)15`\EnSAB9&;YW5SJK.'^T8HWDZ0G^\`;=8:GW_ef#rMgQ+$2PT#IZ[/Jm%4NnW0Zilu*B!^nMZZmq4Z9Ut@'V0(Kg"sh6k\Yb;s$!OA:K*Ec:`ORZud'?VlU]^?]F<N05*1Mjg+U+^F;,X':pi(jkS[)%f[RX>2/Am++[r/D;6qY*/2*jDBfXduDq<QiEC*Ip6:tr?T.#ehqnhc]=PSMCb&Z<jNd1H*h1r8tNd4*WA)cAJp>q7@UCHD)kMV$^tGs`Yu8r9l?WpjIE9=l(HaQ[lR"G\N5f>:n5qeqiS.%J8WEUE>VqVtsp^(0lkW#V&&rh*D=>SHslS[QP9F]b_]4S%`A":/GVMTS<)72VG``j5Kt+"r'Kn<P>J>tWGrYQ\p^If%o*IeUL@s1KcOqW/N%Vu\le;D`i7'=bRKK\&$A)0Mb@f%5)SRr,(\m;t:(Ckrp.8.:"d$TF"iL$*J/LnW:63R+/'<'HLb^#?$V\PBVL^I,53Y0\Bd=qAmfa%-.0X_)@P~>endstream | 2024 | Gb!;dhf%LD&:T\)s']4`8B(D/%G4oSUu\\X:-+ro$WU2`Qc1$4/cJ&KlO`pEG@k\c8-0Ki4Hq7EQee(_De?_O>oUBIB:JW<"h5Vk`u>t6#KAR(HWCZshr*,Vq:Y`BR9e/3I.6u\X6U:E>'#/ddqsZB]L[b-(uC-:S=arKe06q<,Ct$5_t%6+P(Gmm/DoXRDp\KR#c6Ghmn:k+/3[@Tphq#LD"R`+>]kPCZ^bN*gHO9H@'/;?<e$I6W+25aTQ<ZC*'n=)TiV)]Q0Atj=HMmJ&;sY55[g<sSuL#hcF-D8KF1*_df6>1Ko&,(?lUE8;!>3X#r2mO1.3NEP"K4Mo,8Ja/jX1mJndf55=o"3$L)-lXWSB7;_;+k=Q";O/6B1b#kB_qZ"-GB8ec$3Q[t/oRQY&UQ.;u3WaUpt:nS1.bTWU0=RS2@27$J%WN?Y%P<j#\#6erO6c_&]6maD>\?5^b+uhbDcXmULFa88Sqgf>)@[3;6C0Wr::G/*t:Sq;553b_OF^6=#C=RVgb<B?oF2AjieMRQhh2C,t$TBj#\2h'2J&:i4<q":RPr4:U!u$HR[_cS+W?\H2K/*`\(C(T*m9,'Om;WB8,C:g*/;Gnib*5R2S="F;D*WI(%!u[`D[oEBVMbeHK.qCCT[;LKr)lQb=]lO,#ss0*PNba)O:oel8LR#lj\!]]m5:t(llJs,#D&k-X91q%\k'o\6Ql'7rpd8*)^HcjTZEH;Zg?SZ,`[Ti%GdmmU?..5+#&8!pj'cAYM1u!*ZrE-EN1e/6E)<gdJ#abN0NY!'M_#2n1%C%OHPEm:g?,m.T!M[i'AV7RV:^.83TjiWNGOV:pqg0)-$r;8]B5%\tVO-jmY?3\Y_trPSP0j2S\Y:S`@@M9JY2*;o!R3r^dgtrrCgHh038HFjG-870JlhqCJu2+R4CP,VlTPDI[%-]eW0!ha:Mrnk9E\p2DTdGAm[/4Z.bfV:)$I<GX]C_-L,QWfZJp$Da7HUYi+eoLlN6Q>2M_;T1YAKGLA/7ddFK^J[p17Ed=bCAQST#FslchLUCGf&gOUFC6R4Nk,IDjk.Vod+]@^[sJ0,*^kdfq1:Cgjl1=bbo3Rc)Z<GOiXAVU[+u"9N^X`6">\"t'h3!,W9r;WO6=2DRn-@m-[\9hF[L*RV>^d+["iAa()Y,\1dDWh^*$HOata8@^*[8IP:GZ*o9k<HlZdns3puJXU5t>$lD1HA3%(5dh``FT@=Me,rNj2LXNL6=_8dL`gLH4Y_k:;nJm_Bme4SfO&lTBndIm%LWTU_=4=h.nB#.+br9bocms!Y-m+D1OTae8n!?^ZrY2c%H7Z]juP\2J$3DO>kA6N_3]pj\Nd]E'j_&'689*5Ft2rsYsL?7](7/K?I6H'l`Hb&.hQLcS&XfF;^5g!<\D%!"f#:U:q^A89?@i4eO"3C.RK3<hhahfcd4Y-pKl.A87H6+81f@uRN9p,F<S,4.r,9f1:G$p.YPK$j@bGin<A2LhDP_%[ln5ip_.TRZJWQ@9u&&M60R+ZSL(L^7uT3S#p(`?-tm<NpJd-Xs-lHC>?&!,l=j8qfG98HF9VC$0-C!@aa0L)9<>H.dg,HN$H,]4!Q-#-j>,01S$b*%.gJORY:0U1n,0B(W0f%fDu@!Bk4T!Q/SHf@-5!H2'^KZS_n&oiMO'2uEPr<bc.L'<ds;peBApP;\$KDo7_``A6Xp^7\X7C4?dX#/F&64/.][2dL`WlGa^gX>3Y[P\nhq[B7]Q6_(:Ha[WJ5Pl8SHBCo~>endstream |
667 | 2025 | endobj | 2025 | endobj |
668 | 2026 | % 'R153': class PDFStream | 2026 | % 'R153': class PDFStream |
669 | 2027 | 153 0 obj | 2027 | 153 0 obj |
670 | 2028 | % page stream | 2028 | % page stream |
671 | 2029 | << /Filter [ /ASCII85Decode | 2029 | << /Filter [ /ASCII85Decode |
672 | 2030 | /FlateDecode ] | 2030 | /FlateDecode ] |
674 | 2031 | /Length 2007 >> | 2031 | /Length 2136 >> |
675 | 2032 | stream | 2032 | stream |
677 | 2033 | Gau`T?#SIU'R^LRs);>"3/+A9Z6e0+qN,=6)P@JDe6O0Y+eU.8@O%"m8B(+JrU-NCcQr4S\X89ZQ;$ijSpTnaPrra?5L9=gF+=c'G^&+tkJL[9?J"S]i%oa#*$<uY+*l,`W!?02\F!V;LNAK:I_%0-=Htm&L*tTSAB.2W41(Lt+5qh.,)4j)6&ksIkgB5i])E,?KTC[1a`XR(B4o5K@T44/D!<]u,g3ai^bV$+_r"fMadn+N\GdhN0S3l\D/JX+iT\[d0_c-12\u/V:S;pdY.lW3YID:gX^aRg&n"NIFC91VE'h'1^aQum^f6[8$nE^\BL&*BnbIaj4Xd_;;KoUZRN'+fHTQ&CdJ'1_H#5K&*)"28<04&gb.0nW6:oPFQ(/7Y\&&FJJ_N77)07BXWTgWt/6#[;<);0<p)!_O]ZecRIL4;C1h!o/Q=$HN4C_Os(#X#3fKhm_m4Zm0+HK:-^Ihkg5N%;B&nb`"/^:W,oC_D'g"#$@0CSr=bB`^ADRrag^:1jb45n#4Bh&F#k;b7Ccdfq'R7^5B`!(?>'(l/$20sL:Jg`[QXj.f`$EDs;Oko:.6@XKurW"R^d/dNqbr5PDf@iMWVfPB:r?CeVj,d?1&T=dcidmFB]EDJ`j[d["Tss(QH3ZCXF-^BRPjs5j9=o7994_dHKE,3f`1Wt=2c-13R_WsOSW[m??"1D&fQ`22H4`SmGL=<?Oi#FA6EB1$.Lh,S1GNo?l;=$c49cbnh1aaFDriIJ1;8>!.?L4;/=cUNanTU=-Hln<Q&M\9/1lS(_U]-Z$!Nf6IrdlB>ha^%aSK?nZ>TEP*=C7!O3J-ao7_E/[L0smb6RGh)5jKV*hA]T'o>MQP`&+J*0G`WQQlH?DsVKf5Noh]!50e.J_raCoR^==Guj-/H9pV._WS9],1`;0V#T"@0+Ek/W=;BbP@6AVX^EqbW*R[@@T.IF>7b9u.BSJS#E3Sn!^ISJ:no7MBR&3tQ3`,bVj2&oSuu8#\/7JH90U1>4>c@Oh^a\Wr$.2h=o%.F%KdoF]\3#]J$QmtnYTQL2JfYWWSI]DfQ:eKDW1lhUCMt<$&iK#R;SCh]]=1(JC3HR#HJhM0B6OEYpq%QEUd`miY6")_HlDJ:%gEO:5k8Em:$1PW52MqZ/m]Vc*[aKYrt$)DW[P?R`1pdRM3mR4Y+p(:j)J@Po!t0Da?G<iQfrh,\eUC`/B$U_6M6eN9=HfSL;o*d[s97Pu/isWiUERPb;`H=P6J5HGgsUfi1"J)aKolSn0ccNR#XSb[Q21KM4dm;SYt#;d>W;Ul,qBVQ;1*B'i`<f<FOn'j,'.2n[WLXQ^]tV(q5%,f6nk]7u<F86)TT3GXjMVuO%`('Eegii2V;1hq4!rB(s7,@bl99Kk/t&qEVJ'X;S[,]8iRY2X``?2Tsh"97W0LfM=PPa,?cY<+VS?>&NI>>>VlErBX!m08Ee:"RES8[9X9R(isX!b"Gr@*RZZ)[`0=67ljecr6nse5/_&1L(bF9!>D%Ei7*.,2'ck\12K;2FEI+YGX)GV)@AqJX&Q%RTr0*'Yu,-X>'%/?&n?+\^N$8/mPOZ:P:>U2PW/1-)IiUQE)77'I*ZH>]\47HP+^*![?UIg5K2d/^ULI,[lXT6iD[JpMDu"68^2pJXQdjNl=qu[W""1k3'<M)pPT1ZhW@I3=PciIaaO1:lb_XBSNWo:RjoD%[IH0XUqE]/C%O6W9:piL#+/a:O$P24_rlkf;B1;#Y@Dl44=8MZHh-tG]3@FBWDme5\Cp*!hBTFMpc49[[qg4%C_NmI41j!<.u-5`aSn+`taK5<;F[)C]96UIQKpR/)'p'M'FX-X^.@ZgFbYss6!Gs4kn6M$"M$)`!8"'cI#D4aV:@U_7mSLJCh4_DuKL4gQ_c$%oL)K.i76QDQMfGAg9:I^-iiuZ1_bAAumMh]7/B!LI&Ga`gUV:`Jk3?heekrZB!_Q)p'8m40B[YQ(!%;Hs)BhpH1ACmDGr`E_W.[#rX[Na%-.0[!4*#~>endstream | 2033 | Gb!#\D,91O&H7^.Ii,;0U9$[qqVIM4^qOcC["gX)hL;u+OH[26_6L>Oe!Kt)2rc/8V,4UI?0R6"RWL[`bVLpGfS9\1q<ia"!5'Djl%KXs'8C#dg\!H55JsDXiPE"@"2C)foqC"%e/S?P+4hJRr,S@uZ-Eto/W[&;`XWLt:,JF[*hYiLBqsO?@=e\EcmSd?HN"=1^e_nh&5')"W+NOZHZ.f9\nlKdmML]Q0RW1Or3:gJh5E8V`R3s'Jb7NEN+tsPUr,=RatbKS!b4$[-DTVg0RS?Rj4b6F>@bnFOb(u>5*AMR.pu2sGcEPM=\tG/W0>[:9>R#X]kE_k[7!NqjA/$Wi93)qp%BUMcarT>U#1?NJ;]@4I&=4T5U&K!pH5eeB!F66Qn`'EL`$:Git03mI,IjB^).nWY^f<bdTD1"%UV69F3:=SGuS3Y3I4j86CJ3;@l7LEClDm`JZ/nfDHSC8*(O!F,S9RDEXub%AkZWhBjn7,UrEJXkuGZA1#es.7&L<2b73Yi0Q:d?!]gW5J6#a3H-Ul;eWa\^`gKSfg5A'Ya!WK"&D<sA92\o-0#DcE0]Jhd/S#1h,*b0''l"*iV^?")\U/$VEa5%PWX,:p)d:NSRqHD+MMK&%X:s)7oaL*#oe?V\"dO-4M+.h+CNu^)Q3l9#O7u=B[!O<_F&f!@$lpppmQu+C,mHgDaQEU9Wat'\[uH)]eg%U'UUBY8`[HmhM8D&WA&&Ea8]j@me:pjD=ib9plNR*'K@Gip[p"[QQCND'ijC^`hU'T);K<:GNI_Bc]c")r.6<mVRAlr4g_'"iA%A,GH1>`NH[gMAl"m3QK/oGR%?sb?17;XI&`tQ=!fgR+K>gI'1V_4'KFkR_/1neF9ObV6=Z51:oA[@^DmZ="DU99.lJ9-2Bkl!GMQS`u?^t2/L!;Xd4b`.\9c6jS/3gb`o^F&B_W%%]_?qX5f>bBTYP%Q`&'aML*?3`@D='HCYkV.K^1msn7(A;VAY9]*P$+l).R1k^*FH:ha8M'tNO=5F]//+9&Du="W.n%-<L2?kh06W#=o-P%YL@6iG+H=.;<?5C6&-[pR:Z3[g#ETd:]-Q)WR-0@$-m]NNV;eNr$"9G>SA^D_KHjOK?!=N])VD9pH#p!ktYm103;N,YD/Z5T)J=@Sf8b`YN89dgXnYtpO?po[l\s'cP8/P:\;#'-<J/`kuC2VNSS[J-SXP(J&5<MVc:>U,N"V(%KHG^;mcDW4a,A`[c'spgIZ)Or-c$#><tbj89/F`M//QiiQ6o$Sp7tVD97$W2VW4o\pJ@m+./9L4F@YkmH-T:C,qC&&HjiP),:SD'IZaOi4+)e'#1ikoUgla5gPG7a5\835+@3(g(_1E).0J,_Cf5dX,tKBd=O0)E&C#3$B@C2*uo\#*+pEUYMi18*aV:dDsd@R_G#i>aplnmKp[p9.:V>jP^?)XZ-L"m\+&2"i"Z?F-^(\$;'`oe(U%tT6'LT;fA/=5r*K+$IYTbk<THKjASN:8Mc1Ran;:79`7?GlDA8dfMW<r'AB*VnLM.r&_mg&^1QAr'"8ci!,OlEY@lLS,o+Ti%;ZI(r6T90V"!oTrQ:8Z"n4@[ehknskj&1DL.mCdo9M>?3I;\O"5:;jfENd/!d%Hm)$brTe_nf^MV-:2`Wj0sVF+Po)F;VRm5]6(>24t0^GT(IiauRc)pmQ`\ip).rNa5HOYq7>+<*kOQ$_=%o-=0>l>$;%u.!IcC"C"]3.qDn1i0[X/)Q]+h\[>kVp8H&81b+_Q_T:**7,R6@K*4N#"$O)l'2Y:j\2X"5L^"0jiR0B'ET//Xi]`]KDhD5;F^S[L9<)NlB8(Q1'XT.uO8LH&!tJ2JB$+>!!--;oPQbBGSWgsYKbb7+'o<K#!@'I[;(_`;%l&s]/58,omFg8I?ki]8);U0PSs^5BXMU-iipMXWXh_)JUFO\PAt`CmRHQ8_hJF++%jb#6cX*$a?K'4b['P_A))='\VG7+D*DsbhHW'&U^O1uQeQptdD@?As]A%1'2nP.I8$<64_4]FgZ%^\Fh"L6*"`Sp=#rd6j8ZfieeW3b?S*g'FgZbm,=PI<#j?^r*LF;jr@G*;7-.$A7lHPpL<5+Q8]4S+sa7DmSc+qWI26kNn4E28L&,l`aVd"l~>endstream |
678 | 2034 | endobj | 2034 | endobj |
679 | 2035 | % 'R154': class PDFStream | 2035 | % 'R154': class PDFStream |
680 | 2036 | 154 0 obj | 2036 | 154 0 obj |
681 | 2037 | % page stream | 2037 | % page stream |
682 | 2038 | << /Filter [ /ASCII85Decode | 2038 | << /Filter [ /ASCII85Decode |
683 | 2039 | /FlateDecode ] | 2039 | /FlateDecode ] |
685 | 2040 | /Length 1789 >> | 2040 | /Length 1870 >> |
686 | 2041 | stream | 2041 | stream |
688 | 2042 | Gb!#\?#SFf'Rc%,s)>Hq.We*bgDC$XqN,7*W`ujQ[d<]6dV:H<9X-`kAmBpgqqq.l(e@1:o-(+\;#gdGSNFmTgj?1+o'm[/f-DTPkgSj85X@s>&I":5;85V&rR6tbe!"0bD6$C5YjKEs:)dtD:O^#YHmD_3N8_ZiVV(-imk.W#dh;jhXUEhs[QHt'YXaW*G)Nf\[QE!MDS7BbF#m6?IR\?GB#:M\h$(&ZHH$RmL#t`83F.Fq2.'8]1\H5@qc>$?oI!mb)Y-i9\712j$W?aq2Ft@dQ,k+T-;7hi"F8=7l4s,VT4rWA(Z(E8/0Bas]Sc'M?N0s'DgIb:#8AqkCF'Xs26M:'-R4K2bjLRt]O32Jo43aI]N#LNhOe06(Greu^A.M7_6VuV2o2h7%f(p8MTp'SR\upMQZ"AJO#nB.hfo)i]M@D4h7KZJP(k_@17jsJ-#F>m\9V5J7Q^1XUVi1u.K:NW8CRr^g'U@:mn[T3dIH47ipfU?.C`WMP'<Q=9+4noKr"t)K]r1tBZoG5c#6=B)Y2Ip%NHd,aM0eIWY:G^8*&'/b-\$=aQ1dLjFV*["ZOdf3hQlaD-L,V!?AN^#n;Qi"=9[++rV1G(T($P!\d`XiNaqdp)mS^MU[G`K8&:V"]>O0oc%?BOUAG!17dBAU`?oo]j<=3Hng_,>Z]+Vff>_\D<5KKd\Oo!TZM)GD70s')Gc:BP14LDcJc7*RFK)g[j:/Mr9B7#"3S\[A]tc`Y7tdVe.^PP"UJkqRuS4=mYWjO,sQ4`O:".f,Po;9WJiV5V5Iclb[,<CiN$c!`g*Tt@1I+ogs?>C5i0%*',iC0W'3f5J:b-AYWXo&ko*\LB0AF6oTmeJ[\=]\:hqQEVh>(;OJdY];jWe=fiCeBA]ph.j[c$tUN`V)Q<384#N()kAWR:aPndmZ1#&@Yg@>/jmJ-'+C'FM#@>F:?8IWH!/J'c!K,ika&6u"dR?F.4f+;&QDK]&dSP'[p:q%1Up-&Sf'a<P.h,[+&pP%Qd9Zu-H<$Te(*bH7`kQrf?k(ZY'BP`2f?dQ>!/4W^[1]YV(a&2r1US%?=61er$l_<,pASTFJ_WF:A/=gLdf0l1l3.T6!?pg4N5h6f7W6g','0%SqN<6l_qu4Ke)mKXP#QS66rsH5CD%n5>D[ShOQY:/@m@P;Vn)9m^(LSIMWcL4#J.;O*fVSPeSZm1NfMuc6GF<WO[T;&YWfq4@No%-,\hV#ZnZ/MSGGnMM*$)A<*D2bSlMT#k'fMN,Tm;?@I%SFGUVf"V<^FoHn@FPJ19s!E&u1oT1T:d6VMAXKnN0YjJ_Z!`]A[cr/X+'rjc@jb.[-M=goKU]D]YFpAk_1MkU3ntAT'nBR\RUf3i5l10aoWaTB:0cs0OYO<d[<C3+dtWM9eo`TCP@?H>ii^Y>2jkFW4V<3-Yq5$)73NW[Z-X=<oD)QLES4BS?7Uk@lKMCdEagEFY+`#20?8P3T&"S'@1f.:Ku_3DZsQ5p]^bm5aYT8(,sZk%5m?q`.JXAas]XgVid7aPOCc##K[Z6aRmd1O'q3_n`+P<mia$VI`i7RC_QSaBErAnPL)E]B'(Si%n._H*[+qM0d9C1+Ci769EY;/:7[q,Vj3Wet<R'oSce)V/fg#LZIID*/86\2Mni!AUJA;^H;e9JV\X]hnY4kO5\",6hgm'ZpJ0.ljNlgp;,Pi9_WXXrJj)2&]tCgg;E+b<_$TZFlI#G).V]5>)'jV:YBt;87(_s*2kW-_HMXF(MW][PWj!O't-sO@eY,em;e2BBFp6M9rBB="7m+?IK~>endstream | 2042 | Gb!#\?#SIU'R_X]s):hCLbj:U,g3Ju?k5u_?sSC/9>1#;09gQiZ_9dJU_<R^mujssgMLKAE4<hQ4tQ<ro%\9s%iKmnYJC+\8q;g3]Y4^q#[p[t&:"kHY2S4#jbnUp^'L$s*@*=p@P:<-$&rqcBNVL!e:UU)_8)(YI?dVC)p<FY21^e)R8cY[e.Xt;17;W1A]e[GLX?nV&M?Rq8t"94h7KGS>nVXun"!GU^)(^`ZC5GWW??b2i.X(of2i&FD#D4ECl4cf=W:\@"s[QRG\+\Q">_r%(jBe6/2O4iUD][kY1Ni[-JF(kKfLqGY-,8TiPA&OMP+a=n?C3MPHbHsQIUjV//CLo=/aMAZO3gc=)cJ"QaI%!.%$P+=Hu5s/#0]j%P#C:Zn*:$X,Y&=Y%N><J-c6g.Q)*3Vo5Gh,;@7ja+B',0L^].E_h5KaFN#!ld3;e6qnd<69_VQ@+VO8roLGS-oRRc$tT2<1TF\'#p.67q7*M[iP2/rK2)@%^)G!Ys,g&@&[2tRAB&#+6]62`VEWW6g4K%-$VG2fl%PXgE,N[d;GXkh27R:Pj1GbXY"S%).rft9AgapU[%cM([15p3NG?5'Qk>N%>_]18H/Q6$!g/:(PSLj]SB/!qRB$S>f.Bb-G&4E*!+%WW@.&TJ@c](-7APMnZ+K=:g<m>]$rT)5)T\BHiJ,FHpcXb5:pSjnpt6rne5^+jXP+9O740^X`F@WU>FEk4r$*\tRWt__j%`#p,dY(X^1;E;9.7gCm:h[UKI:"'V-mKE"eYE?8PUn?.(5ntO/&IHG`n\#DS2ei_O6PtB-7RPN+"OR@NY6$AI,[jcB)L4VU5@#VN'0f8E,YFajX?qmBE:S\1SMgJp\^'?5"FN9Z*pGkdSup\4YCldJ*3m%tDLoW`c!sc]+)*C+D?K\lJg9Ep?W0Wb-kB@s1AgG*Q\F5O.^dQ-Z=A)/T1hgsIO-I4XebpI*>u^DEN2`Vn^#RG/*:amSY!/s5?!Z"Y:"d4g#5SI#eKrgS.[QKjL?>apIll](h6M&MjXb=m31EAkQh=i_5;OqJ:j!G9->^CAm1:P+eR^fgdlR)V;!7EP-iQt.=1XM+K8E&8kXmO>V;:okWID$[0$`gRho!9mr%f=/6gHYR-OTRHtojartU1K[TcJ];S;)eO^Dd*@;O)24W(p5Y6H]faQ,aKF3JBQ@5(7_o\2nT<5`OueWK*I\B`8^2,@2?[<;hk#s[KT$lrA!VXke\S\FY/u7]"/qP+@HLbIpkfHQ)h-EK6Rpe7aRaedRoG6'JC8XhesMrI(4K?1LiLZfl=%'&'b(ikN6(n3al/>>?*pd\5!k>@!qr(Z.+ZHX3P3;J^oq^#[MRd!&R*XM5K3"%L>(*Q#7Hla7G0.;V.F5C3JVS-QYGn(FkQ0gHbK29OKf+46*df5N$N!g<+5:oII6[]CX8&;k`Hs2#I<U4k]R6K@<bD:Hm*$D#C7lUL<uGJ2c#n0\I8]BX4n!An4.G%@5Ks;gM5sATf-#8BfY\<&1#:6L+%?LMmd]E0\SNFO@<M-:V,l(%Z^ok5"GY2V[7n2C9*81C;JC&\&)0gRG.6m/cN"&guV6_X#%&Tb'>,qN#bluCD=5s"b,(trQTmtYu@q6"Mg9"/%Gh!UDR\BV^;[hM71EIrtGmULOV@t!JCACS^XhQ(e!9!/j96E'8/jq]@r8*+fCkmWtdP-p>gg(?L0KuouS3flmD^Lg%U88Q2a5,oH`k!B+Y*@^#La*HN\o3N"8uknJa7m65U,d9r2NtcE4]_-[,l8Dr/A`(9"<"Ckgd`*JKV7N;N-gN32u&cuhtGIE*[=6)nPZTG^`r5O<[S^dVG@-fEJ)>ToZ#j4IYK\63_9om/:J=Z!d=nLp>'KDY~>endstream |
689 | 2043 | endobj | 2043 | endobj |
690 | 2044 | % 'R155': class PDFStream | 2044 | % 'R155': class PDFStream |
691 | 2045 | 155 0 obj | 2045 | 155 0 obj |
692 | 2046 | % page stream | 2046 | % page stream |
693 | 2047 | << /Filter [ /ASCII85Decode | 2047 | << /Filter [ /ASCII85Decode |
694 | 2048 | /FlateDecode ] | 2048 | /FlateDecode ] |
696 | 2049 | /Length 2417 >> | 2049 | /Length 2486 >> |
697 | 2050 | stream | 2050 | stream |
699 | 2051 | Gau`UD/\/e&H6"/s5AK:Lg)j=-2D[P$aaV2"A$-UEOPsi5>Vu(F-/kUUmh,:muEXnfM1?bE3Q39@Z%f[hECVgOnPK(5JDQc3PbM0]UJ]T#;AfemsBJMS\`A"o4QsP5P+3OUG30H'<a?dN,ai*e[)I/iqYAEd*2+%i/`WL(hPc8*Pn+RNp6-QFKVIOJnne\*h4.ifa8o5Q0)eGJOj2q.q"6%</E.<`<(MeEiMDT8@TFnin0'WK.%.0.>t_@<[;Y/$M+=2s1mtIFGtlNEQnkY;O+]%J3gi4,3C"H87c5:#I>^H4esS2D0W#\QWBPs$3S!IZ/X!s<q$fi9gt1`AX."J5aFm\_ASIA`FC-X5beAk?S`EM+nX\s`RP=P^3pA50;UF)J*I0qBIc;AiQ[@+hHJgL1Oig:UoDCtjMP0M]^n)Iot."_Yg;h)HEOT*<jt]d2[aN#//R")1Wr>sY5&BPI(^6aP(-!>aCs96KnJ1HGojW]0gh:Z=`W#fYF7TmG/\U)5t_WJN=rgd[UQpK15.6F<KS]$kV`cREcoS5$5LO9TmBn?EI0O(MN$9i[c1GU\Y]'hBf:qC3]jmf%D`bQ_K!fFF;(2l)c;P1.Ss,].cmJDnJXS>82$Gd3H<)_bF(b/C_)h('X9&hk-WGr?C=8B97^62*-8sM3e,O_DZII:.s#TmLp^HB^h75X,`4qkCY@9q\P,C@G_2Zj6N$-R[:+?;0g!CG=?Wo_ej,dMNf6Pjm!FnZg.4/'7l#-/&Vaj@#%l5BW$8_K<fj+>QS'>rActT7bh-Y>;j'Vs&-ZfE"O#lCDO@1mRrPW'COt]j&>l,qU<8kgrh0$J_p)(%A\-iKned*]!eSqU0+),a%:hepY-i'Z^/gl'80Tr9D@Oe3,t$7V4F.#$s#t`^$poQP*<+lR_'LW(;&>6fO@C_DhFhAiR71"[_&85^5aI4n_)\XiUGHf38#<#mOHD@VldI0X.LkN>rS\E!ALZl]B9>]LL/5+::1-5(+`g>3cZ2@ICXMfZZH>lh,O+s!6&.4\^u[%9s42,'>l4osd8lF\%\,(Q&JGg8,HZ3'j*KiJjqp_o=n^BS!p/'rb/c7UG$XYU@2Z\)@$HUQ-Ejge*dDaYe?$E)(8CAC-PJ,h9Ne6<[t_nlRAtL!@icD?N'[^6or\"sS7XNgPFHsjbC!'!0qTsk[%"=65'P[>Ve$q2Lg>/g-jVDtdNOe]b60>!*IiJu""0h>/Oq6$Xm4^,\r9.\7_IZYYVQYi*1sFY'!hmc)n3e&Z1).)&b37!0tT-@\QCBl69!2iK\'c@_dZQ+<CS$>*[1NFR]QasD'nB2W\.@QR1OA2K6Xh"-_3'Kp^5@Ng];C:Am^,U;.)_Q2/RA1V>oBNhl?Fg^)&X!ro\@AEMGNl##EO4@X$?%*]19SYZ^i:ScTOaTqqQs9D+V-rl"-kWu(Yn4.;1T#88\OEKt$#gRV7H5i8\:j6^H3I;aA7m@Ro_CS555^ic_HM,eGK)g]@"m\fbo9F]c/NgLESKWTd5a<e5;i]BYd`5n=],$>e`]u7gJFV[`&s/=_C?s:tS$4/k1b;B7Nn3W=S\[V'i;^oPopdFs?P4igqNV:JS^>?Khrckf"o^?l`R8(ai,+>dU]L+-R$\/+PY^bTKiEc5ji0a)V!sK7*(q-)bFBtn8j8HCp7c*nH5j4Z[*Id4-l[Jm6bJSc_4s1:lJCs:d#oL+-G+HH%M"os.+MA^<O*+/V)'=s7DK3p9b;$X,&rsm.iVE\+),BlqmR&sEUNq4mQ\9u]eBhK+6530(0m+E-J]qNr:`ioq-J^R0pKJFtU=)6\:OhKZKl*D&kc<VR"nt2fO_RT"O?GR@\:sc[UuUh`BZm(*jFH<<dlk,eG+"W(OLhh?[\%_g/sm(@a8=\aS)Hr44hs-UTsT(/qGM3,!;G5(mQCS^f8e=XKnJ!<*o-"XiS]g)?!$_H'q=Lq4=^;^lri40fgbt\1&QJ&#JDK-oYtm#U-7u!,CeafQS5PFPFWFA#R?,qp2r%"^f-H&-[\#Z?#t?,EgKGn-YF"c:VcLgA4_][qE2=;28.rl3W?9Pc_'u.5j"M`kPI;n/q=I'jH"K*d!l,nDD"s3;UPFAk`EITBLh!CnE.^g`ca^Ijc;sKX!sH1)B6SedpA\lR>AMqI\jkqHo2Au'qJSV<OU.i5F=4j'1PL0?/Hf!]\smD6+;88SsA5MJYL:3ZH(h>gDaIG91?=POCE-8,Y5T"CurJLc0`1RQ*>sOj\j%_X6W_.Yj)%AS_#'\$%]_F_L[_X+*]>WQ;&=mh?#5),u"Yoc[JG!1geYccnPmS[^os7<HSCc`ZfYOIL6lRjbalE7Ykr`mUPuK)%MCj1,cu[\r')q?a7S)OMY_7P:_PU&:2168ufoe\D5FGN.#V(Zr]Ckb;i1JE4!#eGlI%oYgcaY~>endstream | 2051 | Gb!#]rGUFK'E1-[reDG!$ulVE[J]D$.F=qd&KpK3-Jl?8;t5I&.%?,?W[*kR)"t`5Ng+'9+*NgX^fnO1.Iup%h")MHM@Ua*n(Z/:"*cbYf;Ch-?'ltspUraacf)c`J+)_&SmT__NF=X\Gb+A8N,/.]^;!K,OXak\nG%Sa[_LG!;q5]6%h7+UH:.2A0[7t^#fbq59]+0i'squfZ&HhakCsitF3mC5Hkm\C_Xr&>^9TKkpKe]miA-@qCX+uf,?Ol#*5"HUj(?AB*>l-t0;L?P$b]Mm*rj-f/V&!=qQsHYBOrqO;gp*QqiUZff3O6o5lgiQ@fX.n$Dqe2klPm>T[Z(.Q7m.=>k']dV(/;';!-B?]Zn4G(<g_Qo_QnY:8`qcYT@#m'8T(Vi=iTtms\ugq=1),[G`?Z#)>EZbgUOtHc,"NoJg#-V9<g;oYru3-"A_Ce\G-K[p_#T5$p@3A+AN4V'Ro;kn8V$6Z%K*nZ/)<:f/WD-p`oV?UfZAliW$/[lM`ODb&MRA8W$Ba'?;S>^\.k_^C8`T@ebg!(t_Nd"#NZLmVu)1?1(K3EIapWl8PF9Jp35J7:rlJE#-$9G+L-r:SQV6&*/Ga?[]73p`0p9LX$3(+5i-PiKV:"&*5D/ONWt'GZV.$qo]`jHKsd+)^6Cf?+`X.[KU/WNOj3gOWR;k13q[((bL9&4r:A873T6^s_1(:t-S:5/TK5^l=4SIUiTL<TJn8KLNCpU<,"19k,9?.hpU6,dOGWogPS"V21FW=rbm"q<B,SG[WO3C@We^p`;h\,L[RK/!sIWEW`TiZ+;&eTb'_n":!ELTYdqr_:OjN"h]-P#"1p;Jee:CBOa7ui-=@O\+CKDJjX;r8N[d/n!BVteo0d(Dj0purTnr8c?1kglGcEgAB)kCb=&r:N%*3+rdPJhRlc(OJPje$'1rMGlZjPait3fLP@?*8FhL;_Y.7l%LWF/8KQ,@?/351\>WFJ/=RfKP=_JJua::h-V%^G<FW._Z"2m<k^rAK0du%gq6u.h.DOm>gj+`ZP$95@+-Ml.YkK.<Mo0jChN(g4@FZ<RQLW[`O:6RJXA@J)O8jfY3=H2lB'J+C`K9fRaTiI+U'HC\#@grq&b7,R4ZngZDZm+ng+n8WlS$Qrt`/5`OJ]DEM.Wb-8)q9UR"m5.WG@LM=10tSNBH7qR*8'Fb-aB)BUCLl#;BerK+p'=G8q\M,nl&;LZ:qiW#ce6TFHNlJP,;cLW$-3R*XgE2h(V?g<cL?e=$4?E8qf_(=d_%q^?>9GiF[.8`7N?``%\;+/"3a5Md.*@"0'Xl8lK9doX4ZTAJ2NcEZ8+abSaFjda8`<s4b@O@?;+lAahpcU2\(lIF*_$'.b@SWqQk$LJ1&aYMl"khd_oWRDCnCon.='bQju?\s/mF2!`U*I$=gm<IO[r>a\7]nl]L3WSs&ZKE$=1i)4/8L<jm,UJ'(d;i8^lV]b6ePsI['MW&<4KiIO.e"8:CJThq]fkL^djt)Rl'%J4dGo,L]jooLY`I]<2i])L4CeA8PQqb1FG_EG_S/rN(0hpc3G*N;m=,NHc)eU<E*sS-XEI>o,c.`sjNi/o<FW'f??q;_HY[$(Q?eVJ,URL!!P95C,A.\shkoBn%N<(X&80`<.R4CQ?!?E2*Jk+==1d6BeF:QU7nrU1("i<^)XgV.jE](d63"^=G0(YirKpe^):trK3gY(Q%F';K#C$_V+0Wgb1bmdQ09$<T'a,l]N$*r"#,Ld=rT=Z<c3DW8ifQD=APsnB#!s.EG;GK9j/d\A8+lEj/p7_>'X<'A/MP@Z91>Q_GHBZI2>>-S)L.&M]X6bgQE$<taLYWnlQIhdZ]`"%YBl/4#pKU3\'R7c;JY>#K55`njN]/hU_Oc;OOGg/)`!o4o6s)0pKsEOWp/2p6UU,%Dr("fP$-J.VQWVVPk*X.=-dOY9bIs=!23e<q`_S.8#L`U3B;>E9#@BB-HaQrTa08Lp`&oS=;`5"e,a#5,l\qI.pr?_I>]Q&keq"g>RM[q-4h<8rZ>jA*h+;O?fA@k\?$!OoL[JjRDn,%TLV4^oTpcO:HYF[YD5(<KY_=:WroDu+cD]L`n$#2C!6sL50O&Pe-dS^V2o)9=Im.qG;FB$(a/@E"J,FmSFB^>j&l&mUr<`\^FG&C:F_ti]FPEa1Nc+K@PP46#rL0RL[X!0C<l5^n\=9]Hf:!U#HZ<;CL&+h$a.$ETq>J,>Msi,X[O67@8fC;bfFHYS>ES5oT$R/OOdk?)Tt.s#;PCL3meTh!DZH9enH[sEA66S2ZeWso5([!YlM.tBgXXDP9<iq/;8$#2hEKU^IcVK^0u3=@'JLGS)rQ1]Ght>[rYiLPYHDg(LJL&0(R,uXB)dJ2XoEjUid91/;120S&1Z(uZOku"SA?LI\Dhc+>W'4#]&2n%PMooZDI`'n/%l0?=EMf"CIW@-flsJP(gttJ*Ec%c=:/,F^:NsnIY\gOCj4[G5`=:Thq9jQn,3]:U/S;~>endstream |
700 | 2052 | endobj | 2052 | endobj |
701 | 2053 | % 'R156': class PDFStream | 2053 | % 'R156': class PDFStream |
702 | 2054 | 156 0 obj | 2054 | 156 0 obj |
703 | 2055 | % page stream | 2055 | % page stream |
704 | 2056 | << /Filter [ /ASCII85Decode | 2056 | << /Filter [ /ASCII85Decode |
705 | 2057 | /FlateDecode ] | 2057 | /FlateDecode ] |
707 | 2058 | /Length 1781 >> | 2058 | /Length 1735 >> |
708 | 2059 | stream | 2059 | stream |
710 | 2060 | Gb!#\D/\/e&H3^ns5D=BQnu70.*Jp/!<nX`!BOaoQ?akcp^8ZN1)iea81Le:lZ].8a)M_Bb$8>"0l38j4$IuYSi[O'nX%n[-jM`&_!sDcikZl@i]B=t0&YdNnDO$0J2D%3+cO(\$,U\<HO^R8]TOfX18e<^pkh[iGi7;P1-I`bK<'DG"E3@ojW&]-+>b];-Sulj):JqYU&n?#LaPi_MZmbpZ\iBM:l+XV:,D&=-=:3P1RS1`i6M]TQ*)Bbb:9,=H/?I_+j-`]Yi&XgRbfanSOZR+Om%!]0/Eg/>umnh7;Il!8i%C'4*^A7g]#s:Y2d*3J1LDBnc]k1*"D3o/b"IpFYF#l59E0Z##<ec+r:Y/#+sjAHq\K69;"0um4">II42+CHM#D+0S8iIEP$r[#hF!3h5=tj&.jbub#tF;k+VjP,qm^2dI&\ThspDp`Wpj/fCui[JRIj>YMe\%#b4f3+Bd1[*@RMGfb.t$At1:uQ[4[je12GVeF!<lIeRC<a:pB+g<,Yr\3"-6"&k#&+3*^!R0U_H)&W\"k91Thj)GeNoHYr@e/=f;)4ro<'7$F"VSG5T551KT]j/KU`jWa/'Zk;6go&G7B;5<`Y.7kJI4?F^Ht@1%R%P;U&CCnSaeVAf;(6c191\cD5DC860p(pTf];o$@bN?eki)DkmL^R&`:KUU8$Sl4/1/$F9I_@;a:;$f]S4F7'hM`_\;:?hFW?l=lGH<:Qq;[h;jm3N%noK/pj+$sTmiZ!:e]%V`A2p5Z\ecETqJG!0;,S/'rddWB*?5hhg<UE8.)b2M/8>K+aZpcdpA8qk[qXGRiZ#6D_,CIiQ""R@q3i4j.gZXJ8n$*8u/EmAIWSH;mIDc.SS"R(nLr^7GhJ-0MF8)<[DP9cDE>0&E\Xl/m2ZqGG6@c9esf#1(H7X26)IT8rDE,&7m:)f?DsXa*Q[]]&'l42D4AeBsGQHOmK$-.>o9?p&"LP[i%^($NV"NdYHt'j73kqlBRAg4aOKknS/0gbEnU[KDUTB\!rXHK[1SE>O%bT2O*_re[nMN.4Wd3MVV[QTp"5ih$*X5r1ZUg$RuPU5*7[7$R'HbJ;Ft=Rn$O\*e.(L2*4DKh9`Ml^2T\g=Z6m.(9lV+D\/#ur=e0IG(M)m3[oT-e#\?[<t^Ms5VGcBg.?sL(L2%*o-LWqMIWr#m4kTDQHE&CX.EQpljL8E&b_o#(69cb`?!^AVLA]O@89N[>=at1W&o&4mlmiqlqq@qXU#-aoH?f,bR=]OHai]r(P8f,FYhqqfDPq"jf2-e+[o;['"g:U&q#HMXhJd.LW1Y;CsX*S4Ftd]'4-WY(QQ(>8Lluj[LG>;Z_e0SDrc%Rn+-P0=^rGToX>bd_bkV)[oBHT=Bb_Q,1_?un%EHshfC16iO$B"$!?-U)br4Vdn1"<`;^&e0L5k`pEK6P-ZV\=SZ`]RJg7PpHEmL0,mg*iMFjT'4ItdA1Tq@ZOR.Udrk6J!Q;B"8Y&"Jrh;c'K0HW0u;4)1HXYUO)3I-)\A[li2GrG'/D>YP:)"02M,#R,MBktlQ)/pf&W:l%mmN=WAO3(oB5NCuWG3[`%[[eKfo%166cg$N.'sR^B@'_m-<=r/d6\O]&0%\%u):3VAfK0H6MT#g77[J9T6J%='U[qMCWj:uEL4)fY!92_q[,1'sm=rfH#GZ;16jFamFDFLi"eEKOeL.k=$'Pcjl)*^)h*08(*"7IT2BJ)+:t=ohk.R]V2m#[^6Z:n-,AX9hQGHo=I!HlTK"sM0YYPUP=(i3CrN/H)iPE8A602h~>endstream | 2060 | Gau`Tmr-r=&H*Xms21Pd0P>>>8X<n4!s0`P!u/hfXE.5Qn/#9&,W:mcOAoKRYMYK5n&0C>3EQn2YpA0HTAI8*Op<W=HM0-D!Nq/rIdM^L__;0GDupm5_#**Tao1I\2nQL?6U(u"2]foIk4I`T>=gUo9;4:<Di#a;-a(-^k,0RDE5&IkJJ5r*`!h'M9nM#F^Oa\7?jcCa5Y`gZ#m\cH6;OQU"@\/@$KhhPhdH5cXlcfW"U2'h+'Oc<W$biR#Oj+;)/qmi;+FKTFWk7bIO$3[Sc,k+&jLJij$>Kd<!#s[1aT7\d7dN4Zt*0#3nmqpk;q#<!E%p/*XYFp#bCbj#:,2?_^W2>&Bi<6P.a+KdGZ'n"X&-iAJt4]g[1D.?Jd"f^Q).l9ZD?dd#k[N;KFU:3#asNqP=7_nbh+5XltunD)g@Mj)HMSDb8CS/I6SU%%M!hDGWcqTY-#f(9![BD!E0D$7X@:AYh^rBbZho8OfbF:LQSe%X_;6L%,k!5p;Sj/m+k1ol`*I`1@6[\#DEL[L`r._qD_g<kiXK'`:]><YBjELNb\Z_Q\N7V^&-(dbm\r3RnJ6U&e8(+k[P:0``k6gb><DQt]d]!ZHuaBo#F')Vmpk+73?9e.7DleqA#QRbUd8K-aDDOm.'^:H=-_?</ZJ2pka(1aOT`K/Z$-mCn#73j/A"\AX`WY<[qR(g%TM_@NMe]0dG18%_FbhJ\%jjUdih:B3^G5,N,0;uf8O]&S'I9A*ru28F)ifGp$S>7e:gf_u6n6Dc/3f%AoVXuXDVYG\rs<+ak2JtmK*)#%@Q2V4?@`o$JE-&>m#.`Z0ocl4OZpeOqQ;c,HAnWu:*i3*QZ4.Kaf!1tu'do4bo.P][Zk*CNHMBWN:%\095\^R/(/,=a?bZWEaUG;j0qhGYG?/:H#ofd]sIK/dD&09(-Sq]b_XPjp.<adB+P%nM4Vugl\10>iceLbY_6a]Zfdn!a]$^maDG+g0:B2obH:)<>AhLA&qct9:ZGWEqE"5s[m9L;!'2'0P@S6!0Q^c)H2/D#?FBI&jH>`!9[kk12mCXbqc8F@fuiUCOjgd]<__QRhFV^@uq'4>k9J4W0`8tq.kAH?`46ag,>3_[g?...;q75#1S"=DoSe]9YWZPlM5K\<%O,b5+WQ"Z#4O;(<a9Z#>d`YD@KUaYUFU992ZRbIO[>AH68lHRsniRE=A(-AT3ac?@fdraEG0.nk8)<WT*!6)h@_X)4&n.VkV.ij+]p1V"s[fO^pkCi&N]-W>]=HkGVgB5EAoZdtn7iIAtaE)I!Q\h:%YINZP@X!I8%DU*q4<_!cs"=T1/mop_A8Db4>'p0=!M?Km8TI>lrUkHV1s'ok\?USOQ9B0E*^2gUG^R$&J:?,F9RsfcSn:8aCMLj\KS!2t1[O]^d//Q+Z_@)[elPf3.#k5S(DQb(UN1s-.*CP[Unr=/S'f`h^bcbDkh/@m`^\i77(R`SrU:P.Bjd(03@*?p1LB,`o2Q!l[d%J?3H+'kaQg<4UQ?ZK>79:n<=lm]Lt:Fmk<m^>O#`lXB_)?f$Vu"25$mjg001Y$BCKU$R_8^3hD&A\Zs@/Sci*S\9]F,)\K;hjZ+cm<r`LQ>#or;9e/i(,hkKu=GGm$sq`aWWZf)g$i4NRTj+`NOo(E05U)B41A$:Vn=WR9g1Pin]4iWomJSN2#aEc<Jp=`Lm5*DZ#okgMX0b/]:jmlp-M'Dg.D6r#,7-MT/RtfCUIfV9pcKG~>endstream |
711 | 2061 | endobj | 2061 | endobj |
712 | 2062 | % 'R157': class PDFStream | 2062 | % 'R157': class PDFStream |
713 | 2063 | 157 0 obj | 2063 | 157 0 obj |
714 | 2064 | % page stream | 2064 | % page stream |
715 | 2065 | << /Filter [ /ASCII85Decode | 2065 | << /Filter [ /ASCII85Decode |
716 | 2066 | /FlateDecode ] | 2066 | /FlateDecode ] |
718 | 2067 | /Length 1752 >> | 2067 | /Length 1650 >> |
719 | 2068 | stream | 2068 | stream |
721 | 2069 | Gau0DCN%rc'`B'qs5ADEjp\8iLF(."3Zr,tTNdjrNNllAJUj&hA1eMVP#PWZfC+lOHVGI`8qI1p:m^@:H[$Y)_4tApr_G%pZOskLbm-I`;%A'4mDJ,hhN*\X4s(mBbI)s*##XH-aY9E$NfSY!P*jk,@Tm8b`?[N/o'B7W*$:;/J%^W,^o3t:,"R[k`4Wj8?A:IND#S'rK6T?CboN`&aMoTG:13]IN./&4rq[^k^?5];1&/j/`*aC77,:B7>\GZbK#F'FKgKiX(iW=7n:fd\n?EaI4U4Fc^@`L3S[sm"$mN1<.9/Bp8tR':r]qlf0D#2T=ha(=h2s"PC-j2r2JrkD%=3m>@-0iJ`h7@.`fb%bO(QN&9E6g0%mBAYXRRubP>2uG:g`OI.(a")Wc@J=>B/Z3QhSC6NI.CSXA57BoL*fN!gJurXRXEm0]KUU_Oj'r.9KB<8k%gMQgY;Y&]X52qZJCOVmY#+KG""HV>11/G_;%*mhQjZe.E.B/p$N'q1o6-NcQaQ(W^2ac`^1cFI?Jle0lh"&9n\"L+1G/Ai?P"1ai[b3l.8jV;Q*kVaT.4Y3AUL37e)%_u0A6A4j[@UBmu"k=jn:VS]R\gj3hY@3nuCc_[mG)@2BKn<4@2.aX5R%*Pqr:LTYQ[O*%0N#/phC`#B)"7<fT`>K9W1GfG)@'QZEbHAj6XdY*4/CffulR,8Zq0(#Fg4X-*efgLYK<W$i+/\;5$)SdR4&!.73_[?7:fCRI$mTM`+0d!R&3]u@HRZ]04i+A?r4A\95m..A.pi!:3bVu:XkN4-#`$;-'C:SdQ*Si&USf*$0R:Zcp&[VjShZr[-3Ejh)JO8)_WVj>faDcJJ&Xm"TF,%t+.*,s0ce2LCMuHY6h"CM2h<Z2$![$Op<[E5>"hn8VG(MHg:F*<$`?Ij=]_4:.n_rWin'Fk#FM`i?j4EWVg4!cXer8<<n*9K;[nW?'=IIhBn=hn'W/:Ze7'=<T9p4t-C`G$Bu88ne0Uf/!CjF22-/LC(:?FoCM7E:LI*36jW"u<Au4b''Q?croF<el-AP9G>u1IN`Wn!!;NO+a#BkAi\s>_i,DJ*8%#,%tB4Z^1%>0jYaLEF<1`&mB.$.+6*TYVK+oQZ"k8R%<CHi+'Kh#@n05Ok!B'72+75L*:b%Cnr:rFq*_m/aK1^"1fkA)Rp*;#o2:h@pMUhs/h!MuKs.4l(kO$oA_)KM0&RVZfEA\Omh)@4:7f(d#'gYW^&mH/9E13"qpZH8%>XQto8p_;I=pRV3<--=6>.AlG0`kB?[^^878Zf^q[HbQhM>tC1XqB;&"/o+"UG!j;bE2K`Wn#9MHO^?gbOT24=q%'09]9S5.Bs>#c2R`%Aj<eIp-FH^r#;X9;*IL.^9`RU^n]^Jp6IosNmKpsUP9"_B=[pnHaZ=Y)>2sFV!cD,>C[iW`W[S4[<MPC">7.2n3aUL")0c<bSMbKj=[QPb].HJ*-e$(4NR_jEC=7]RWasX*A+5E>7O1lOpZimA_08/9PC#6q[R@ZY9j)GE\(%&,hE(:\]$K-c,tbRX38QCfZ-MS2V+[L69j3[q+%TN7c?V^XPEg+4^V8CqH$uIOCgN].-5,bf8kkOOp/,X(VS*-B_>!:JBX#&Mh+EQWJ<K0&b#;X5IDQk]c519uVcOtu'BU]?UcWY=f$jSjmgeA+hR+N/NKR#kP#"c@5%EgtS^VF#@^5Oq(8?C/#i/lr/M01;iHf.?+S"8I[UYrcjiX+kE4G'f*$>+aKtH$X~>endstream | 2069 | Gb!#]D/\/e&H3^ns5C[#EsGLk]AsG"YVZa7,0dF5^bEQ2B^'&CPpr&qP.JDWG>rB+l"\1h!mEq5b9D5X4ZqSj4E0Q2Ze'!sE&NF%(ERfb9FL>V-\U_1r'!8,q0[MJh2b9.8>=1Fdn*/Q:/?>K<`mjd-&f\<=t"B:inC)@EI'qZDWc9o3%7O&,U%`'"f-Nq$)?0Eer\KdZU/AZ.;K7DW)>6[Y?o';+.3%<1&UhVN6l_F@pul/'[^D)5bB#(W+C^iOiFC<h[(S\N*d(Tn09;C(.SoH9h.=&pFncq;*&)^?GZbM?_k'</9)%+7LIbT16n4g<B57Kj0-a^6*Lu/?hj@O7]SRg.XZj.>:?K6`"/L\Bb9a<.,[cUW.*5mQ&DKL6bYn4OKqJl4U1gn;!+._Hio@OJ9^7t)Ql#2=\G4*\#*CR[%Nsbe8aiNK@ppmd`'c4Cm9.s:E90t*iH**\#9_&)QqAZ/3r1WVBg<pK*[V@%hgHX0,J8QXEN*m^[E7oI_N##6IR=h<IKW0k&hniTf+#M#e8S+p0g4(Z8^[7\9P%mR4Z&(LaN,k<nPM`ZX3B;,>-DEc1<%s\_-gWr.Xo[2VO*u229C$'#h]Wf%EVe.1Inc(@ln]20iDHZ4%6.!q$?N(d?I?NB;l/K5Wkm3@9+<7%V1&e)N%U+B:k0ZoMd5r^NT;0>;Ul'a2RHn+Xqec"^!!eTTh,]+qZj()[(m2iMKF1fb<nDNT^e(D;NYDrS?`Z$PZM5'MS?`oKP@Pus`/`d)XCs$JP/Ai$[kD2BAC2To`2&LQIuNjq"_d:?YZgJW$tU`ARnL(T1!OH-h0)hC)TqgH9";:a\p6i,`tI(8U[5.8t-.+Z`=Y<a'9l!JKgW)f`_cIMP*Za(u.X^ra\%4]6'F0HXm[M^\do9p`C_cRRr5l^\H;f=X21niHg1PZI;U3K5dHGeg"WmjG_1R".JoNn1['R>.7,2/F:BeXuuA:[;"GG1C>S6r8p6'/TiU[NV3@it#KDNr5d@<eA&TYK<&V"\*CP1<!b5Nu$p%:;X&Bod;9P7HHR1Sd>Q,r;:)p9Us146_TK<+mpM:Xl.Cl_LGTU&;K=]g17B8'n#%HN?2**p$QQ*BFiKLSJK&)n/=c2EVT.Udp9m9a$o_DWI0@j!?hqZ5;FGmST*h7,b3<Nio2.4Gf,Y]a4kds&=H^&"JrA2H@"p2K*q_*,q31jqU5;M7Y8e:MG!gB-aM"QAbMaU\"TL@^-IPK\=Fil+Y`5<7l_9>CN6a/MTo5E!E[R6Xs0?>dq]IlkNTp26Ek3hB;2TP>RKrg&[S(.*AS_Ft@s#K#Z0a`<I(bKrHu'bLO2`Ue='hkb%9^^VQ]Wa4FVUDqB5(0igloB/>:_]P(4o,(pmdqZ[-9!One<;"%eVZo$j?-?W!2S%@"?KHrTLURrq+EBVo`9)6*^#@=IYKDFogG$1-dE*BUqCWspY,6QY=$\p`S/N=hc<Sd"BiU*:pb!K*^aH4>V[0,td=]8HE80<PiVD4mLmCIa^IJ3>"!1mt5+8FTW#7p/OnKF;o>),[-2Yq+acBhuM^KnU,O'&&AR6=1,*m>,md$_gLr-42k]kbo<efsuZ3^6k;[Z\=Ied<UnS5j$"])SmaRn'c3DILSoVdlQ.1Q0*1M:-?hnh7++KF.~>endstream |
722 | 2070 | endobj | 2070 | endobj |
723 | 2071 | % 'R158': class PDFStream | 2071 | % 'R158': class PDFStream |
724 | 2072 | 158 0 obj | 2072 | 158 0 obj |
725 | 2073 | % page stream | 2073 | % page stream |
726 | 2074 | << /Filter [ /ASCII85Decode | 2074 | << /Filter [ /ASCII85Decode |
727 | 2075 | /FlateDecode ] | 2075 | /FlateDecode ] |
729 | 2076 | /Length 1567 >> | 2076 | /Length 1645 >> |
730 | 2077 | stream | 2077 | stream |
732 | 2078 | Gau0DD/\E'&H7^.J!_lh8OXWsJmVEP;K=$_X!<r8:/rPb[+GJjnI)h<c8DWmh`JFS!e^Z.P+[?AZSSr65!/A;9k_qteF-fQE7K`M)\YmQqI;3"_h%f"\F.sahs*(?DX7,F%U?pE"/!T_CHpWp*9TFq;IXag331Y7g6>Cu20-2DBDQ#E"+sjV'Z:)\`UF=DKkQ#54,#cWBe84D\P"tW,01`n#`RW]4f=>iHbp%V0gd!/9SaAGrr`4,5lEWF7XOZ2]BmO?c9ZnLp)%G+%9$oaPbMMS&\1Y6:@h#lE#>IYiNPli;^SBZiHFhY=WU>sM=Hsm&o<.*o,7L#H-7X'RR]eugIDU8*VS8fTA;Vn;gn=hN%\)]aOf9,[CcdCVo<K$f%LOX'E:]K8&YUEXWU"a=e*<nn]A:q"PF3T.BqHrkaui%2anq^lt8W*:F7K#S7b1#'%<@D?qJQFkQQNrV$ImHSTSQF/;jeW#tc@TAP6RQo%V_epLY8^/0QEEp*e2emW4>YiHL<L/IW@Ws*DRZh_b6u);5/27`E[H>BWIq"r9X[L;7?TKSVdL_9)N@,[AZ/*L_ZK0!j3_,8=F=<SWH;ZX9C;#T6C)N1U[@9]?2c^+G5)j=HP-dq`0Bp$NZN8Y0@IdU%<;cZ%_O+-*Yb):](b6:?>8[B^>e*ts37,3H24lqYa0%^0bsEM8YuLe>iPS@X&E;8n>h!8=8jU4@N(Rl`EG!rHs9<WV4'pi"*kC2c/(IlL*q_Qgn,j,BbK9N$5ap^gN@;f5=&P'kYl6GL;DZO&$I@s=BEI5mRo@s'dMEI=dBR,]:6hn=iJJ-/JX'/S/Bb'm6-:*Ai-FKV:c^f>s1[QgE[04DJh<`BYf1O.5L]`g7K(:Sl1.2>*m$%9'#Z^11`F^&@Qe42C/Cd30jg-#[5M3-P%4m-<iZa`>bM3t:1+;R]N[:/EUUMV&@T>5Din`P`T"c5bOBCspB8LMNXXbA;4Mko-]nZ-b1W>gG,Whg]*OG[OqZ9*?dr;]/m(4@'9@9\jkQMLMp5es$iaoOh\e>Z\ha]'Rp4.k(9LRe=AHn/=),abC(6+ILD.l]l>rYV%h,9m5WLIFg8W2,K9S/U>DA9SsK&TW%J+QJgsFUgHg/!bO8F?PF13j%[XZ(*&7m!`cXPAY;6QZ9U'.]2#cMCO2OK0iOtLEq=:kk9,EU18sV91i&nGtFZ?nbMY4iC+h/:O`HSU3K#&q:24B%((jHE4-[,?XVhYj/sZ.[TbKN^'V*R7*7ic.#Xp(;.k7C:j(bTe*bCO]XN+L[^o[@,+LE2Z6J\G+NF8.c>39Wm+F.P:?TkQ[dd'0G$ZQ6Q]k:H64MS'?Wnu?D$J`t@i`t1.^JeaYM,:#>=UND$3H1]9$in.NatA-GtRSCfA8VS;IJ=e:?V!&@:sn;DGHf#0bAc-8mLjk#=SN$c6eeJP<!FK>](jTB7Uj%jmK%6NI.2W>^g90\@h\@mW"2]3l<g!XGh<R`sCJ/]C(;e*sil(8N]mH'kT"EA<Sku=W)MAU/F$9gP4g(:\3HVkcMh0I+*%?FjtPUPWSG,Wchn#:p9g.38%I&~>endstream | 2078 | Gau0DD,91]&H7^.J!_lh6PXut8Sj1U.WGWl]A@NAU7t8BU:!-Z>jSk:G9,W!GBTM[SBL!t5nLjXl^;CWH$3fN%bUF6R.n)jpb7AF(CiDW$r_+k<Y'qWiI#lpnEo_\RBI&dkde.`LP(]V3B[*$8mkh[JglDq'bfs'^c"j)jR@[.0(*dIn@ZJ(V@.DW5cB*a<iB;G(s&*+9L-NA-;\aX`&K_^E!Eaf*Pq50)#aU5\+:-RZNMnga8ClF"Msj9-"K-`lNCYG3?HPJlZA]F&U^h^Yg+gs;c2,0l,$80e7mLD>u.ZPCYkUcB.ZnkTjud!Rt+h3-,`aBYRC4;A#77)_@2.B#W8fD#_`G$ROT$0_':]YThM/G#gm/*er5HeX<gh>W/Mqq8>\.k#PSKY73@k$AdMV^'M-3;*8<m6<nK0ORNt;WPpfQ=DA6,MjD`:_<Uub.aEg1?Q,ZA:!nOR["fc:)[*6<?'P12*#csmV"UL?\UthD('c*'D`f;NC:cU&#KY_T8eVAL's8*/E?k(15$La;3jsXEcU]ECqZQpEL]6#4^BKVl]PUhLeQJjK.P,2=*)DcGuj=5J/^MoKY36NZCW1taaboTV\@nt\:fCTjKY5<<d)FX^??&8*8j!or*NE7M8b0Vq1P)"kGUGo#<&E/kuaK_fs'QMFZC*<Iu+;lO:e31+LN)*K?p/\jcI*SDt@<#.%bY=LqNlUIPT3#Sd2=f4rlI+N>X+hL_i[4Qgn!'crfOJ"_rDIYn2-9g@`da'pDd@$f*D_a^C3?YjlLH-Gcj?d$7MRWb`@-dZ7mi<<C,X[iTV&Lk0'_oDhZuo=X;+PP@1l7#J?o=9rT.2:(]`S&EB-<R)c5KuPKX!W#(9EYS?\T_AGf2o!*kkX4Mm]lOY7L8P5=os<RpMAiP&=B#$jN;7I@Q7W^`Ug$FH'f*Jo&VF=g!Q-Q>?r"0-VCK(/[aMUf;0,fZt;<^N>TC.\]N$161Z;U&6%U!fpTVQI!(Mq)EaJT&*&cB6f;%80q$nK"\)HMe%J[GY"7%"s9>+_gH`FiU.e5f-clQ-HOZrr*p`.kd-t*Ehp&rM@,k'jZb(!\h.r$96(tZPeT5m'#;PLhJidNc`qAr[Q_ra+=DE't%T5MV<^ALU;)?)Ae\"pN@@-286!9#uteYK^"6-r`\0LX/:73`g@^Tqs/GVA'`3sB$b()3<I1-&4E6A9.-/h6ej<$on,3%dnACIW>4ek>0hQ?>.oYIdh^PuQ09ZIplacK4(iI+#'J[>VPfIqq/X."XPIrloFS=UXYU7?VDcU.87Niah&YRNaZhYAD0.a's$cJr=T0ZGbZJ3#&4tqN:S"*>`([Wt3on8&hJC'qBlqhNXl]aGlHjhC(mp\,#4L;b+=Q<mf@15;].(neoj<1eOE?.m`W9P#VGjnTP(a+K)3=NDKDB[k^==cA$;=<3:i0d`H,233@qJ1N:'5#Ef*,0J7Qs]VC4N(SbqSK#N3c^p8M_O_3G:(JKP#66r3t.4J[Iotjp@)=]U1'/mc+&f1REY#_-kV8NuWAHZ(f^qB,8>JeOR-h'WDbaX`=!dh*&5[%K*rt[NUThS4-JM7=*Cc=FA.9/L.pu4<GgVke!GJ#0,*hZQ*jd^>.)?I%RA)pPbFhZ:LmlQ([+*i."$*r,h~>endstream |
733 | 2079 | endobj | 2079 | endobj |
734 | 2080 | % 'R159': class PDFStream | 2080 | % 'R159': class PDFStream |
735 | 2081 | 159 0 obj | 2081 | 159 0 obj |
736 | 2082 | % page stream | 2082 | % page stream |
737 | 2083 | << /Filter [ /ASCII85Decode | 2083 | << /Filter [ /ASCII85Decode |
738 | 2084 | /FlateDecode ] | 2084 | /FlateDecode ] |
740 | 2085 | /Length 1852 >> | 2085 | /Length 1576 >> |
741 | 2086 | stream | 2086 | stream |
743 | 2087 | Gau0DD/\/e&H3^ns5C[#Es>,H-!?Q2/T"[a6eZ+R\"T2`JX0u;S)-V4l.fX\4%as;>"^an'khHN\iW*'Gk]uJE:FIFJ&aRbb:25Z@DG!m/q=+#!7Q:>4h\N'p[WpDCW@$G7jH'6-5!t5H1Ae)&rTZLg_c/9E5aI`>e<t3QPX=SrLP*_'>ZLq%qCF:5t'W!@A&:Q<<3Cb!k8GOPUo^o"U*G69Vm<*i!Or1#`Y;inF#,Wh;-='I'-lR2b\_,1&h"pbeSA6A&ECI;3(@F"FLie!3,DjY<HAcZ[inF@WqG(E"jjF_@s_R38lgD8q[d+Q\>FM!*tF`/u2#VN221:K<np>d,7Mu)H@04%G:"S9!s\&Yi(qHTAA2Ni>oGPM9_,k`jNA;X'ZY2b/,_,@2VPpo+OpS:lp,V-l69W!cj0SW$i#u;PCmaY'kIQZEa-4>g(9WBB"n.eJ"Y(fEoiY;#)N(P)2G+OB]7Lb;')s6B/odQ*l2N4l?qu?k[=&7h<WWGfS]t:9="2B]P/6-Zh;,T$W3t1[f9*bWh]FrK+O[c]rbALW='@*DbN:nDN53a%J6(A*O,5,Epp(Z5A18KEFG[r:EJ&LEK:W*0)oIO!f0:aPQMnoE6_(:<Mh7!%Ta^/M8n^.uTC%5'6rant.(0(M"eT?Wqu7T^fI#$1%`9T:@]Ga(9f.agB>B&N+RaTl`76LDN'?H<.[L2h5<7d%,-cmTHs5LIO;o-5%e8><I"Ko.m;)"$lR$;@]2]T4>R(UYmUM?(ih%H1`l-JnXcb"Ddh_lhUcpG"u)caaoaH/7?cN5A;V\UG(j1!?2*0\F/=+7c?/M9+)A'48eB^-",meroi7^Ts'a/i>B3@jDH%fG%BU:/bWIhYS2+o2]PPXrf`6:?O-Q,P7uG\+"5uaDX&.$mG7.2`?1^K57aP4*lk!1HJ?+jWOZa&DUqEn2H\q%k=K,e&286lD)1ebs49.[(0SiQ+ZPM2d?aR&'8g`NGdkBBcur<XO9R(3h!aiN2CM0gb.,_c@B<(9dHn`f4/(5KiaKtYSQ3GCm'@AJD"#3U;jnhsp6bKsTY/D-)&2,2pAi!eK(Fo>[bo,TnS+IF9EQJ-_E80MjB4(5&P6M,ke2(E*A6V`3&tJGIt\oNL2ECER#kG,Nl.W>ZO#2Cr!l2#cSQ9nc'ZGlf*#P%)bS-s09WE9oGTndCi/K4h`B[uAs9q'0,D'FcI8#U1b:@:(\"7PKXM<5A@b/larg/&i\*-:g"=XQokL3?bt`P&!@?H!%AE;ef.e>Ccm[5;<**TR8Rq(''Y"@6VCP3&i$M[%9$+,m#!R:?QuqS^fVSu1&9[-)PI<C+@L?->mK\s@4tbQRe@:]9/2fXA!R]>.'8@chR7N=l0s[b$>&OT-o`QA'\VqZ-ccku`Z_O)c)r&ppH,^s?W%b-gZD,Er^c!1LR!+%hg9%M9<p2O47:ehd$Q`f1"RFkEQCYP2/.T03-(r+4\6X25hqI#SqF!Y'!Q8eEipGe"4!$hrMjW<Uh5NB7';C*7qN)/#X@=#m[=a]@AXtGt.U07!)u?q!f%f%AGC,qJ656erQRKhc0*+.HE]CEGX;^JWh2eFs0'[g:'^l!E5qTK_dt+CfTZPF'L<8!k=-Ck1ilVgRhU46Yp]itj7'-GO<@nm$'o?c%4St"$XqU2j]1iokmQm*G#<j&'/O]\inB@-9O3":]`L&4rktK^"8M`AQRK`&nfa$ZnJ[;g,2t,PnZ%r.KbtWH5Z/qrWAa]@6DBI`P#F[g_<:7AqGMWh6n!f!*E8QDU2DRI?1-*C:k7s'X60dhU.2pO7K$:KPoGqjd/[`?)n8Zd@(GR9GWQP[NQNn^UnFbEF/hd2/2p<[b~>endstream | 2087 | GauHL?#T!t&:I(.5KlbH;M!m$2gM?DDePqIiASB2LT'iRZ.HpR5H)9VMH9JdGBRi-8Vh47.$5-ua#h=sZSQ6[J;QQZrcTN:cZ?V1,=")Qq`kS/JGDA+4R`%Dme96aCHGpnVP6+]#OgpOIX"DOT;3(\S9YW%V>Zu86do&MLC98n%`O!EKF(=k`;5MhHk-=pQcFKp(R`PaK8bN`d#[t]lK/H9J&2%Q$0(]g3%REuN)O`[(6!+Lb+[IC;"FK,$sjcEBAcY4@$:ca$MZE038p),8\Dqtq"O%;]0JS!r<+$`_(+BIAMgLna:Jqk*"A:X"_9l_`;CKdQH)ulVXK\hct\4B&J9,q9\F33^qF3nQq$EbFS`\6n,68!/?\h8RW3;=O[thF'GCGu%?hF=8%8Ag,>U%^]R,P$*S%qsq(V(4@D4Ji,&VXh5E?Sr`r_:%7WT:06L&tMeD$p,U+8tDjmGCHd;@&$-B3)[,4ugLKk>rSga#44iGhoV]7K5=H8<$[HE)[3NlMsji/b3K(*hUO4/P]l:pg7R.:Z=pcXV>[0kQD@01CkZ"kc&6lR.A8Ot=N;,cgG?p!@3YoqNXA&GV?hR2bo%mR>5pO?n]\jG+o>]ZNj7DAXo/A8qcE=m15OB&__5ii;taFE.EDKf%g'])BmGMH\Jl94FH!GaX5jX*gY@m-A3oF1/qPX#VDqe0@o6"gf$l/e-L)>cJf3L1?c\83^]7H"C\.GRS:PD+0CJ-Q_a[)_cn]Z:SJa)))0sQt%`ABK\hSSA$3d\Vf+aa>!#1"l1`)GHrA:U=B?#[+"^'NepQ[FL:*rZTEH@[X:ou8#:"SgEEq@6O4C'^onI0h6H&Q(jD6kX@0[N;ijhjTM&uhR#Z(WlrG:1R)>)R%8F<pRl#WH8<E9'(T>oi=<n=S.0phYL:\I1?kZD'F3]C)-8?8]?6g>@.*"22lVNY[lnF\]P*47<[3l+S8(L4d2En/XpmO8lRNiF3X5kMKG?u+s>QGE%8&@:Q]75M4DMa)u(?Gm?606Z%JWWT!RY@?eD*M#`VlIZo#<5Sl%$hV!$Z@?8k`+5E5__PDW`fd$F3G$5.q?F=<V4h[Me9$QD#Tf/g7c"$W#gTE_="b*U1+dk7C-p,_s$#_S*A"poH0g<s&kt$lekgu;"8,3;g3VRHaf+O[6stq.7)I+fpZR8oTkj+I#,Dk3MFE"Mm"Q"4?7unhlO`da8iEdJOM=EPs,=>;&[FeicJkND<NQa]:kajROBJ*LQ;8:c5)$l!AAFO&^KIc,o(5SnR6V)[>fS'A1kTsG(l?+4T&u=0^rBq.&I(m*=$_LZ__O)!s!A(F/=9@a1qC!L+Y"ZCk[IdAai=0%24AM(V#(1ccU*Q;pPu@D!O2/h;Uhn6!:)M$-H&-:<ZG&NsI5aMXqCJT92\5l@CI:Tl5=UYnuP>5(dbScF',d6`W=rf7Bmkls8A:]N8Ln)VF)ee0,ZNAEtN&pN-_6*e&[D@Q7t5/?2?EmPZmh)-`t\\4.t"#jG4nK-b&tjdNb6FEOfYS7aGYkm0sW=#=-a<;\D&fg.78+c9jQ""BZ"!E[3RlHM[`^\8h5\O'p~>endstream |
744 | 2088 | endobj | 2088 | endobj |
745 | 2089 | % 'R160': class PDFStream | 2089 | % 'R160': class PDFStream |
746 | 2090 | 160 0 obj | 2090 | 160 0 obj |
747 | 2091 | % page stream | 2091 | % page stream |
748 | 2092 | << /Filter [ /ASCII85Decode | 2092 | << /Filter [ /ASCII85Decode |
749 | 2093 | /FlateDecode ] | 2093 | /FlateDecode ] |
751 | 2094 | /Length 1611 >> | 2094 | /Length 1810 >> |
752 | 2095 | stream | 2095 | stream |
754 | 2096 | Gau0DlYkcP&H@d/s"If[P)?buJ2(bZ;GrZVgEW%38>f!LBX%fp`Xcs29eNI:^NXi1KNECI+Tb>"4#?c'h`TI"f_"?ocS,C0m(fgV%QH(_#2n"4)K`^/<Ms*u?7n6:fgYsaf=0P.):4gml).a:K1mOa.?&/4@-*Pg7)cB8,)*@G:&qHO[!_'_A>B6W[LlVm2GjMR3e\i;necr>C6T#9.(LV"TLK1oPHeSSB.9bfEet@6U`V>dh6uV<`7)b&-d_Z*3kp2o=)=olqe`]I6kO-JYnXp7ClI@d#r3S4;/2X7BFE2QYpeo1WcTEUI]it_Os?)o;=#qbDJ'P'n;nB"VCK\eru(gU#u@86LJOjmOhlSJ3*TQ[H]HbMf>0Daa6N!P7DCKp;M?gM;I&m([dY&$_A1j>m,Jj[W%IWJ4o1gR#l5IE#oT')(e#8t\[mq"nj[jr(oSfmO$"GcLt5V/(O/\\,J_0,>Tbt7En'Dl(;Cc#i<Uc(E7U)T$8TiF"Yr-W7J&OBPc.dP\Z3F!=fOsRl2d;t,=^OeX^uc;3mG^GZL4a7C]6[+0HV36KI@P03*od<=B?%Y)oFHL?Ah>4k[-H'lTA3N\q+7PBWZg(S4PC8JWqGdk;TMSAH49@#g4A@8YjBU-g/6&DYeg@+_NMqajN\)#&oo;oF.>q@QG1P\bscW3]i@%4#ELFd&F'E\\=ZX&Is=hWEYK%%h,XQpZ-.k'=F]Uq1h#iq/\2i$49opAi7%A_X'3[1/])iSk]iAWc3d2gnn%PJq[sOH\#Z1muEOPmfK>Vq"P<AIQr2_Wa)?!.uXiJ!CG:.6\K8@"QDhnH!/hg<o#pO($rkm,.ApL?K6"imR0J[,B<f59;b/YkL=R]HfDVlo629!MN4ng*-U@]QL9E9L4R,p[:DrG[0M<pETP;!/h5!+Fqm%uSi]q;'j=htoU=Xq>i$R'U3l<`R+DTRkO20a(;Kr_]]$in@erYK"G(7/d[>j8!4NJT^@qYNH4J[=[A#fMWs.rpX#GQ@g>YT+,!?)@?IE*F`m"$<TPb^mo^oC9?;C)TC\JMk4bRW1CY(bI2Tnah0bI@?*TX<D^G_$VE4CII'Reh!4A>Q,@<#%0,_=EomIW4_Eo#;5(5I0?,U%XXh6cL6UmjE0h%Q7:Ql'^bhQMD/TeMJ?%a8=m+/@W&oD[3hKPmV'#7(X):=UmA'CFFqJ%R"$KY(+WT!NZ:0L_[$[1aGPLgg!oA@e%j#08@>'<4A&IA@M*!4sW5h6;qWB6OD4i'Q^Mcp:oVRR`=>#B@_m[6Ifa`Y#!4DJY8ppAL4.K4H?0!],Ner'Q#Am#AdpX!-Vd#jlufZ09Q.B-f]:VHH3WH0P.niSh`q*)AeM$P=K/=amWOCB5ZS"_nt[g+P//?r5GWX-$TtBs/CW$BUQ-,$JG>Wp#Y[;5jB]P%a`(_;>#o\ukE:KEt(AT;uXGSC(ek60m)"7IG!E7B<i)MsY=:&$e<:D"AdmSNXtrLh">V7^H5C#">k=LLWB7Ipmc8\G[*/E.BchKM.)mL"/&iAi9Ou^T9d>*AQka1%4FLjd:a_Cq-8d/M'[r14d%&=`2,jRf4spq^#H!*BegXT@7Sqat7<Q#?E_ljjO1W9JcP~>endstream | 2096 | Gau0DCN%rc'`B'qs5ADEQ4Ap%amX$dO=oqIY"c7R=>:qK5tTZ`(VN:9:;(#L6csRgf6-F'9oqcJann'ln=E8XjPr=@^Z1jJ`JAtj'i5IiBL5#*ld4iI]c<T7r,[/s/CsM"eF*0>3#E.0kOdiI)o\"=jh_j0DM/Y#-b`fbdaJjH>j_t(eFC.WO%)."oP%]]%(q.6E@.uMb`mrKa/h-e,#(MKFF.V1cLc$XY\m;^k*\o@L:!>i,/l&MMs;1>rhe'RFJ_&NMZg5hM7qYV<)0BF9ne"M8K1[MVH0c]U(LYlZB2W<Uc&`!N5F"b:8q]2Z8lWe=.,RLeg(]Rn/pgu(h$rXO=1aA21*OFcGo1eYUYa\]LCEfQL)c*QPpI#MA$U@)bFLAMV.?nRF4c>2="6Z&uI+?)X/)Ae7GaRM#qW=U[oYCr4iiaP[pD=YT5P<XmL%C41!KoJkW+@ZA<(',9t^]KjujG=hrT4ebR@F/I+0`(TNp[R,MYF*Q94\lce=<Hk]M52+SODU'DWh1_pFPK%^cdfc/unZmZdfr[)N4U(k^1@P25"?Gp!;==Ui1><sc)D-qP&H7qEX7[8*W?2;)qCY"0@[U!Irr-7I3D0U(/"4(=k,(*[_'Mk:;QK)@a*$&[n[&nFIk7K6*IlTgoe>>56V/8AGd!ER[ek@K+CK:aQ/9>.8PUu7dSq1'2W2c/?`>(d!,0I>"jElLgF-fH"k\a?[n`Zb,C<?^.&t(2,n%kta7EgdO[\dM"Pap"*9K(,A3TXgMB./"a2\k9sJGV$;'/c:]$W_lf2Q9C2;'P4:hs5li`SE1O62#L*H%klS@;X#!,<"q@)imFNN5mM4kW0WC(K'HL_n?Msn&bdr04#3,@FC9sIV3a'\ru;@Z_R"XI_OI[)*R$Yj:h,jlf%@hMA4B?'PHV[gJKL\hQY."Tf#0R6Nm&Nb?,BF4;BY3ehsBJB0pMadbRSb(;R`@Za`Bkg034`p>4`<#Ru='H.=#r'm_n^mp?"!.c[M'T4M"1B<SBTA8I*llL3T/fj"h?/GspOVDE?jIt?WeWDS"DC1SD]cg,=mD7K!(Q2GG+=Jq/o0e4JF7sC\56Z3IdmQf[NS6j`QOM;s+#-A?.O.aJ'Jl!V`*m_$n2N<jbH/ine"p`NEJs388Fsd0mi`HPg;PL\M(IT?;:?M2<@P3rSX]#/gKikdq?KYFqoZ7H8(!>sA:tk+HSe-q1/JKk-3*tq*B,CGt#][)/%AMZ_7BnGr8`JN/DHV,\agI(Z;k2;S0?)2LNM?t`NQqIl0Gk4i*$][A)jDD]-QGGbSdlj]Qo(n%]+>ST!brIT;fINnLq.7Nqnq^nNZYVL`<DMg&=$R@4EV`7`ASro?jECeU_93,KDgpSHH5XO&0Ml[3"QQn>">pk;)jjY.'=]7Ce)4hi<-7<45iM!IdX[Y<:f^SR;VbS)>'!Qo&3\.l?OL]IX!u)+%9uT*"jkB.97Zi>Uosh?!FnEcoL"oJ1VW1^HnJu_0-8:3XiBg+$O8>h>s(/`LUB_Fp\4Ug-%QY=h"D?qR4;c:*0`#eS.6Zmp6!*LQMIP_nihHc2%TR9]X'jK3jH5K4$eKLYqo7oGN,>C;/V%F.(5Q:@t4OQkQ<][C+a3m[IuNnnd;C2o+0(grI][;bZoi58[Qfom9IB.Mp5(M&U:*0Znh;d0>!dZ]B)$aiBjBIRsFrYTZ-aSUKE'"6Wl#dH/VgqS3ca@>ZuXI;O0Um!-ES\$p'=3?+BB]M(e<=K4c:LMQ^sOeVBY&>,K(@G;1ecI1^[N';.S$3u.6lN,=La*G5#(]@+=Pr,&'r!2;Zldl~>endstream |
755 | 2097 | endobj | 2097 | endobj |
756 | 2098 | % 'R161': class PDFStream | 2098 | % 'R161': class PDFStream |
757 | 2099 | 161 0 obj | 2099 | 161 0 obj |
758 | 2100 | % page stream | 2100 | % page stream |
759 | 2101 | << /Filter [ /ASCII85Decode | 2101 | << /Filter [ /ASCII85Decode |
760 | 2102 | /FlateDecode ] | 2102 | /FlateDecode ] |
762 | 2103 | /Length 1637 >> | 2103 | /Length 1522 >> |
763 | 2104 | stream | 2104 | stream |
765 | 2105 | Gaua@?#S^l'Sc(=p^cPb&uiZkCh&s";JC>(dT/r*DTG7GH82i5if3>6a!MD#qVQX3C]]:.2AWYf8q;k5?66lE@g2uqrXebWNr_F=Tg'kh%%,=k=IKEB/,48@DZ+7X828\8_6Ih$E/-&Pdr,+@&T#`]9XBZ]'.R\-V5p;!d;IorS*N`eL7/S#(mf3WPq0A5.i7FI4W9=Z!J"MF(SI?2lm\_i)*B_K(sk,c1hIOXr=7;Ko>,IS*;n@f.JNQ=`?s!6@hn;PoguiLID%$D!]Gg]P.TIO-Y:\QG4D82"0j_q!O[oC=3q)n<[*(p8HDO/bs[pM+ABT6EQf*+].NZ'JEuP#B[jf30:/RMbrm#?cR_Aml[#@Cf?s6jJ<\Rl_F9j.RSiSjY6naI@iQQpQ,LQ3MUCNK8u`3@EZ<]s]jM7N`^Cdn%)P$#9BM$$&7\Ql$<)aWS9iS:S?$1gM%tYGLWhB$MjHu*djUK"la)N?:LKW(E*br]Cdcl^kLVi<*bqu+_p]PX<Dl*E.6`ORJO(h%8LoNe`YM6uiV#rCY"Z=Mi3eC<1h'rP<BWYNGBeKZI@h(#@R>_K6S.H'Qt6djJ;hAQNO.at!D?YuLS+ZhX[S27CNQZ<,GL?$>i/#'_=2\:=52rS2P`j%EZs#lGX'e)n^6s4:=nQ8lAbXo\i_C.4oYP\nhG8q#N=bb7*(QEKGr=t2i>r$bj,>RI'$X()4[C!:f;599;r4kf2(9RCk0W>C!1'V`EKMYq6N[YQ9.&n[SGm/;>=2nW!b%D4-mYh:mOIDRBV+2?p`"n`FU79FcEVJ.+^1eck0>G&N!Y'!5\Mo<oPfmPP,(8o$3*S8n@bOnjrAnMo%="!9F'_ll9?3IuO'G_hK\(kmH0sSP(IA7[u7OXRK/jn?[6.Pcg0n%am'$)0ckIQbAZ#7R+uh"4@?.eFc^*VX'hi?7D'IdZ2)B\<r;%b2SKJX*3]LB2l$Bd%K3sK4:`Qlk[RS$A[0)Dlq$ABB_WkEW<@mIA9*;=pN$k9;HHMCh'peMVb"TQD>YgqeV[sgYH)*Re'6YJ("_K3bs,]E=f'##\9uIZop1[s/HNd,-.6j"\mGq[O&qt5nU8PGIt?MWh!*(;T!3FESpNDXHRT/\A*o@:Th:)Jn>`.]0WR$jH8u3]N=b=ZdJ:#WSYJ,ThWm-HVSlke61(_f!Q"gN3f$)jnjK(MiV>rKkZ&hcnJ6(SnPK?E[)3M^81KpqcmIWM<etHrcj.6PX:0NQg]uTX<mOUA4o?a0!^:Z=ql;:175Dd([GW:C;p2).'DdP4BNWZX@"FsEPh]AhCJVWq2]a+:8&%?lB,M4\Z<;_"Dc]<&OkJR#<'CZG.R*.!TEQhQ*IO!%W:@HKVmui(I8l4F0b[@DUVLJ=ind)O,pM$E$FEN$c3CO6gNZ'*jAo"jb*iIl</<5m*b*8oR@0"Dg5/_QA;X8]OUuf#[L(Ar^[p'#]in-d<O5>jLFrTq:X"Bp)'[t"[g0VI@GG$R9T,c)K2?Khh7@^FS/@aZ2#GO8!RS71G$gs:`SngA<sg$*djK*JT(,3$FT84UReG;_pX;5^tt\n0@N4uns7dTUl2oXP'lBNYWdemJ^Ne^R>U__\D:B4E/A2]l8V>:1;OiJX8(sI6bE"Ef$C&`~>endstream | 2105 | Gau`T?#S^l'R`L25MVStU]Q>A\+<F1>8jJ@fVTV]+Y%mWm")\:#<O!8U=K8;hAI7@J_7uZ.Zko=m`[gX553ni-8<G(UAk$E^lL:]]dH'eQn<lVRL-;*pj(HZIHgJs&aQsb=I(jg4Vu`BHf$u,[S1s?Kj__Ajg<naX&-OqpMe%+3l;0HKis?P*,oHj=+5UK!G>lZP76RU5=uS)b\nVuR=Kg*+^IF)-K=+kAq.Y`HNiR+'0PDZdkAZrhSZUYi;gRn[KQ;86_eH]aB5ehJtRM1`;Jc#)Mr?Gk4P+0&!@WYeDJ1q&QFEt!h%tTZC9ZM_]WI6^,dF\OCr#h\%aMmns8@\e1kEZQKE@j'a:YK=DX=/0&Cnle0`YB68$Hk<[sF&[??F1B_GSDo(<QJY7.:(8;LZXa\XN2?5Or%/ta5^_8"=Bh^&'GkQfHX#Zm^M/Yi4t5_[8Zo5)3AD4gqEmm+3AmN?%dP2tgBaTrV*,NrUQg"-dd#K;E(NS.1mo\2[GdpMWXq.hShrrn8O"ljr<*&!\Dn.4&jjsh^APH-[@2]4S(08ApKk&87GjaoGeo4T"h0&XBW/@18W<h"JcC0&cKiEa3oF1idjH%U`'!C)R+?MOFti4FX+oQE"#I=A>RVmi$gN@F]147S&D)_sic%&Oe6RA7&Mcgb#QR-D#G>.'<Cf`S#8B8"cn/CPcEAECMR%g.Q_+,:/TE!b3dq;F*I>#ZJq)+4a*I2G;rX6Pps_f3$q*%PaVka(E7jO`F\Z"mN<#Ki6:kgHGGRel]2QQ=a73E5_N1/%gT@ADB/O[6"0ktVIeMc-0:ls=PZO<L?*hFQO:./h:J%g.QnTXJ;V?IAgAM?B6^2Vi=S@g3?-!TmLB)Qgqki2j]',&4ZGS'/llN@p1hM/:7hkg_q7[f_DhE-tKZUEL_FED:e0_?U6S<4\C/*CAL=KMZ.sr(?M84^/>G$"'aQC:G9D"U4QD\s.r&kscKW^GL]l0,r'CMAr/%X!_TIFjR6(\OdM7_fc:*%'(C=?k#uEB3qoQqe:Wk8JK9X,Kb"#coP.dE*Ac(C.[A@=mZO3q2s4U@C80S^?5Y`jj&_F8EBOqq8i-LMo&/$!-8*A3f!\+O)a#.cu:;:?(ii0=B[:1h<a-s=m2h^q<>J=9i]:s#C*!8)([2uQek?'d5tK\5__P:n[KJK+W\WSA'uJ?kc9^[in;p'rg7'GTsr=G)M?e]mP^cu^a9PL@:)N[h86YPduek=5NHe`ZT>kO_Q>_iio@aNGC5X_>>'k1@X_@b+R8i?/[Fs>QFH#S&9ka-6M&#/?Z@%gl3IH#Z]<0u#5G5[YUF+KdYFK0>0X=*O;:3n$,,HRDQ$<.Fd.2ei&^T3r,gFgU\7"k[=!dP-LXr'@ocCW%3T0RFC!ce><b[<khp^)_\LCL@r%WUnN[o[iUI`Z,Yns[]C4_0#HLSTe3)KkO8%RIO,,Eq-sT$G=feV&8lnNP,^JOH+iRi_D:9N5;t4,r:Ihs;ls@+P+*!Ytb9QE\VX`fCU#5_XieKH5~>endstream |
766 | 2106 | endobj | 2106 | endobj |
767 | 2107 | % 'R162': class PDFStream | 2107 | % 'R162': class PDFStream |
768 | 2108 | 162 0 obj | 2108 | 162 0 obj |
769 | 2109 | % page stream | 2109 | % page stream |
770 | 2110 | << /Filter [ /ASCII85Decode | 2110 | << /Filter [ /ASCII85Decode |
771 | 2111 | /FlateDecode ] | 2111 | /FlateDecode ] |
773 | 2112 | /Length 1622 >> | 2112 | /Length 1650 >> |
774 | 2113 | stream | 2113 | stream |
776 | 2114 | Gb!SmgMZ%0&:G(NJ!cQH:1:YuXIIu,+\cFIZ+7BV>4fceZp`Yb,Z5p;47:^E87)ug)egl`5dq&-985DGSiJnh6TNN4J&d!b3P]Pfr%rB.E?Up*j)mJ?DrE$,4o+F9`7[6l7M,EFV]5:R*-6Gs_ar4TO?(^WVB[;,kt0Jj.VGY,BQ-&YM4bMJSDt#$6tV%lgttHaL*n1A$4&%3)4uJAk),?"*9'1+rmA=Hq^X=i?7.e`M_;MJa'H=9n%4_1.8ZVW<M?T%?P#)4-2+saFe],Dr^oW@La]YF12VYGo&nbcHbjFH=L:9/p$)p_D6E=qb,25ac'9]cQ^=3M9f0iD$=a8o51B*2Y<+rJ\IuEFh`k`J/rLo`(qpH&9Q8>[oUJ5tOtrq?_h=J_c7#E>$V@D4o>C;0la98mRMQk<0Q*``]85dh_=`,p%.4,i,%:S3_[(6d'rC0q>`gSTTV?--PEKMA\2?J=<;Y3ghCG\&F?8K,1`(0iDD>I^H?;=F?O#-V)h<a\m0-i+/kH[ZBHt.q(ee(%iJa/Ya\#JS;Nd:OHu>W@qZS7qV;tk5BaT[H0'^%p`cJ#-))H=lRmTX]1kS3c"m$/JU1'Xf1n\;#6mrd]1:M!Q-PCoAlI!gIp^3<te_(%C3/*VGd4r3G)jD'n<froT(EaJmg)8HX1W"AUQp+Hi<s2,6D8Q):fe(:(?4iaP2a\71Qe&=8Wm%iMVRGr842JO+qgi*!-6$D)E/F>!<b-'H?f$8[Cd3I9?Jf\>of%Qj$L8#sS>D=[Q7`\TimF*;0YG*0^V%0EC&;F$Y!B8,Xm2=V:_S=3EXnGkm`s4hUQ;DHOeS]f]BDDFk^B8-2N4TYR8Wg9C4i4r0Z@-b\mX[0$b$o.+R$>UK6Q,1@[HP?/HXMBh"\P9%9,1QW7]AZ;bWhU\>@G_*=BL<n?)RG$3\ms`\^$reB!sg)`8GT%2R*`dHa*+95^Lm=cGt(i]:s?e\]]CO'+S%,t5$+*mW#&#]`T@VFIOkIP2*?-f[9>5B*+QPD\J&7'],i3Te*9)dr.R<8d3F6a&d%>6tB]\c.?F44/OD)112rOd334+1Bn5(!.@BgaG4\4>qo1%3'HdDa7ar&-Kt:0UWW'.eC)?ZZTCF8*uabG-"7a<gr=e"2r\iSEL81R9l5ukh:^42D"#"T>R,o=4[t_^%Ar^9'93/Pm?+2Wf]RoQ=Q0+)Pim8>mg!]n#KPr92QfQbiV^f!9C:!7K-\1@Z,E,&N=N!("H+r(;:S4'#K*sfA4THVauLrOCPQA$7lQ>Ki>(RN"L_.Rmq&FmjbUs?&+tda`qrBkk#f>e6;"3Ot=X*7C-\KBq;1g-H0lma;`b<)C3m;(m^=!CDbbj(5-7KYZ/q-f,lD!T="a`p^L-g45eS'FQQT6CHlUi("cDKn(ns2gnPo1227j[+T'_fL"[d6/Qlh&dC6)6%$!`6p$B<^mIo[a)]ca7>^aV/oC%6je=seS<)i(:I1+E>8D(BOme.[:M]"ht_L?u/=e)G`M&&GC>;CcQd1BOG.@'%kkG@DZUHR5poE.>1[iql5N(c8MRt)t9"\BcWCsNAocb)h&3V^Zu2mel/^Lcn[D_;iQo,o`B1cDbK7VEArmpD!-e!#7]reP^p~>endstream | 2114 | Gb!Sm?#SIU'R^LRs);>".YFEeZG*t'%quYd`mVe@SN"7/&oFn986)CSGe\]oPb#b;,$0L#ZuZ4O;U!>%F"T*VBcAW$Zh8[8"+6KPqlpU="1&0`Y3Egi$8,u37ph=<m*0a,&-C06X`+t`S)^8NVBoN(1+,uJA4fI7Ht;KFQHS;5%(L.5oYCrEQ=CF+KW9Z$h-Y_1;H]>+&gAcd$6itS8ND<+E1%4*nN&]3=Vhr=J_:j,rMgJ.r;r4!R8-g[efuM[(DG^WTaO[n,,:mc,!,P%]mn'Yh;1_#r<'r5HpJEc!1YZuA1J!;P1?qVs!K?um!US6buTr*aF=9eoc#B8$A]_$mba'me6h1f_H)I";9FjAc&Bol,$@_`Qg6timd^8.fsEGROjl&&H3kn)9trX#PZDcrj1F'ef\g4jhpM)sDYGUCqn<qk7:M%U.2Nk,5U,2KVd'i<""IG/^5Ph@@<bQA=k-9'aGX6MS&hNY>#%Xhh2=$+J@OdgDbIZN'uJbLdkKuL_qonka6>e8^5&VQWIqZ(Tae$N.7l_hX21++;eN>R5=nVR"fH\r["@^;h`lhOaQ];dXV<Ze9eXMKTpZSc0/T!HFZu^*b*NeU:?1(mBja-dhPmiB3\LcN:QO,,]548HZ@N(O<*,=Fm3m\oe-ZR'S2kHAWMDU'Hpt'VM"Tq=$UZR9]<@ORXL#.5/OlAlGibnf:tHdX_A;I^c+,72QY2frbUA@X/\r-0Hn!NCf@haIF$Okp?,!Y>a;E(o1grZWO=>UJ%PXeQekPGWU_TF>>&P_QKns@u0/CHW)2\8?FR:Q\M^rJ%if8"2+rADr9Tcf,;-,*[3QX#j'gkoef.9Q=,<BPJ40IVXQ)rGF1#X3g0$8<I0TPH((;KmG\AR5)&lDp+[f7X+M.9^[<HsW[=Kmb$4/-WUCZYT>P,sr<\Yf)Vn$"O`)qo!-aOR'NO$fG6%"5>ePHna,)-tVuf6+g%S7,>)bS)N:=>>m]//<;tl=uHE&tcMq:A%3R)Xb`$g`^TfRfH;10`"mfYcOe3(!1/G!3r8pm\.0n'#k0ljLYcj'o=D?D*n2FiYH&rc\Y'=g,+cq?L#$HXm/S\mAW5g%M,hjhjN1WquSn3,k`(1G`?4PXKCUUqk#.g]B$ODp:1nt7mA/h<[g^KSLuk1Zg$jn4Lr&955TS]V<sJlnHpc>O03eD.dYXAEdQXpm!.F/-m$pN;<n+V>htX13NJBOWs56F@$9/J4<3c1IY8_pK,(NG*CNLAB(SAYL/dX==R\e.D?:)E]-WXl=!muM^/VA:;K9J1U=.6K`OHqOHdG+4c:FJ*Z]g0XF:>98c,7@h@=(//+"7P;>R$E_fe\$!lCNt5&)Rl1Sr[B]\7C;`E*WF#rA<0C!=o#:B^cLNZE5rk-(!LDI+S?0.\lD+4]fXls1,7kgEO1h$N#@+_>^DNl&C/MpNrM0+Oj#@R-K'lQJ"E+KR2,&&]F!?@.3;N.6>_n@XqQoa,*@FT#ntbo?@llIEM&+kc+T$4T?^"rEI)LCeOe/i,!llG_RG^+;g*,=cI*R:\k(eMTk$q3^M)uTV\sVcU0p4XnHWWht)&%ll8>Z<R2$chk?6_*eZI8gJ+^g4D/=gJW@*_QGMaT^)V82mAj.m=8+JhLu>l%$lY.erWT#lLt;~>endstream |
777 | 2115 | endobj | 2115 | endobj |
778 | 2116 | % 'R163': class PDFStream | 2116 | % 'R163': class PDFStream |
779 | 2117 | 163 0 obj | 2117 | 163 0 obj |
780 | 2118 | % page stream | 2118 | % page stream |
781 | 2119 | << /Filter [ /ASCII85Decode | 2119 | << /Filter [ /ASCII85Decode |
782 | 2120 | /FlateDecode ] | 2120 | /FlateDecode ] |
784 | 2121 | /Length 2297 >> | 2121 | /Length 2152 >> |
785 | 2122 | stream | 2122 | stream |
787 | 2123 | Gb!#]D,]1[')kW@s.MAO=*CaZ#0F&f`<VQfKN^pZi)FUgI$GUC@s\t_UWeZ>b-0^#7t-)Dprl(\-3Z-!;>8Pco^pTQ!nt]P^jhDCU)-2NHQ>oodVqN=]@j(?)4_1[G<YK`"S9=?54pt-k'm?'O*>bkr\6*IU.m,-POUmTZ+I@2\!lRL%LauHCNZW0VdToC4mKA+56$""ohdm$'^M\gA`eYE3[<sLb,1rscY<.Z%KGZIr;$k]p3ngQ(<6=d7HZQ9_Ojq*.$l8\ecNeujm8p`AMP,d5Q!7!Yg[Fg%1!:6S))+4`5l1#=Y\<+ibFRhQH#k*T"[73V_bl?V!^OHg&M)9eEmLq-gsNfN1;B`Ufjpta+%Vgg)s51WO.eWDKktWIKFCJ_=i/eOW,h,EKU`rpW>*Z\e[lB3GhsUm?@AQW!S+DZhId@?7*Nm\o]-SKo&U2aHS\pH)2_a8!n<!.JpgGP;qbj2CY2Ln-LR`A`RaBfp!kT?LR>ZK0/K"$HD6jJ[a93csm<-YPV-up:()lFVJ"r>U%247#d[go!Qc5RZukRm_'+n0@Wo@(Q#d,iu992?F\.?chHTj2e8KZ%L)%P%67-,'1r""d\(\<-:/LqOqd._rejR1C^H-9?m3ok&RNkAD:3-QMDu314?Ol:VO!5XR-TqcZr&t>SbrODYu6s&2DI6uI!0i.S:7?o9N&"H<?kqLr]j"W'(Z3V>Bj3e4tb*0$a_oQ26(GAdmO9'$ZhVK/-#+%`JXntCQs]siFD*Pc4^B1.\d@*_S2/80U[m#i`>#3+:Y+ojGH'^[R&*\`02\_4B(rmRG@K8N9[f$=l*g*f,D$RTPfB3I;R?57mV[/hQ;Qq:,s@X$sO2+ZrR^6Mjj:qV3;7f#NTCd,XCH_,WDI)lbHmELPJfJ_Dmh"ndDO1nbeS&`Z1R7.Vr<M5iD.U;6M.G<@>eY(.\br;aV57l(FiO_9C[[F-gT2Kp?Y1Aho;*MZ*r/#M7aU%m%Bo/5fK!\i4p!LehiL48A&il&=?`E;S)Vpsm"tp)^JeXLb,g_=^;I2\EBZ2gB$]*C73Ke36&:Xb6Tt2Mt1`PIN%6>e&H6$<mDZp,W!Q'Qi%Z(k5-$$u2e;q6iC^c,0/)oET-^n))%!)-=1$D.H8:\`M[q>W>?\5a*D`2';$mB%8kl=q":*W.Kcs>[,=8*'8S$[OagH>XQ.aWhTdTbZ$EoWQ_.M3,QOj,c4&l1WpQ17BmRFNMS:CfI\nO'Wba^BGO+F2"+t4)oS$ZT62IP@j\%)\RWL,0p]hG=>uGCZo)4,F/,p9:h*I&<-McO!cJdiPs4&sQKCD(as;.6S[*9mK\dOpYK3=L7,3E,;8?74(^"GC8QL85b2Le#+^GS=08:PQ9@KXsf6iKcY+,Ke^/#<ugo=&BpI/1%&7Uc;]Wc2aj8^dTmFZ4*bP11P&&XTh91Vl+fUn`d*PaP"9iL0a[\ebGc=t]eZd7sG`(ZJ#(-f8%ip?Fl9O/%$r$>a-npVH+e]*H5eZ`uVil-]1J,f<CiYC;f(LOrR?";O;Cs3-3EUjJYU5q5i2"HOU#8a<,L8XLs?p2OFF$CVc-Q%J8P?R%gi4%\"p[?[hZC/jVkpl1p$dH`Z[H&=j<mI0e]_M'bqt&!<IY6T/lQFU]gFB*FOI023/nh#DIik9nc;'Z85$T/D3B=/lhR\rI;Z;O(m\WL%-b4YLZ_$>qb>g*,6h]Kk?Q!d5YK@jF.S6[pV/a:nXQ^Mj'Y3Zf&Q#L-:.]KAS1@Nf5X+#&<k58JPl1"o1ZK!=G;RdJ]n5<,`Hc\r_57hd5%J&Kr":&7A5_40rNLiK2p1,>5mV["a@,hQOkJ7/NdBY2C4_5"NK6k0n;rLsa8O<;/b(9:1bXdBr63XgW3_U-9Oq@?mh='sC9:nA2=XIEa!M-Cn1aD$HR-;m-Lo,9s#gSCaommc(!%1).'D/J#m#o0f4EMYQ=Jsqh&F8X+NShZ\aC]C1^;(ppIp_&eM(IqK4]aKd`ABBd50YWB`\Ucb@bplP([).X%4KIcj3MW,AVYcaYQUs3h'<O.4NkRBb8u"25*na?A03OJj=)`>s\%k>%3f?6#Q#o?&YT9LnLq$-_<]T23@>Z#G'%QX7?``]:(Z>pTq(>F@A`qJmX)EW"pm.,H"8H0$\erc1b>qDe=gt)WW+IDDbu&rSm3oo?`)Lptn2eMr-Ut*H*U,hSDKX;K9eN$_Lm@@SFgp;nA&(^g7rln%@HdgWb@gVgI1<D)k!<F&LVLA<l>'0i+b^U,DCb9CoQE/oUOmqa%RCp&>ih]aX\'g7:<Fe*bMRCm#2D~>endstream | 2123 | Gb!#]gJZcs&:LI6J*;=5ZIs7<9>8KOPm7R+W,V9YW,/crLTr_F-V,.11VtPI^YL,-(_^l4ROXI[[R[+\dqAM,44(dXNr=GE!UTXOrm1\d"b-YMX53pX":k@SNLS0%B=?FXK%Fnl)r9m6hQsc_HVa0o<"Up@#<es:k!m7+<TD=5'^1cBl<Wm(<7$@Pam[[P'<$?gRFZ<g%ono4+lgI::>$cN4'UWm#QG;Bi3,Wf>drQm'nauSIq0;1n/fI!=#'e4&K4%GR7n@f6>!MKeY%n$)6c(#@:1S%&2Z>-dWQ,5":ikol$<B#?<+d*a!6`QJKt7n)B+`k*/o]`Y#uo=JH6X0(m#aX1qOLm37g#&EW(/4)IC+h[c8LC!?XV#fX,#94<4%'Sj/+XG&qeMBQcuJ$O>(_`Y,6hV@ejuZc$UROH0=ko.[gph-E)O;oOoiL)R:#-GhD[0U(2Q,;-tLZ]q(WZeg!1r3X&98'I-p]egQ@9Ek1<]7c&RF*1R'W*M=scLr.i=Q(`s$"UgZB3FX<NRmCoqQsJfg4@KcW6m\>&H^p8k#ihome5rF\WdO8O6!M+O1*YDh(dM'+78dq/#:RGX%6o`./&>A^IUo]"nhO'#\c2'+e^6?-VTe6;W+R+]]DbBJ046035\Y(PU*1*(:%\ed9'mZ/P&ce/@=B9?qCjBa!o"`;FI[pN13kW]t,_tT:;/0]L&(+hJ5%YHY$IHJtuTdVG#aBeaBLplb8aTQF"T$qc#<,(INLY.U,5sgNcXP]l$^fk7oak/n?]o/G#(f[eCPXE3n$,LN0Y.G`u)e*[u>`Lnd\&1`!m"MMY@`'='ne'SC]b4-Zu^UC=6@pP82'L2%ud1uo#u*[,O4SU2HhH.jW,mLo]RWDs$iiZuL[lj&;PAgTnK%U2:1e@tiPVZf+KNp^j0PXH,?,"#XkitsT3L^j1*%N%+Tn=dX&*Ta0kX%>eJ%Q6PAWSqB`A5mq7ZG-S3^rL/iP4,CN;e(.sJ5]h&32'O*/n4`\MLQ&A4qlJMk!L3u;0jB\6fhX(`=@on!^m29Q5)GQ"fONt-lPV%**XRnEKdDi#C1@5EJB("`=\IOVaqdM9@(O,fA+ZU4/I""s63T8f0#Np'i\qpW'R<cH$ug2K1h5W0CQ`rTo@&6]]_7hfFQbEjCVMLInM(J=:<4(AkBcf%kO6V9[<f.\TiAKShakF*:Q%S('h0A3ZX<-p8Dq7W;mC*nJJC"6X7`/N'7tI!SsZ*9a&"Zi2VB<Ag3)D=Q7u9Gu0,"[`eT?rZ!4%[lA+eNWZJk`[$fsW$e,P51#-$^4Y<lV)*-H"BS?(ld+^2b?JKRR!1tjLuFDo>RcOTUde!Ml"IZ/QeGN6_su=1-k[PTA"Zd7AgU/"BXhthlup%Pl2Q5J1PIhh7MIF-XCe&pot8SUC=[8"P^sLjB.$UI#`]QmSbXBc&CI8b;&\2JO4\]Y`?<*&iR;;U*#Ph+;KL"@\C7m!AK&^no't"S'f4ci,)-aJo9_%_B+6gYZ*@c[7$C$A1"EQH#2H(4gs'?p&lcaoU+$SN'Q85LnO&HFT/IQfNsXtR`U*_e(B^gVJi+2_EF#jF4&PPadqO>X'QZ@bH$WNnc/mO5hb*EG35ce\C)Kn)@Ng+sS6t%6%ogCtBIX>`)Q$+MZnMS6mN>S5lIpe^J+pgplBS+@<Qb(T;n4USB\7J7$ouo`k1KL(=YV,=7EY*ngLmNR6;,:@?n9gKo@)Q]IrKCa"XmuY:QA$NW#D(`,2s)DNDha,d3KB7T@S.>'3V-1oT?f"PMIGtFj$#R+[?4Rl6WB*)2)g(_0r/;]rQ)/^78Qsj#r%e`t,dtJ8uqBZNabVI)_)s`@LEm^S^\\`UT@GI.dlu'+?Sd:2r>2!(g1Q7N^lCooIDEk(qHj8.of\n2I>Bj0k66'[JA#[9Rt:a.r7TbKjNmE:.jNU=!d/N#3aqYt!V>g>LoXh:(6&6)if-Eqe&!:+l'&8:lZ])pCaJ7D.R6[^V\!o=<u<(2Q;UW7Zi`PsD#u_g(XGq8,q&h#<,W6n.h"%(H!<@kOoI(ZU#=YQpr8H=77C@0>0L*Q&%&Tps?8#7GabgfAj8e*]>_nW41G3>+6_7PC2H''G]r6V[c$[omo<.quF-_W:l*DASf1NdW0`[Id9>Nj&n7_resgg&M'b~>endstream |
788 | 2124 | endobj | 2124 | endobj |
789 | 2125 | % 'R164': class PDFStream | 2125 | % 'R164': class PDFStream |
790 | 2126 | 164 0 obj | 2126 | 164 0 obj |
791 | 2127 | % page stream | 2127 | % page stream |
792 | 2128 | << /Filter [ /ASCII85Decode | 2128 | << /Filter [ /ASCII85Decode |
793 | 2129 | /FlateDecode ] | 2129 | /FlateDecode ] |
795 | 2130 | /Length 2300 >> | 2130 | /Length 2382 >> |
796 | 2131 | stream | 2131 | stream |
798 | 2132 | Gb!#]D/\/g')ipps']<nDOlK^>4QHVk_CF+H3VgMCTDf/=;M,m;)U@tW/st`UZd3B)9OU(S#n>Lmr$K18S.1TLX3VP3:W]&IsguJ8cd4)G^8P++$c3Dht3?K?9pe<5.Wm@o%.Y=?0JY!?G1^>`HR?'r\;h`;*&:>np&)04$K[VV0[T<KRj'QL=_,570>.*&q62HIg+Ai-SX`WK9dT1:\.]PC%XtpbjYin4mAM&p`"lN3Z:52`M?Z2Ju:Bo]3?bULK(/$9L5bS,3>5(<i?FceKUJY:VKOJBR.ie99;P45-60bX)"!j]n6$%YPn2'ddHrn)Rj'i]0W=l%N0M:fu5oqM]6,%eN?pe8iH::R!C`*g@10&"D@5cA[$WWR]<lZr!OEM0kiKa^W-Jdm0??0Zek+nq`?PtF1hW"dTgg#=UYTm(4LOU"cenO6")`:<>n8;21'n8fj(k2!LA5B*k^WZJl^)rE5o9-2KZ#"+fB"+YCTtuR'@KmN$2d`"#KKdLXF6s;"+WmRk7>Q@!>;;4Hb&1Tec71&QqIL>Au%R$d7cLAW4EiB]_b+;h^],Gr7N"GQ+X2239:m:8)9-ajK5k#K(gVr:32CT_">r*U.TKM!.=24:#p3Wj$bWTqm<ZJ8h$oYS<oaJ&VJC>bg2N;NcDbraf'H=7m@/N_'g-[;6<h04p0MgIT"_LhHf^`*-o,l=D(UC?WLL_GWor^*k-j,kk9l@YY?PKR]Q=X=Ae9Ea6cZ9p'eLs2^_bh5Xf-3HPpfl\qs?3pS0ZaJi(5:9.3rBWG%cRf69kX.37;:r*=#cSbJ4QOmQ$L<D)'r'oq1cRU3?]J':D4fL^NkQQ5"*l.CN5!clkL>S^i!!g8o-l_YO[$oqO?4$RUKD?QP_Z28$A'="b.V+8J25C]9K%g?,kTS+X4^!D>6rkTN]irVe>[2nPA`sOQKs<L+Ko*=(/E<`a,"iVJ?7n4W_cNIH/OV/-R)f-AfL!WB+p\W[#?`4PUJo<d+"W+O\6'Bh-rhOHcAlE/,0,12TMSdRcM0#la;i_r>`L3ZkE0-b+q--R"54QB<%<uMe,\$!3CnV>AIYmCdJfNS-mVZf$ASH?j'>]q87HU2kpr%1_6;jQ"1bC$g/TUjN!(Wd]\^sQR_k3bKd<1X9,`Fg[88pHRWL5P:=Ts*X@Nt:"6%Qm#li_9\&5]RlOa&P[IBn4p;^fb2X\K@c1Q&2J*kXHs2*N7P7Z%:>N!nRGgW-WqQF=H%;.@5:;Rh5B7oM/0F@V$&+IEcnBJTE_uX0T6[3hR\j)d>_]e"L&U96bhd'R*?ud@br9X=g9b&//\$o6?=G@?4LcV_EQH(A%,sUi[5?le54Lqj[r;##.4ahW`ZX4)6onbcRVGsHAjD%YXLR?,N%Y0Yc?e&ps?(AN=UIGQ%=(@gp(30;QaSI5m3PQsUrX.\2T:X;FoBDgnn*?s97(CaCm+2QLl<utF;EBOVF*0VqZuO.VY/!0FXF9s;:?bnRghK#9DuLZ3Yrb2:4X%l&`St<].:f>feW!Gg]b4b'I_]_c8HKk>/B]JCE4L!`+>mGlh;9Q3/c&m/$g'q>+0_r3C0k<'PsJJ4BqI/?e(,]2$cI_DES.K]<=3Q3=[GH?P\Sj&@Y74RA^!BeRA[#a`U?4mgMFLp"!8-9Y\A6`9'u=n3#*>`s1kN6D;SpP[(?"7h.X/+=j"K`KYTfkh0uHf<ho]0!&s316PeVK'di-dFu93FS_J,\6075jDqmXjYtLD;-ZB#_X7VMn0S9\@&4pJmkO%X_K4aknRGpiPi=Ug!iO=7FDo]?'^;pQuNTZBYJ_rV8b0WlJ.8&)/cQPgVmcf9a&ldkV%UBcWT*BbBq&G-SIe-l%oZ-6M?.$=KqoZjVA'o#Z.hdp9UV":68q=p\lPaVP2\RCrk&a(g68B!fTO9mpg,cMrrF's:Q4c!!1HX6K1:ENN)F(`'K2F'&CeHU;KJT'4Q.$<oeIm<Bfn+!J=VgNL+JHZkkSA^JW&YX'P%TN(@@<R`GdYLdfaS!O$^T'-qmnlCbjpj^pZ8!j67iY7FgI,LjkZ;^Ph>!!,E##,gVFZ*0^!W=L0>(/ZJaLq5O4&_Ua]SA+2CJ`5a*(SWnk]2RBUctLhQpbo$m'XM+&=7@E+7^@)3_?A4d_Q[S\7;Xk[46*3[9>:o!['2Z61L\mKqD^ot@WIfu6JIbZa/$(uoPF'$K1??PW*iJPn<Cc$Ys:H1C"H4]uJhJNNln$Lnc5K%f.;dbJccCu79IfPXsQMpBV'O!f?$T\c3rCk)hJZXGLn81)aG?.1hLj.]/2@[\srrYjT,?=~>endstream | 2132 | Gb!#]D,]1[')nK&r.cn)h8O1J@JS`niWBaU\;F[t/T,duS>+$OaIYcI-o3*,09uROh'9Z7$[BeiC/Y-<Uf$kBcZDD-/Nfui5L4c_$,EMN8*:q<<U_7&l>@X?$g@D)hgB_H``oQ^[@u,a\<V68NR-6]'miTuhS)8XlZHMQgc"p6>&6Ko%(>Ep$Rf_\)P..<_k`N0?mIF^73W/]#k6.#!-0[>)43F^mtATjiG\_9_<!cQ!;ukKs-!WZZi,1QX^6"JCM<_b.NV0H0Oo>eA;WMP[B`*PG_e3;&Hm0CkaU\0A42$2O27;*F<A>DKV@+=l`\:s4C+.K.Nt$BSfhsq#ap9&$Mg)0]F;]Y\BV]b;&HfL#T_%j$/p***/g%ga#oo\q/NIHMje7UiO8c8C79!X)o-fo7^3XfnW=FEKgPKXm%977X'll(iI9S78Pc\gqWRlBcr4^s@=3>g6B,5q/TPfPhF<bQO)&-";EU/c`,+_Y@d9uGn0Eo[be\Tf3j5]X-m^XmA%jIc)srDWSn"GEI$0&A4O1I2^b*KXCBHU6L;P0fgi/NdphEpT\`+l&$Usf#DR/'-nB7?"pku``SB=dD#$k[V1u8af)'qr]8n8,G>'q>^l"3Qn(*\dT/2ImB3*nqE3("qbeqB.f/=,NoMi`QF)hff5jp"3V9:5l\"a1MI"rRedfSl"t"u=;^g^nt.Vc.Aa_>coXcNJ</Moa+Ii!s>pc>60-Uq1Q^V]3sgE,X2/+lrcS!CGtu:adA%WKr?NA,=7lfb#@aM`L4t(<OT[Un!3&gaV*><qZ.&q-mOQ\@GZ12$G.tSWnRQ@-_*TfP%WuYFYPd`(%H:HF`s[KMY]E8l9n^.9!sEOD=[cMRe4'lCH4QcJpQ+;oY'aG=h_'_Gk;scQU,AHdt0.=`&Ahr@OCdF%dN)OpmTf9*[inPO6st(LU[N13PpMeYHCn22WF6AN!I<RfcYr(Z+af5qAg*3+5FVS,E/;%Rk)ZbUVJ6KcoCe6FPAtV,QD.>adYc5%cCTKhDmAQ3j?7jt<1G'[J!7N$^%oj0=urXXn!\COn"`c!eI&dK$(EEP4Q]Ihc!A,SHGBW1gqEoQeWb+JPq]^+<>idoc_:Q?`4gMr5pgP!Z:Y#7<Hc":0nl1rI%h'gH1.6`0A.JqB/%3VjI@01tiUr[j$s=GYS^iKOpuCT81l&^4[7[Rg1t<^VhoV-N5R6GN%A$Bq8s>F%1UXcVP/4YtS`C\SDFQS<QGB.iiEQp#W)WnXod\dlSW`g2^WeWj.qPUKEW-*/*Mb:.@7Is&!*E2O'R/o\OiiBL:Hd%F=Wjj"S?U\)RlN_#_e`G^rm1,qN0^h7upYiYikQ0ufm`qfeti-!GigA"`Q:$0-,@J\a4k%FGnIIp'd%Dse>HQu7DC>8#lN11eikT\.`:U1D&^fh@ZoI;T?EA:K58WApjKuVQ)#T`CoAgs''*(1D_(Bs+8G;^KDQ=A'JIUR'O_%S&,)G=DTo%7&("W_ht+jA`]P-@\QOg)R*0XM@2r2*4*dQErgD,cWZdQq,u<cl=`_.![(]Q=s'?Y%)p+Q:BBZ7@_eYpdV'5lIJV0p10]LWpeIp\!oj<nKrPnUf1JQLY5E`=9:6]h@-@%KRf+MITu[B4[OKOj4>#fOHOAoXAQY<JVA.H-gh+lA0/?8!3Iqk"gBo5PF$ai)B*mLOZ$6T(W$<kQFXM4m7C**/o44?!?e<I(C6nE8'%`*f^G;^%&W,*r;4B!lMk,5?qL[?[dO1h]'.W(G5n6Y'OSnn8dI)e`H\bB^?66BQnu]8%A-Tr#GRnqj(#R:+st*hqHf;<Rg<kd8[k_7.$tD(Zc;pl'utJcW\Tj&SAnKfA,sk\1XOd>K\@h;g'c=9ciBF>@IX&g$H4Hk47lg2B-4"0XDbh/7noaa*HCf!R(7@Omj/(cTCs(Gl&I+AJ>H?\s3.C6<%5),Qsr1aA]/*6*@RHa'4+?&m5qsQMo*pIhTe$m)JcZN:)m=m*>>e-Y1lA(bBit69)bb_F(,E-Ul[[mr;#L5_):SZCIS>j321lf4+N%),.HGk@$[6M!Q&WW`[Pe^3\\C3i&=jGdVtF$\X2u33:LM.lk&_/0^eq87cU'YsG2:1?<XYo+\U4p7:36GnI11C%&T#d"+n`]3+XX[3)(lGg5rRWrd.qB$mE]F4U%'[3+@uTNCIG=gt$Ogf!Y)"W3$9+5q'EVa2_7c+cG`CMp:dVS@33DHA5f[Q%U(rGs9K-RN4*@r<EFRF\P<F>%A..T-AP@fIoU?2mX[T%@!X>+JD#`TXojZJ3*$;`GZg@DjC\;psU?%duPda)gZ*)pO-r*`,A1gK(NVmMe_*c`:(pJO['0<a4/'l<4VV#JR3TcYYT-X!R(C81tVAbt%Yc[r6^#WIZBt~>endstream |
799 | 2133 | endobj | 2133 | endobj |
800 | 2134 | % 'R165': class PDFStream | 2134 | % 'R165': class PDFStream |
801 | 2135 | 165 0 obj | 2135 | 165 0 obj |
802 | 2136 | % page stream | 2136 | % page stream |
803 | 2137 | << /Filter [ /ASCII85Decode | 2137 | << /Filter [ /ASCII85Decode |
804 | 2138 | /FlateDecode ] | 2138 | /FlateDecode ] |
806 | 2139 | /Length 1977 >> | 2139 | /Length 1804 >> |
807 | 2140 | stream | 2140 | stream |
809 | 2141 | Gb!#\Iqou`&H+hTmk>FcV^8hBmb7""Q#QBLVA'*V2<N%I+NV08XEmrg-#J&/p,=5lBB"/OZZ'PEn8>&LkfoSU,DFLaDs714-,:T)\@;khN*n>kYS2+dE"*loV^F](:Vt*'?4+A`2e],f'^)!Xr,SS.8El:?bOZ[Mg$))_%Fkue-YRHZ02*N[@8Pqj4\0:<Pb,);lmoQ1Q3J0C4"n)]F)F8Q^[o[`L;A'N]Q$.5q94gn4,=AhUV65m]Br&47prm4\'Bc@Zb+i(m9`$A#+amA\3#l]Eg9WNQ^1dJ,bgudI(4O:hi4i\,`RBE^0nsr[?01[YTJFlh[S$6*e>RG%qjp\#QT=0$<,3I9_8!P4u-Z$iPk"#1B1=kN252iS/H;Jr?0c"bhoFpQ%>>0k/]#3?kjO&P\LPKbSRtoXp)@J1W4.pj;Ip.^hG.Jmrp-oS4YX06*ohNBD<26rYKqhis,=dJ3g4bf62Vdm=#JTrUb&'CEA+G)BV`5g70XGZ1"dEX*bO88&$Z\Xh'b^-L'L=`0>!TQ>V(06Yg*r1E*<c#Gi2m-p1+,_N_(r%P0I:Fi8,Tk#d-g2I]cs'nh]MV3;W,6&F]*U8oT(q:h17</-#B_&V!>bT8bQ3LBLkRim`/WitOc^gJ]%#dZNILZ'6@mtDJLrdO<j48ij+i?(jWNG2$oO#D#uQ"%p'4'P$:H^cL%$T8D#0at"l=&p">gk$>Dd:0sqWUd(I:Y^3_8N0o;k)YjM&S3NI#rS`uUW=$Q;bb@g-e<qbH%mu+jT0t@q2D&/RQhalJtE.^:FRO88Atopb+,Y3PoNYtRP;aC6&'EtKNp01ac)%9nbC+P^i8YIZK)!S&nAt%Sl,,h:??"tR2%M92],p6,oPaRpVi,'p6e^\FN"aqWU-!C;(>fNB<3]">"<7\QM;]V5nL]/NC99n-r6([&)=o!lh7*l"JFmqUl(].Eu53on7@D?g^A2VY05/$f/m6:O>NM'D0J\E$#8OkP,tI42=;b<=u[_b*\J4tE5P][hk<bre+,S7@6V7?rmAd6N)`m=O=BFmZS71L)Z!;]CX1Ak&WOS^U*Z%&;e>"^:uhlNEbadoCE0))5'XeYUu`/2hCocrUcFWW&J:a=)bPK56mP"MLBB5EOASg@p]19",sV=,Xkb-pU'=VifI"g$/M%hVr9io=/Yb@@PGbNmCL8(%%A1($2W;+jE`YlF2Mj3X9t'gsLC+d'VU(pVS.4_R#s2H!>+o&Y=luaDe>kRkM>+B34RKYpVOCmkPssB'<'[";FZ;f]F;.J'(,8n7B1br.H%MlL,QJKnV?o$`TD($Y&tpg)2pW\9b$D8<3E+T6;9[S7-T7>P8m-G"W^84lU7dC]eu'A7'?GmiR8nS4()3ao9Gi6HPfbXOqUcu>mRKkQds9+S>1Z=!Hr8+YA\Vu7cfiBgUjUZQ`tJ*,7Gj?d+5Wr;K\Z#*mhBij?E;;HjrM1)g@8`V)s6o$NG;cFU@8Gjg'\.WE5,BGK@&fpf"=$`_Hq6s%PQ9/1Nope>-N]gDc.>'Lo;^I'6Q6#4t7a5abGlr[)Iu+dIqdN'LoXFK]bAUH8(sN=I.OO*P*q:fJ@U(M1u8s1MAipE7u+beBX?*+=/g[hmm&26/ftr1&LK.\S1j/M`o"V64H.1*W=!8$.h%S`4TjS*;iR7E<<1$8e;'GXBK^0Gl5Z1rpk_'St&rl5OZMb#[+8m#pQk*XXi?_+T2mtWtVUFJ*NQh-&3NOj4tMI=3_hmBY0@f)r9ZE`c0Ihd:]]3nNs2]m-6!i>VA0:FEX^_UX)9&.J6Q5(ThPt20Brk5ktUjE"XXMCjfoJ<aGEeXrDL,VaJo+Q<*-lK\kOD`t5]8c$6V.(Z0bJ(I>7^pYpg5@Ri^3Rqjp8G;l/Q.j&23@n(@)hO*,U3^H!p-JLGecEDoT'T^l4@EXK!.u/RS$/Gma[%=V2GZV]Jelkoh#"_.*$1::@lio%.VtX`NE-h(.bH,p_~>endstream | 2141 | Gb!#\D/\/u%/q:js+)RPfEjZ/P4drPrK(S":`pU\g/p'P5]E#aOW*KFkY?-rmmiu1f=4kPWE9cUZ"+otHUp=jScpJ?>5E0)"8k?6Me`\O)^[:ANo@e7#!PdW:S(<WX@CbO^is)%$q:9#3Bd3"[cDF*k"I3Fh6N37SsW]gHoO8TL"=D$&\oY^""j_P5G70YkXRai<%)'F*icidjA4>,n?77ap=gHY^;Ar9qs`2F2]U;NO*/>I<dshuIbaTb!DsG03>[RPZk+?[R>Qd3Zbp\5Y2OJ[7O?FV;+OfdiVidIGU(fG\jk\YiYm\4%(sA:4t1s_#-PX_j(W/(6S`6KADlH.^^;<E9?3]4nl\hiN(o9_SJkBX1+kjs]=>9gl$cr,<Q961Gj0snmDemD5P4[;r[MDUU2e*_#el(Wc&seA"AD3+dlblW#qA5+U]HgTSV:#EK<WEPXCOZ!L]J_sVUJ.W3EZ.5a%)Mp.KN]5*;DHm15Iqh<J`&&!A)EO3V643n1n!;KY.P0=lcN/`_)315^S'F>Y&*&U6l_D@\l;%O/OI#R!?FH/4OMCY6;kKdXE(GH]grTQXgkU`&Cp*p<7KN;\VMC<r/<0_S)-t[3A#tJZCNKB,T;n`sLp"B6RubEnm'*B^1]-(U,;;#ap38DX1%dW`#-K`1M<Ub]:C$%2NA/LFJF$#RP,URFa,8J;n09/M5bn5FsV@<p4`cICN<`h`dVe^L+%6pAnMm^L@s"G/O!6Vp0j-@*U/0K_ti^*;auhm%1Fd46Z/ff>I\KWMoE^"T`E6((P:r'QeSM"9)+Hb`L)3XKIq8As,on/07X,do/nO350H]Ag!:uN;[Sl:W#%`5%9MQJjTYjYu7TiVS1\B:&.Z.k(qcLPj%EAQb=N/*PXc/-_sX=;([kim[HbDU"Nj(eHfu`<@on,mTX?-*RjAZ&Sti'M]"1u@a*A2%#0?-()k#_Dfp<S/m0LE$Gi'F,$<+q9hY-;:]+Z%kN@otW0LbFY'58^,/J@1O^iNYr[oA:O>/AmKj0[W.O"qmf5$)Zp0P_M?,L.)*Ra-a(0#qRF]*k?L4nrTNfOSm@0LacYQp)Lru,qn-IbttgM>Wpe)=3f0H`[oc`sHt^H-\>5>G_E/gp"R_j#4nT>F*5Iq`WGq#X5&*'[?3\MAd$!q,NVVnTo1]O?"oK)SPU)mt3]9!d,EDRMQ/fB.Y+c,NM-0@WOWcY8'rb%aD+knBVL,1#aiWjmUfD*DHBJ;qB-.5G4j<`h++.]I@u+fUIS9lR6_0:?4h+@J\2WE>XiKV#D%*aa.40U/-e]S?tn,VaH^f?&VN/?%`6BkH%g/L1N;d[ZQlW:i['1A/L3=LqCgit/00;90,%J1K3>hlS+[7nksGQ%i_[CQ!j'E]P6PE*0^JHi-`K!RQK2(Kn]"!Q6F!n-9=ckSNfBfiF`rn.dl6(:?`9,8ANQ%IW9k*AEY>K3iRj$_9huLPoaX>&;_(C:&h:HM($ZF<a%$lGkrG3,DZ!6j'tpSOOd"d'T*BC"&M7`?\=G]*5!/=bXt$'_;EO5#[BnCD<a\D'!OEl"Pftp&2h9^bf]`4X*5WAO;DQqVIoP>_`EcBJ?3)p!a$=@840)Y-.^H[9mp'Fnej7I\H(kBnd)7+0?DlH>fL.*a(m[^=OA4F;Zn^P.N?hk$%)RIi^M?p7\4!_2!i&^'2!4GMjDEI2i+3W3/CmMq(2mEl4bnH2@n3o,&-AKNhEjZ.cH'A)t2W[Z7IgKMm2PLE(Zn;Bfl!<kU!'fc:<2?YaE5AMDuHAI$jsH2=s8>Id1^3+))i)GX*-"Xd/VU&~>endstream |
810 | 2142 | endobj | 2142 | endobj |
811 | 2143 | % 'R166': class PDFStream | 2143 | % 'R166': class PDFStream |
812 | 2144 | 166 0 obj | 2144 | 166 0 obj |
813 | 2145 | % page stream | 2145 | % page stream |
814 | 2146 | << /Filter [ /ASCII85Decode | 2146 | << /Filter [ /ASCII85Decode |
815 | 2147 | /FlateDecode ] | 2147 | /FlateDecode ] |
817 | 2148 | /Length 2416 >> | 2148 | /Length 2211 >> |
818 | 2149 | stream | 2149 | stream |
820 | 2150 | Gatm<CQI5[(&^>3r.g1Z$@<Op`U\?kBRk1_Z^Yf8U`$Z;&.]P`6s5Hp;B_krm]Z)iP[BlGlg;mr[O%'&LPP','N,bIU&U'lU;'IfeP/SCO/<5;K4$snp[iWTIeNI4/DQ1):M;j1#2RDO"EVl7rqsUT`7S=ZV2RVE/'cJPI]-PBT>=pF>9fN^1rfYbR]u_s?b`N4FXEWR\)5AEUD(%c#q,+9QSeY-di\MQs*OfScjb<!!XL/8"QLh\2rla%8BYgDnp;g./7\N'X]%\fBunH&ZC3Q18k13O='DF:/pJFHD\rmhN$H2H//)4.Z<j*<bh>g(8V`gp8jMd*.JS75H%`i7)iRN\efR%DhR/J(P+/kI0&`3Z+Gu-6E`hQS'm]n0<C17H8kOcZN_haI)?uBAQJ4'\RK'?>Qnrpa8S$"SOrI-4dl%/qj=l'0/;P^N'gPXF;-LfYPE$9@iDXI[)/k)cZ'7c")N@L9NMF&e(r3dm86aUj-B"_fe2WM'DDVbtpP,S'GN7XYC<R<j#@T+j)OW-Xbp,D[:a[5s.H/H?#j[OHGD@F.qC#MC&T!u?ZX.mffUpQZL?i]mg_8+2H:J8+NaFKo^QbII=2!(*IS<TM9pRLc3W.3lI,fma)l8@$<:Bri3t?=HToD4pN5JMB&+]$LK),m$*:ra)DC.o`N+WNfg/]!/QC4*FR@4@,&sFh$<K^_YeP0s<Tq.[_b2b]&&!?L1qa:;X[#B=kT_Bj#^WNWcJeF)C!(/7eM?9Sq-s[Xge=t5SDk%HO*oZXTbaZs6/X:Kk=cl@:<<<&5<a]nT]3Xl":i!3LZnaOW5pZ\40sV&.V33UpNCkat2o[f/kLm@L3uh?fdo>;)4<&*FaYS/7"oV)paM`+_PQH/d'NH=@o3![sd*1*hqI[])EO*)V!,7kte"02^Z>/>SQ_q<4pi0]U0[?XX(1(a^b%(pJ-@#kYQ;1T!j'"\m[</RZ*OoB-^FuRAB*j?@\Id*4(k#QXER*9cDB2o[\4et02$a:'J%;N#A9)\6,7!_ZP@OO>O_`P!L11fr\^[GlfB2:/Qd<PdO'aT41HTTAcYlsYZSj=T_iO,FpkIei'42a>VVf-L*>H!iH\4i1nQJ^b9mL't:gTAmW!U'JLFg+ce65m@F^0!pe#:\3k9\1D=cN`)-mI?<W2fgi,#_,CK;qoq0Alup8kOM>2k\ml<i4"^Dr\aQ2.ED(qp<uMX4?m84"(TJ@`*s9\%M.qEYEb#WJ(<I(nu7Idrda!VhRk3Vt4$I<FN*t?`7&;@R'OTg2D-N:k3SET9n5p:tdB#>_J5=74CGhQ"mik&8o`<`sV?/X?5:<>ubj>G)0EJ=oqEO:q(*M_P8t48u:8E::P-!`=qaM,KN*=,#(u]lH7(3oiMZ]n$r)G"8SGR6%^ouRO2@UIXNWqWeI+:R9#),LY]QaL)m)\^%8Tqj)362d!"'th<rZf6c5dp5AY!%Un-'W7eQ`ATuk?gX#G:>#%>tn?%[CjgMZ?NM:(EL6n[e4\*?3KR+qB7T\GOF-aN6^#B$oiOF9&"$#71K]dM+e:930;jhT#alZ\is/ttmK%G>\l`[>nIe%<M4?(8tdC%3uA4>3<#H,N5HnDgZ+MQQc%C1#I)EPbj8LfDT7_?G"0[.X+XG<b!CpA\k2hmqetGA"t="W0R[q3[GbLU2/F8\]9,V#%^O5CVn,As`8#r!6;&CGr4_j)KmY_:pp#9No>)boA)1.5s5qV9iQ`#t1/bgEhNc-E"7Yo&oVUn%H7!2auFPf4b1sar=-di#IeQ:3lfp',A?#>pDfN&92lF\:50Gi*8XXi^1?Km/"3+r>So%IALF5C@FLZDp]lr;PE5W;he&qkH52qbNd7#?'$jb=2'j=D7W`A,`9;(C"YJN($[^<!r*Z8oUI^f6tV'3<siWgBXo"4S;d`jQ)<1rY*+GtaYqB5RQ`NI)FW4J+gai2]W]b0^TK*La?]1GTs'lT:[JTiOjU=2AVH]+We4TQj/B7!\$5I]'+Ph.5K7<3ImT&,/Ub0k=&I[*`J''(qI),+iG?L;nL!ifI^)h\h%'ecR<DpCBI!eX28l^;]2*WujccjJ"50"JmNUej._2j1*"Qs:Ts^k5TtYMJMu0R)+O_-'g&cU'o6^mMg>M3fAQcn`l5&gb3%rl2s%k98b18i^"[1rE_JoP3&CI<CD^+JtKH13Jnp?J7NL(:J9/,7"EX>gteSQqKB0hbW.URSIg+kpc&n>Up7G(Z,%?!;2nO-^;H<dZXqh4B$ooPikb5"eK_p#9bBNUanmuK<4riL,]n]8H[mVUhf+1U^J8)pYN3YoPQOet)B^DCs;oAL^<PR3!Op('k>bT7mc?&aT6VN"(FbO9RUR:rB+NTb]Mbo;id>qZ!@Z+%*NQdKY[Xkk<37O)fFHstk1^oc9tEc9EKIeI,A&rkf~>endstream | 2150 | Gau0Dmr-r=&H*Xms2-"q@&G\X99sF+6T]C,ZN^]^Y4^?VFYV5UA[.OmQ)*F9^Y^'rT1NP/JX7-<A;bY-O7+.Y'LEW9L$j.G#P_d3c`]\A,8fMR`^($.>Bi4j5PonY(9['G-8=f\K5P^pi0s8D?Tr.p.m7Oro'?J-m/3sNDUm5-1CUd"(FB\=0UcL++XE9pU$GorJ)n&h&f=_g/=9UC%LZ\QGAX!P/E7W/>0Wbhl;#]+=u'Tt#qfZY%7\Y`aM/eSN4VAt/C*YfAq(n7`cFtaX_O>`P)nA.*+/\k0`U(rl:F*,_]\e);klYr==?<gKEN%of,UlDKdP(bI3)esE0GpWV%ds]`n4$d`^(0bV+PCA@\snRk\7g`NTKaA=I2=<,tp;&bt@o:JkTjL>,@S#J[1Yh+Uk7`I$GCF%P7bPDm!&9/R'jS-AJ=O0?^2Mm'ER6NA,MkAU1<YP5hbB:$KRM4%S?EDf;J+['qMr<[]uJO"+AH#TL6uE#$<h.u,i7Khn>lF"XR^!lcFgl1jg'N.)`T:.g<#p3gf8#`XquS2^!Mp7B4?UN4+(+=q8]jNT$MQQ<'")Nbbg@R=['e9?cQ9su5+NbksE2R<;;'noL*e=Cth1I0LO$V)]$f`XSH"j8S35)G#nneJN=&\.2@6tp;V=-/RoLPkCl&2^PS)fq+Ur`+!U%=Ck[$*XC)oOk-MDq70<ZZ=(YiI1&?]c]>+SmTSk:LH%M$UQ$T?6WIp6<`jm%1SL4>0*(BL[2Z=G_3%]aqN\DM&j!XYc^i3B&#;WbW?*0bdd(#fpO2[pVSAOl4)tWcWIf&E/`+;JqOa?NtOtU&P]-oG^(11SBbO81YVVKWRQkBO\bEtFE['OC_?O`Xfc089U\Qq4o29K'B5km9P,f\!::_MaiUK?4.m\6TWBa>$n_2RI`iTM>PjJg$/_u[h,@Lk09N_.lt[ng0uX^$WA`,\:?hGT^m&;3=L8Q#o=1UIjpnkk9HVT'm5lPeaj>5,F.f5mM2.uk#M.ukjjn&l0^Acp=Od\b"0-AhAj_EnrN"t<"mb1\nm3iLd:RfEU5O;RD2A>dPSJt]9FE2FUpf':0P@+rU,%0aUY?p#U[:&/4e[cs,WT,E?oko4_cAQk*a`-346?0q]7I&fIsbu.n$X3[]>n!jj-oSJ$jE(LWZDK<D$6#U^:G4TJ>$CmNjX8%Y[5aB^)S'@ooYI1;iG_'c?dCtPZ&SDqg&A,Yn!FXT`3l&DLX-)p#>IcSMr"?\?cl`RJVVY<J22J/Z?Lf."R\=CedZDP\MVd?5RNFI_SBLO+;mN9)nfM_*O^_XC4J#o1E_$Z:RlM8RV'r10'0:YY4ch3a++KcW+#4r#Ue%80X9u["IH'.Gu4"/(Y)i;pf-cd&a7/PR\DNWo0'91[()9f[dYr**u:N;6r"kd\p:XVGLG!n4kQs`D*8iT8c-P,,R2$B.[(SKh!k?nZI?jn_C(rPe1>q!S':9pQJ/+Rk;t+H90s/+:S78_G/nd:^Z-8-4W01BeQA&d7fk5qeADOEG+fNMF_UCFrR@@WiW*sh^;-c_*<+[=3;@GZdDIH"V/ue;rnNuBA<d[AuHK>i=]dcf)!C/](pbG4kr[]aO=9S'k@)W7b]q@e%Tt/A'Ji;!A9KgAE1WtD=ch_W?NRgaJ1otoE0=P%8Q-M`(j@Z-_Er%j#/?-`K08V0DtV3rbS;U8I3a`E%EkT'L2R$.`Z/Dd6`EHQ$#.4WJ\d%j:XsD%%_cL1U*"?OB-YGh-ob@C>>dTQ?!thCL=LdV3oY7U6u]U^S'8,_7A?X)luOL<L<>!bE%]tQ/$2HZ&P%2gHW$n)m6T'^GPgUH,l7%k?Ybt,7>*jAA</oY6:eu[`doAHE'RDl21*Vel8O7TsbKDnIn=$`_U<W,Zn?M#T$dB&8=F;@[!g+3+->i,\I2GMCgomVG1?Y;&ckpQHg%9MG?+L!NiB/@Q7DX/`</1(.t/CJ,:JNLgGY.bVq-Y7??+Uq1`\ZGY%i!nPFg"#kgWuI/.eaX*"e5]2YmBHjRDlTCk9"k\b16r<5FQ_"sq3?T2=KL?\/^H"*$5OXR?8GYcXkmKVItQ$Y[NK<XZJO%8N&j#`M^N*pn<)KN'0g)o-JHHRZ)lGF&hB0#6MVL)t<cK[BHK<%:fYTIBD32SSI<Ad-Nh[LcXk0U<#6U0i>dEk<cI9+4_]j+EdSiNI+g(er2".^-GEpo^\r9QYKm&]I~>endstream |
821 | 2151 | endobj | 2151 | endobj |
822 | 2152 | % 'R167': class PDFStream | 2152 | % 'R167': class PDFStream |
823 | 2153 | 167 0 obj | 2153 | 167 0 obj |
824 | 2154 | % page stream | 2154 | % page stream |
825 | 2155 | << /Filter [ /ASCII85Decode | 2155 | << /Filter [ /ASCII85Decode |
826 | 2156 | /FlateDecode ] | 2156 | /FlateDecode ] |
828 | 2157 | /Length 2097 >> | 2157 | /Length 2372 >> |
829 | 2158 | stream | 2158 | stream |
831 | 2159 | Gau0DCN%rc'`B'qs5AF[ljg%2q4/!Ecu$l?+PX3P6T<N65YI?\L*AL<MOXS@*E%b:WT,gLQ3;bTo%n_<mZWO-Mr-Ml:C<ibVY&k)VRT.FN8d-95gsd8R3!FIF*J6THcHd<%u6_DjCeU__h5-F%*u:0QubC'@"o[CFMh.c3';`.G\*X+TkON06^i8u'E@lug*t?]WD35dPet]!r\5U?`IrUh;O9n<C#seP"g=QTLk"s5<MEEc(<<Q"AWt^3fun"brBShM!o2[N,9FhaLEhg,?t)rB*cGP;%FLnlQCOh_iTu_03!1aROlRcjEbWX]/E)nJ_BubA<&3KM6n[Ye$"G"?XPSF/]q#JmpP1>T(JH4sZ.@AI3ccPt0e)dYVqs1%;p);eS1@7d5SnM>MAm1gQGVe>G&B,AmF*'7+opUPKaMETCr=C.6=>JJ/i^YI7E$&?3AHdsA\!)XjB<i,\Li(N16DPK>igKQKq-8=2T"R0Xb#22=#))(j>G1B,s^i,Ae(-&:qUDbT2)GAW2Ljmd5ZcT-+DO.<YfR\f`2E#aMf?YG$R.+#j\lkkY/0q!:U1tTPH/aP(E$n"l-pkX_hea&[j1A*;Ys\"_EsM*!gOa$5:4EK_$a77LmlG:]g1-f0muCJ3]pj+5PYOL+Nb8i*(WG93QrAU;BJXk)[$3jEk/M!R"&p^eC82U>Z_ANi:GO-k[t9agGKhHF9/,Xe.R^jK1<qD+2tC7au1[ia^c74^/6,He7Z[jWMor+&VX?Q@8f41G-QB/B#"K`&fR;bhD#dZHh0RDH2n7:X"(Me+(C+13MOHo-TNtD0W%>PAK*<@c")Kc`CO@`G)O/gb*\P8U_&aV^P"_KGu?-WYJ$pdEYqc"4%PJ54&ssZ_WDU.#>Kg65W6@8r6Qt!`jZ7rmDMo7Zl+l?OT7*Aft0O#g`>moBR./.:a2I?W(KX6+]lD$NFBc:POnoGFlU(E!$%8oM'sRe3'j]G:+I7SFfCR^XM@N/R1JTg\V?RYWq>F*`:!sXP`SCU(rQF"814_T>mh0p`K[/rBRs3239JL9df"3@rlT'De6ulO8gI%=%FdI$Lrm$RNP=miju/%KMbF+a!]Y"C8+=jhg7#TnYjo`dK!]JBnthonhK+"a"V9FFqJ-gprr_%(rbe\rpm;`N>DSB[.s@3bb@j?7JrpbTc`bCW;CQD7SfOIM(T//!B"<:QM7Z4Ij?Q)\C93SbF-['b<6XB7qdr\_ZcuJcF6'Z6c0.G](2sCUK!URi+%QlPe/H;Y.NHS1e"+fL2Y4$(CDGNIZ+Ss$`]^2M2tS"*akWIB2JumDQgd:XeF"n)g&c/0m'VMh#C#Nmq9s)gXu5R<aXW]G?\M:"_^YTk_pRZ1h_g@iERrIIeJQ4rtBnlnpAQ*DpWu53M0"5aNQ?2fT;@m7E<()aH+<SGB01W&g7oRL.F&S<CYYRjL49moiNc-a6OS4C8s_-&nE4ZFZ#L*dG(?NQ&7)S<[a8V0JcXsa'bHU.:H:]Uijp1k$h3`GX\q1a]8^;?n8C)6_LV7.7["39_rgTaZ3]6V)F*I`'9!/V?2#G;7IOKHE`-S>B4%G_L@b$7t*,s1!bCMHAe-g)2"lY7nN"YaT9M>,%LeQ+<QuQa!:c\;$7$/$USr>I!<s1Nh6%B>1<3rWm.W91<8ejqfpb?Gh+&)8%m49qrimB'k6UWT?g)1Y,oK7n]%OM.Y$%Q\;5f(N8k]:I%VWhKYlRtGC.ATc8Ug6H;.bqGFNsbpYf=WPi#q]lhaJR^MiiEn;2nmb'jdIotI[)oFih$.TZ8,hB+tpepN5,Vmu'C3;ouJ?J"rJO*VIZ8%gtj&8Z<(\8C[nhOQe!A;7-ZHDW<^bO)C%WMoGbOg(78r-2s+*bA$dj&79V^Q4hY^7Rm7UF2eUEb>4q)eI<6a[4'q=Q'^I'UKfKWD`RO%sq05-U(NPM!A<lrg#SG-f>D3Fd->tb)a.r#n$.^qJ]_b-eGtU,I_)tgnXDe;'"Dqg&=->0@&7@?=05]\sIDh8U9VSYou9o%6@"SiFlH9eeJAEBoYr/aVJ)Q<,FXuV$\+b[!Ui+WVK<;Rk7jX8_b2C_AtC6\U[0)@;[*S%M/O@gR"`9~>endstream | 2159 | Gatm<CN%re(B#9ss5@E&$bHL2NGQXY$;;8h9Y6d^m%W6\[oh-G5tdH]7Nu-$Wg!8OF"ScnOn3=?o\kQN?Cq$Rk?^3H6i;q]CJkfDI7c0M`YA/]RSc2+L,;&k2q.`=YPWZdoB^]gj.iC5E,n(WRf0q7^9]RN[M7TAoUW3qJ+#'RC)?bo0Gna%LaFr1Z,%#Hf`$Q=T2R\6)(hXKc%Z+p;P1R(G@bUEUWdEODc+[Rdg,Q$S@s1?Ju2mgqK"ppT3Yj"d;_#=;.)*uMPGW[D;</)?M_fZ7tM*04;f7nY*V/N!mlbe6Z/nJV7@j#gbj@EB'E;%XJ@\$[`)mA,dLOIk5S`(T@^8RmlK;#V^r2(ku$Wn<)uSKO7D2q`HlB'pLt<^p?;4n7I)D2Slo!TPtPV8+m.0-c/umb-rDE`duc-U(B%=8`2)trm+8_Vr4Q/#?:o-9ZE[p$!YLUh:+J8AcFWBpKB(*Goe3-P4q9W[(HX8,&ZVieRoQ6R36'_Bc,hC>X_";g*#ARN1s"FJcsIIn.rkBHAEhf&N=S%,r-ImPGs-N1/,-TU$ElY>YJ$HKPPif8+!*oM-WKjZ_bPWP3V'^II;:l`$Ejc1//"cDD\'bL+%=([NPq[Ac<OE.P>r]jL%9!oW2\>mnP,r+'Yn35)NH2mkQru$#Q9"d'EA`4$q*]@R-)/?V9mX^Z;i&RqqgRU^]0@,h=F7:OK@X]q;4.Z[9'(NY,O,;')H5)-a5q#j.4t$j9uYG4KTm*7X$sdSH]hWZ;nLej`A_==\;D0V!_.W*l4B<!j"4^2NL[8'a:b/ATPK+175[iS)ZZ*C=?F>/#WhmL]^^24o=>X:q2%<&d..26fKpg#.-<@;i/oI.pp-ARX_PgL1QXX\-1,.LUaIf=<=8MV-hU_i"8LMAX2=.;ar^KoA-6_:<a/g"eW-I=QOC%W\W"#VD>h"n0uu!h.X@%b.4m\ju%<2P!"-8'gB-2d_A`m%P]o-VbHounZYY(?(6]el5KeZ"YaBm$"p>A^c+ZQZ]G/>m]KMdZn/&00@BntR`sYAQ8@FO3mI=oW^Z?t(&We?6<BLa^;1o"'%d8%jUPh>-Bo/)68,iBQ^(<n-+ngcV6Cq'N>b*=,YD--Mhk7nMClfEelrnKou%5`CE%6/(@75"\AXJ*S!E"Cf9+`79Zu/F>X]0eH8PEef)D?%E:-q&;i7W:NS*#-4aLKY\e[F(V,R2+dWnN?#*?p(bT_%VGc(b:e3%is^q#`iOs:=h:":#1!Y-K=2&XN>%%!Z3JLN!V>>Hs3q+^?UgMW3@=ULuc=i!j-=RHZd93*h0SOJuFNX87.8<ArKoKmTcL#R9dgaV/H4;@i^^gKJ_s-WFO/7R:RVN_(a(R8+D"%ZS;_I*n;gcuA\geoIK;b9[o%r<3GU0+'ipq1]+d"]#!K+s]n&tn@r1R)&p*[,:b*D4$U<3HU7_Yes%8KLe%Aqr5p(LY(=*$l*\on_e`H3'N"FU\?(5RL1*b>'2lmRl)?abf;i6\C88<@R(7(DJp2CnM3$3P>p>SHOFCn<$;p9MO8,cmA`9OBu71.A&nS9$(Qa4*X>t7TLrOls^o*1N%)ul.3+-(e;po'b%'@DUrrU.(_d<H?T7#Clr3#)B@Tu`.%OsL95(?^$&>b]j?&*nXVb[&+'qslk&'b_k!mr+-3k3rOO4#""%VBAidYR$`4E%T5,KHG<7,fC*$BDR2%W,q6o0Cgau6XH!prpD%u$HG09].^K)=EUH>mC=.,c?R<D0YK+Vd$8^\u/GK%5*jI$0T+R8=As3\[r8@:?+(5'E<%)LIC2sT>Cr-B%8'PeJf?L8dD[U(n*!oBM"rBfsaJeTC8pc"k<)dK0#dl)FE`oCb'bi>QZk>Ere96T-$6J`doShs4!1J;10K%TRgi,F4H#=]a^!h>$si']bTT%`h:G\V*8a2]cdr1Nre&:\'n_UK1_%k<Ic0m$HbWpUL#Mh2e<o%25V$n;,@US&s[I52I>)is.TjslKd`\?_EDUH?5n=BMB*^As^N>jMNKJ=J6"]JGr?qp2!B59+F\VBr7Y+t/D]&=o2MD*>0=grW,.cY$ads1M[;&T&%]>pX%AeU25VSNkuA$:_XF,%ib5srO[fYWaShb.%CDgXOC8Gc,Yg[96Ji`&_mN5@O)L0:rK@+:AJ<3B%(f-uac(heLSR.]5$PoJBl)@lStE..!Wromn;01k?$p!^t,]iJLQBl;O1Nu-05m]kGlP0m[>G8JPAQG\c="8(UBj'dH9e)?9KNr-nIUE7KfpO*ULF"sSVG@tS%),?_.hbDQY<Y,)Fk]h2+C>3D.)nB_/a%4Ej2i[$IkI=hudSV+RFW;qif*_B$g8dGpUX9A?H5*B^q[OBUGeE&nmI0u[k<0,s~>endstream |
832 | 2160 | endobj | 2160 | endobj |
833 | 2161 | % 'R168': class PDFStream | 2161 | % 'R168': class PDFStream |
834 | 2162 | 168 0 obj | 2162 | 168 0 obj |
835 | 2163 | % page stream | 2163 | % page stream |
836 | 2164 | << /Filter [ /ASCII85Decode | 2164 | << /Filter [ /ASCII85Decode |
837 | 2165 | /FlateDecode ] | 2165 | /FlateDecode ] |
839 | 2166 | /Length 1896 >> | 2166 | /Length 1841 >> |
840 | 2167 | stream | 2167 | stream |
842 | 2168 | Gb!#]D/Yn7&H3_"s'\mk<)P`p?u0eYHq9_bbphr>'&WB"EO$?^bgsSXh8QPolYgrdgq%?=#9d@daTfC>qs6,Fo7d?qr--@t>QDF*^tDos*#BqN31fNRj9FI7NfQ@E+$&YlIK9@dB_R.!J9-a3I_-=Oje<kidH$T!EdZ@q6cJEe#R*E9ErrQJQk[&^%tS%0d.]J,OfHQ*OOdtOMM'&"j?+d""JUF03!6-N4GQmtJq@HWhM`1KeY9uZ;">5sS3ULKnsZ/cj<I?)(uToCJDKPGmSgCb2pd?7ckDj7Rd93LB\e=h06aVe%W/C2h?8gR+k_H^p)4JOHV>pI!`WIe'Q/(]Er,L.;`\Mi?&71nP/SoX?G)XYpTZLEK;WJf=`FL[T0M;r<R()&gI6]2(b^_2IKV<S.1((,>&o`*&[T'A,sGHePlY5g+]q'B1K(BON?]54"*3]/!>Q=Z7h^k1aFX[$,iZ4`R$Td:i_$K]&O+Q60U;u!.J7BPA0kE!)/kJ_i[H!GR\mjE:m=WDS1d0/1hQ!0Pr%44=4tUWolf]XClS]q\$:>gICH43=qX7mBOr+Qq0QGr]o)K7Vq]e_jrR\PLP3];D+$12N^4d^iQ5sSK7P%bc,b#nB(V67&m@t9^1B<QO8`iH-dK4pf6Ke"g2E^k*b:M[1,R*.J\.sa:pJ>'?X'j&#Ur*I!Bpce8bei-aP#tRDW`_=HQDuUAFA=<m.udiMX'gV3uS=`0&:,FZBW`>*e8'e-=3@!V^1+>6&*,*Z--ZH`J'b0a]T<]HeB6rT5Ms1T;nU:+pZcFJpbh$MT"cmj-S[/0JR5Qb'/P<SPObK29#`a@TJ&Xada7i%ab)_4OMZOLI[YR,BI#kqE<nQ%s)Z.*6_3n7;P2YT9e8W_6@EnbiCqc1g*g8Zkg?S<9Krd;P0OUKYiq$1jQgaV+Y]QTY06^@qU_4n63d&:j_^pVq^k9H[CkZ:.qp57icn]^ctO*AoVl$VpqEpHFW7ZJeH$kbS+_8<)<Ogd)$9M=.\IM$6FLIp,hup]V=L%'9"BgP9;DN<M;F!*^/CNarkZ8FOmQc)>P;"jt0JO<`6KIN7uV%d/=^-jMAY#fIn1U:s.,.V$FELomh,]`k9@"fCsXFEX/0/*h'B0='p:HLS0CPo3Z]#J?hIn8+q+YlF/0M&*IgKXeq)5HI@psa"9p"mL@A4>Ej\#af,DK9NB*n[%s</<a_jn\W73?Dio5d)aWs!+#f]kVJfkboK9%K3cE^Y3Tp!4P+h;;6"Y!Z'$iME]4h;Ye]$2eirtQa<E#lCY\=VY8l[Ojc?-7AjD7lF`9(NP7YG5j:?C.F<`Q2!j<#$UGq,dqd,\00I9NaPp,/3U@J<_T?H[^"[A7N-CI"/&0IY4f#d#W&B5$taN)3UaIJ-[E(.LLp.pe^%g\]OuPE_N5LK9@?a?7t`!Mc+?7a<c!EMfd%S72u!Ni0J7Ve=I6OkU"59WnUS-Wlj(:0+s^6Ll!1\C!X[18=m].uIFAh9$m;;*&(-gFTo:K!5Wrl\$p\:0GOc]"=NmN*7K^4,nI5[DU_s67ELM4Sm]_npokRj0_Di+$\,U8I7,no7dc,IQ:5OAcq$Yh)]`NmJc/ECZ?UJ2mbl/h!m(iY"a$Y>3P\FFaaN,OdO^W-98t9mIc7Xo6q3K\u;3kp\47B[)aO8kOESHTU9>3[4^Pe<*W$2iL.Q7G"uZ9$^u%@JY!?(JhTbB1g>;O"Q.+7^I:V;(q]N,=CJDt?1&pl0\N9eqL=G9c6)BFRs,\OUs-KhE$*qEHiq60_&okM-j[f'UKS$a,_Cs/CUg,g3gF`t$1uJYch6YpBK4_3+cMAM6oHAJ+R>uRqj*>L=a@-l!f!)b\A"*4I[7nMelltLfV=Sn[[:'4FWYPSs)-;)I.SLa[G@P~>endstream | 2168 | Gb!#\D,91]&H7^.J!_m+!j[3Yo4D0G&fbkeU3H6cg.G(n2YK2b_d<4`fAY.bhjM^s"Gi7Dr_O/gZ$0e$5Po]fM*5P2Y@g);']=?=n#eeBHl0f[FkdH8DW#PSGjt+i^g!o-#LMp_h,\J-@*ITG&%@G:R7`l%4M#*]*?MTS;DgX#^kBlj0*!q]6&HER&5[q.rkF$Hh[S.UT](jn1Mlskpi?RjY:qrE`IEA;^XI6%II"@Cjh'j?,9B4>V('l=,0[9jLIXRoQLD6YDPtA=#JgTGm\m>o1Z>!d&onC!QiTD4C'KCQ3b173jrf5s#S]4OP4JsuFcdMK(]oQ@`a*%l%PjE,iY<Eu5a3"YKS(s2>g#Z379$Jos5b\aX*OL\CTSmkdnE0<(/%/,>R3-</;?(H+q2$5@`fJiK#o.p1,GtoF<;2WiaX,XhV'H!VL[^/?m6pL!XDgA@@YVG8-.k8F(p9k.VPDp`=.J5"*AjKQPEu!r;HNeCO=cCcH$;2_kU6-L$4hk>Fg6gdK'SBp_T)I?fZ0L9`beKJ@?X\0>lZ_SaX2(=uAOBn$<GuYSf15[`Q8<l0\N#H%_^aa;_G"Pe'-)rUnnSA;/,5"%'1LokU61A-gH]Thsc0%h/gSocbZa?/'8N(ukJh/N(i37lZ"D\(s51bL6<$]Wu_[<V2'c\r0W-T!";j\=Bb/CTh&U=^8orjeTB!rHld!gHOQQboEXtUTIbhp%B3Zk(\A"+_\L$plWeCMmkf-W0Ms:aQQga1,I=qAh9LCNZ=a&OmphN._$-JOdoa_7.Y9FFFnt4ZVY_?_?jT_D!VJ7Osa?M<KHPGJL<7p'5WcA**(n"GsW-VpIQ,E-cfF66RUm(R@L^o'%F$A/N46Znf0)$!&SM*%*V#jJ]X!7D-6Q5Z!o-e,EcTOFu_8pa@noo3t"uQ'YGE4Vs^E$-PS1gc'tiJq>L8'^R7%"_a;bL-MHREk3NE>ZO0BgUG98-LZGl;f6Skd@rBTAG^:N"S<Cq5&!,IIBa:b4S]D0s%&*8Z,SB8b64>'%$nYP^Z4tBB4n.-7VU1R+EKP9uB-)bp5_d9PM$P1q]2Ht^M^tZ#VWeKiV7Ej[BS<N<AI9I3#cAZr!f>;C.qs)?`S;J:,smDW#Zm31P,Mi+N_a79#3:VSqSOr)]IZX[8"dC@iYd#2p+3Zf4l)-&c=X7aF)/`(rFM9j\7C>p@<4bs:HrE2CEID;]fQ&SYURtWAte$=7SGA7p!Xn0)b.Gkak=\TFiq`%Jh0r$d,>]toM=,3[W:A/)#g!bq8a$12_l$O-<uKW`]E?;+3u)Hhg)M(ZUJP?NXP?S@_%5#fp'1^]e445m8aCOY`61T]4]`fLWr[.n"_3.Uk2h'bZQ)X/C9D0JZKne4@"V@/1dD9I_UIt-tPiCH)Aga^PNd:Rp4S0<U^%^5?301Jd3]:6%?sRr1[jWE.4d&#:A.>7X<ZH,sME"'fZ^lN335S-Mu<>32#`@&HNQtiK9sWA6ssU^P*Zm0R";QcMY%!bkBlgWQ:&8"?!YuU$qcc_(<WF5#^WNRoB4h7+TC%,;_O:7[)GBf@c=f5#>QEW4CS*03Ou8^8kSQ::jhZqGK!#_Pnq&s.mZ;9Ae?X,'7f8"@po(DD%!?:iUe5'kS&e'?["!"r4Sq]^i_\s.MfPS<0iL^%qksj]pZ;_73!],(rBaV8Q5@eC[5_clmQ#M5DUtloX\pGV/e&gg@brIo`N:6Qc-0lGmqi0:XB[%3*.:m59:M0iqV_qgrJ.*P^X+oX_a/*6RD7fZ;%B%_<M9CjSDlp,n2%='kZk'Y8bJp%pYri`lP/CUO)UF*g(Im`nkD-#;+L]sqc94STF[ND+^~>endstream |
843 | 2169 | endobj | 2169 | endobj |
844 | 2170 | % 'R169': class PDFStream | 2170 | % 'R169': class PDFStream |
845 | 2171 | 169 0 obj | 2171 | 169 0 obj |
846 | 2172 | % page stream | 2172 | % page stream |
847 | 2173 | << /Filter [ /ASCII85Decode | 2173 | << /Filter [ /ASCII85Decode |
848 | 2174 | /FlateDecode ] | 2174 | /FlateDecode ] |
850 | 2175 | /Length 1384 >> | 2175 | /Length 1769 >> |
851 | 2176 | stream | 2176 | stream |
853 | 2177 | Gb!$G95iiK&:j3Rr#b'!fEkO-P,sETn0.0W5_*\0DN*u%5X7o*bsi=GP"sU,oc6qr@rJ\NCrk6WLb-8p_iHUDOW54sT4@:\!V#CpI^sX;EFGGi1Ub=X^P1S.rSBd;T!Rf'7M,F14c1QuNp6:eRL,F&;%TR;3[97KHR%!>/GhREkj7H9,FB9,JIdm/+6i>J$r`UGaR>Hph%r1ZkB&F08O9JCM8dGh$^gr'o1PjtTDqi#4L3dQ'lft=-K1XF3&-2Q-gQAMMC?J;O@l`t\[Zli%G/)0BAcW8<ZmC%[(*cPLg&UjRB`8W\[6M,Y)BpC&uX7j]Cr+2f:rqhld8[6qK?4.QpuM1lfZh>E(5$?j*)W5pib0?%KKh[0'#.7*RLNKC$F&FheZ6K_Bt)/j5&c)CkCSi-Y]n^-FJ1ARO6VP=XKHg%C6eCmi:e!B0bYaa'3gN6LDFD@FjGpXc-NJGhYFbUJ]Zl:ro&(SJ[g`Yna.j)S%G5rJCCmienn5*QJu<MCPNJ<R0*'W9@;oA\:ulkch*0mb#;(.`g5V=PE2<Ic.qq&E&Ve%R\$M3KXrW`:EFC9@Oc@YA"@Jcg1/+^B1gB-n#QNchS5"3C=c!GQo"j)ng@*XD#JV%1l'Tq+-4h`3ONRBQUGYlpMiuL76ab)R#L"BYe&Rjc*"CNUFloh%tXuP_tbU9n>i';;4#8>&g5Y-HQA:1*Mofk<s=;kbeAS[%D7dQB3*;Ot<Tfl#,5IF\q&L0]siGi?AFT";d.476\'e1Kd/ZK]t9<IJ?SC=BT%J`nu>ICq^H8IFJJqD".>^D3CcS+Xss*;)';bS<J%U+F">H;Pmtr(s7ftGjq9ol+3f/_ro$F#M6%MY0bs#p3)!XPa*-TBQ6/2dt.:cApPp'RN45"]j=[mgMY'XC\`t<g8*(%cE;Mprl&JEV7K-o>RYbqWnt2'E+$*nAQjl>bsl0c$S/q?!KDVtZOot5]ij*`n43[,EDE@0eQ]^U,,$.@"q@)7lPsB2jFNVAY3ZaQV\Mj*5Qo'd7rkQtr)Es$&_h+*'ND2ZC;9'!DU`7ofqdcM#pdbOlgjW*W@^NKi<a4o(N^[l>eeH=Z9_@bZY%UB@=1D=GQnRoQ^Qhs#5L^uc3\2jpDf\pQYBaCTftd!K#*:=8DML@+m:\$gW-NU#>;Lgn4uU3c9T841*LF(m%TAGTg,Zeic)U*E*PH!kR>LC*PC7g*tqH)AJk>Q%,jV/k)jDcV!6Kb\jHPq*T@5,jtj5sr68k^\+p<B-U)WLX\%og36Uft8[ND-$s0bSpe3In0]/c)UA%-<h6B*Lr8:C@SZM!"`jbOVj>sFtD9$aG?V">G]FA?Sph6XEBI%H\Ek"2ubDdK'#gE1>R:V*cn]g6d774ia+%u)-jT~>endstream | 2177 | Gb!#\D/\/e&H3^ns5?d^YWF7j--NT!^`TkZ/IH#Wep-S;Gq^Y)QJ#*/8lBZb?b[gs.rh%\Z_7AA&4q725()e>];#Tor:B8rScSaDJb->lGWne:i!!uuP:Ll63Bd1aHK&f<%O2f##&Z(476'H%jL8nr(ID_%CRSKA8PW'-[]<(t:Jd]ccf%>Ia`)h46q2W9b#cqakQ4.<o,5Z6RA;+e/>m7:bt1Bq9I+`8d@KOF="e"Q"X^ug4Fd;4.Hn>ATocpc`\cJiKX2%W`4X<-Y)-a7#Gi`ie*5'S0`6J@[*K.QZ-;Qr&pG<D,rZjapuX.$h+bGB/[+>lmBL4lAq^F@/6j=%@%;h1nFssR5hTP\,C=c'Kqj2<4WemSGWdkLrP2hT<FOr/DX6[/<Z$RHg\5#p$;'\uHHFYfVr.-Rb><toM2agR5MWu8N@9+)O"2@\&9h*JdEDdWFDa*A0td]B`9eFFU@&#BL8l)Sq5q8_B`>V^V9!&M'H'd;Y,"ZOY\ih][4YdVT<EoA#\RjH'3E9IS4LoeS>u2LX=2Y4aFAc;1I^CG:!Uu<B>n%-7D:S*%@'VOMQ`^QFA[&\W'JV$faA;=mQ2Ri[/(S>-u=RN\CYM_;lsFZ8iq!9]k2\M;UA'O'k8SrPt!]?<TDSL<_G>X6:s*FZ((06a=.[;8(0Rt]*(h2`7/0iJE=QQ,1&T".O6W';m9G'M455KX@S?W#o&W\DWK?3ej'diAlbIY<F4Wq"a0QD9b8=oh!?n)8`upLm#JfTqEesXm>C[s"*T/QR;fojpbDC4L42j;QkRaq5$3j1TPj#ri^)CHDY<`'$3#'e'"K*Q2eq$Lei^Xl$6aDUj0;[+C/7*NM5$>1NfEiWGN/;YbAkjZKZ7RamPXRf$ek6_QYQ`C%$PI7(9E*S.)fZN;[)T8P-XOi_US]-j'3j<MCPQjp-qZZT3XRg>5$2u]/MrWT`]LlQ]9!%%"gGYnU\[cisOmsLkARJDHZNJ*aZ0FP8e_90\ONIE(&4/^*aEe7mrgGK9&\^':]cI,Lie;H9#KXKMc6Q>Z5aF@bmL5[-"-$hcA5i[R0:$gBtt`B%a;'1_7(lDUa2\7!/;7)X&1R]frCr^u&0#>f<QA,>.*Y.?2Ti[Ik!aoV3Y*fClc>&!$utS#hf&ZTWM,'5JXk-C1)0Z]W,@&M`]0:`+Foq[(!ibL>mR@='qRjG.S5N2&E(]_7ltB1fXBBVrg>Qtb<tD4oH%%=\Q]i^\I@r^C6X`T^+5)$YU0j*52[ErEha?1W&gEKu`MDkC1\]LVp>pa`iSJ)Ig"!a]rB'O8`OmZPif-PI+MYg=K#H.ZJS?5M+%EYuEF(!J\5-5.%#PN?Y$R<DTW3ErS%nsEq<X:/Ts1:LEII`QuQ7E84ZG%i^c5A;J<ZPD0'D&=>:QKJL6de,fUR,qd05YSIe=Z=@[-49fp5Cbc`S.r!a7,OmF2Mj<*I^1S"RXkc"8ZA_PgG\ZXWUO0.oGQ\:+VULq`INVTnu?,cN@Ej$j6N-XF7bMT=IEU6`HTAEet7a<Dt8S%`k*KfVHo>m9XEh<=`ZllEJNJUj,cAH.:FV\Nm00,UZ7On/#M/"`k$e@f;4dHCaOk>(2,?,(8@YEg&!Z&'Jd"ZLWFWW%BbJGpJtiYW;GNGlijf3]q0[\2a\[AUJ8a[`mam"mGa#AE,kgt510V"BHB5ac\'Vr+1S(b&FR]>Cl=Jo>tGI)N2q>J7n?t2]Q&iI$uiuW6RukLa5LWC/jJp^0XTFVG*Zp.#QsON7DnB3J)-5qP5~>endstream |
854 | 2178 | endobj | 2178 | endobj |
855 | 2179 | % 'R170': class PDFStream | 2179 | % 'R170': class PDFStream |
856 | 2180 | 170 0 obj | 2180 | 170 0 obj |
857 | 2181 | % page stream | 2181 | % page stream |
858 | 2182 | << /Filter [ /ASCII85Decode | 2182 | << /Filter [ /ASCII85Decode |
859 | 2183 | /FlateDecode ] | 2183 | /FlateDecode ] |
861 | 2184 | /Length 1465 >> | 2184 | /Length 1614 >> |
862 | 2185 | stream | 2185 | stream |
864 | 2186 | Gb!#\>AN7g'Ri"959(G2S732u@S&3E+`00BOD`L+]2+/:Q:BF^P"(iWg$uiGR?;kiFsCN3\d=$\SiPD@^@-;_R,G/br^Jo`Df`G"Z,(TkSq-32*mAQ]j*Wh2)@l+GD%K#fSQ_4r(?1qEi2:of'/"="'TMR<+N)%6//>5E!"JAifcaH@b]ECf5c>]VqY:mr3I>?A-k<*3CDKiF.><87>X;+bb2Z-^rsSFj9d"r!MT,)rYrnS%S:I[=fn&j;FVA4Rg?gLR(^XAdTe`p\1:FR@,\&Q+>Y$OiYATkBa!g+jQ-gCf]FMoh/a"OHNb*H3Ukjk`@8-nu[]ERs;AG=']T>r])T-S'=Cj%+Bskq>c[<q%g7l\Q[-;:<^Lor,\?6PGjiqE4Tl'W(!Fmi635dqZE`slc$NX-3/Bm,Em4`qF$@>Den0b(>-n<bV,\`R'T,3hGKpXpW:Pe?2?3iJL+L4KOgkh?h*N)!qh>mkFTK=-?`PHZYF@Tg?31'nYG<!%hi"'@t23#A6XJ0VL_)nP#[cUN3q.:N,.?hOc;FG#VP80!`X[A5T8Qh:pL5SPR,WRbtNGj*=p7s^[/q?-L]Z_e,X"n3d$D`1_X@P&rog(**8VPlY6#s>!'_$]@KPOJkh@"n>KqJufK0?H5PR(hh7*u_cgZrK!/^tQ)8LrbRqFko:^I$u?`!#WpPUq-6W\iFB&qNI?gcR&m!`.%T4'2;Q^)f[X_m0\)lC9;.Mre[61p.K7NEMeTVH[)(7eb=l6347T-4s96@9>7]/:d%12N@qm@Oe=T^$$Yj/8<$n[Q!_Yn-tgkd3_self-<onO^-8XNaU@?E2Wcf^oO)h<A3BAK]`ti-f'E,HYhGflPJ9(-Ko<n/Wq7U"G9Lk!?L"*0+dICT0L7a#t:.92:rDkg8"g_Vu>e1>TAI+imWO92g1BK2!`@UCtM\Ci;V9Jleue#WgD"UoKU=[,VUSj;>-@AQ=]a3s5Nq(P5*`2epOgq3'Z2"U0rk)sj(<OtEd-&X0)d9qT)?)7nJ85.S!UA?q+W6*!8]_&3m=^Hf@/)%t<uKhjST[cHnJ5r.nZ"P<$\;!Wo&>W_;4c?FfY`9hQ#X.f&$e\$kdS1m'@C?[a,-h,tY"Zp^W1S&XnBE(594KnL_[!.=YjR);Ns#c$$7e=?^s.AB"N-P$NG4Ze^:U1k%8ulWiEY]Z%BJXB)r%6%U0Q3F^$'(;.]?7?OL5XGJ9$21$0tr_p^,Qh\m,t+L\Q8uBR+*2C&&nk;pg?9fM(1HF-X.?2HYe`j/Kh9qmm32/Ne?`u&A2[<rU]"NIB$rm[@`;t&&F5]6]HZs5Ct%4eCZL/T"n`OCL(b2\ZL!tGI9r$!XAgteZD/^UG(b3hi]9jhg^521r3l+gO3o7BXd/Lf$'c_V`%;K!G&ShEUZIn3]9mcT'^i*%TC<G',XBe]*o`UHo_&cd+;>6L,;EpBG%_e8/d58rrA;!h9#~>endstream | 2186 | Gb!#\>>O9='Rm78s)9gCMLrF5\MR$CG[Qk()JOAM*@dX1Xk^j/]d.U%SX09P4a,786O7EQ5b`"tcfI6\chSP"HMD9F^L7K=`s=<dCp4os`F+%Y#G^bWFjt:l[p+$`FqB0gF=f-_#.USeqX%V9R#@1W7AG2R8A!D.9?"9o6A)=e2XYXn`>!_/+OD_B/'o=uJ3U1?,7]>)?:]qq+Vt`MJ7YQo`j;_HEu=i\UPj0+r],379r;k=[rbMAs.UqaGN.uc$m2AA`PTs-DTX2MI4!7Zk6IJ,"'3912"&#^+C1#+<-LbHN]VPq:6t"qZZQ"6[*A%,A!08k8m$iJfpH!5r0@A?,,TD``Bh`s<*Nd+"='+`9(Okhd_(0"6;"O0+@^@5^k=/I'.&^K&VJ&]Kejj'!_FYm>d-m>:lSU<isVD*Uf>T`A?@EIK)]mgo0Hd[9l&Sf?!pt-raEVf)XI=A*D)I)HZAS_(nY0K*J<fa6.6ZUIiZHKlc,KS6c?kdV3re6P6rJ%DJJij(uEX)*?>Jmj:[AS(gPC-4ol)cY^%%0(C]l*3:slGPWV,>rF"9JQ*iT9*TT@;oEY?WF?BR4I]ka^hZZA9LT[^I_Ws-nj9^oeHREKll`"?ta@Jp=iNW3OTj@A=p'KGa3P=3i5.n]2%.2I^fLKbEIjRQU\4b?S,&k^l<J*TpDb`l'Cqmb.AM;8@Q<`o>Ml;aOs2M%<Ur;#m3.jpVc[4ofg7LOT?7t[Je=bO_.QZc!RWG/819hHMZ0!<?&Q)fS;@-[d3Rs-"b.JplHZ:$[@QU%mo%Y(:#GhTq5e0>fMjMKcLf#.,:.Qta,+'n^;+@MUI<BZDM`V?-GYC_Yg_>X\9ait"RidYt,P'7"iVL@s["LcR?M2L.\h;t8h9R2j>W4X:R+SY$LT!f%nX?fQ"?blW:EUjMnA#ofT0Yh(KAdD"7*1'clr%mC4d)V6DhDGI"9`6;N]?3%(e-;.JQ5DVNSuI4b!Nc'@OSOnVCoB'dXrga6I#$L0@[RIG&B(.0-ndUMX--&4"K0%1\ehm).o_ZkXh";TpAuGqC52Rn;K\iCM%*Pp[6n#+:G9%(!_V3<_*pqEj<9&@FE$G65+(P4B$a)`e&!)>jRin^(343T:j9MlnaJ`/9kpD.\>t,\@K4QY1B"'DMH_o,mdu/.9!_liMjh2<$jj[ZT8Cd2_U>IY"*8_XfhC2BdI8DLbWHAgglOe/8,er5t1$,K)d[)+X>+_`)FYlBQ?_G?mRD@UJ'X2CA3P/<`._&7pmF([&_Y;V92WC3l1.#\n8>#SS-^U^gt:QN$@A+.f[:m01sKAF?qs(@D+.i5&K%3kcQ'V<HWEICf2Cc>06*9,tL>!AuRW>iu0I0$(mG)L1Y3/C*n0[SH2#Hjt2TCicqrl'oc`?\JlkaK`'R-!$N/1L'fkSb?WpUE2S;H8$rMD4tn6t]$aYRRYn]PAG88A(QUeQL1X$fr0,AQW#\\:1Ed]lE23MGh@I5#%.er#=hPj4E\q_h_!6=R]'K8NK)Id!^s2g:pdns@BGU"Ao<$giWfWq3pNLK@LjkH),Y-jWl&Ln-oPBl+;Wo?(SUn%F4\O^Aa-RIlQLC<P#0+hL>/Y9)8OL,_5Q13T:]~>endstream |
865 | 2187 | endobj | 2187 | endobj |
866 | 2188 | % 'R171': class PDFStream | 2188 | % 'R171': class PDFStream |
867 | 2189 | 171 0 obj | 2189 | 171 0 obj |
868 | 2190 | % page stream | 2190 | % page stream |
869 | 2191 | << /Filter [ /ASCII85Decode | 2191 | << /Filter [ /ASCII85Decode |
870 | 2192 | /FlateDecode ] | 2192 | /FlateDecode ] |
872 | 2193 | /Length 1175 >> | 2193 | /Length 1187 >> |
873 | 2194 | stream | 2194 | stream |
875 | 2195 | Gb!#]@;hVr'`B(%s5?RG:J.OB@Y:qRoKKoH/Q/E_bPIs2pS$#G^`dN%>2/;1rV@B=CX]:l<$7;qBq)n$Q_SV_NrafIIo-(b(BFK:iG=>N@9@FJq2Q!O$[BFXcYhl$e/V+!:dQ.gL!6,ETDc;u@T0:Y)^CL\=+!2QlU+Z5T@nh[(P]h8?!%(.XK'UHs"@dM0'?EUIlu$iDG'Tq"P-pgrMIU5r!_;'*S_GLZ!Z/U&3JlT^hjGgERi3OHqYN0YY,5u9#LpE<@#n>LoZ4Fq<%>;lD0%:j>oTa2S@ro)Qjj]KVXQNKoh%YXH]B;b%,g@EjUfK,RtcSNO@-qG8U](lEA;A(^YfnqWo&Y9V4sp\;\D)9a:t-oiL>"e+%/c]V*##4(VjsVu`[m_AkiN/fi^q1];;p6pdHf9.j._S-K\d+mnj.4:k+TE6Un)J5/Op!)LEcM,+@ub^2e2oAct"X/_,A*Ai"IImq(&L_'7,eIoG,VdPk<bijcf:uYXbh=>Uo4QVtg1Ac>HmZ)LJfRPUN)?V.cf3bf#bJgCY6Q7s[0%[.s&?PrXQH\L!$F+FV(7+qtR@HcBSjgq1OkX5>UR`uVF7c1TP?ff4o^KL&&j?`M9lH:J<EVRd;(/+%j#a_F-GaL%XS-71o>,"T<<Dl0`RWgrPq"""ja/D"l.1A6D%/"eU:_44B?._Ni1)s/LT=Cl?gt=bU.[hek70LeYEf_DK-ug.fB3)D(Uei0*J*$jh'k`)O-("u8Xu-Yam<;Jn>JF&7,j>:^dQWAYRr'n=(8e*ig(#J"72O-PpM9K&FH/p$I&%sI+2N&,>a&G&]2[;PF:9V&Mc('D7Q\Gm*Z>0;ogOM$qAn625F@?=6>S[Rhgr[\r.TQn.^%o31qMWQ*"='F7CQZ-gGZ^Nd!k['XA,?kQmL/P-X2l<buK4]]`U]0ud.2@-k02*4ViA/?3miW!.n3'O2GO2M16Q[.Kn3'R3P1?0&=(9Xj!Afh->nKs4-2kp4=@Vr5)kL#[H]D'_"8Sd'gPIgWp5lFe)F7NpntQ18?ZNm(H#0Yt)se.343q^CD8.)eHhn6Y)iHZ<3W=>+n%J$7/V;J_"!1-X?]5!%H=^(U\r337,(lNOt[Y'Kr)V[#ZO4`YV%YQ09W"k't[o2uS'*aiDg;cllR^St(2[NZ:Oa[O*pp(N_$<6t~>endstream | 2195 | Gb!#\?#SIU'R_pus);>"3.mo\UdRcXp94u^&0P]#e1:7N(J:E5XnkRZW_N?U9.Kp7;JS%$e2D,1+$A`WqV7i=,&m2o[GOO^nAbs?-3t0;f`I8uGVHa\^LkC"_f1-,pBDcD^@/R?'^@Ej_(Sa'(UYZZ;EUL*_1i'$]iAU\JHeL]%OZp4W<mqX%=VuNDd`3M_5)bMC<8oIhHe"b5FDE'ZMsf[fQ/(gQPbDqk$Xg,5,r?gl_GtTV3oEk$D\;[Q-CrmLOjloZSm<[YEU[_j6@:.)Eo67?7a)=Ga3<c`>CG=QsY$4#.Y62)\\pR;aVee#q\g1I9l@RipcSSM#'cm^+q+5r<:oS%)o&HX5^BW#h2BC`H_M.&DCKP*CBOoFg*hfH_2AB&/6(iHXm&alnaDMXN4>;C&s6i8k]jCBOE6/WM!Q_ZE3YN94o96q6^1Y5E]T*'6/A6!PdmI^9<5?=R6`Iltk%Fe';nr\lc98qkoABKk0Ge2UUpe>4dPr"o&/I0Krh\DoqZ<HQa%sfcKPjR?,]3NSP'VptdHYZ<'']j=G]+8+qB$,CaBOQ#tW2HPYK%Kg4B4^#1HSdIZaPj/7%MG@\KVrH7mF/]:?N\mo293R!NdMll#C"I0!:no*jNWETW6pXc-f+cn*3JNn%X1#(8KB1>FJcbUt8%BTG;0!?e)f`,n_ifeG&8j^DD3b>c=0KBB5,]7;O.!,3u.:Y!5X#jAL1hU_2J0SOP/s"6Z%\aWHB!4]PVVX<m-MAXANqoa^4[*"h3AiLbl:;$IqCD-WK"-6+2NQ4>O*,@O\WX!eR'p=?\^&M<=N5AuAGU\n*tLku,)\("N.GC2Lb0hJE^9`^L@ObB]#7F=^^saFoY$i)>R(J.rDhBX=m-r@frcZHFn_i9e#)%V@X&mt7GHgIkcL#)W(Vq@$9>3Ipr]t-<M5WtVGCs[k(?Y_'<,<&`e'$p#H"5U=^4'Th.0.^Wn&"j4D"JFVk"EHe7+tce\ad%onq:9l#]K&&S/5tNg:6NeiT$$PNq&[)\!p88&L?lHk%`"(`38Ye?5Pl74hS(qjV>6pS3Sj6+\4uf=TEl'ENq2>+(pn)VqeiHc'=fI<l?HI)1M>,4@keN:sL=7+A.3(jgrIZAJ$QnsO'9+Or:>C,&_?Y8\f.Zq.6="ao+c_P*8OD)XmeQDm=VT=gOJ$jYYjYe/jA~>endstream |
876 | 2196 | endobj | 2196 | endobj |
877 | 2197 | % 'R172': class PDFStream | 2197 | % 'R172': class PDFStream |
878 | 2198 | 172 0 obj | 2198 | 172 0 obj |
879 | 2199 | % page stream | 2199 | % page stream |
880 | 2200 | << /Filter [ /ASCII85Decode | 2200 | << /Filter [ /ASCII85Decode |
881 | 2201 | /FlateDecode ] | 2201 | /FlateDecode ] |
883 | 2202 | /Length 1016 >> | 2202 | /Length 1030 >> |
884 | 2203 | stream | 2203 | stream |
886 | 2204 | Gb!$H?#/1K'Sc&Yq%)Y#OGr1%ZK.)'D.A2a#$m^V>m,ag.u@>3c6S[Xs*fi0[nYVr[YU:a#^3Gu3IWr6V,p.ERkLdkdh:Tf*'Sa=J2#4!J;?^'5(bN[n`]^lKH@:U@YcH*r&BPX4lar%$d%"c/=G'O]3pe]7t,lcgl+`M?uoZdJeu>;1`7KnpBfjXq$\U.M5VPtd[QC-c#d7u:g3!jZ^=KrrX7lWlPb5b.YIL;mTYGG=9Ujh!mE%PCY1D)'n!!(4O%$6Qmc:BcQH_d/Z.^OlbV'q"2KM906Dq;1T<7d1gJ8`)3eBEX6^6g&ujS5KaIG3s%b)&;?%\TV'NV2qOUD3LG8)P]ad"ueA#^%3>`)lY.8ou5jt,r[.d$$p2=4A9JGbhU0X.BWiRI)@n(V-&O.1cd*`%Y&6a3hMYOO=;HC*fOs1]I<-q&2MJ[SW*u[R8:g=oJ#E#Q.'<5H/024\a\Oa9r1EB=*%7+ZA&3(6T)f[I0>Hpl29U_%PQi5n8*-P#Tj$fYd#i\MU^k)8=Cq.OrBBi6*8/r.+K1Qb:d,69.3nJQkNC.A7"@XYj3)J[jcC9a)AoZFR&Pe(Rb/>-ae#Dp$_E9_]("M]tmkYVBEHtf<K-]^=^aMB(KcmhnC9=%i(7!n8ehBC#iR1KY%0<jjB<<0)S7d94jFC?W1C#V<Ka2CKOc*I]hjekM=+`'*f]f*f`57UYKlU-jO-^Sc(c2J>647S[8nV)-/SC,3aL"\m%VjtI*8h)RS6=H<QF)s@*jUC&KgBb[`OE']SY7%+oE?aLm3,(QI+dbhTZG!+FiI=Eqf;OT$OSI*R0,"Y_Lm!MdWYhf^qtpg@"KrR='$`P-K\q'[M=g@iPeP&-a'RQ'KUj;_@ccG@-X((JUp_6,f._UP%Qd"$rOA-2lS0kHrim&@k7>!nI7+?h43Z%TA<3qnWJugLG<<[UL5UUaB,$P<]cURZctcIEM*&8Jh2K4^r'"il/BAYXq#L>(DgL^D\gl+/keZSr8ODY4SfEnmZS"~>endstream | 2204 | Gb!$H?#/1K'Sc&Yq%!_M+=Y:9AB>q,gVsGM%(\>5]*JPY<YDUES4W"Srqe-^Z6a?(gEL*%+P=LkkP4$"Q!PD\Dn`1L9hU"\;g@mG!Q$Nr![8\:kla1DLP,'5!SUfu`=Po3q/I%:0uLinCWVp./=G'O]4R38#C_*#>R^obi-noBJeu>31`7Kn[gD']q#j0nOf0D'def18c#d7u:g3!j2&hTbq@0;<FU_]LPsKd.G:g`4;[#=e!mE%P93?5+bsmR,b=fpDB!_"B]RoDRQSQlB/n"2LOt3\2f7p7pH@Q:s??goe\]E<Ic:+V`C<pXA35.FV9pea1rr5g3(j0cS[SW3#;BKDZ";>%?7QOu1]q$1jTr<>$2UY_aOVN88ehcT9G+Gc_#eN%"""5"/n(cJjekDNgHRsc6]Fg&Dog+.CJfQ9/*_TLNbN[G,1lD.&\hq>8<-O+olO9L5l@\<K+E/I74!r9SU.ZoF?<:8S*#/-5F/^7kdp,gDXrf\3%#O".kUq\nGIkDK<I2`^h0^D'l%AU@6JP/9g@-q372M@839c(f''!/c8ahRa]18Q/\]5)@U^poS`"iQ[O](S(*n`AjLb,Ws!tNhtV)<9I'T-.:q0)mG0Y(rd%:\;H*&,2E-ER^j;3dF-B$R?@4b>5$gA-$P`57fto6;rXr0h[U/%P,3+r=K`>=DDHXW!O>**X7;#CJiGLXsO:9.!WS1nU7f>]PsIeR^bXeAAFMJ.l&[Zpm%Li_EH;`Dbg,4WIhFL+.8V-u@kr*3erbbZ\d?00Ph?7Y;<]kB;;2.'i>Y*RHo'"Do(_Kbb`T!?GWXg02rcq#IT%UVOah3FILkr7aFR]e@TH_ei9Lr;(\J![oZsb:iE<HlIsh9d-[A=qmR;;pqC<r59YRIZ"gU#5)17]RP]WO<VOQm@AdL1qMY89'Q^e^t\0NE3ipA%RV=s-CB$L8AjI)ZAqedKid=C;"okW9CL(_i\615be.-u9;"96E)]?]rE$f%;6K:5,7NnY89L56'@@da\S2ljIKM(uT&]~>endstream |
887 | 2205 | endobj | 2205 | endobj |
888 | 2206 | % 'R173': class PDFStream | 2206 | % 'R173': class PDFStream |
889 | 2207 | 173 0 obj | 2207 | 173 0 obj |
890 | 2208 | % page stream | 2208 | % page stream |
891 | 2209 | << /Filter [ /ASCII85Decode | 2209 | << /Filter [ /ASCII85Decode |
892 | 2210 | /FlateDecode ] | 2210 | /FlateDecode ] |
894 | 2211 | /Length 1017 >> | 2211 | /Length 981 >> |
895 | 2212 | stream | 2212 | stream |
897 | 2213 | Gb!$HhliJ&'Z]**r#a5-&mYp@L%=9<D9J4rEJ_<f@1O]^@T@TF\@-"]s8<;IVK^dk1m4Ph!<_L)4un!Nhh&Yo?W@'&"i-T1?G/jZ0I0jf^>hR9LNgjboPH]Wk@;C86:)YNMBdPpGk>GgfX;It<JkW/<7(0VXUc/YnONn$cLV*V,"N'3+bZdd&68UKQn0VtKM@jU$cWo]=iirZOn%7J3ecWF,VSI%55e?5mlIso)=F[XaE85j59%%b4lr0'XU_(!QP7L3m0ks+fF0Z;dH1#gq3!FOquMmFXqUFr7NP[#dCb$?JgH50'E*D36%liDXYCS[Ki3$EE7(.2.%&_TRi1E86FKc!K'rTm"!rQ1pM_XZ!u7!$d^iZ.KX+W$?I6BFHN8Xpp[0mB;AN7ik"+9H#gu@Tgk56jO>+DZ\;a[KO>%Z+jH9N;+LrjDQd;CB#(j6T$1YnV#VPY[*X)3?jf.+F2[YFs+Kr`VHB;4a'C;eED&iI%)M5!cU"=psC'o6`R.rh:]VK#gHGB5#*eLKi^>FREC*pSE9#:/U+q8l%a$UD<?[ImhMlM0S7Jp7B+\L.(8Y0qAbA(FKP3uEk+"rY0TW_[4@Dl@F-pbDfWF@@uO9rp*-G)tK?>/<@H@S@6]N?\S,CeY5GJ6]D<9TDQQYLSfV]SW25$sOmiQQUUK.RM"0q7J8Y1b^!K.Pg2mEskE_M*+tUGDLUd5X+kE+M2Z#qRWq0qH(*kf,\'0Hq9%XTq=eKh)"fUUReJCe0pm?TuaOe`\NTQX>\']GZTE:;O@-AZ_Mdk+uU#1CT-m*80_k!JM:iXHg[]5K^Y_LVUc[ot\DQY[=8cDcc6s-8Q#"/6l9f:lpAI1PTq`[Ub'1[4l1$`tHp?/.?j@@aln#Rh/BeW8E9djupdS\e%6]\,`(BEmG5l:ij4&f8C/Yhb;=^TeF^bZ1#U3$*Ico3^ulr:7eRR*nLXc5%m#u)2+V;T:^3/&F;D:X<X;9bMi%mY%i%aJpLFqcEbe/JWM5q%HGi3_'Xuj~>endstream | 2213 | Gb!$H;/b/B&BE[jp^[$RM,l$_*SX0Z[RlrFW=Q)R,8)cJ5dnU>N[q6hIO6?m[*tOI=:7YJT]GP9EW5k7"@6^mW-uo@J57&qs+15ZaL6Ui5Tm[kce3F2CH=bZF5mC48qSfh'6DE?nnt/>[T4-p>&4sZn`_<8:K>$k`!#G0M\lR'A<k7J6ZPk^*8fYiCcR\:D!Lql&lNdVe.N\%$FsBtgd(Q8ZJ2gBDf<c@@=X-!&O'8^0<5*EfSD+qL"IqhN@;8WfPo*%2]r$)"f;;<!=TYHm.rCC=Z$#@O;lGg*L5ZY"U[n:OSjSV/4%/m[4db6F/:OpbeXE`NKju`_].20*K#SqY*I;8k'Oq:Q]Po%.uoDpDd<l50H/fS<ZHH=2l0X<Xcs6U'c+f!crc`G%iX1gflL^KG$$#nKFJ<Kj"[JaA_;XhG$+%p=O*"GTd1\3hU3hCTXQ:"6WXgfaV\!CL62_+4Y_5g1!cO+H='l6QR'Zi1mc.C5Ku'^'`)gB^^urp6$EVYrcIn-lMR/D^\(!63X4gp`g:q6hW>sOJsSi8-;)`A88j_PGd?1.r\j%*#u/a.2i8WgRKlI7_5pcg*OoijNHg-l#]]?L*e7W'UXg7&jW%c#JfNS"oo\1^_4C6eEk,O]M;Z=gTm7ct*"6"H,3O;M0aB#+;M(m#:\+Q4E\M/iTtJr\H_XsRS*#8nkhsaf9MA6<PD\!PT[^fE?(V4V*UK/YK:u*W>,[e`jHcj;FhJp[@*1Sc+V&[s%hi)I[1[)Z1d-12E\M#FGT[4rB'8\tMYOjt9%Bs-P-U09f#N?DC&$!=J5GIfaf`r;Bmj+-Y00<c/t8#>Yqc?6&i(8_FkUbPMaRbCHWpVs2au$_`Yd^\#FP.iHZ?!L^>j#(\G-F*?)mMCB3,a?Js9,U)+1ed9"keX@L^T"qS;]pk4^qJ,+gW_2T,qNNWL30O\VO6nGOQ_EMR!DrQD.aZ7llAdT9coVNX4UXGUi~>endstream |
898 | 2214 | endobj | 2214 | endobj |
899 | 2215 | % 'R174': class PDFStream | 2215 | % 'R174': class PDFStream |
900 | 2216 | 174 0 obj | 2216 | 174 0 obj |
901 | 2217 | % page stream | 2217 | % page stream |
902 | 2218 | << /Filter [ /ASCII85Decode | 2218 | << /Filter [ /ASCII85Decode |
903 | 2219 | /FlateDecode ] | 2219 | /FlateDecode ] |
905 | 2220 | /Length 991 >> | 2220 | /Length 962 >> |
906 | 2221 | stream | 2221 | stream |
908 | 2222 | Gb!$Hd;%Di'Sc&YH%uK3OI"g-Z6\2:gVsGM%(\&-]*K+i<YDUESB:')^AVS$?CSCQ[YU:a#YqUa:-O\fSR4_ARl>(GP60\@'&J"&J1rN5J;?^'\U]aal/_#LJe%O0&VQBpIM>:ab]NFP6A\F9$Egd-0=^#jM;R*g[aU'>fT$=VGS)J71IDFF4[E%s?bgJ8P9m#9E`37C\^!eRPua=.Y0P=#q#crG9b(O&Ud9A=%o'tAQN]Ot!mE/0)q].uk2L-Zb%*B17)#(AjFrsgau*Os]mVme9Kb-41<B3W.l,X],T4p43.8$8R!R0[a20#W]P]g9<4=325?C1N;RK?l9F=qJTb(5C\"]&sA&BhM!?[2R=)TIY)gO$Yhsr8MEFhJFM!E/9/--\r`X]4\1q\-]@hCKHI+qPu0>"1Xi>C(2`n5k=hG_gi^)^6,1^qDI^6E%2inK'a1fsO`@-1jkX/ZgD$-+1*1^Hi)_B3f)<Uft1_@3T#l6(VOi?aDVP8!Ef#;Ve0AL6cEU8nnt'TGC[8JjG6eVt.)UYZ,[62A^*cWQ\D$0te?-C)q2k=4JdLb'^fJ]M^aR8plX.hBJd(^--AB6&<L4[?:(f-$*oTW^Xl@F"`Cr^l]L%I!_Bd))P<J3ki8=`5_/NG\%u40]>)KB<.A[d[kAZ'7\JcCeo<('a0u=E&(ba806_q?5cu_N[&g_CW?%?RAQLU=qWn?(#lQTbc5'!M$sBP4aV%a9qSP(lU'%R0,.WKdCfP7>G=[HZj]j.(!r'%_(X5Z`n!NYRh2#ef2eR^"o7+o^)*E?t%k2:dPp%Y*2cDMY]>(jBG`qdrU<`P8:G;Ds.P!B3M82#O%\YmIRa5S<sG67rr-kg[gR5dtJXUeesiXB:!(7._XbUG^&Zq0#^:.+VXB"oRkNo'/*s^*QLuNN1@)b4Bk0qZek<7RW"7=aLdiNlXKr0#9FAE8;H)Cpi\Jqh.\RolkD=`>aU=4fqUb@e&bsrNg9t~>endstream | 2222 | Gb!$H@>gU/(rtMMqAgUoKAJSXM+N[#DAsN'3k4!nYnmX8WbLdrYtOGlqt<[r3nbOZ25crr'O0jd`ubhAr@%g*^/=is'EE&]Gl7XD_@S@$&W]1>L\L=\nma^Hqu;Bj6:sD58)3MgS\2VdE`qZo<0^.\Kbi-o?iO-0VA!1<fe6akEJP"763qtJ!8i3s_sDQD8k@-9>=_bN.Ou7$8nVm]HZ9)V2i(hk4ad7,%H;`ECE*910'I9k?sfm<_H)(djY(bCXG+)/DeDQ%b=gK)?<k<9(t7=UVB-TU)ru?^0K)h*PuonWG+7Zf@1i2-o:o_6Fe@M#BWA/FG8M=>=SHMNJ.>$(kP&dRV@pI$*h>s.e[7Du;8Bb=o`0q)l9<;hAb7UaLCLLFe^mT<>JNdXe\8[<Frt,1qkcV'4@&fkH"l?WGhA-lD]fJ/&@Ib]!MXb*DpA,P%O<#]Y0nF0+BR/]V7F63;Gi8t2<sR-:_4^9S5MQg+ANk(A[-$K$PpVT(_W'd6&u?K#YWcH+Z(+TjX_QcJ3;XDg#t2*QmbhQ1WeQg$jfS.MY*OFHST1XP>(%C"t#/#0a)C0*Am+.(3=D`pjFNt/p.7Bc]hDj,o"cEZ'$L1KFVHL!$CL!@ScU5p3qgMP7<$G4)!91e?HV,jIg#];o+TKIQc3ggH4C)-8ki@k29MC#[r'ee3UqU^_8]KfEi?VdfV=J&?u-s&GlqUeu&bIa?dW<T*,ihB\7#0PVRZ/D#uA`r+XL'=dhqdMgHBi7TSoi0aBWV!"j44ZI=UbQ'ldh1Cjg4ghZs=a?dqnL#S]-aELIfrorq+bsM,_G89D@,(Tnq58D#Z1Qd=_64@;_"ErJONSKc0RYq?^\c)jnE[eCqM**>;YW'D:M\p$G20<+K(CMnB(1=S/NC^e<MsnP-l=&fQM6Hu;!tU00V>Y<mHoYAGG>Z1YIFG-$jk<`<arVQ[9IG;i[KDPg~>endstream |
909 | 2223 | endobj | 2223 | endobj |
910 | 2224 | % 'R175': class PDFStream | 2224 | % 'R175': class PDFStream |
911 | 2225 | 175 0 obj | 2225 | 175 0 obj |
912 | 2226 | % page stream | 2226 | % page stream |
913 | 2227 | << /Filter [ /ASCII85Decode | 2227 | << /Filter [ /ASCII85Decode |
914 | 2228 | /FlateDecode ] | 2228 | /FlateDecode ] |
916 | 2229 | /Length 1810 >> | 2229 | /Length 1647 >> |
917 | 2230 | stream | 2230 | stream |
919 | 2231 | Gb!#]CMt+O'`B(%s5@jk'kES'R=TXFrR=jeW=mTj>GU(I8<K;pi5T8&D,2V\^=Sq],`Mk)THt*O1\SB"a7n]3LE?HkmPW5ihMpL=XUfj\iu.UoDZJf0r&$Z&qg*_Rf43hDi\:"NaY:Okk@_Qe.lrkD-cXO"Sg\W.eoO4/r;6s(RsFr<]EH57>)4?,"qpfY"PlXN8B>=Fk#<1,QkZ3Q@U_O3]S,ek)#rPSr::S]6-fr4V9s']KMP_Nra^*TRMm>jWMgt]4m?_(B9UN.f80X(2`Lh$r14]F?B5haq#3ODP,a]*$9/\ua=G?2emqObkn=Ln0DYY@M%Y;f\)"'F;+,(m%"1B+Wi/IfDKO$W+^;pBUA_e##i^O:r][tpS5MHV\J,S=Jgc:gFKoa;DkJ4V^J:dNmI/FmcmJ8VpYVOLTd%BRdn"!+mNbL[5(ssr%YH"ei3bCrRFNrM:)M$LOHIF/3'p)PeBs"!o@.oc!7@(g9qt"%$<]C]P;S?'c]mWt;grNl]X^b@-*\4)@aJ,^ONMMtof/Fe/!=sm[bfdDp"4.7Z]`dM%"9BT^h='58A)HU5Cm8075(h#>PR\@jf-HQ(^ZhlhMlu*YJ;u"I&7,)$>C8T_&ZC6AH=#"jsAU($b-BBH$,8$(Laj^klRb@]XsDAL6E5'X9o;.J6<Eas4r[;@"mfcp5Nf82.A!S.g;>]MS0FrWS7b?K5,b@#NGuA3>GL*hVp%"a\kQ,")N]G[`64LcC*%`A7gCZ3aUtVQpD*e9;^(-/niB5LI+S6H5\`sK>6e'QV=lWG:aF?;\W+Y;QQ)as"h9Q!Zc-\8?pP*\0?PS$Le>OGYRR26T53pn,_i,ZF;&^p^;!e,ts04l-uMe$bHm"_m0s\lZ)&8ZTP-'6TDfsH^T'>QAQQe,YNb3=-/_MUP*?4>Jk.+=M"XEP`ONJM/(scNE_QEZ]H'#KQCBt#J"sUZjP+*IVi:JGHHlW4Ag/9.iKa?A:IV.T3Tsj`+f"%?F'Zd0o^8>D0!)O(p__k7Fu.jBr.h0bg>gun[9NO9PIFBYcItEk?GIA>0Dq1qGNV!2hs_&[.r2c/QA8sS82a#%@M?Fl9$*CcEaWe/rA]cNGt3"L9R:b&&Q-(OmC`[EQ&Vp8sC*X>+i?u<7ZnD0ZhuGZsb_"*1[C'%V$p1Zt!(kWTc;9aNeLnSPs%4KD..-;ema.YaGSZ:;:3'fLU']6H>,S3903fG5?@K8Sa+WH+pa>oCT;<*j4t;jh^cS/LiR@2Yq7U62Ob:pT@G^%M)eOqH,?\f4VKpN7%AI>oNh5\4e!RMD7Zqn#VNl7_aGgcK[R5e,f#oVY;][]e2U4r.8eCDW$Ec>^U"+_("N:6=Q4aQ)RNMY-:HJ8_HRK/oerH.pWLfYY+.<HsD'P#&%iE,&XN`&PXje``ebgRlQQZj302\-27ftVg/+N9]n!2NJ%JWa^XRX,n#HSb0,atN*WNiWe<S]9Hd>gV>1E/Agt-6*pCoQNKPNVY*qc01k72Um1SkRfKY(2<R=O%E3?M")5lrskU$Q>Vf7S%HG^sIUT-A_Rh5R<E!ds>59:m)`8l5r-;&G5MLIBAL%CEKp5\XlC84AQ;jDfV$BM7cTQc'B]$W.[8*XBL#/:rq18DEq<7Nq5/t.(-%D-e3]BeXXQJ&=GL-=k>EHG<Nn:[3hON$ABi"lQ;h^A%n*;=kJd!V=e@4Mg1*Y,516^->emR08`;g<Zh!BrD;<&^L0Ae-SBh)MXfc,!9eH,ORs+u^a=l9/D&5@EX2d6G[cG-?fUY?M6.oj]dRpI9q7JqHcucUB8_N9ZQH?*_e]~>endstream | 2231 | Gb!#]D/\Dn&H7^.J!d9YK!*aj]SG@AhWZMl7!61KUq;nR.[(^4D.6Gu=dFPeA!6n@d6^[)UFulccckFiO(USkL*?QMju"akI\4F+XUV]@P<%9ejhYI9InmSGVf'PX`eG(Y^2FIU;1pj`cEHtocFG?Z;Dbp3Joj(A1K5p:*HYE<\H,eE9F?^i6DO]OqXYR#dlufRn@1"t;ab2eJQ*h'Ms9=L9YS@(K>I'O.i@-iEgji^DGg2T;#pS@F:Ka.8PUAePR-n@m7Wno#J`krVjH""a5cr\G6YG,6Rui0(1(Z62(],3j:EoZaL@oDT9^V*Ru?uB=ptp93!k3!dVXOKheoUL@l^56;.NP1Jo:lj:mLV4+?=>d>ehqQj4MV!HTX;<;sT/E-5_L#OE^YcdpCm:$6JYWEnl-7_seXDY9,akV-^^.ECTLGBu]naF%F!YlaE.+V'87>SS/4X6%hAAOr^)\1A6K@$cuLI8ZQl[L^,Sjc6;Y&U"_oj72GGf;6ek@+,F#=e;!.Ic6;:qT%?<O78=[Q\=g?EjH1@#7d#kH4`!mM5LIV2K)"k$L#A\+8Y.ZZ\BZL#P/Y6Mm>a[!OE'+?KF[Al5=uJ6F/%k#3i%A5R*$c;a:1pYfNKE<5G:k785@8J).0Y8NMCrLGn!Cjjj-5<-Zj2WE9!J8X<#R1X-V['C?uTp\+cf?)4f-\25')#6ZB,GSEPVIXp'!#':QA)fm31N=!-jji5e-VQ"tpqa4\:RHGP986eS.CE-3+NmHKEa0^&nUj?hs=B'%^i>*C-8'C4r7WQ+W>Ss26`J`%7K)g@LP#NF"=gC]B2.sQ./<bfN:1lloJ6#l[GF#X*;]L!t(i[\#J_mi=<J3+qrb9`)R>Ei5O0An&d-oMn5l6<=X/5FU"`ndO\An[.+eTse1A"`=i&-(LG#I$\dMsNNj:eL@+E%GX4Q;]ohj>8bf_<8%*?>75$V6HUd+8`MG"d5[TU/qNO*8Tfs%l:f<R"SJ:;S:McH3;5&7X-C=4@;KdI=^f^nL/pGD8BS*QE*\s3U^`Z#Y\'N3K(.?1Ajr?>a?eFKcnQ<U2X6:1F1lj2WH+6G88pQAAKXp[tn@OfXei%k+'>J#W/G/:+u6%YRL,diR*r<#'*`Y1s+*M^;bMV1uVI:&&/a%WUSpdiY$#@;d7;s^_g/;\.!E'+/NQ^ftc>TQXnQF5tphh-e1R8^#(Z!F,XJFQM"P.j46Ab[*;p>0^U+]5m;aa=\TRSn./O*k6gr?g/Q7+@d,UXa3iJM<9p&l=Oi?ZqEl.UqSPE/;Jd2:D[>1QCNmH4QT[.t'eaW5*"(eJlX)/>];fn+O_02[8@3W@;*)ipUYijl&WQBDag2-DM#C4#83]F0X?48YN%(L^81dSZWB3#8["tk>alrEIgLQo;<'Lo@HRMI]6+"1$_5m0i[b85MU;hQcJ+,jq<[&oqT*'Yj^>[qr43^S.4[$AhJtmk'q8Z*!42JS<[glsjXIiUn_Vfi7KJ!d)Qab&[ZsWEGkR<@!12%'te)>Y<!qZ)B$hhqp^#IOKY3Z<!*=1s@!lO[qS#eh$1Ut!q"J>!YpV,rVCX;OP;;_]*I6=PM+NrH$`/c=:I4&hE\Z1erpl9,MU%))fbMgXN=SgY^"QgScM/oerk_Cf<%Gf<Z6_jQ/~>endstream |
920 | 2232 | endobj | 2232 | endobj |
921 | 2233 | % 'R176': class PDFStream | 2233 | % 'R176': class PDFStream |
922 | 2234 | 176 0 obj | 2234 | 176 0 obj |
923 | 2235 | % page stream | 2235 | % page stream |
924 | 2236 | << /Filter [ /ASCII85Decode | 2236 | << /Filter [ /ASCII85Decode |
925 | 2237 | /FlateDecode ] | 2237 | /FlateDecode ] |
927 | 2238 | /Length 727 >> | 2238 | /Length 1164 >> |
928 | 2239 | stream | 2239 | stream |
930 | 2240 | Gb!#YgMYJ*&:KW#Ii)/e,q(O_?[/>2+]:S&oj_=Zp,I&-Hd1uUV16g9';LdY/lIcL-ba/)k3SMBB5Om:Yk:"p!%q2pHY%is5[&d,R3&/Fpll\l+3)CYNX[3=IG_E+32.7"oI:GTEmZS;YXk-h`lQRq`R5T#_BI26^l0CQW'Ube?QeX+k:g5$>7Lh_f+#0GWJ\/-Q)NEu@PWN,(=G,[_tRdt4NhhAKjjpLiBKa3oI7!IJJ-LB/?pfDPBZm)354Xj!$5t"%*ll1LRLd@'IcoGT7.>@Vt4gso^.A*(BW#b-%Qd7SKMFJb(3^s]S$Zl\9PZ:S2VI,M&iR6M5..AGc9+!^8,-!n/@IN=69Los66u;)R`$o"kg.#jo.7Dmcc;dW2Y/='50:uRR4oMFcG9\K2X2MD;O.jP$6d4Vt]uD;Z"\#88\f;,&sS_#g&iFOl1J-Mn.8ckseVZ'\<G/$he(P>r+N'G:ien$2#sjVQ6-%JOQtp5)MKbIL1`D=PeN]XH(B4'Zf^&1G(hKcY6RhQ@)$l/%-/A$-7E<qZ2B,)=;0HiVo]]gk.RI?BIf!Ur&0g([NkUgs`[R=hSepnJm5=BO.ho^!SmY2S2m7F<HOOn>P"7)ETS$S7V1RRDCbH.'Us92t]qQkBLSYpqbE!6Kb:MB%BrdEh*fR4&XCBP'0dWhF'6Z40Ih$3n*e.%6%'t3K\._5u4D%ol7`K8S*BF)N<&slD,A8~>endstream | 2240 | Gb!#\D/Yn7&H6Rhs'ZW+:/5rnbWEOWc/#4UjAp09QV.7_^g_3a]6&8Q2ZLM/@OFq"RMTD3[Z%J"B-*Y4H"OjH3PK@:9hU#;)#h7X_0-sH_=fDji[+LE:FDd4'754H(d[B_ei[,(\7Ret@jPhAA4a/*fnr<US]o?XE\j8Z62SKR'gZ*!"!=8kIT6>R_CVHB<(&2Sdr0Oqe%!(@7!c>Vr9"^P:Ct8p&DfW=iQWsP0+'deJ.Xu!Z(>q9R7MNJjdKj03%-?rhlJJ,_f1"H)i]f+$_e>?&OfbY-1Wkr5rcY=;W%aDV;U@!PuU,8L.Wl5P(GTCOmnY#/I5\<KAKKS"eLkg`DR7Ic'5LD0^I$nn.fl0!Xp[@<1-/Ym_.BgT&Is!8AY_2)'6\Fp9mS^ic1j<#A\ZZ'N.<Aa&d2G%5#A?>3n"LSs&Bd(1'09a9e&d<3gWC`/rD6hHQla%H^\F=tj`iF`o-S_`/Q=cP.u%^C\J75rgB.>D`ZWDaf*5?uSV2n\DP&XS2fIPagbD.BQ:r62tCY!u#a&`*trCifG0t7/0X+5=<I=_@Q&5RFt18/'6qI8oiLb8:3YgT:KV&`,kcfBIb;sJ$4ukhQ/\Fs%GQX/%0L'5s6,&)HJm0%Gi9K;c-7JCAJlpCmsIgd-P?"n-h!AC1O5N7ID$-<`5)4&]K<t)Gr"N61d5EXlm</&6_X?e_P>uF/.VYB0F9U;.lB_ZHHeC/d=-nS1O'+^1m?K!G3Au=b`FE\;-aXOi)kjb:XnPAL0=AUWb?2<0rac4Q"(qQgcB(rk!VCBAV,i6fC^=Od)lpf+\^.SZOo;mdL;#6]%'PgD0?$$8bBJNi2>,8@9BFkbZ$h[F\kP<H"gRUhOtT\!V+Yq*\.u%[fR9%9f,49F+C'oEI/*<phrIisOf_;nVQARQel>o=GZ_mXW#5I\F@HJ:?7Hd;A(^b4o7$d;nCP]'Z]3\DaA"\us[j@O*(qOdlR46j).Y.go^%lf()R7jT"06lQk932!$iU#HH/Z]l/`ilL:*bX3'\m(%CtiZ'#5*4Z@r#T&DR.!.BE5V"#NOsKO3FTW_!:*o!N4Z7_qg2fAl&bs1@)q*@e87E;b!OYQ3h&U+RYn>i;hQ'A-1SSYFTs;!)YCP@T^7<9QK"t'h`_0U=GRO)[7Dj6<*V6\5f)~>endstream |
931 | 2241 | endobj | 2241 | endobj |
932 | 2242 | % 'R177': class PDFStream | 2242 | % 'R177': class PDFStream |
933 | 2243 | 177 0 obj | 2243 | 177 0 obj |
934 | 2244 | % page stream | 2244 | % page stream |
935 | 2245 | << /Filter [ /ASCII85Decode | 2245 | << /Filter [ /ASCII85Decode |
936 | 2246 | /FlateDecode ] | 2246 | /FlateDecode ] |
938 | 2247 | /Length 1059 >> | 2247 | /Length 1051 >> |
939 | 2248 | stream | 2248 | stream |
941 | 2249 | Gasan>Ap#k'Rl+-s)9#_.BQLf2L"#Th2SjCG*OuP^.&;hN4XUsm7BA=^;n#o)qkWURUP]03EHOj004KH/\q6'(,lpUK7!hZn,g[LiQqGmiplSk:@H1/_u]Oo,YddPn.uuAde2]*!mj(WSo,.$!DOOT@h()aSfcui!dOrNbJ"cu-,78/hSG!Imbs(KP")G]rfY8N]mU"Y=30:9]9@;2dc]RQ($8#Ka*,=+heB>n]&hM#lAfXD$M?_PdtjU=ocq,K(QFkn(aLJ8i\Y#U\lEkW#Ud"C9&XXAk5#BjmDN;t<E"q[0LFuTOp).HP*te!%7jQVnpdA-BDtq-U4SY2/LW2dg$o8mXhK\@6D[:q%I5_OcmWCJa*s]Q-U*\EI.T][+"7kR8p6\ZH7dKn\*%!s'lpb2(tmHDC=G$m)I^9]FLFPt(DJ*ZArL=QI_eamm1l]VOb9?'!^?i>)_j!n$ksSP#r"ROUPtuK]W8IO=r">!lCcqoYL^?n)^s=N[mFT/KXG#t2rtrMeb2N\4FeC-Q!8Y*,kS`&EZc_ncnP(?/>OroqEpO;<cjX3G7k>l1C'B:0V\eEY^<[;A\h$-5K-#P>s47;*)L?1KF.6CkJF#6.khUk$L#tq)!SnX%0\\XGJsC1#`\KPo[4^nHpekTM6e>IJoHbB^?&&k<d_6g1(t\e#2j6QTq=@#Z!(Ed!;8-(ZI&M'&^IZ!,A\>[L`L&U0SfVQVCf$?.mu61\7:s0%aKX)s-#bi72td,EK`_Ajg>,iT\gKgqdp>gE6dSffT:d5/-n#nCiHMfLM&QioKKujK5f`fX)Q;)&o,f#4k2$:XQOc/MIE<Rg*&o6cW4&8T63=ZOq@dW`WfkdaHU[-5El3F[;1?\U+s/@Y6ClT@=2Al@Q5&@fi2(C()qKES(VNrXs6(h<[4Mtb[sq"dRp%-=T1q]8'nV#*f%;@\A>m,_k(AM/U+Q3@Kph@N`uuP!m5LR\%I7Qh+-6uPEfYAj(/jY?6"aJ.E69Z4,;CH&uJ+P6HFP8NKDVq#4>8X)6V%/_CZT7M\el1`][#Agr&6mGK:4N8H~>endstream | 2249 | Gasan>Ar7S'RgRSs)9#?+<=@JV!`R#ecouR%G@KC24u3uAh/uN8LO2Gn"D;iZD\ch(q(uEQZJugn=nrUh#mRU_W$:OAPfO[7R71=/USs"0-2c"kk&b]5oS,nbOQ(fN.6u[0@O66+94Q4ioqNS(spLe1$6k=)MBO\,u?L=[2]CE)Yji.n.'pIpE';L:XVk;i1mYSS*aE.^HhTF]K84<-2f^XkJG(]$.rS:06]me[->,BU:K<=cNjsn]P3JoeAa2"c%=0?]m=b#gB%pW(nk[VD#<Ys$/Y#[>oiRcJ-%Dkk^ns$M(s`R(ubuq=,HdS0S_H6kU4cnb30nROf_TqK>Hb)U3=oIg0V[CB-'*Nh>Z&Vke`1;A;_"IO<R*8%%r_to?aWD3`cR3A^_c70<LM>KiP%CH.<3?bbDF,HFfadWOuWG@-K1Zb3bj1KdduNI2;T,@+gB^iO_@;&Xi\-M`<.V%_u)NI5&6qb3GaBT=NPB@;V]Eo>(`c_%P%1U#4@8W-(<IR0We1\>m%5i(9;]?fXaQ6D/<1k!_sNnb$5?RpIM`SNhr8Kq/=jpR''SA_8q1b_kVlbb&C>*S&H1Ak,ghO(#p'd^_'"c3]F4G64"X"tP+(Y+ahjo8\(q=CI<*S6hX/9i";Y+DDE6724(1hY4\K^km!tB4d;?g^&9Z1%[8W];nui$\06+SZE5ac@VD8nHh)`)oPL/0UfoYF444CbRL:M#M_,[!CneoC&!<Ih2/T"ET8F#!QSCP:;a:h@/nImX5P@/G[s/S6Am6AR('nk<Y*N*N1!%\Y=@Kd2brC`P;T^6#rC*]L2>dcXfHH;T\;+he'D>ZRicc:4->X,3lVA45KT/_4[555qK6S)m:%cZ")eA,eT#tCO(((J)qd)NRgpB^-+hiF*3U#=3*$]rLWj@3.d85(;_3E8%O5Z@(Q[V3?ef&HPB"LFrI-h2#:Y9^cZf6q2Zh.l8@Q6`jkV<>:Qq&BkgO++`^-'5aZ7B@??7/^m3G@U[YL6(!S]n8cT8R#,A"A)P6CVe4K_p/R2GZXJ)MG$0>7MiF>OX~>endstream |
942 | 2250 | endobj | 2250 | endobj |
943 | 2251 | xref | 2251 | xref |
944 | 2252 | 0 178 | 2252 | 0 178 |
945 | @@ -2370,72 +2370,72 @@ | |||
946 | 2370 | 0000044494 00000 n | 2370 | 0000044494 00000 n |
947 | 2371 | 0000044648 00000 n | 2371 | 0000044648 00000 n |
948 | 2372 | 0000045280 00000 n | 2372 | 0000045280 00000 n |
1007 | 2373 | 0000046611 00000 n | 2373 | 0000046601 00000 n |
1008 | 2374 | 0000047980 00000 n | 2374 | 0000047970 00000 n |
1009 | 2375 | 0000050352 00000 n | 2375 | 0000050342 00000 n |
1010 | 2376 | 0000052637 00000 n | 2376 | 0000052614 00000 n |
1011 | 2377 | 0000054973 00000 n | 2377 | 0000054936 00000 n |
1012 | 2378 | 0000057465 00000 n | 2378 | 0000057401 00000 n |
1013 | 2379 | 0000059951 00000 n | 2379 | 0000059842 00000 n |
1014 | 2380 | 0000062442 00000 n | 2380 | 0000062312 00000 n |
1015 | 2381 | 0000064606 00000 n | 2381 | 0000064483 00000 n |
1016 | 2382 | 0000067088 00000 n | 2382 | 0000066913 00000 n |
1017 | 2383 | 0000068843 00000 n | 2383 | 0000068677 00000 n |
1018 | 2384 | 0000070655 00000 n | 2384 | 0000070669 00000 n |
1019 | 2385 | 0000072771 00000 n | 2385 | 0000072785 00000 n |
1020 | 2386 | 0000074026 00000 n | 2386 | 0000074102 00000 n |
1021 | 2387 | 0000076740 00000 n | 2387 | 0000076816 00000 n |
1022 | 2388 | 0000078806 00000 n | 2388 | 0000078882 00000 n |
1023 | 2389 | 0000081192 00000 n | 2389 | 0000081268 00000 n |
1024 | 2390 | 0000083287 00000 n | 2390 | 0000083363 00000 n |
1025 | 2391 | 0000084769 00000 n | 2391 | 0000084845 00000 n |
1026 | 2392 | 0000085270 00000 n | 2392 | 0000085346 00000 n |
1027 | 2393 | 0000086527 00000 n | 2393 | 0000086603 00000 n |
1028 | 2394 | 0000088686 00000 n | 2394 | 0000088729 00000 n |
1029 | 2395 | 0000090927 00000 n | 2395 | 0000090985 00000 n |
1030 | 2396 | 0000092922 00000 n | 2396 | 0000093022 00000 n |
1031 | 2397 | 0000094351 00000 n | 2397 | 0000094529 00000 n |
1032 | 2398 | 0000096078 00000 n | 2398 | 0000096226 00000 n |
1033 | 2399 | 0000097874 00000 n | 2399 | 0000098067 00000 n |
1034 | 2400 | 0000100283 00000 n | 2400 | 0000100531 00000 n |
1035 | 2401 | 0000100946 00000 n | 2401 | 0000101271 00000 n |
1036 | 2402 | 0000102978 00000 n | 2402 | 0000103486 00000 n |
1037 | 2403 | 0000105100 00000 n | 2403 | 0000105666 00000 n |
1038 | 2404 | 0000106969 00000 n | 2404 | 0000107515 00000 n |
1039 | 2405 | 0000108914 00000 n | 2405 | 0000109371 00000 n |
1040 | 2406 | 0000111121 00000 n | 2406 | 0000111277 00000 n |
1041 | 2407 | 0000113273 00000 n | 2407 | 0000113558 00000 n |
1042 | 2408 | 0000115207 00000 n | 2408 | 0000115573 00000 n |
1043 | 2409 | 0000117769 00000 n | 2409 | 0000118204 00000 n |
1044 | 2410 | 0000119695 00000 n | 2410 | 0000120084 00000 n |
1045 | 2411 | 0000121592 00000 n | 2411 | 0000121879 00000 n |
1046 | 2412 | 0000123304 00000 n | 2412 | 0000123669 00000 n |
1047 | 2413 | 0000125301 00000 n | 2413 | 0000125390 00000 n |
1048 | 2414 | 0000127057 00000 n | 2414 | 0000127345 00000 n |
1049 | 2415 | 0000128839 00000 n | 2415 | 0000129012 00000 n |
1050 | 2416 | 0000130606 00000 n | 2416 | 0000130807 00000 n |
1051 | 2417 | 0000133048 00000 n | 2417 | 0000133104 00000 n |
1052 | 2418 | 0000135493 00000 n | 2418 | 0000135631 00000 n |
1053 | 2419 | 0000137615 00000 n | 2419 | 0000137580 00000 n |
1054 | 2420 | 0000140176 00000 n | 2420 | 0000139936 00000 n |
1055 | 2421 | 0000142418 00000 n | 2421 | 0000142453 00000 n |
1056 | 2422 | 0000144459 00000 n | 2422 | 0000144439 00000 n |
1057 | 2423 | 0000145988 00000 n | 2423 | 0000146353 00000 n |
1058 | 2424 | 0000147598 00000 n | 2424 | 0000148112 00000 n |
1059 | 2425 | 0000148918 00000 n | 2425 | 0000149444 00000 n |
1060 | 2426 | 0000150079 00000 n | 2426 | 0000150619 00000 n |
1061 | 2427 | 0000151241 00000 n | 2427 | 0000151744 00000 n |
1062 | 2428 | 0000152376 00000 n | 2428 | 0000152850 00000 n |
1063 | 2429 | 0000154331 00000 n | 2429 | 0000154642 00000 n |
1064 | 2430 | 0000155202 00000 n | 2430 | 0000155951 00000 n |
1065 | 2431 | trailer | 2431 | trailer |
1066 | 2432 | << /ID | 2432 | << /ID |
1067 | 2433 | % ReportLab generated PDF document -- digest (http://www.reportlab.com) | 2433 | % ReportLab generated PDF document -- digest (http://www.reportlab.com) |
1069 | 2434 | [(\242\252\270\340f0b\216\324\353o\343\364\370\200\353) (\242\252\270\340f0b\216\324\353o\343\364\370\200\353)] | 2434 | [(c\0243\337\031,U\034\302\260}\304\003\260!\242) (c\0243\337\031,U\034\302\260}\304\003\260!\242)] |
1070 | 2435 | 2435 | ||
1071 | 2436 | /Info 71 0 R | 2436 | /Info 71 0 R |
1072 | 2437 | /Root 70 0 R | 2437 | /Root 70 0 R |
1073 | 2438 | /Size 178 >> | 2438 | /Size 178 >> |
1074 | 2439 | startxref | 2439 | startxref |
1076 | 2440 | 156378 | 2440 | 157119 |
1077 | 2441 | %%EOF | 2441 | %%EOF |
1078 | 2442 | 2442 | ||
1079 | === modified file 'docs/userguide/app_demos.py' | |||
1080 | --- docs/userguide/app_demos.py 2009-02-22 14:19:44 +0000 | |||
1081 | +++ docs/userguide/app_demos.py 2013-04-14 00:52:26 +0000 | |||
1082 | @@ -1,4 +1,4 @@ | |||
1084 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
1085 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
1086 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/app_demos.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/app_demos.py |
1087 | 4 | from tools.docco.rl_doc_utils import * | 4 | from tools.docco.rl_doc_utils import * |
1088 | 5 | 5 | ||
1089 | === modified file 'docs/userguide/ch1_intro.py' | |||
1090 | --- docs/userguide/ch1_intro.py 2010-12-06 12:45:44 +0000 | |||
1091 | +++ docs/userguide/ch1_intro.py 2013-04-14 00:52:26 +0000 | |||
1092 | @@ -1,6 +1,6 @@ | |||
1094 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
1095 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
1097 | 3 | __version__ = '$Id: ch1_intro.py 3790 2010-09-29 14:20:28Z tim $' | 3 | __version__ = '$Id: ch1_intro.py 3960 2012-09-27 15:22:33Z guillaume $' |
1098 | 4 | from tools.docco.rl_doc_utils import * | 4 | from tools.docco.rl_doc_utils import * |
1099 | 5 | from reportlab.platypus.tableofcontents import TableOfContents | 5 | from reportlab.platypus.tableofcontents import TableOfContents |
1100 | 6 | from datetime import datetime | 6 | from datetime import datetime |
1101 | @@ -181,6 +181,7 @@ | |||
1102 | 181 | disc("""Many people have contributed to ReportLab. We would like to thank in particular | 181 | disc("""Many people have contributed to ReportLab. We would like to thank in particular |
1103 | 182 | (in alphabetical order): | 182 | (in alphabetical order): |
1104 | 183 | Albertas Agejevas, | 183 | Albertas Agejevas, |
1105 | 184 | Alex Buck, | ||
1106 | 184 | Andre Reitz, | 185 | Andre Reitz, |
1107 | 185 | Andrew Mercer, | 186 | Andrew Mercer, |
1108 | 186 | Benjamin Dumke, | 187 | Benjamin Dumke, |
1109 | @@ -189,13 +190,16 @@ | |||
1110 | 189 | Chris Lee, | 190 | Chris Lee, |
1111 | 190 | Christian Jacobs, | 191 | Christian Jacobs, |
1112 | 191 | Dinu Gherman, | 192 | Dinu Gherman, |
1114 | 192 | Eric Johnson, | 193 | Eric Johnson, |
1115 | 194 | Felix Labrecque, | ||
1116 | 193 | Gary Poster, | 195 | Gary Poster, |
1117 | 194 | Germán M. Bravo, | 196 | Germán M. Bravo, |
1118 | 197 | Guillaume Francois, | ||
1119 | 195 | Hans Brand, | 198 | Hans Brand, |
1120 | 196 | Henning Vonbargen, | 199 | Henning Vonbargen, |
1121 | 197 | Hosam Aly, | 200 | Hosam Aly, |
1123 | 198 | Ian Stevens, | 201 | Ian Stevens, |
1124 | 202 | James Martin-Collar, | ||
1125 | 199 | Jeff Bauer, | 203 | Jeff Bauer, |
1126 | 200 | Jerome Alet, | 204 | Jerome Alet, |
1127 | 201 | Jerry Casiano, | 205 | Jerry Casiano, |
1128 | @@ -210,6 +214,7 @@ | |||
1129 | 210 | Moshe Wagner, | 214 | Moshe Wagner, |
1130 | 211 | Nate Silva, | 215 | Nate Silva, |
1131 | 212 | Paul McNett, | 216 | Paul McNett, |
1132 | 217 | Peter Johnson, | ||
1133 | 213 | PJACock, | 218 | PJACock, |
1134 | 214 | Publio da Costa Melo, | 219 | Publio da Costa Melo, |
1135 | 215 | Randolph Bentson, | 220 | Randolph Bentson, |
1136 | @@ -240,16 +245,26 @@ | |||
1137 | 240 | heading3("A note on available versions") | 245 | heading3("A note on available versions") |
1138 | 241 | disc("""Our website ^http://www.reportlab.com/^ will always have up-to-date | 246 | disc("""Our website ^http://www.reportlab.com/^ will always have up-to-date |
1139 | 242 | information on setups and installations. The latest version of the ReportLab library can be found at | 247 | information on setups and installations. The latest version of the ReportLab library can be found at |
1142 | 243 | ^http://www.reportlab.com/software/opensource/rl-toolkit/download/^. Older versions can be found at ^http://www.reportlab.com/ftp/^. | 248 | ^http://www.reportlab.com/software/opensource/rl-toolkit/download/^. |
1143 | 244 | Each successive version is stored in both zip | 249 | Older versions can be found at ^http://www.reportlab.com/ftp/^. |
1144 | 250 | """) | ||
1145 | 251 | disc("""Each successive version is stored in both zip | ||
1146 | 245 | and tgz format, but the contents are identical apart from line endings. | 252 | and tgz format, but the contents are identical apart from line endings. |
1147 | 246 | Versions are numbered: $ReportLab_<major_version>_<minor_version>.zip$, | 253 | Versions are numbered: $ReportLab_<major_version>_<minor_version>.zip$, |
1150 | 247 | $ReportLab_<major_version>_<minor_version>.tgz$ and so on. | 254 | $ReportLab_<major_version>_<minor_version>.tgz$ and so on. |
1151 | 248 | The latest stable version is $reportlab2.5$ (.zip or .tgz), | 255 | """) |
1152 | 256 | disc(""" | ||
1153 | 257 | The latest stable version is $reportlab2.6$ (.zip or .tgz). | ||
1154 | 249 | Daily snapshots of the trunk are available as | 258 | Daily snapshots of the trunk are available as |
1155 | 250 | $reportlab-daily-unix.tar.gz$ or $reportlab-daily-win32.zip$. | 259 | $reportlab-daily-unix.tar.gz$ or $reportlab-daily-win32.zip$. |
1158 | 251 | Finally, from version 2.4 onwards, there is also a Windows installer | 260 | """) |
1159 | 252 | available for Python versions 2.4 - 2.7, named $ReportLab-2.x.win32-py2.x.exe$ | 261 | disc("""Finally, from version 2.4 onwards, there is also a Windows installer |
1160 | 262 | available for Python versions 2.5 - 2.7, named $ReportLab-2.x.win32-py2.x.exe$ | ||
1161 | 263 | """) | ||
1162 | 264 | |||
1163 | 265 | pencilnote() | ||
1164 | 266 | disc("""We plan to drop the support of Python 2.5 in our next release. | ||
1165 | 267 | We advise you to move to Python 2.6 or 2.7. | ||
1166 | 253 | """) | 268 | """) |
1167 | 254 | 269 | ||
1168 | 255 | heading3("Installation on Windows") | 270 | heading3("Installation on Windows") |
1169 | @@ -257,8 +272,8 @@ | |||
1170 | 257 | restartList() | 272 | restartList() |
1171 | 258 | 273 | ||
1172 | 259 | list("""First, install Python from $http://www.python.org/.$ | 274 | list("""First, install Python from $http://www.python.org/.$ |
1175 | 260 | Reportlab 2.x works with Python 2.4 upwards but we recommend to use | 275 | Reportlab 2.x works with Python 2.5 upwards but we recommend to use |
1176 | 261 | the latest stable version of Python 2.5 or 2.6. | 276 | the latest stable version of Python 2.7. |
1177 | 262 | After installing, you should be able to run the | 277 | After installing, you should be able to run the |
1178 | 263 | 'Python (command line)' option from the Start Menu. | 278 | 'Python (command line)' option from the Start Menu. |
1179 | 264 | """) | 279 | """) |
1180 | @@ -304,8 +319,10 @@ | |||
1181 | 304 | 319 | ||
1182 | 305 | heading3("Installation instructions for Unix") | 320 | heading3("Installation instructions for Unix") |
1183 | 306 | disc(""" | 321 | disc(""" |
1185 | 307 | 322 | Many Linux distributions already include or can deliver a ReportLab distribution, although this may be a few months behind our own releases. On Ubuntu, simply use ^sudo apt-get install python-reportlab^. In addition, we support the Python packaging mechanisms so you can use ^easy_install reportlab^ in most Python environments. | |
1186 | 308 | """) | 323 | """) |
1187 | 324 | disc(""" | ||
1188 | 325 | If you want to install the latest version of our code, or to install your own reportlab to go with our commercial distribution, you can install from source as follows:""") | ||
1189 | 309 | 326 | ||
1190 | 310 | restartList() | 327 | restartList() |
1191 | 311 | list("""First, install Python. On a large number of Unix and Linux distributions, Python is already installed, | 328 | list("""First, install Python. On a large number of Unix and Linux distributions, Python is already installed, |
1192 | @@ -397,8 +414,6 @@ | |||
1193 | 397 | bullet("""allowtableBoundsErrors: set to 0 to force an error on very large Platypus table elements""") | 414 | bullet("""allowtableBoundsErrors: set to 0 to force an error on very large Platypus table elements""") |
1194 | 398 | bullet("""emptyTableAction: Controls behaviour for empty tables, can be 'error' (default), 'indicate' or 'ignore'.""") | 415 | bullet("""emptyTableAction: Controls behaviour for empty tables, can be 'error' (default), 'indicate' or 'ignore'.""") |
1195 | 399 | 416 | ||
1196 | 400 | |||
1197 | 401 | |||
1198 | 402 | heading2("Learning More About Python") | 417 | heading2("Learning More About Python") |
1199 | 403 | 418 | ||
1200 | 404 | disc(""" | 419 | disc(""" |
1201 | @@ -440,7 +455,7 @@ | |||
1202 | 440 | 455 | ||
1203 | 441 | bullet("""<b>Dive Into Python</b>. | 456 | bullet("""<b>Dive Into Python</b>. |
1204 | 442 | A free Python tutorial for experienced programmers. | 457 | A free Python tutorial for experienced programmers. |
1206 | 443 | $http://diveintopython.org/$ | 458 | $http://www.diveintopython.net/$ |
1207 | 444 | """) | 459 | """) |
1208 | 445 | 460 | ||
1209 | 446 | 461 | ||
1210 | @@ -466,44 +481,49 @@ | |||
1211 | 466 | target dates. | 481 | target dates. |
1212 | 467 | """) | 482 | """) |
1213 | 468 | 483 | ||
1218 | 469 | heading2("What's New in ReportLab 2.4") | 484 | heading2("What's New in ReportLab 2.6") |
1219 | 470 | disc("""Many new features have been added and numerous bugs have been fixed, a big | 485 | disc("""This is a minor release focusing mainly on improved documentation. There are a |
1220 | 471 | thanks goes to the community for their help in reporting bugs and providing patches. | 486 | number of minor enhancements, and a larger number of previous-undocumented |
1221 | 472 | Thanks to everybody who has contributed to the open-source toolkit in the run-up to the 2.4 release, | 487 | enhancements which we have documented better.""") |
1222 | 488 | |||
1223 | 489 | disc("""A big thanks goes to the community for their help in reporting bugs and providing patches. | ||
1224 | 490 | Thanks to everybody who has contributed to the open-source toolkit in the run-up to the 2.6 release, | ||
1225 | 473 | whether by reporting bugs, sending patches, or contributing to the reportlab-users mailing list. | 491 | whether by reporting bugs, sending patches, or contributing to the reportlab-users mailing list. |
1259 | 474 | Thanks especially to the following people: PJACock, Hans Brand, Ian Stevens, Yoann Roman, Hosam Aly | 492 | Thanks especially to the following people: Alex Buck, Felix Labrecque, |
1260 | 475 | Randolph Bentson, Volker Haas, Simon King, Henning Vonbargen, Michael Egorov, Mike Folwell and | 493 | Peter Johnson, James Martin-Collar and Guillaume Francois. |
1261 | 476 | Roberto Alsina. | 494 | This page documents what has changed since version 2.5.""") |
1262 | 477 | This page documents what has changed since version 2.3.""") | 495 | |
1263 | 478 | 496 | disc('Reportlab 2.6 is installable with easy_install. You must have installed a compatible C compiler and the dependencies such as Freetype and PIL.') | |
1264 | 479 | disc('Reportlab 2.4 is installable with easy_install. You must have installed a compatible C compiler and the dependencies such as Freetype and PIL.') | 497 | |
1265 | 480 | 498 | heading4('General changes') | |
1266 | 481 | heading4('PDF') | 499 | bullet("""Manuals have been reformatted with more pleasing code snippets and tables of |
1267 | 482 | bullet("""Canvas automatic cropmarks.""") | 500 | contents, and reviewed and expanded.""") |
1268 | 483 | bullet("""RGB alpha colours - colours can now be transparent with an alpha value.""") | 501 | |
1269 | 484 | bullet("""CMYK overPrint - physical colour mix in the printer - similar to RGB alpha but | 502 | heading4('Flowing documents (Platypus)') |
1270 | 485 | used in professional printing.""") | 503 | bullet("""Added support for HTML-style list objects.""") |
1271 | 486 | bullet("""Colours module has a fade function that returns a list of different shades made | 504 | bullet("""Added flexible mechanism for drawing bullets.""") |
1272 | 487 | up of one base colour.""") | 505 | bullet("""Allowed XPreformatted objects to use Asian line wrapping.""") |
1273 | 488 | bullet("""Unicode font file names are now accepted.""") | 506 | bullet("""Added an 'autoNextPageTemplate' attribute to PageTemplates. For example you |
1274 | 489 | bullet("""Lots of improvements and verbosity to error messages and the way they are handled. | 507 | can now set up a 'chapter first page template' which will always be followed |
1275 | 490 | Font size can now be specified in pixels.""") | 508 | by a 'continuation template' on the next page break, saving the programmer from |
1276 | 491 | 509 | having to issue control flow commands in the story.""") | |
1277 | 492 | heading4('Platypus') | 510 | bullet("""Added a TopPadder flowable, which will 'wrap' another Flowable and move it |
1278 | 493 | bullet("""Added support for heading styles h4-h6.""") | 511 | to the bottom of the current page.""") |
1279 | 494 | bullet("""Improved support for onDraw and SimpleIndex.""") | 512 | bullet("""More helpful error messages when large tables cannot be rendered.""") |
1280 | 495 | bullet("""Add support for index tableStyle.""") | 513 | bullet("""Documentation for images within text (test_032_images).""") |
1281 | 496 | bullet("""Added an alphabetic grouping indexing class.""") | 514 | bullet("""Trailing dots for use on contents pages.""") |
1282 | 497 | bullet("""Added support for multi-level and alphabetical indexes.""") | 515 | |
1283 | 498 | bullet("""Added support for an unlimited number of TOC levels with default styles.""") | 516 | heading4('Charts and graphics') |
1284 | 499 | bullet("""Index entries can now be clickable.""") | 517 | bullet("""Support for UPCA bar codes.""") |
1285 | 500 | 518 | bullet("""We now have a semi-intelligent system for labelling pie charts with | |
1286 | 501 | heading4('Graphics') | 519 | callout lines. Thanks to James Martin-Collar, a maths student at Warwick |
1287 | 502 | bullet("""Chart axes values can be reversible.""") | 520 | University, who did this as his summer internship.""") |
1288 | 503 | bullet("""Labels on chart axes can now be drawn above or below the axes (hi or low).""") | 521 | bullet("""Axes - added startOffset and endOffset properties; allowed for axis |
1289 | 504 | bullet("""A per swatch callout is now allowed in the legend.""") | 522 | background annotations.""") |
1290 | 505 | bullet("""A new anchoring mode for string 'numeric' that align numerical strings by their decimal place.""") | 523 | bullet("""Bar charts - allow more control of z Index (i.e. drawing order of axes and |
1291 | 506 | bullet("""Drawing has a resized method now to change the size dynamically.""") | 524 | lines)""") |
1292 | 525 | bullet("""Pie charts - fixed bugs in 3d appearance.""") | ||
1293 | 526 | bullet("""SVG output back end has seen some bugs fixed and now outputs resizeable SVG.""") | ||
1294 | 507 | 527 | ||
1295 | 508 | # Noteworthy bug fixes Section ####################### | 528 | # Noteworthy bug fixes Section ####################### |
1296 | 509 | #heading3("Noteworthy bug fixes") | 529 | #heading3("Noteworthy bug fixes") |
1297 | 510 | 530 | ||
1298 | === modified file 'docs/userguide/ch2_graphics.py' | |||
1299 | --- docs/userguide/ch2_graphics.py 2010-12-06 12:45:44 +0000 | |||
1300 | +++ docs/userguide/ch2_graphics.py 2013-04-14 00:52:26 +0000 | |||
1301 | @@ -1,4 +1,4 @@ | |||
1303 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
1304 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
1305 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch2_graphics.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch2_graphics.py |
1306 | 4 | from tools.docco.rl_doc_utils import * | 4 | from tools.docco.rl_doc_utils import * |
1307 | @@ -1227,28 +1227,27 @@ | |||
1308 | 1227 | heading2("Further Reading: The ReportLab Graphics Library") | 1227 | heading2("Further Reading: The ReportLab Graphics Library") |
1309 | 1228 | 1228 | ||
1310 | 1229 | disc(""" | 1229 | disc(""" |
1312 | 1230 | So far the graphics we have seen was created on a fairly low level. | 1230 | So far the graphics we have seen were created on a fairly low level. |
1313 | 1231 | It should be noted, though, that there is another way of creating | 1231 | It should be noted, though, that there is another way of creating |
1315 | 1232 | much more sophisticated graphics using the emerging dedicated | 1232 | much more sophisticated graphics using the dedicated |
1316 | 1233 | high-level <i>ReportLab Graphics Library</i>. | 1233 | high-level <i>ReportLab Graphics Library</i>. |
1317 | 1234 | """) | 1234 | """) |
1318 | 1235 | 1235 | ||
1319 | 1236 | disc(""" | 1236 | disc(""" |
1320 | 1237 | It can be used to produce high-quality, platform-independant, | 1237 | It can be used to produce high-quality, platform-independant, |
1321 | 1238 | reusable graphics for different output formats (vector and bitmap) | 1238 | reusable graphics for different output formats (vector and bitmap) |
1323 | 1239 | like PDF, EPS and soon others like SVG. | 1239 | like PDF, EPS, SVG, JPG and PNG. |
1324 | 1240 | """) | 1240 | """) |
1325 | 1241 | 1241 | ||
1326 | 1242 | disc(""" | 1242 | disc(""" |
1331 | 1243 | A thorough description of its philsophy and features is beyond the | 1243 | A more thorough description of its philsophy and features is |
1332 | 1244 | scope of this general user guide and the reader is recommended to | 1244 | now covered in Chapter 11 of this document, <i>Graphics</i>, which |
1333 | 1245 | continue with the <i>"ReportLab Graphics Guide"</i>. | 1245 | contains information about the existing components and |
1330 | 1246 | There she will find information about the existing components and | ||
1334 | 1247 | how to create customized ones. | 1246 | how to create customized ones. |
1335 | 1248 | """) | 1247 | """) |
1336 | 1249 | 1248 | ||
1337 | 1250 | disc(""" | 1249 | disc(""" |
1339 | 1251 | Also, the graphics guide contains a presentation of an emerging | 1250 | Chapter 11 also contains details of the ReportLab |
1340 | 1252 | charting package and its components (labels, axes, legends and | 1251 | charting package and its components (labels, axes, legends and |
1341 | 1253 | different types of charts like bar, line and pie charts) that | 1252 | different types of charts like bar, line and pie charts) that |
1342 | 1254 | builds directly on the graphics library. | 1253 | builds directly on the graphics library. |
1343 | 1255 | 1254 | ||
1344 | === modified file 'docs/userguide/ch2a_fonts.py' | |||
1345 | --- docs/userguide/ch2a_fonts.py 2008-10-19 23:16:31 +0000 | |||
1346 | +++ docs/userguide/ch2a_fonts.py 2013-04-14 00:52:26 +0000 | |||
1347 | @@ -1,4 +1,4 @@ | |||
1349 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
1350 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
1351 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch2a_fonts.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch2a_fonts.py |
1352 | 4 | from tools.docco.rl_doc_utils import * | 4 | from tools.docco.rl_doc_utils import * |
1353 | 5 | 5 | ||
1354 | === modified file 'docs/userguide/ch3_pdffeatures.py' | |||
1355 | --- docs/userguide/ch3_pdffeatures.py 2009-02-22 14:19:44 +0000 | |||
1356 | +++ docs/userguide/ch3_pdffeatures.py 2013-04-14 00:52:26 +0000 | |||
1357 | @@ -1,4 +1,4 @@ | |||
1359 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
1360 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
1361 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch3_pdffeatures.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch3_pdffeatures.py |
1362 | 4 | from tools.docco.rl_doc_utils import * | 4 | from tools.docco.rl_doc_utils import * |
1363 | 5 | 5 | ||
1364 | === modified file 'docs/userguide/ch4_platypus_concepts.py' | |||
1365 | --- docs/userguide/ch4_platypus_concepts.py 2009-02-22 14:19:44 +0000 | |||
1366 | +++ docs/userguide/ch4_platypus_concepts.py 2013-04-14 00:52:26 +0000 | |||
1367 | @@ -1,4 +1,4 @@ | |||
1369 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
1370 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
1371 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch4_platypus_concepts.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch4_platypus_concepts.py |
1372 | 4 | from tools.docco.rl_doc_utils import * | 4 | from tools.docco.rl_doc_utils import * |
1373 | 5 | 5 | ||
1374 | === modified file 'docs/userguide/ch5_paragraphs.py' | |||
1375 | --- docs/userguide/ch5_paragraphs.py 2010-12-06 12:45:44 +0000 | |||
1376 | +++ docs/userguide/ch5_paragraphs.py 2013-04-14 00:52:26 +0000 | |||
1377 | @@ -1,4 +1,4 @@ | |||
1379 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
1380 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
1381 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch5_paragraphs.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch5_paragraphs.py |
1382 | 4 | from tools.docco.rl_doc_utils import * | 4 | from tools.docco.rl_doc_utils import * |
1383 | 5 | 5 | ||
1384 | === modified file 'docs/userguide/ch6_tables.py' | |||
1385 | --- docs/userguide/ch6_tables.py 2010-12-06 12:45:44 +0000 | |||
1386 | +++ docs/userguide/ch6_tables.py 2013-04-14 00:52:26 +0000 | |||
1387 | @@ -1,8 +1,8 @@ | |||
1389 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
1390 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
1391 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch6_tables.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch6_tables.py |
1392 | 4 | from tools.docco.rl_doc_utils import * | 4 | from tools.docco.rl_doc_utils import * |
1394 | 5 | from reportlab.platypus import Image | 5 | from reportlab.platypus import Image,ListFlowable, ListItem |
1395 | 6 | import reportlab | 6 | import reportlab |
1396 | 7 | 7 | ||
1397 | 8 | heading1("Tables and TableStyles") | 8 | heading1("Tables and TableStyles") |
1398 | @@ -397,16 +397,41 @@ | |||
1399 | 397 | """) | 397 | """) |
1400 | 398 | 398 | ||
1401 | 399 | heading1("""Other Useful $Flowables$""") | 399 | heading1("""Other Useful $Flowables$""") |
1403 | 400 | heading2("""$Preformatted(text, style, bulletText = None, dedent=0)$""") | 400 | heading2("""$Preformatted(text, style, bulletText=None, dedent=0, maxLineLength=None, splitChars=None, newLineChars=None)$""") |
1404 | 401 | disc(""" | 401 | disc(""" |
1405 | 402 | Creates a preformatted paragraph which does no wrapping, line splitting or other manipulations. | 402 | Creates a preformatted paragraph which does no wrapping, line splitting or other manipulations. |
1406 | 403 | No $XML$ style tags are taken account of in the text. | 403 | No $XML$ style tags are taken account of in the text. |
1407 | 404 | If dedent is non zero $dedent$ common leading | 404 | If dedent is non zero $dedent$ common leading |
1408 | 405 | spaces will be removed from the front of each line. | 405 | spaces will be removed from the front of each line. |
1409 | 406 | """) | 406 | """) |
1413 | 407 | heading2("""$XPreformatted(text, style, bulletText = None, dedent=0, frags=None)$""") | 407 | heading3("Defining a maximum line length") |
1414 | 408 | disc(""" | 408 | disc(""" |
1415 | 409 | This is a non rearranging form of the $Paragraph$ class; $XML$ tags are allowed in | 409 | You can use the property $maxLineLength$ to define a maximum line length. If a line length exceeds this maximum value, the line will be automatically splitted. |
1416 | 410 | """) | ||
1417 | 411 | disc(""" | ||
1418 | 412 | The line will be split on any single character defined in $splitChars$. If no value is provided for this property, the line will be split on any of the following standard characters: space, colon, full stop, semi-colon, coma, hyphen, forward slash, back slash, left parenthesis, left square bracket and left curly brace | ||
1419 | 413 | """) | ||
1420 | 414 | disc(""" | ||
1421 | 415 | Characters can be automatically inserted at the beginning of each line that has been created. You can set the property $newLineChars$ to the characters you want to use. | ||
1422 | 416 | """) | ||
1423 | 417 | EmbeddedCode(""" | ||
1424 | 418 | from reportlab.lib.styles import getSampleStyleSheet | ||
1425 | 419 | stylesheet=getSampleStyleSheet() | ||
1426 | 420 | normalStyle = stylesheet['Code'] | ||
1427 | 421 | text=''' | ||
1428 | 422 | class XPreformatted(Paragraph): | ||
1429 | 423 | def __init__(self, text, style, bulletText = None, frags=None, caseSensitive=1): | ||
1430 | 424 | self.caseSensitive = caseSensitive | ||
1431 | 425 | if maximumLineLength and text: | ||
1432 | 426 | text = self.stopLine(text, maximumLineLength, splitCharacters) | ||
1433 | 427 | cleaner = lambda text, dedent=dedent: string.join(_dedenter(text or '',dedent),'') | ||
1434 | 428 | self._setup(text, style, bulletText, frags, cleaner) | ||
1435 | 429 | ''' | ||
1436 | 430 | t=Preformatted(text,normalStyle,maxLineLength=60, newLineChars='> ') | ||
1437 | 431 | """) | ||
1438 | 432 | heading2("""$XPreformatted(text, style, bulletText=None, dedent=0, frags=None)$""") | ||
1439 | 433 | disc(""" | ||
1440 | 434 | This is a non rearranging form of the $Paragraph$ class; XML tags are allowed in | ||
1441 | 410 | $text$ and have the same meanings as for the $Paragraph$ class. | 435 | $text$ and have the same meanings as for the $Paragraph$ class. |
1442 | 411 | As for $Preformatted$, if dedent is non zero $dedent$ common leading | 436 | As for $Preformatted$, if dedent is non zero $dedent$ common leading |
1443 | 412 | spaces will be removed from the front of each line. | 437 | spaces will be removed from the front of each line. |
1444 | @@ -414,7 +439,7 @@ | |||
1445 | 414 | EmbeddedCode(""" | 439 | EmbeddedCode(""" |
1446 | 415 | from reportlab.lib.styles import getSampleStyleSheet | 440 | from reportlab.lib.styles import getSampleStyleSheet |
1447 | 416 | stylesheet=getSampleStyleSheet() | 441 | stylesheet=getSampleStyleSheet() |
1449 | 417 | normalStyle = stylesheet['Normal'] | 442 | normalStyle = stylesheet['Code'] |
1450 | 418 | text=''' | 443 | text=''' |
1451 | 419 | 444 | ||
1452 | 420 | This is a non rearranging form of the <b>Paragraph</b> class; | 445 | This is a non rearranging form of the <b>Paragraph</b> class; |
1453 | @@ -429,6 +454,7 @@ | |||
1454 | 429 | ''' | 454 | ''' |
1455 | 430 | t=XPreformatted(text,normalStyle,dedent=3) | 455 | t=XPreformatted(text,normalStyle,dedent=3) |
1456 | 431 | """) | 456 | """) |
1457 | 457 | |||
1458 | 432 | heading2("""$Image(filename, width=None, height=None)$""") | 458 | heading2("""$Image(filename, width=None, height=None)$""") |
1459 | 433 | disc("""Create a flowable which will contain the image defined by the data in file $filename$. | 459 | disc("""Create a flowable which will contain the image defined by the data in file $filename$. |
1460 | 434 | The default <b>PDF</b> image type <i>jpeg</i> is supported and if the <b>PIL</b> extension to <b>Python</b> | 460 | The default <b>PDF</b> image type <i>jpeg</i> is supported and if the <b>PIL</b> extension to <b>Python</b> |
1461 | @@ -437,7 +463,7 @@ | |||
1462 | 437 | not specified (or specified as $None$) then the corresponding pixel dimension of the image is assumed | 463 | not specified (or specified as $None$) then the corresponding pixel dimension of the image is assumed |
1463 | 438 | to be in <i>points</i> and used. | 464 | to be in <i>points</i> and used. |
1464 | 439 | """) | 465 | """) |
1466 | 440 | I=os.path.join(os.path.dirname(reportlab.__file__),'docs','images','lj8100.jpg') | 466 | I="../images/lj8100.jpg" |
1467 | 441 | eg(""" | 467 | eg(""" |
1468 | 442 | Image("lj8100.jpg") | 468 | Image("lj8100.jpg") |
1469 | 443 | """,after=0.1) | 469 | """,after=0.1) |
1470 | @@ -655,3 +681,43 @@ | |||
1471 | 655 | disc(""" | 681 | disc(""" |
1472 | 656 | This indexes the terms "comma (,)", "," and "...". | 682 | This indexes the terms "comma (,)", "," and "...". |
1473 | 657 | """) | 683 | """) |
1474 | 684 | |||
1475 | 685 | heading2("""$ListFlowable(),ListItem()$""") | ||
1476 | 686 | disc(""" | ||
1477 | 687 | Use these classes to make ordered and unordered lists. Lists can be nested. | ||
1478 | 688 | """) | ||
1479 | 689 | |||
1480 | 690 | disc(""" | ||
1481 | 691 | $ListFlowable()$ will create an ordered list, which can contain any flowable. The class has a number of parameters to change font, colour, size, style and position of list numbers, or of bullets in unordered lists. The type of numbering can also be set to use lower or upper case letters ('A,B,C' etc.) or Roman numerals (capitals or lowercase) using the bulletType property. To change the list to an unordered type, set bulletType='bullet'. | ||
1482 | 692 | """) | ||
1483 | 693 | |||
1484 | 694 | disc(""" | ||
1485 | 695 | Items within a $ListFlowable()$ list can be changed from their default appearance by wrapping them in a $ListItem()$ class and setting its properties. | ||
1486 | 696 | """) | ||
1487 | 697 | |||
1488 | 698 | disc(""" | ||
1489 | 699 | The following will create an ordered list, and set the third item to an unordered sublist. | ||
1490 | 700 | """) | ||
1491 | 701 | |||
1492 | 702 | EmbeddedCode(""" | ||
1493 | 703 | from reportlab.platypus import ListFlowable, ListItem | ||
1494 | 704 | from reportlab.lib.styles import getSampleStyleSheet | ||
1495 | 705 | styles = getSampleStyleSheet() | ||
1496 | 706 | style = styles["Normal"] | ||
1497 | 707 | t = ListFlowable( | ||
1498 | 708 | [ | ||
1499 | 709 | Paragraph("Item no.1", style), | ||
1500 | 710 | ListItem(Paragraph("Item no. 2", style),bulletColor="green",value=7), | ||
1501 | 711 | ListFlowable( | ||
1502 | 712 | [ | ||
1503 | 713 | Paragraph("sublist item 1", style), | ||
1504 | 714 | ListItem(Paragraph('sublist item 2', style),bulletColor='red',value='square') | ||
1505 | 715 | ], | ||
1506 | 716 | bulletType='bullet', | ||
1507 | 717 | start='square', | ||
1508 | 718 | ), | ||
1509 | 719 | Paragraph("Item no.4", style), | ||
1510 | 720 | ], | ||
1511 | 721 | bulletType='i' | ||
1512 | 722 | ) | ||
1513 | 723 | """) | ||
1514 | 658 | 724 | ||
1515 | === modified file 'docs/userguide/ch7_custom.py' | |||
1516 | --- docs/userguide/ch7_custom.py 2008-10-19 23:16:31 +0000 | |||
1517 | +++ docs/userguide/ch7_custom.py 2013-04-14 00:52:26 +0000 | |||
1518 | @@ -1,4 +1,4 @@ | |||
1520 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
1521 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
1522 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch7_custom.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch7_custom.py |
1523 | 4 | from tools.docco.rl_doc_utils import * | 4 | from tools.docco.rl_doc_utils import * |
1524 | 5 | 5 | ||
1525 | === modified file 'docs/userguide/genuserguide.py' | |||
1526 | --- docs/userguide/genuserguide.py 2009-02-22 14:19:44 +0000 | |||
1527 | +++ docs/userguide/genuserguide.py 2013-04-14 00:52:26 +0000 | |||
1528 | @@ -1,8 +1,8 @@ | |||
1529 | 1 | #!/bin/env python | 1 | #!/bin/env python |
1531 | 2 | #Copyright ReportLab Europe Ltd. 2000-2004 | 2 | #Copyright ReportLab Europe Ltd. 2000-2012 |
1532 | 3 | #see license.txt for license details | 3 | #see license.txt for license details |
1533 | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/genuserguide.py | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/genuserguide.py |
1535 | 5 | __version__=''' $Id: genuserguide.py 3376 2009-01-19 12:05:41Z jonas $ ''' | 5 | __version__=''' $Id: genuserguide.py 3959 2012-09-27 14:39:39Z robin $ ''' |
1536 | 6 | __doc__ = """ | 6 | __doc__ = """ |
1537 | 7 | This module contains the script for building the user guide. | 7 | This module contains the script for building the user guide. |
1538 | 8 | """ | 8 | """ |
1539 | 9 | 9 | ||
1540 | === modified file 'docs/userguide/graph_charts.py' | |||
1541 | --- docs/userguide/graph_charts.py 2010-02-16 23:32:55 +0000 | |||
1542 | +++ docs/userguide/graph_charts.py 2013-04-14 00:52:26 +0000 | |||
1543 | @@ -1,6 +1,6 @@ | |||
1545 | 1 | #Copyright ReportLab Europe Ltd. 2000-2008 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
1546 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
1548 | 3 | __version__=''' $Id: graph_charts.py 3563 2009-10-01 10:52:36Z damian $ ''' | 3 | __version__=''' $Id: graph_charts.py 3959 2012-09-27 14:39:39Z robin $ ''' |
1549 | 4 | from tools.docco.rl_doc_utils import * | 4 | from tools.docco.rl_doc_utils import * |
1550 | 5 | from reportlab.graphics.shapes import * | 5 | from reportlab.graphics.shapes import * |
1551 | 6 | 6 | ||
1552 | @@ -133,7 +133,7 @@ | |||
1553 | 133 | properties.""") | 133 | properties.""") |
1554 | 134 | 134 | ||
1555 | 135 | 135 | ||
1557 | 136 | heading3("Labels") | 136 | heading2("Labels") |
1558 | 137 | 137 | ||
1559 | 138 | disc(""" | 138 | disc(""" |
1560 | 139 | A label is a string of text attached to some chart element. | 139 | A label is a string of text attached to some chart element. |
1561 | @@ -246,7 +246,7 @@ | |||
1562 | 246 | 246 | ||
1563 | 247 | 247 | ||
1564 | 248 | 248 | ||
1566 | 249 | heading3("Axes") | 249 | heading2("Axes") |
1567 | 250 | 250 | ||
1568 | 251 | disc(""" | 251 | disc(""" |
1569 | 252 | We identify two basic kinds of axes - <i>Value</i> and <i>Category</i> | 252 | We identify two basic kinds of axes - <i>Value</i> and <i>Category</i> |
1570 | @@ -576,7 +576,7 @@ | |||
1571 | 576 | caption("""Table <seq template="%(Chapter)s-%(Table+)s"/> - Axes joining properties""") | 576 | caption("""Table <seq template="%(Chapter)s-%(Table+)s"/> - Axes joining properties""") |
1572 | 577 | 577 | ||
1573 | 578 | 578 | ||
1575 | 579 | heading3("Bar Charts") | 579 | heading2("Bar Charts") |
1576 | 580 | 580 | ||
1577 | 581 | disc(""" | 581 | disc(""" |
1578 | 582 | This describes our current $VerticalBarChart$ class, which uses the | 582 | This describes our current $VerticalBarChart$ class, which uses the |
1579 | @@ -687,9 +687,6 @@ | |||
1580 | 687 | ["fillColor", """Defaults to None. This will fill the plot rectangle with | 687 | ["fillColor", """Defaults to None. This will fill the plot rectangle with |
1581 | 688 | a solid color. (Note that we could implement dashArray etc. | 688 | a solid color. (Note that we could implement dashArray etc. |
1582 | 689 | as for any other solid shape)"""], | 689 | as for any other solid shape)"""], |
1583 | 690 | ["barLabelFormat", """This is a format string or function used for displaying | ||
1584 | 691 | labels above each bar. They are positioned automatically | ||
1585 | 692 | above the bar for positive values and below for negative ones."""], | ||
1586 | 693 | ["useAbsolute", """Defaults to 0. If 1, the three properties below are | 690 | ["useAbsolute", """Defaults to 0. If 1, the three properties below are |
1587 | 694 | absolute values in points (which means you can make a chart | 691 | absolute values in points (which means you can make a chart |
1588 | 695 | where the bars stick out from the plot rectangle); if 0, | 692 | where the bars stick out from the plot rectangle); if 0, |
1589 | @@ -704,8 +701,9 @@ | |||
1590 | 704 | group. If you wanted a little gap between green and red bars in | 701 | group. If you wanted a little gap between green and red bars in |
1591 | 705 | the example above, you would make this non-zero."""], | 702 | the example above, you would make this non-zero."""], |
1592 | 706 | ["barLabelFormat", """Defaults to None. As with the YValueAxis, if you supply | 703 | ["barLabelFormat", """Defaults to None. As with the YValueAxis, if you supply |
1595 | 707 | a function or format string then labels will be drawn next | 704 | a function or format string then labels will be drawn next to each bar |
1596 | 708 | to each bar showing the numeric value."""], | 705 | showing the numeric value. They are positioned automatically |
1597 | 706 | above the bar for positive values and below for negative ones."""], | ||
1598 | 709 | ["barLabels", """A collection of labels used to format all bar labels. Since | 707 | ["barLabels", """A collection of labels used to format all bar labels. Since |
1599 | 710 | this is a two-dimensional array, you may explicitly format the | 708 | this is a two-dimensional array, you may explicitly format the |
1600 | 711 | third label of the second series using this syntax: | 709 | third label of the second series using this syntax: |
1601 | @@ -865,7 +863,7 @@ | |||
1602 | 865 | ##title, subTitle Not implemented yet. These would be label-like objects whose text could be set directly and which would appear in sensible locations. For now, you can just place extra strings on the drawing. | 863 | ##title, subTitle Not implemented yet. These would be label-like objects whose text could be set directly and which would appear in sensible locations. For now, you can just place extra strings on the drawing. |
1603 | 866 | 864 | ||
1604 | 867 | 865 | ||
1606 | 868 | heading3("Line Charts") | 866 | heading2("Line Charts") |
1607 | 869 | 867 | ||
1608 | 870 | disc(""" | 868 | disc(""" |
1609 | 871 | We consider "Line Charts" to be essentially the same as | 869 | We consider "Line Charts" to be essentially the same as |
1610 | @@ -943,10 +941,42 @@ | |||
1611 | 943 | 941 | ||
1612 | 944 | 942 | ||
1613 | 945 | disc("") | 943 | disc("") |
1618 | 946 | todo("Add properties table.") | 944 | |
1619 | 947 | 945 | data=[["Property","Meaning"], | |
1620 | 948 | 946 | ["data", "Data to be plotted, list of (lists of) numbers."], | |
1621 | 949 | heading3("Line Plots") | 947 | ["x, y, width, height", """Bounding box of the line chart. |
1622 | 948 | Note that x and y do NOT specify the centre but the bottom left corner"""], | ||
1623 | 949 | ["valueAxis", """The value axis, which may be formatted as described previously."""], | ||
1624 | 950 | ["categoryAxis", """The category axis, which may be formatted as described previously."""], | ||
1625 | 951 | ["strokeColor", """Defaults to None. This will draw a border around the plot rectangle, | ||
1626 | 952 | which may be useful in debugging. Axes will overwrite this."""], | ||
1627 | 953 | ["fillColor", """Defaults to None. This will fill the plot rectangle with a solid color."""], | ||
1628 | 954 | ["lines.strokeColor", """Color of the line."""], | ||
1629 | 955 | ["lines.strokeWidth", """Width of the line."""], | ||
1630 | 956 | ["lineLabels", """A collection of labels used to format all line labels. Since | ||
1631 | 957 | this is a two-dimensional array, you may explicitly format the | ||
1632 | 958 | third label of the second line using this syntax: | ||
1633 | 959 | chart.lineLabels[(1,2)].fontSize = 12"""], | ||
1634 | 960 | ["lineLabelFormat", """Defaults to None. As with the YValueAxis, if you supply | ||
1635 | 961 | a function or format string then labels will be drawn next | ||
1636 | 962 | to each line showing the numeric value. You can also set it | ||
1637 | 963 | to 'values' to display the values explicity defined in lineLabelArray."""], | ||
1638 | 964 | ["lineLabelArray", """Explicit array of line label values, must match size of data if present. | ||
1639 | 965 | These labels values will be displayed only if the property | ||
1640 | 966 | lineLabelFormat above is set to 'values'."""]] | ||
1641 | 967 | t=Table(data, colWidths=(100,330)) | ||
1642 | 968 | t.setStyle(TableStyle([ | ||
1643 | 969 | ('FONT',(0,0),(-1,0),'Times-Bold',10,12), | ||
1644 | 970 | ('FONT',(0,1),(0,-1),'Courier',8,8), | ||
1645 | 971 | ('FONT',(1,1),(1,-1),'Times-Roman',10,12), | ||
1646 | 972 | ('VALIGN',(0,0),(-1,-1),'MIDDLE'), | ||
1647 | 973 | ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), | ||
1648 | 974 | ('BOX', (0,0), (-1,-1), 0.25, colors.black), | ||
1649 | 975 | ])) | ||
1650 | 976 | getStory().append(t) | ||
1651 | 977 | caption("""Table <seq template="%(Chapter)s-%(Table+)s"/> - HorizontalLineChart properties""") | ||
1652 | 978 | |||
1653 | 979 | heading2("Line Plots") | ||
1654 | 950 | 980 | ||
1655 | 951 | disc(""" | 981 | disc(""" |
1656 | 952 | Below we show a more complex example of a Line Plot that | 982 | Below we show a more complex example of a Line Plot that |
1657 | @@ -1024,22 +1054,56 @@ | |||
1658 | 1024 | 1054 | ||
1659 | 1025 | 1055 | ||
1660 | 1026 | disc("") | 1056 | disc("") |
1666 | 1027 | todo("Add properties table.") | 1057 | |
1667 | 1028 | 1058 | data=[["Property","Meaning"], | |
1668 | 1029 | 1059 | ["data", "Data to be plotted, list of (lists of) numbers."], | |
1669 | 1030 | 1060 | ["x, y, width, height", """Bounding box of the line chart. | |
1670 | 1031 | heading3("Pie Charts") | 1061 | Note that x and y do NOT specify the centre but the bottom left corner"""], |
1671 | 1062 | ["xValueAxis", """The vertical value axis, which may be formatted as described previously."""], | ||
1672 | 1063 | ["yValueAxis", """The horizontal value axis, which may be formatted as described previously."""], | ||
1673 | 1064 | ["strokeColor", """Defaults to None. This will draw a border around the plot rectangle, | ||
1674 | 1065 | which may be useful in debugging. Axes will overwrite this."""], | ||
1675 | 1066 | ["strokeWidth", """Defaults to None. Width of the border around the plot rectangle."""], | ||
1676 | 1067 | ["fillColor", """Defaults to None. This will fill the plot rectangle with a solid color."""], | ||
1677 | 1068 | ["lines.strokeColor", """Color of the line."""], | ||
1678 | 1069 | ["lines.strokeWidth", """Width of the line."""], | ||
1679 | 1070 | ["lines.symbol", """Marker used for each point. | ||
1680 | 1071 | You can create a new marker using the function makeMarker(). | ||
1681 | 1072 | For example to use a circle, the function call would be makeMarker('Circle')"""], | ||
1682 | 1073 | ["lineLabels", """A collection of labels used to format all line labels. Since | ||
1683 | 1074 | this is a two-dimensional array, you may explicitly format the | ||
1684 | 1075 | third label of the second line using this syntax: | ||
1685 | 1076 | chart.lineLabels[(1,2)].fontSize = 12"""], | ||
1686 | 1077 | ["lineLabelFormat", """Defaults to None. As with the YValueAxis, if you supply | ||
1687 | 1078 | a function or format string then labels will be drawn next | ||
1688 | 1079 | to each line showing the numeric value. You can also set it | ||
1689 | 1080 | to 'values' to display the values explicity defined in lineLabelArray."""], | ||
1690 | 1081 | ["lineLabelArray", """Explicit array of line label values, must match size of data if present. | ||
1691 | 1082 | These labels values will be displayed only if the property | ||
1692 | 1083 | lineLabelFormat above is set to 'values'."""]] | ||
1693 | 1084 | t=Table(data, colWidths=(100,330)) | ||
1694 | 1085 | t.setStyle(TableStyle([ | ||
1695 | 1086 | ('FONT',(0,0),(-1,0),'Times-Bold',10,12), | ||
1696 | 1087 | ('FONT',(0,1),(0,-1),'Courier',8,8), | ||
1697 | 1088 | ('FONT',(1,1),(1,-1),'Times-Roman',10,12), | ||
1698 | 1089 | ('VALIGN',(0,0),(-1,-1),'MIDDLE'), | ||
1699 | 1090 | ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), | ||
1700 | 1091 | ('BOX', (0,0), (-1,-1), 0.25, colors.black), | ||
1701 | 1092 | ])) | ||
1702 | 1093 | getStory().append(t) | ||
1703 | 1094 | caption("""Table <seq template="%(Chapter)s-%(Table+)s"/> - LinePlot properties""") | ||
1704 | 1095 | |||
1705 | 1096 | |||
1706 | 1097 | |||
1707 | 1098 | |||
1708 | 1099 | heading2("Pie Charts") | ||
1709 | 1032 | 1100 | ||
1710 | 1033 | disc(""" | 1101 | disc(""" |
1715 | 1034 | We've already seen a pie chart example above. | 1102 | As usual, we will start with an example: |
1712 | 1035 | This is provisional but seems to do most things. | ||
1713 | 1036 | At the very least we need to change the name. | ||
1714 | 1037 | For completeness we will cover it here. | ||
1716 | 1038 | """) | 1103 | """) |
1717 | 1039 | 1104 | ||
1718 | 1040 | eg(""" | 1105 | eg(""" |
1719 | 1041 | from reportlab.graphics.charts.piecharts import Pie | 1106 | from reportlab.graphics.charts.piecharts import Pie |
1720 | 1042 | |||
1721 | 1043 | d = Drawing(200, 100) | 1107 | d = Drawing(200, 100) |
1722 | 1044 | 1108 | ||
1723 | 1045 | pc = Pie() | 1109 | pc = Pie() |
1724 | @@ -1056,19 +1120,18 @@ | |||
1725 | 1056 | pc.slices[3].strokeDashArray = [2,2] | 1120 | pc.slices[3].strokeDashArray = [2,2] |
1726 | 1057 | pc.slices[3].labelRadius = 1.75 | 1121 | pc.slices[3].labelRadius = 1.75 |
1727 | 1058 | pc.slices[3].fontColor = colors.red | 1122 | pc.slices[3].fontColor = colors.red |
1728 | 1059 | |||
1729 | 1060 | d.add(pc) | 1123 | d.add(pc) |
1730 | 1061 | """) | 1124 | """) |
1731 | 1062 | 1125 | ||
1732 | 1063 | from reportlab.graphics.charts.piecharts import Pie | 1126 | from reportlab.graphics.charts.piecharts import Pie |
1733 | 1064 | 1127 | ||
1735 | 1065 | d = Drawing(200, 100) | 1128 | d = Drawing(400, 200) |
1736 | 1066 | 1129 | ||
1737 | 1067 | pc = Pie() | 1130 | pc = Pie() |
1742 | 1068 | pc.x = 65 | 1131 | pc.x = 125 |
1743 | 1069 | pc.y = 15 | 1132 | pc.y = 25 |
1744 | 1070 | pc.width = 70 | 1133 | pc.width = 150 |
1745 | 1071 | pc.height = 70 | 1134 | pc.height = 150 |
1746 | 1072 | pc.data = [10,20,30,40,50,60] | 1135 | pc.data = [10,20,30,40,50,60] |
1747 | 1073 | pc.labels = ['a','b','c','d','e','f'] | 1136 | pc.labels = ['a','b','c','d','e','f'] |
1748 | 1074 | 1137 | ||
1749 | @@ -1076,7 +1139,7 @@ | |||
1750 | 1076 | pc.slices[3].popout = 10 | 1139 | pc.slices[3].popout = 10 |
1751 | 1077 | pc.slices[3].strokeWidth = 2 | 1140 | pc.slices[3].strokeWidth = 2 |
1752 | 1078 | pc.slices[3].strokeDashArray = [2,2] | 1141 | pc.slices[3].strokeDashArray = [2,2] |
1754 | 1079 | pc.slices[3].labelRadius = 1.75 | 1142 | pc.slices[3].labelRadius = 1.25 |
1755 | 1080 | pc.slices[3].fontColor = colors.red | 1143 | pc.slices[3].fontColor = colors.red |
1756 | 1081 | 1144 | ||
1757 | 1082 | d.add(pc) | 1145 | d.add(pc) |
1758 | @@ -1087,36 +1150,154 @@ | |||
1759 | 1087 | Properties are covered below. | 1150 | Properties are covered below. |
1760 | 1088 | The pie has a 'wedges' collection and we document wedge properties | 1151 | The pie has a 'wedges' collection and we document wedge properties |
1761 | 1089 | in the same table. | 1152 | in the same table. |
1792 | 1090 | This was invented before we finished the $Label$ class and will | 1153 | """) |
1793 | 1091 | probably be reworked to use such labels shortly. | 1154 | |
1794 | 1092 | """) | 1155 | disc("") |
1795 | 1093 | 1156 | ||
1796 | 1094 | disc("") | 1157 | data=[["Property", "Meaning"], |
1797 | 1095 | todo("Add properties table.") | 1158 | ["data", "A list or tuple of numbers"], |
1798 | 1096 | 1159 | ["x, y, width, height", """Bounding box of the pie. | |
1799 | 1097 | ##Property Value | 1160 | Note that x and y do NOT specify the centre but the bottom left |
1800 | 1098 | ##data a list or tuple of numbers | 1161 | corner, and that width and height do not have to be equal; |
1801 | 1099 | ##x, y, width, height Bounding box of the pie. Note that x and y do NOT specify the centre but the bottom left corner, and that width and height do not have to be equal; pies may be elliptical and wedges will be drawn correctly. | 1162 | pies may be elliptical and wedges will be drawn correctly."""], |
1802 | 1100 | ##labels None, or a list of strings. Make it None if you don't want labels around the edge of the pie. Since it is impossible to know the size of slices, we generally discourage placing labels in or around pies; it is much better to put them in a legend alongside. | 1163 | ["labels", """None, or a list of strings. |
1803 | 1101 | ##startAngle Where is the start angle of the first pie slice? The default is '90' which is twelve o'clock. | 1164 | Make it None if you don't want labels around the edge of the pie. |
1804 | 1102 | ##direction Which direction do slices progress in? The default is 'clockwise'. | 1165 | Since it is impossible to know the size of slices, we generally |
1805 | 1103 | ##wedges Collection of wedges. This lets you customise each wedge, or individual ones. See below | 1166 | discourage placing labels in or around pies; it is much better |
1806 | 1104 | ##wedges.strokeWidth Border width for wedge | 1167 | to put them in a legend alongside."""], |
1807 | 1105 | ##wedges.strokeColor Border color | 1168 | ["startAngle", """Where is the start angle of the first pie slice? |
1808 | 1106 | ##wedges.strokeDashArray Solid or dashed line configuration for | 1169 | The default is '90' which is twelve o'clock."""], |
1809 | 1107 | ##wedges.popout How far out should the slice(s) stick from the centre of | 1170 | ["direction", """Which direction do slices progress in? |
1810 | 1108 | ##the pie? default is zero. | 1171 | The default is 'clockwise'."""], |
1811 | 1109 | ##wedges.fontName | 1172 | ["sideLabels", """This creates a chart with the labels in two columns, |
1812 | 1110 | ##wedges.fontSize | 1173 | one on either side."""], |
1813 | 1111 | ##wedges.fontColor Used for text labels | 1174 | ["sideLabelsOffset", """This is a fraction of the width of the pie that defines the horizontal |
1814 | 1112 | ##wedges.labelRadius This controls the anchor point for a text label. It | 1175 | distance between the pie and the columns of labels."""], |
1815 | 1113 | ##is a fraction of the radius; 0.7 will place the text inside the pie, | 1176 | ["simpleLabels", """Default is 1. Set to 0 to enable the use of customizable labels |
1816 | 1114 | ##1.2 will place it slightly outside. (note that if we add labels, we | 1177 | and of properties prefixed by label_ in the collection slices."""], |
1817 | 1115 | ##will keep this to specify their anchor point) | 1178 | ["wedges", """Collection of wedges. |
1818 | 1116 | ## | 1179 | This lets you customise each wedge, or individual ones. See below"""], |
1819 | 1117 | 1180 | ["wedges.strokeWidth", "Border width for wedge"], | |
1820 | 1118 | 1181 | ["wedges.strokeColor", "Border color"], | |
1821 | 1119 | heading3("Legends") | 1182 | ["wedges.strokeDashArray", "Solid or dashed line configuration"], |
1822 | 1183 | ["wedges.popout", """How far out should the slice(s) stick from the centre of the pie? | ||
1823 | 1184 | Default is zero."""], | ||
1824 | 1185 | ["wedges.fontName", "Name of the label font"], | ||
1825 | 1186 | ["wedges.fontSize", "Size of the label font"], | ||
1826 | 1187 | ["wedges.fontColor", "Color of the label text"], | ||
1827 | 1188 | ["wedges.labelRadius", """This controls the anchor point for a text label. | ||
1828 | 1189 | It is a fraction of the radius; 0.7 will place the text inside the | ||
1829 | 1190 | pie, 1.2 will place it slightly outside. (note that if we add labels, | ||
1830 | 1191 | we will keep this to specify their anchor point)"""]] | ||
1831 | 1192 | t=Table(data, colWidths=(130,300)) | ||
1832 | 1193 | t.setStyle(TableStyle([ | ||
1833 | 1194 | ('FONT',(0,0),(-1,0),'Times-Bold',10,12), | ||
1834 | 1195 | ('FONT',(0,1),(0,-1),'Courier',8,8), | ||
1835 | 1196 | ('FONT',(1,1),(1,-1),'Times-Roman',10,12), | ||
1836 | 1197 | ('VALIGN',(0,0),(-1,-1),'MIDDLE'), | ||
1837 | 1198 | ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), | ||
1838 | 1199 | ('BOX', (0,0), (-1,-1), 0.25, colors.black), | ||
1839 | 1200 | ])) | ||
1840 | 1201 | getStory().append(t) | ||
1841 | 1202 | caption("""Table <seq template="%(Chapter)s-%(Table+)s"/> - Pie properties""") | ||
1842 | 1203 | |||
1843 | 1204 | heading3("Customizing Labels") | ||
1844 | 1205 | |||
1845 | 1206 | disc(""" | ||
1846 | 1207 | Each slide label can be customized individually by changing | ||
1847 | 1208 | the properties prefixed by $label_$ in the collection $wedges$. | ||
1848 | 1209 | For example $pc.slices[2].label_angle = 10$ changes the angle | ||
1849 | 1210 | of the third label. | ||
1850 | 1211 | """) | ||
1851 | 1212 | |||
1852 | 1213 | disc(""" | ||
1853 | 1214 | Before being able to use these customization properties, you need | ||
1854 | 1215 | to disable simple labels with: $pc.simplesLabels = 0$ | ||
1855 | 1216 | """) | ||
1856 | 1217 | |||
1857 | 1218 | disc("") | ||
1858 | 1219 | |||
1859 | 1220 | data=[["Property", "Meaning"], | ||
1860 | 1221 | ["label_dx", """X Offset of the label"""], | ||
1861 | 1222 | ["label_dy", """Y Offset of the label"""], | ||
1862 | 1223 | ["label_angle", """Angle of the label, default (0) is horizontal, 90 is vertical, | ||
1863 | 1224 | 180 is upside down"""], | ||
1864 | 1225 | ["label_boxAnchor", """Anchoring point of the label"""], | ||
1865 | 1226 | ["label_boxStrokeColor", """Border color for the label box"""], | ||
1866 | 1227 | ["label_boxStrokeWidth", """Border width for the label box"""], | ||
1867 | 1228 | ["label_boxFillColor", """Filling color of the label box"""], | ||
1868 | 1229 | ["label_strokeColor", """Border color for the label text"""], | ||
1869 | 1230 | ["label_strokeWidth", """Border width for the label text"""], | ||
1870 | 1231 | ["label_text", """Text of the label"""], | ||
1871 | 1232 | ["label_width", """Width of the label"""], | ||
1872 | 1233 | ["label_maxWidth", """Maximum width the label can grow to"""], | ||
1873 | 1234 | ["label_height", """Height of the label"""], | ||
1874 | 1235 | ["label_textAnchor", """Maximum height the label can grow to"""], | ||
1875 | 1236 | ["label_visible", """True if the label is to be drawn"""], | ||
1876 | 1237 | ["label_topPadding", """Padding at top of box"""], | ||
1877 | 1238 | ["label_leftPadding", """Padding at left of box"""], | ||
1878 | 1239 | ["label_rightPadding", """Padding at right of box"""], | ||
1879 | 1240 | ["label_bottomPadding", """Padding at bottom of box"""], | ||
1880 | 1241 | ["label_simple_pointer", """Set to 1 for simple pointers"""], | ||
1881 | 1242 | ["label_pointer_strokeColor", """Color of indicator line"""], | ||
1882 | 1243 | ["label_pointer_strokeWidth", """Width of indicator line"""]] | ||
1883 | 1244 | t=Table(data, colWidths=(130,300)) | ||
1884 | 1245 | t.setStyle(TableStyle([ | ||
1885 | 1246 | ('FONT',(0,0),(-1,0),'Times-Bold',10,12), | ||
1886 | 1247 | ('FONT',(0,1),(0,-1),'Courier',8,8), | ||
1887 | 1248 | ('FONT',(1,1),(1,-1),'Times-Roman',10,12), | ||
1888 | 1249 | ('VALIGN',(0,0),(-1,-1),'MIDDLE'), | ||
1889 | 1250 | ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), | ||
1890 | 1251 | ('BOX', (0,0), (-1,-1), 0.25, colors.black), | ||
1891 | 1252 | ])) | ||
1892 | 1253 | getStory().append(t) | ||
1893 | 1254 | caption("""Table <seq template="%(Chapter)s-%(Table+)s"/> - Pie.wedges label customization properties""") | ||
1894 | 1255 | |||
1895 | 1256 | heading3("Side Labels") | ||
1896 | 1257 | |||
1897 | 1258 | disc(""" | ||
1898 | 1259 | If the sideLabels attribute is set to true, then the labels of | ||
1899 | 1260 | the slices are placed in two columns, one on either side of the | ||
1900 | 1261 | pie and the start angle of the pie will be set automatically. | ||
1901 | 1262 | The anchor of the right hand column is set to 'start' and the | ||
1902 | 1263 | anchor of the left hand column is set to 'end'. | ||
1903 | 1264 | The distance from the edge of the pie from the edge of either | ||
1904 | 1265 | column is decided by the sideLabelsOffset attribute, which is | ||
1905 | 1266 | a fraction of the width of the pie. | ||
1906 | 1267 | If xradius is changed, the pie can overlap the labels, and so | ||
1907 | 1268 | we advise leaving xradius as None. | ||
1908 | 1269 | There is an example below. | ||
1909 | 1270 | """) | ||
1910 | 1271 | |||
1911 | 1272 | from reportlab.graphics.charts.piecharts import sample5, sample7, sample8 | ||
1912 | 1273 | drawing5 = sample5() | ||
1913 | 1274 | draw(drawing5, 'An example of a piechart with sideLabels =1') | ||
1914 | 1275 | |||
1915 | 1276 | disc(""" | ||
1916 | 1277 | If you have sideLabels set to True, then some of the attributes | ||
1917 | 1278 | become redundant, such as pointerLabelMode. | ||
1918 | 1279 | Also sideLabelsOffset only changes the piechart if sideLabels is | ||
1919 | 1280 | set to true. | ||
1920 | 1281 | """) | ||
1921 | 1282 | |||
1922 | 1283 | heading4("Some issues") | ||
1923 | 1284 | |||
1924 | 1285 | disc(""" | ||
1925 | 1286 | The pointers can cross if there are too many slices. | ||
1926 | 1287 | """) | ||
1927 | 1288 | |||
1928 | 1289 | drawing7 = sample7() | ||
1929 | 1290 | draw(drawing7, 'An example of pointers crossing') | ||
1930 | 1291 | |||
1931 | 1292 | disc(""" | ||
1932 | 1293 | Also the labels can overlap despite checkLabelOverlap if they | ||
1933 | 1294 | correspond to slices that are not adjacent. | ||
1934 | 1295 | """) | ||
1935 | 1296 | |||
1936 | 1297 | drawing8 = sample8() | ||
1937 | 1298 | draw(drawing8, 'An example of labels overlapping') | ||
1938 | 1299 | |||
1939 | 1300 | heading2("Legends") | ||
1940 | 1120 | 1301 | ||
1941 | 1121 | disc(""" | 1302 | disc(""" |
1942 | 1122 | Various preliminary legend classes can be found but need a | 1303 | Various preliminary legend classes can be found but need a |
1943 | @@ -1162,7 +1343,7 @@ | |||
1944 | 1162 | Nevertheless, here is a list of things that are under way: | 1343 | Nevertheless, here is a list of things that are under way: |
1945 | 1163 | """) | 1344 | """) |
1946 | 1164 | 1345 | ||
1948 | 1165 | list(""" | 1346 | bullet(""" |
1949 | 1166 | Color specification - right now the chart has an undocumented property | 1347 | Color specification - right now the chart has an undocumented property |
1950 | 1167 | $defaultColors$, which provides a list of colors to cycle through, | 1348 | $defaultColors$, which provides a list of colors to cycle through, |
1951 | 1168 | such that each data series gets its own color. | 1349 | such that each data series gets its own color. |
1952 | @@ -1175,7 +1356,7 @@ | |||
1953 | 1175 | be visible itself. | 1356 | be visible itself. |
1954 | 1176 | """) | 1357 | """) |
1955 | 1177 | 1358 | ||
1957 | 1178 | list(""" | 1359 | bullet(""" |
1958 | 1179 | Additional chart types - when the current design will have become | 1360 | Additional chart types - when the current design will have become |
1959 | 1180 | more stable, we expect to add variants of bar charts to deal with | 1361 | more stable, we expect to add variants of bar charts to deal with |
1960 | 1181 | percentile bars as well as the side-by-side variant seen here. | 1362 | percentile bars as well as the side-by-side variant seen here. |
1961 | 1182 | 1363 | ||
1962 | === modified file 'docs/userguide/graph_concepts.py' | |||
1963 | --- docs/userguide/graph_concepts.py 2009-02-22 14:19:44 +0000 | |||
1964 | +++ docs/userguide/graph_concepts.py 2013-04-14 00:52:26 +0000 | |||
1965 | @@ -1,6 +1,6 @@ | |||
1967 | 1 | #Copyright ReportLab Europe Ltd. 2000-2008 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
1968 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
1970 | 3 | __version__=''' $Id: graph_concepts.py 3401 2009-01-23 17:41:45Z jonas $ ''' | 3 | __version__=''' $Id: graph_concepts.py 3959 2012-09-27 14:39:39Z robin $ ''' |
1971 | 4 | from tools.docco.rl_doc_utils import * | 4 | from tools.docco.rl_doc_utils import * |
1972 | 5 | 5 | ||
1973 | 6 | heading2("General Concepts") | 6 | heading2("General Concepts") |
1974 | 7 | 7 | ||
1975 | === modified file 'docs/userguide/graph_intro.py' | |||
1976 | --- docs/userguide/graph_intro.py 2009-02-22 14:19:44 +0000 | |||
1977 | +++ docs/userguide/graph_intro.py 2013-04-14 00:52:26 +0000 | |||
1978 | @@ -1,6 +1,6 @@ | |||
1980 | 1 | #Copyright ReportLab Europe Ltd. 2000-2008 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
1981 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
1983 | 3 | __version__=''' $Id: graph_intro.py 3375 2009-01-16 18:23:19Z jonas $ ''' | 3 | __version__=''' $Id: graph_intro.py 3959 2012-09-27 14:39:39Z robin $ ''' |
1984 | 4 | from tools.docco.rl_doc_utils import * | 4 | from tools.docco.rl_doc_utils import * |
1985 | 5 | 5 | ||
1986 | 6 | heading1("Graphics") | 6 | heading1("Graphics") |
1987 | 7 | 7 | ||
1988 | === modified file 'docs/userguide/graph_shapes.py' | |||
1989 | --- docs/userguide/graph_shapes.py 2009-02-22 14:19:44 +0000 | |||
1990 | +++ docs/userguide/graph_shapes.py 2013-04-14 00:52:26 +0000 | |||
1991 | @@ -1,6 +1,6 @@ | |||
1993 | 1 | #Copyright ReportLab Europe Ltd. 2000-2009 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
1994 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
1996 | 3 | __version__='''$Id: graph_shapes.py 3375 2009-01-16 18:23:19Z jonas $''' | 3 | __version__='''$Id: graph_shapes.py 3959 2012-09-27 14:39:39Z robin $''' |
1997 | 4 | from tools.docco.rl_doc_utils import * | 4 | from tools.docco.rl_doc_utils import * |
1998 | 5 | from reportlab.graphics.shapes import * | 5 | from reportlab.graphics.shapes import * |
1999 | 6 | 6 | ||
2000 | 7 | 7 | ||
2001 | === modified file 'docs/userguide/graph_widgets.py' | |||
2002 | --- docs/userguide/graph_widgets.py 2009-02-22 14:19:44 +0000 | |||
2003 | +++ docs/userguide/graph_widgets.py 2013-04-14 00:52:26 +0000 | |||
2004 | @@ -1,6 +1,6 @@ | |||
2006 | 1 | #Copyright ReportLab Europe Ltd. 2000-2008 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
2007 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
2009 | 3 | __version__=''' $Id: graph_widgets.py 3375 2009-01-16 18:23:19Z jonas $ ''' | 3 | __version__=''' $Id: graph_widgets.py 3959 2012-09-27 14:39:39Z robin $ ''' |
2010 | 4 | from tools.docco.rl_doc_utils import * | 4 | from tools.docco.rl_doc_utils import * |
2011 | 5 | from reportlab.graphics.shapes import * | 5 | from reportlab.graphics.shapes import * |
2012 | 6 | from reportlab.graphics.widgets import signsandsymbols | 6 | from reportlab.graphics.widgets import signsandsymbols |
2013 | 7 | 7 | ||
2014 | === modified file 'setup.py' | |||
2015 | --- setup.py 2010-12-06 12:45:44 +0000 | |||
2016 | +++ setup.py 2013-04-14 00:52:26 +0000 | |||
2017 | @@ -1,6 +1,6 @@ | |||
2019 | 1 | #Copyright ReportLab Europe Ltd. 2000-2008 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
2020 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
2022 | 3 | __version__=''' $Id: setup.py 3730 2010-06-16 11:56:53Z rgbecker $ ''' | 3 | __version__=''' $Id: setup.py 3963 2012-09-27 16:14:06Z rgbecker $ ''' |
2023 | 4 | import os, sys, glob, ConfigParser, shutil | 4 | import os, sys, glob, ConfigParser, shutil |
2024 | 5 | platform = sys.platform | 5 | platform = sys.platform |
2025 | 6 | pjoin = os.path.join | 6 | pjoin = os.path.join |
2026 | @@ -209,10 +209,10 @@ | |||
2027 | 209 | 'fonts/_eb_____.pfb', | 209 | 'fonts/_eb_____.pfb', |
2028 | 210 | 'fonts/_ei_____.pfb', | 210 | 'fonts/_ei_____.pfb', |
2029 | 211 | 'fonts/_er_____.pfb', | 211 | 'fonts/_er_____.pfb', |
2034 | 212 | 'fonts/Sy______.pfb', | 212 | 'fonts/sy______.pfb', |
2035 | 213 | 'fonts/Zd______.pfb', | 213 | 'fonts/zd______.pfb', |
2036 | 214 | 'fonts/Zx______.pfb', | 214 | 'fonts/zx______.pfb', |
2037 | 215 | 'fonts/Zy______.pfb', | 215 | 'fonts/zy______.pfb', |
2038 | 216 | ] | 216 | ] |
2039 | 217 | 217 | ||
2040 | 218 | def get_fonts(PACKAGE_DIR, reportlab_files): | 218 | def get_fonts(PACKAGE_DIR, reportlab_files): |
2041 | @@ -224,7 +224,7 @@ | |||
2042 | 224 | try: | 224 | try: |
2043 | 225 | #infoline("Downloading standard T1 font curves") | 225 | #infoline("Downloading standard T1 font curves") |
2044 | 226 | 226 | ||
2046 | 227 | #remotehandle = urllib2.urlopen("http://www.reportlab.com/ftp/fonts/pfbfer.zip") | 227 | #remotehandle = urllib2.urlopen("http://www.reportlab.com/ftp/pfbfer-20070710.zip") |
2047 | 228 | #zipdata = StringIO.StringIO(remotehandle.read()) | 228 | #zipdata = StringIO.StringIO(remotehandle.read()) |
2048 | 229 | #remotehandle.close() | 229 | #remotehandle.close() |
2049 | 230 | archive = zipfile.ZipFile(zipdata) | 230 | archive = zipfile.ZipFile(zipdata) |
2050 | @@ -417,7 +417,7 @@ | |||
2051 | 417 | setup( | 417 | setup( |
2052 | 418 | name="reportlab", | 418 | name="reportlab", |
2053 | 419 | version=get_version(), | 419 | version=get_version(), |
2055 | 420 | license="BSD license (see license.txt for details), Copyright (c) 2000-2010, ReportLab Inc.", | 420 | license="BSD license (see license.txt for details), Copyright (c) 2000-2012, ReportLab Inc.", |
2056 | 421 | description="The Reportlab Toolkit", | 421 | description="The Reportlab Toolkit", |
2057 | 422 | long_description="""The ReportLab Toolkit. An Open Source Python library for generating PDFs and graphics.""", | 422 | long_description="""The ReportLab Toolkit. An Open Source Python library for generating PDFs and graphics.""", |
2058 | 423 | 423 | ||
2059 | 424 | 424 | ||
2060 | === modified file 'src/reportlab/__init__.py' | |||
2061 | --- src/reportlab/__init__.py 2010-12-06 12:45:44 +0000 | |||
2062 | +++ src/reportlab/__init__.py 2013-04-14 00:52:26 +0000 | |||
2063 | @@ -1,21 +1,25 @@ | |||
2065 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
2066 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
2067 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/__init__.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/__init__.py |
2069 | 4 | __version__=''' $Id: __init__.py 3788 2010-09-29 10:44:00Z rgbecker $ ''' | 4 | __version__=''' $Id: __init__.py 3959 2012-09-27 14:39:39Z robin $ ''' |
2070 | 5 | __doc__="""The Reportlab PDF generation library.""" | 5 | __doc__="""The Reportlab PDF generation library.""" |
2072 | 6 | Version = "2.5" | 6 | Version = "2.6" |
2073 | 7 | 7 | ||
2074 | 8 | import sys | 8 | import sys |
2075 | 9 | 9 | ||
2078 | 10 | if sys.version_info[0:2] < (2, 4): | 10 | if sys.version_info[0:2] < (2, 5): |
2079 | 11 | warning = """The trunk of reportlab requires Python 2.4 or higher. | 11 | warning = """The trunk of reportlab currently requires Python 2.5 or higher. |
2080 | 12 | 12 | ||
2081 | 13 | Python 2.3 users may still use ReportLab 2.4 or any other bugfixes | 13 | Python 2.3 users may still use ReportLab 2.4 or any other bugfixes |
2085 | 14 | derived from it. Python 2.2 and below need to use released versions | 14 | derived from it, and Python 2.4 users may use ReportLab 2.5. |
2086 | 15 | beginning with 1.x (e.g. 1.21), or snapshots or checkouts from | 15 | Python 2.2 and below need to use released versions beginning with |
2087 | 16 | our 'version1' branch. | 16 | 1.x (e.g. 1.21), or snapshots or checkouts from our 'version1' branch. |
2088 | 17 | |||
2089 | 18 | Our current plan is to remove Python 2.5 compatibility on our next release, | ||
2090 | 19 | allowing us to use the 2to3 tool and work on Python 3.0 compatibility. | ||
2091 | 20 | If you have a choice, Python 2.7.x is best long term version to use. | ||
2092 | 17 | """ | 21 | """ |
2094 | 18 | raise ImportError("reportlab needs Python 2.4 or higher", warning) | 22 | raise ImportError("reportlab needs Python 2.5 or higher", warning) |
2095 | 19 | 23 | ||
2096 | 20 | def getStory(context): | 24 | def getStory(context): |
2097 | 21 | "This is a helper for our old autogenerated documentation system" | 25 | "This is a helper for our old autogenerated documentation system" |
2098 | 22 | 26 | ||
2099 | === modified file 'src/reportlab/graphics/__init__.py' | |||
2100 | --- src/reportlab/graphics/__init__.py 2009-02-22 14:19:44 +0000 | |||
2101 | +++ src/reportlab/graphics/__init__.py 2013-04-14 00:52:26 +0000 | |||
2102 | @@ -1,6 +1,6 @@ | |||
2104 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
2105 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
2106 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/__init__.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/__init__.py |
2108 | 4 | __version__=''' $Id: __init__.py 3345 2008-12-12 17:55:22Z damian $ ''' | 4 | __version__=''' $Id: __init__.py 3959 2012-09-27 14:39:39Z robin $ ''' |
2109 | 5 | __doc__='''Framework for reusable object graphics, in PDF or bitmap form''' | 5 | __doc__='''Framework for reusable object graphics, in PDF or bitmap form''' |
2110 | 6 | 6 | ||
2111 | 7 | 7 | ||
2112 | === modified file 'src/reportlab/graphics/barcode/__init__.py' | |||
2113 | --- src/reportlab/graphics/barcode/__init__.py 2010-12-06 12:45:44 +0000 | |||
2114 | +++ src/reportlab/graphics/barcode/__init__.py 2013-04-14 00:52:26 +0000 | |||
2115 | @@ -42,7 +42,7 @@ | |||
2116 | 42 | BarcodePOSTNET, BarcodeUSPS_4State | 42 | BarcodePOSTNET, BarcodeUSPS_4State |
2117 | 43 | 43 | ||
2118 | 44 | #newer codes will typically get their own module | 44 | #newer codes will typically get their own module |
2120 | 45 | from eanbc import Ean13BarcodeWidget, Ean8BarcodeWidget | 45 | from eanbc import Ean13BarcodeWidget, Ean8BarcodeWidget, UPCA |
2121 | 46 | from qr import QrCodeWidget | 46 | from qr import QrCodeWidget |
2122 | 47 | 47 | ||
2123 | 48 | 48 | ||
2124 | @@ -64,6 +64,7 @@ | |||
2125 | 64 | BarcodeUSPS_4State, | 64 | BarcodeUSPS_4State, |
2126 | 65 | Ean13BarcodeWidget, | 65 | Ean13BarcodeWidget, |
2127 | 66 | Ean8BarcodeWidget, | 66 | Ean8BarcodeWidget, |
2128 | 67 | UPCA, | ||
2129 | 67 | QrCodeWidget, | 68 | QrCodeWidget, |
2130 | 68 | ): | 69 | ): |
2131 | 69 | codeName = widget.codeName | 70 | codeName = widget.codeName |
2132 | 70 | 71 | ||
2133 | === modified file 'src/reportlab/graphics/barcode/eanbc.py' | |||
2134 | --- src/reportlab/graphics/barcode/eanbc.py 2010-12-06 12:45:44 +0000 | |||
2135 | +++ src/reportlab/graphics/barcode/eanbc.py 2013-04-14 00:52:26 +0000 | |||
2136 | @@ -113,15 +113,16 @@ | |||
2137 | 113 | else: | 113 | else: |
2138 | 114 | manufacturerCodes[int(k)] = v | 114 | manufacturerCodes[int(k)] = v |
2139 | 115 | 115 | ||
2144 | 116 | class isEan13String(Validator): | 116 | def nDigits(n): |
2145 | 117 | def test(self,x): | 117 | class _ndigits(Validator): |
2146 | 118 | return type(x) is str and len(x)<=12 and len([c for c in x if c in "0123456789"])==12 | 118 | def test(self,x): |
2147 | 119 | isEan13String = isEan13String() | 119 | return type(x) is str and len(x)<=n and len([c for c in x if c in "0123456789"])==n |
2148 | 120 | return _ndigits() | ||
2149 | 120 | 121 | ||
2150 | 121 | class Ean13BarcodeWidget(PlotArea): | 122 | class Ean13BarcodeWidget(PlotArea): |
2151 | 122 | codeName = "EAN13" | 123 | codeName = "EAN13" |
2152 | 123 | _attrMap = AttrMap(BASE=PlotArea, | 124 | _attrMap = AttrMap(BASE=PlotArea, |
2154 | 124 | value = AttrMapValue(isEan13String, desc='the number'), | 125 | value = AttrMapValue(nDigits(12), desc='the number'), |
2155 | 125 | fontName = AttrMapValue(isString, desc='fontName'), | 126 | fontName = AttrMapValue(isString, desc='fontName'), |
2156 | 126 | fontSize = AttrMapValue(isNumber, desc='font size'), | 127 | fontSize = AttrMapValue(isNumber, desc='font size'), |
2157 | 127 | x = AttrMapValue(isNumber, desc='x-coord'), | 128 | x = AttrMapValue(isNumber, desc='x-coord'), |
2158 | @@ -295,15 +296,10 @@ | |||
2159 | 295 | return chr(z+((10-(iSum%10))%10)) | 296 | return chr(z+((10-(iSum%10))%10)) |
2160 | 296 | _checkdigit=classmethod(_checkdigit) | 297 | _checkdigit=classmethod(_checkdigit) |
2161 | 297 | 298 | ||
2162 | 298 | class isEan8String(Validator): | ||
2163 | 299 | def test(self,x): | ||
2164 | 300 | return type(x) is str and len(x)<=7 and len([c for c in x if c in "0123456789"])==7 | ||
2165 | 301 | isEan8String = isEan8String() | ||
2166 | 302 | |||
2167 | 303 | class Ean8BarcodeWidget(Ean13BarcodeWidget): | 299 | class Ean8BarcodeWidget(Ean13BarcodeWidget): |
2168 | 304 | codeName = "EAN8" | 300 | codeName = "EAN8" |
2169 | 305 | _attrMap = AttrMap(BASE=Ean13BarcodeWidget, | 301 | _attrMap = AttrMap(BASE=Ean13BarcodeWidget, |
2171 | 306 | value = AttrMapValue(isEan8String, desc='the number'), | 302 | value = AttrMapValue(nDigits(7), desc='the number'), |
2172 | 307 | ) | 303 | ) |
2173 | 308 | _start_right = 4 #for ean-13 left = [0:7] right=[7:13] | 304 | _start_right = 4 #for ean-13 left = [0:7] right=[7:13] |
2174 | 309 | _nbars = 85 | 305 | _nbars = 85 |
2175 | @@ -339,3 +335,14 @@ | |||
2176 | 339 | x = (59.5-9+self._lquiet)*barWidth | 335 | x = (59.5-9+self._lquiet)*barWidth |
2177 | 340 | c = s[4:] | 336 | c = s[4:] |
2178 | 341 | gAdd(String(x,y,c,fontName=fontName,fontSize=fontSize,fillColor=textColor,textAnchor='middle')) | 337 | gAdd(String(x,y,c,fontName=fontName,fontSize=fontSize,fillColor=textColor,textAnchor='middle')) |
2179 | 338 | |||
2180 | 339 | class UPCA(Ean13BarcodeWidget): | ||
2181 | 340 | codeName = "UPCA" | ||
2182 | 341 | _attrMap = AttrMap(BASE=Ean13BarcodeWidget, | ||
2183 | 342 | value = AttrMapValue(nDigits(11), desc='the number'), | ||
2184 | 343 | ) | ||
2185 | 344 | _start_right = 6 | ||
2186 | 345 | _digits = 11 | ||
2187 | 346 | _0csw = 3 | ||
2188 | 347 | _1csw = 1 | ||
2189 | 348 | _nbars = 1+7*11+2*3+5 | ||
2190 | 342 | 349 | ||
2191 | === modified file 'src/reportlab/graphics/barcode/test.py' | |||
2192 | --- src/reportlab/graphics/barcode/test.py 2008-10-19 23:16:31 +0000 | |||
2193 | +++ src/reportlab/graphics/barcode/test.py 2013-04-14 00:52:26 +0000 | |||
2194 | @@ -63,6 +63,10 @@ | |||
2195 | 63 | story.append(bcd) | 63 | story.append(bcd) |
2196 | 64 | story.append(Paragraph('EAN8', styleN)) | 64 | story.append(Paragraph('EAN8', styleN)) |
2197 | 65 | bcd = createBarcodeDrawing('EAN8', value='1234567') | 65 | bcd = createBarcodeDrawing('EAN8', value='1234567') |
2198 | 66 | story.append(bcd) | ||
2199 | 67 | story.append(Paragraph('UPCA', styleN)) | ||
2200 | 68 | bcd = createBarcodeDrawing('UPCA', value='03600029145') | ||
2201 | 69 | story.append(bcd) | ||
2202 | 66 | story.append(Paragraph('USPS_4State', styleN)) | 70 | story.append(Paragraph('USPS_4State', styleN)) |
2203 | 67 | bcd = createBarcodeDrawing('USPS_4State', value='01234567094987654321',routing='01234567891') | 71 | bcd = createBarcodeDrawing('USPS_4State', value='01234567094987654321',routing='01234567891') |
2204 | 68 | story.append(bcd) | 72 | story.append(bcd) |
2205 | 69 | 73 | ||
2206 | === modified file 'src/reportlab/graphics/barcode/usps4s.py' | |||
2207 | --- src/reportlab/graphics/barcode/usps4s.py 2008-10-19 23:16:31 +0000 | |||
2208 | +++ src/reportlab/graphics/barcode/usps4s.py 2013-04-14 00:52:26 +0000 | |||
2209 | @@ -1,6 +1,6 @@ | |||
2211 | 1 | #copyright ReportLab Inc. 2000-2006 | 1 | #copyright ReportLab Inc. 2000-2012 |
2212 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
2214 | 3 | __version__=''' $Id: usps4s.py 2966 2006-08-31 15:20:29Z rgbecker $ ''' | 3 | __version__=''' $Id: usps4s.py 3959 2012-09-27 14:39:39Z robin $ ''' |
2215 | 4 | __all__ = ('USPS_4State',) | 4 | __all__ = ('USPS_4State',) |
2216 | 5 | 5 | ||
2217 | 6 | from reportlab.lib.colors import black | 6 | from reportlab.lib.colors import black |
2218 | 7 | 7 | ||
2219 | === modified file 'src/reportlab/graphics/barcode/widgets.py' | |||
2220 | --- src/reportlab/graphics/barcode/widgets.py 2010-12-06 12:45:44 +0000 | |||
2221 | +++ src/reportlab/graphics/barcode/widgets.py 2013-04-14 00:52:26 +0000 | |||
2222 | @@ -1,6 +1,6 @@ | |||
2224 | 1 | #copyright ReportLab Europe Limited. 2000-2006 | 1 | #copyright ReportLab Europe Limited. 2000-2012 |
2225 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
2227 | 3 | __version__=''' $Id: widgets.py 3764 2010-09-06 13:24:45Z juraj $ ''' | 3 | __version__=''' $Id: widgets.py 3959 2012-09-27 14:39:39Z robin $ ''' |
2228 | 4 | __all__= ( | 4 | __all__= ( |
2229 | 5 | 'BarcodeI2of5', | 5 | 'BarcodeI2of5', |
2230 | 6 | 'BarcodeCode128', | 6 | 'BarcodeCode128', |
2231 | 7 | 7 | ||
2232 | === modified file 'src/reportlab/graphics/charts/__init__.py' | |||
2233 | --- src/reportlab/graphics/charts/__init__.py 2009-02-22 14:19:44 +0000 | |||
2234 | +++ src/reportlab/graphics/charts/__init__.py 2013-04-14 00:52:26 +0000 | |||
2235 | @@ -1,5 +1,5 @@ | |||
2237 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
2238 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
2239 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/__init__.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/__init__.py |
2241 | 4 | __version__=''' $Id: __init__.py 3345 2008-12-12 17:55:22Z damian $ ''' | 4 | __version__=''' $Id: __init__.py 3959 2012-09-27 14:39:39Z robin $ ''' |
2242 | 5 | __doc__='''Business charts''' | 5 | __doc__='''Business charts''' |
2243 | 6 | 6 | ||
2244 | === modified file 'src/reportlab/graphics/charts/areas.py' | |||
2245 | --- src/reportlab/graphics/charts/areas.py 2010-02-16 23:32:55 +0000 | |||
2246 | +++ src/reportlab/graphics/charts/areas.py 2013-04-14 00:52:26 +0000 | |||
2247 | @@ -1,8 +1,8 @@ | |||
2249 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
2250 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
2251 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/areas.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/areas.py |
2252 | 4 | 4 | ||
2254 | 5 | __version__=''' $Id: areas.py 3602 2009-11-26 16:25:50Z meitham $ ''' | 5 | __version__=''' $Id: areas.py 3959 2012-09-27 14:39:39Z robin $ ''' |
2255 | 6 | __doc__='''This module defines a Area mixin classes''' | 6 | __doc__='''This module defines a Area mixin classes''' |
2256 | 7 | 7 | ||
2257 | 8 | from reportlab.lib.validators import isNumber, isColor, isColorOrNone, isNoneOrShape | 8 | from reportlab.lib.validators import isNumber, isColor, isColorOrNone, isNoneOrShape |
2258 | 9 | 9 | ||
2259 | === modified file 'src/reportlab/graphics/charts/axes.py' | |||
2260 | --- src/reportlab/graphics/charts/axes.py 2010-12-06 12:45:44 +0000 | |||
2261 | +++ src/reportlab/graphics/charts/axes.py 2013-04-14 00:52:26 +0000 | |||
2262 | @@ -1,6 +1,6 @@ | |||
2264 | 1 | #Copyright ReportLab Europe Ltd. 2000-2010 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
2265 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
2267 | 3 | __version__=''' $Id: axes.py 3748 2010-07-27 09:36:33Z rgbecker $ ''' | 3 | __version__=''' $Id: axes.py 3959 2012-09-27 14:39:39Z robin $ ''' |
2268 | 4 | __doc__="""Collection of axes for charts. | 4 | __doc__="""Collection of axes for charts. |
2269 | 5 | 5 | ||
2270 | 6 | The current collection comprises axes for charts using cartesian | 6 | The current collection comprises axes for charts using cartesian |
2271 | @@ -37,10 +37,12 @@ | |||
2272 | 37 | isNormalDate | 37 | isNormalDate |
2273 | 38 | from reportlab.lib.attrmap import * | 38 | from reportlab.lib.attrmap import * |
2274 | 39 | from reportlab.lib import normalDate | 39 | from reportlab.lib import normalDate |
2276 | 40 | from reportlab.graphics.shapes import Drawing, Line, PolyLine, Group, STATE_DEFAULTS, _textBoxLimits, _rotatedBoxLimits | 40 | from reportlab.graphics.shapes import Drawing, Line, PolyLine, Rect, Group, STATE_DEFAULTS, _textBoxLimits, _rotatedBoxLimits |
2277 | 41 | from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection | 41 | from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection |
2278 | 42 | from reportlab.graphics.charts.textlabels import Label | 42 | from reportlab.graphics.charts.textlabels import Label |
2279 | 43 | from reportlab.graphics.charts.utils import nextRoundNumber | 43 | from reportlab.graphics.charts.utils import nextRoundNumber |
2280 | 44 | from reportlab.graphics.widgets.grids import ShadedRect | ||
2281 | 45 | from reportlab.lib.colors import Color | ||
2282 | 44 | import copy | 46 | import copy |
2283 | 45 | 47 | ||
2284 | 46 | 48 | ||
2285 | @@ -76,8 +78,8 @@ | |||
2286 | 76 | class AxisLineAnnotation: | 78 | class AxisLineAnnotation: |
2287 | 77 | '''Create a grid like line using the given user value to draw the line | 79 | '''Create a grid like line using the given user value to draw the line |
2288 | 78 | kwds may contain | 80 | kwds may contain |
2291 | 79 | startOffset offset from the default grid start position | 81 | startOffset if true v is offset from the default grid start position |
2292 | 80 | endOffset offset from the default grid end position | 82 | endOffset if true v is offset from the default grid end position |
2293 | 81 | scaleValue True/not given --> scale the value | 83 | scaleValue True/not given --> scale the value |
2294 | 82 | otherwise use the absolute value | 84 | otherwise use the absolute value |
2295 | 83 | lo lowest coordinate to draw default 0 | 85 | lo lowest coordinate to draw default 0 |
2296 | @@ -93,10 +95,14 @@ | |||
2297 | 93 | def __call__(self,axis): | 95 | def __call__(self,axis): |
2298 | 94 | kwds = self._kwds.copy() | 96 | kwds = self._kwds.copy() |
2299 | 95 | scaleValue = kwds.pop('scaleValue',True) | 97 | scaleValue = kwds.pop('scaleValue',True) |
2300 | 98 | endOffset = kwds.pop('endOffset',False) | ||
2301 | 99 | startOffset = kwds.pop('endOffset',False) | ||
2302 | 96 | if axis.isYAxis: | 100 | if axis.isYAxis: |
2303 | 97 | offs = axis._x | 101 | offs = axis._x |
2304 | 102 | d0 = axis._y | ||
2305 | 98 | else: | 103 | else: |
2306 | 99 | offs = axis._y | 104 | offs = axis._y |
2307 | 105 | d0 = axis._x | ||
2308 | 100 | s = kwds.pop('start',None) | 106 | s = kwds.pop('start',None) |
2309 | 101 | e = kwds.pop('end',None) | 107 | e = kwds.pop('end',None) |
2310 | 102 | if s is None or e is None: | 108 | if s is None or e is None: |
2311 | @@ -109,15 +115,19 @@ | |||
2312 | 109 | else: | 115 | else: |
2313 | 110 | if s is None: s = 0 | 116 | if s is None: s = 0 |
2314 | 111 | if e is None: e = 0 | 117 | if e is None: e = 0 |
2317 | 112 | hi = kwds.pop('hi',axis._length) | 118 | hi = kwds.pop('hi',axis._length)+d0 |
2318 | 113 | lo = kwds.pop('lo',0) | 119 | lo = kwds.pop('lo',0)+d0 |
2319 | 114 | lo,hi=min(lo,hi),max(lo,hi) | 120 | lo,hi=min(lo,hi),max(lo,hi) |
2320 | 115 | drawAtLimit = kwds.pop('drawAtLimit',False) | 121 | drawAtLimit = kwds.pop('drawAtLimit',False) |
2321 | 122 | oaglp = axis._get_line_pos | ||
2322 | 116 | if not scaleValue: | 123 | if not scaleValue: |
2323 | 117 | oaglp = axis._get_line_pos | ||
2324 | 118 | axis._get_line_pos = lambda x: x | 124 | axis._get_line_pos = lambda x: x |
2325 | 119 | try: | 125 | try: |
2326 | 120 | v = self._v | 126 | v = self._v |
2327 | 127 | if endOffset: | ||
2328 | 128 | v = v + hi | ||
2329 | 129 | elif startOffset: | ||
2330 | 130 | v = v + lo | ||
2331 | 121 | func = axis._getLineFunc(s-offs,e-offs,kwds.pop('parent',None)) | 131 | func = axis._getLineFunc(s-offs,e-offs,kwds.pop('parent',None)) |
2332 | 122 | if not hasattr(axis,'_tickValues'): | 132 | if not hasattr(axis,'_tickValues'): |
2333 | 123 | axis._pseudo_configure() | 133 | axis._pseudo_configure() |
2334 | @@ -133,10 +143,78 @@ | |||
2335 | 133 | for k,v in kwds.iteritems(): | 143 | for k,v in kwds.iteritems(): |
2336 | 134 | setattr(L,k,v) | 144 | setattr(L,k,v) |
2337 | 135 | finally: | 145 | finally: |
2340 | 136 | if not scaleValue: | 146 | axis._get_line_pos = oaglp |
2339 | 137 | axis._get_line_pos = oaglp | ||
2341 | 138 | return L | 147 | return L |
2342 | 139 | 148 | ||
2343 | 149 | class AxisBackgroundAnnotation: | ||
2344 | 150 | '''Create a set of coloured bars on the background of a chart using axis ticks as the bar borders | ||
2345 | 151 | colors is a set of colors to use for the background bars. A colour of None is just a skip. | ||
2346 | 152 | Special effects if you pass a rect or Shaded rect instead. | ||
2347 | 153 | ''' | ||
2348 | 154 | def __init__(self,colors,**kwds): | ||
2349 | 155 | self._colors = colors | ||
2350 | 156 | self._kwds = kwds | ||
2351 | 157 | |||
2352 | 158 | def __call__(self,axis): | ||
2353 | 159 | colors = self._colors | ||
2354 | 160 | if not colors: return | ||
2355 | 161 | kwds = self._kwds.copy() | ||
2356 | 162 | isYAxis = axis.isYAxis | ||
2357 | 163 | if isYAxis: | ||
2358 | 164 | offs = axis._x | ||
2359 | 165 | d0 = axis._y | ||
2360 | 166 | else: | ||
2361 | 167 | offs = axis._y | ||
2362 | 168 | d0 = axis._x | ||
2363 | 169 | s = kwds.pop('start',None) | ||
2364 | 170 | e = kwds.pop('end',None) | ||
2365 | 171 | if s is None or e is None: | ||
2366 | 172 | dim = getattr(getattr(axis,'joinAxis',None),'getGridDims',None) | ||
2367 | 173 | if dim and hasattr(dim,'__call__'): | ||
2368 | 174 | dim = dim() | ||
2369 | 175 | if dim: | ||
2370 | 176 | if s is None: s = dim[0] | ||
2371 | 177 | if e is None: e = dim[1] | ||
2372 | 178 | else: | ||
2373 | 179 | if s is None: s = 0 | ||
2374 | 180 | if e is None: e = 0 | ||
2375 | 181 | if not hasattr(axis,'_tickValues'): | ||
2376 | 182 | axis._pseudo_configure() | ||
2377 | 183 | tv = getattr(axis,'_tickValues',None) | ||
2378 | 184 | if not tv: return | ||
2379 | 185 | G = Group() | ||
2380 | 186 | ncolors = len(colors) | ||
2381 | 187 | v0 = axis._get_line_pos(tv[0]) | ||
2382 | 188 | for i in xrange(1,len(tv)): | ||
2383 | 189 | v1 = axis._get_line_pos(tv[i]) | ||
2384 | 190 | c = colors[(i-1)%ncolors] | ||
2385 | 191 | if c: | ||
2386 | 192 | if isYAxis: | ||
2387 | 193 | y = v0 | ||
2388 | 194 | x = s | ||
2389 | 195 | height = v1-v0 | ||
2390 | 196 | width = e-s | ||
2391 | 197 | else: | ||
2392 | 198 | x = v0 | ||
2393 | 199 | y = s | ||
2394 | 200 | width = v1-v0 | ||
2395 | 201 | height = e-s | ||
2396 | 202 | if isinstance(c,Color): | ||
2397 | 203 | r = Rect(x,y,width,height,fillColor=c,strokeColor=None) | ||
2398 | 204 | elif isinstance(c,Rect): | ||
2399 | 205 | r = Rect(x,y,width,height) | ||
2400 | 206 | for k in c.__dict__: | ||
2401 | 207 | if k not in ('x','y','width','height'): | ||
2402 | 208 | setattr(r,k,getattr(c,k)) | ||
2403 | 209 | elif isinstance(c,ShadedRect): | ||
2404 | 210 | r = ShadedRect(x=x,y=y,width=width,height=height) | ||
2405 | 211 | for k in c.__dict__: | ||
2406 | 212 | if k not in ('x','y','width','height'): | ||
2407 | 213 | setattr(r,k,getattr(c,k)) | ||
2408 | 214 | G.add(r) | ||
2409 | 215 | v0 = v1 | ||
2410 | 216 | return G | ||
2411 | 217 | |||
2412 | 140 | class TickLU: | 218 | class TickLU: |
2413 | 141 | '''lookup special cases for tick values''' | 219 | '''lookup special cases for tick values''' |
2414 | 142 | def __init__(self,*T,**kwds): | 220 | def __init__(self,*T,**kwds): |
2415 | @@ -375,6 +453,7 @@ | |||
2416 | 375 | annotations = AttrMapValue(None,desc='list of annotations'), | 453 | annotations = AttrMapValue(None,desc='list of annotations'), |
2417 | 376 | loLLen = AttrMapValue(isNumber, desc='extra line length before start of the axis'), | 454 | loLLen = AttrMapValue(isNumber, desc='extra line length before start of the axis'), |
2418 | 377 | hiLLen = AttrMapValue(isNumber, desc='extra line length after end of the axis'), | 455 | hiLLen = AttrMapValue(isNumber, desc='extra line length after end of the axis'), |
2419 | 456 | skipGrid = AttrMapValue(OneOf('none','top','both','bottom'),"grid lines to skip top bottom both none"), | ||
2420 | 378 | ) | 457 | ) |
2421 | 379 | 458 | ||
2422 | 380 | def __init__(self): | 459 | def __init__(self): |
2423 | @@ -612,31 +691,24 @@ | |||
2424 | 612 | 691 | ||
2425 | 613 | def joinToAxis(self, yAxis, mode='bottom', pos=None): | 692 | def joinToAxis(self, yAxis, mode='bottom', pos=None): |
2426 | 614 | "Join with y-axis using some mode." | 693 | "Join with y-axis using some mode." |
2427 | 615 | |||
2428 | 616 | _assertYAxis(yAxis) | 694 | _assertYAxis(yAxis) |
2429 | 617 | if mode == 'bottom': | 695 | if mode == 'bottom': |
2430 | 618 | self._x = yAxis._x | ||
2431 | 619 | self._y = yAxis._y | 696 | self._y = yAxis._y |
2432 | 620 | elif mode == 'top': | 697 | elif mode == 'top': |
2433 | 621 | self._x = yAxis._x | ||
2434 | 622 | self._y = yAxis._y + yAxis._length | 698 | self._y = yAxis._y + yAxis._length |
2435 | 623 | elif mode == 'value': | 699 | elif mode == 'value': |
2436 | 624 | self._x = yAxis._x | ||
2437 | 625 | self._y = yAxis.scale(pos) | 700 | self._y = yAxis.scale(pos) |
2438 | 626 | elif mode == 'points': | 701 | elif mode == 'points': |
2439 | 627 | self._x = yAxis._x | ||
2440 | 628 | self._y = pos | 702 | self._y = pos |
2441 | 629 | 703 | ||
2442 | 630 | def _joinToAxis(self): | 704 | def _joinToAxis(self): |
2443 | 631 | ja = self.joinAxis | 705 | ja = self.joinAxis |
2444 | 632 | if ja: | 706 | if ja: |
2445 | 633 | jam = self.joinAxisMode | 707 | jam = self.joinAxisMode |
2446 | 634 | jap = self.joinAxisPos | ||
2447 | 635 | jta = self.joinToAxis | ||
2448 | 636 | if jam in ('bottom', 'top'): | 708 | if jam in ('bottom', 'top'): |
2450 | 637 | jta(ja, mode=jam) | 709 | self.joinToAxis(ja, mode=jam) |
2451 | 638 | elif jam in ('value', 'points'): | 710 | elif jam in ('value', 'points'): |
2453 | 639 | jta(ja, mode=jam, pos=jap) | 711 | self.joinToAxis(ja, mode=jam, pos=self.joinAxisPos) |
2454 | 640 | 712 | ||
2455 | 641 | def scale(self, idx): | 713 | def scale(self, idx): |
2456 | 642 | """returns the x position and width in drawing units of the slice""" | 714 | """returns the x position and width in drawing units of the slice""" |
2457 | @@ -726,30 +798,23 @@ | |||
2458 | 726 | "Join with x-axis using some mode." | 798 | "Join with x-axis using some mode." |
2459 | 727 | 799 | ||
2460 | 728 | _assertXAxis(xAxis) | 800 | _assertXAxis(xAxis) |
2461 | 729 | |||
2462 | 730 | if mode == 'left': | 801 | if mode == 'left': |
2463 | 731 | self._x = xAxis._x * 1.0 | 802 | self._x = xAxis._x * 1.0 |
2464 | 732 | self._y = xAxis._y * 1.0 | ||
2465 | 733 | elif mode == 'right': | 803 | elif mode == 'right': |
2466 | 734 | self._x = (xAxis._x + xAxis._length) * 1.0 | 804 | self._x = (xAxis._x + xAxis._length) * 1.0 |
2467 | 735 | self._y = xAxis._y * 1.0 | ||
2468 | 736 | elif mode == 'value': | 805 | elif mode == 'value': |
2469 | 737 | self._x = xAxis.scale(pos) * 1.0 | 806 | self._x = xAxis.scale(pos) * 1.0 |
2470 | 738 | self._y = xAxis._y * 1.0 | ||
2471 | 739 | elif mode == 'points': | 807 | elif mode == 'points': |
2472 | 740 | self._x = pos * 1.0 | 808 | self._x = pos * 1.0 |
2473 | 741 | self._y = xAxis._y * 1.0 | ||
2474 | 742 | 809 | ||
2475 | 743 | def _joinToAxis(self): | 810 | def _joinToAxis(self): |
2476 | 744 | ja = self.joinAxis | 811 | ja = self.joinAxis |
2477 | 745 | if ja: | 812 | if ja: |
2478 | 746 | jam = self.joinAxisMode | 813 | jam = self.joinAxisMode |
2479 | 747 | jap = self.joinAxisPos | ||
2480 | 748 | jta = self.joinToAxis | ||
2481 | 749 | if jam in ('left', 'right'): | 814 | if jam in ('left', 'right'): |
2483 | 750 | jta(ja, mode=jam) | 815 | self.joinToAxis(ja, mode=jam) |
2484 | 751 | elif jam in ('value', 'points'): | 816 | elif jam in ('value', 'points'): |
2486 | 752 | jta(ja, mode=jam, pos=jap) | 817 | self.joinToAxis(ja, mode=jam, pos=self.joinAxisPos) |
2487 | 753 | 818 | ||
2488 | 754 | def scale(self, idx): | 819 | def scale(self, idx): |
2489 | 755 | "Returns the y position and width in drawing units of the slice." | 820 | "Returns the y position and width in drawing units of the slice." |
2490 | @@ -872,6 +937,7 @@ | |||
2491 | 872 | subGridStart = AttrMapValue(isNumberOrNone, desc='Start of grid lines wrt axis origin'), | 937 | subGridStart = AttrMapValue(isNumberOrNone, desc='Start of grid lines wrt axis origin'), |
2492 | 873 | subGridEnd = AttrMapValue(isNumberOrNone, desc='End of grid lines wrt axis origin'), | 938 | subGridEnd = AttrMapValue(isNumberOrNone, desc='End of grid lines wrt axis origin'), |
2493 | 874 | keepTickLabelsInside = AttrMapValue(isBoolean, desc='Ensure tick labels do not project beyond bounds of axis if true'), | 939 | keepTickLabelsInside = AttrMapValue(isBoolean, desc='Ensure tick labels do not project beyond bounds of axis if true'), |
2494 | 940 | skipGrid = AttrMapValue(OneOf('none','top','both','bottom'),"grid lines to skip top bottom both none"), | ||
2495 | 875 | ) | 941 | ) |
2496 | 876 | 942 | ||
2497 | 877 | def __init__(self,**kw): | 943 | def __init__(self,**kw): |
2498 | @@ -1377,28 +1443,22 @@ | |||
2499 | 1377 | "Join with y-axis using some mode." | 1443 | "Join with y-axis using some mode." |
2500 | 1378 | _assertYAxis(yAxis) | 1444 | _assertYAxis(yAxis) |
2501 | 1379 | if mode == 'bottom': | 1445 | if mode == 'bottom': |
2502 | 1380 | self._x = yAxis._x * 1.0 | ||
2503 | 1381 | self._y = yAxis._y * 1.0 | 1446 | self._y = yAxis._y * 1.0 |
2504 | 1382 | elif mode == 'top': | 1447 | elif mode == 'top': |
2505 | 1383 | self._x = yAxis._x * 1.0 | ||
2506 | 1384 | self._y = (yAxis._y + yAxis._length) * 1.0 | 1448 | self._y = (yAxis._y + yAxis._length) * 1.0 |
2507 | 1385 | elif mode == 'value': | 1449 | elif mode == 'value': |
2508 | 1386 | self._x = yAxis._x * 1.0 | ||
2509 | 1387 | self._y = yAxis.scale(pos) * 1.0 | 1450 | self._y = yAxis.scale(pos) * 1.0 |
2510 | 1388 | elif mode == 'points': | 1451 | elif mode == 'points': |
2511 | 1389 | self._x = yAxis._x * 1.0 | ||
2512 | 1390 | self._y = pos * 1.0 | 1452 | self._y = pos * 1.0 |
2513 | 1391 | 1453 | ||
2514 | 1392 | def _joinToAxis(self): | 1454 | def _joinToAxis(self): |
2515 | 1393 | ja = self.joinAxis | 1455 | ja = self.joinAxis |
2516 | 1394 | if ja: | 1456 | if ja: |
2520 | 1395 | jam = self.joinAxisMode | 1457 | jam = self.joinAxisMode or 'bottom' |
2518 | 1396 | jap = self.joinAxisPos | ||
2519 | 1397 | jta = self.joinToAxis | ||
2521 | 1398 | if jam in ('bottom', 'top'): | 1458 | if jam in ('bottom', 'top'): |
2523 | 1399 | jta(ja, mode=jam) | 1459 | self.joinToAxis(ja, mode=jam) |
2524 | 1400 | elif jam in ('value', 'points'): | 1460 | elif jam in ('value', 'points'): |
2526 | 1401 | jta(ja, mode=jam, pos=jap) | 1461 | self.joinToAxis(ja, mode=jam, pos=self.joinAxisPos) |
2527 | 1402 | 1462 | ||
2528 | 1403 | def makeAxis(self): | 1463 | def makeAxis(self): |
2529 | 1404 | g = Group() | 1464 | g = Group() |
2530 | @@ -1485,6 +1545,7 @@ | |||
2531 | 1485 | dailyFreq = AttrMapValue(isBoolean, desc='True if we are to assume daily data to be ticked at end of month.'), | 1545 | dailyFreq = AttrMapValue(isBoolean, desc='True if we are to assume daily data to be ticked at end of month.'), |
2532 | 1486 | specifiedTickDates = AttrMapValue(NoneOr(SequenceOf(isNormalDate)), desc='Actual tick values to use; no calculations done'), | 1546 | specifiedTickDates = AttrMapValue(NoneOr(SequenceOf(isNormalDate)), desc='Actual tick values to use; no calculations done'), |
2533 | 1487 | specialTickClear = AttrMapValue(isBoolean, desc='clear rather than delete close ticks when forced first/end dates'), | 1547 | specialTickClear = AttrMapValue(isBoolean, desc='clear rather than delete close ticks when forced first/end dates'), |
2534 | 1548 | skipGrid = AttrMapValue(OneOf('none','top','both','bottom'),"grid lines to skip top bottom both none"), | ||
2535 | 1488 | ) | 1549 | ) |
2536 | 1489 | 1550 | ||
2537 | 1490 | _valueClass = normalDate.ND | 1551 | _valueClass = normalDate.ND |
2538 | @@ -1755,27 +1816,21 @@ | |||
2539 | 1755 | _assertXAxis(xAxis) | 1816 | _assertXAxis(xAxis) |
2540 | 1756 | if mode == 'left': | 1817 | if mode == 'left': |
2541 | 1757 | self._x = xAxis._x * 1.0 | 1818 | self._x = xAxis._x * 1.0 |
2542 | 1758 | self._y = xAxis._y * 1.0 | ||
2543 | 1759 | elif mode == 'right': | 1819 | elif mode == 'right': |
2544 | 1760 | self._x = (xAxis._x + xAxis._length) * 1.0 | 1820 | self._x = (xAxis._x + xAxis._length) * 1.0 |
2545 | 1761 | self._y = xAxis._y * 1.0 | ||
2546 | 1762 | elif mode == 'value': | 1821 | elif mode == 'value': |
2547 | 1763 | self._x = xAxis.scale(pos) * 1.0 | 1822 | self._x = xAxis.scale(pos) * 1.0 |
2548 | 1764 | self._y = xAxis._y * 1.0 | ||
2549 | 1765 | elif mode == 'points': | 1823 | elif mode == 'points': |
2550 | 1766 | self._x = pos * 1.0 | 1824 | self._x = pos * 1.0 |
2551 | 1767 | self._y = xAxis._y * 1.0 | ||
2552 | 1768 | 1825 | ||
2553 | 1769 | def _joinToAxis(self): | 1826 | def _joinToAxis(self): |
2554 | 1770 | ja = self.joinAxis | 1827 | ja = self.joinAxis |
2555 | 1771 | if ja: | 1828 | if ja: |
2556 | 1772 | jam = self.joinAxisMode | 1829 | jam = self.joinAxisMode |
2557 | 1773 | jap = self.joinAxisPos | ||
2558 | 1774 | jta = self.joinToAxis | ||
2559 | 1775 | if jam in ('left', 'right'): | 1830 | if jam in ('left', 'right'): |
2561 | 1776 | jta(ja, mode=jam) | 1831 | self.joinToAxis(ja, mode=jam) |
2562 | 1777 | elif jam in ('value', 'points'): | 1832 | elif jam in ('value', 'points'): |
2564 | 1778 | jta(ja, mode=jam, pos=jap) | 1833 | self.joinToAxis(ja, mode=jam, pos=self.joinAxisPos) |
2565 | 1779 | 1834 | ||
2566 | 1780 | def makeAxis(self): | 1835 | def makeAxis(self): |
2567 | 1781 | g = Group() | 1836 | g = Group() |
2568 | 1782 | 1837 | ||
2569 | === modified file 'src/reportlab/graphics/charts/barcharts.py' | |||
2570 | --- src/reportlab/graphics/charts/barcharts.py 2010-12-06 12:45:44 +0000 | |||
2571 | +++ src/reportlab/graphics/charts/barcharts.py 2013-04-14 00:52:26 +0000 | |||
2572 | @@ -1,7 +1,7 @@ | |||
2574 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
2575 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
2576 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/barcharts.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/barcharts.py |
2578 | 4 | __version__=''' $Id: barcharts.py 3761 2010-09-02 14:40:46Z damian $ ''' | 4 | __version__=''' $Id: barcharts.py 3959 2012-09-27 14:39:39Z robin $ ''' |
2579 | 5 | __doc__="""This module defines a variety of Bar Chart components. | 5 | __doc__="""This module defines a variety of Bar Chart components. |
2580 | 6 | 6 | ||
2581 | 7 | The basic flavors are stacked and side-by-side, available in horizontal and | 7 | The basic flavors are stacked and side-by-side, available in horizontal and |
2582 | @@ -49,7 +49,7 @@ | |||
2583 | 49 | "Abstract base class, unusable by itself." | 49 | "Abstract base class, unusable by itself." |
2584 | 50 | 50 | ||
2585 | 51 | _attrMap = AttrMap(BASE=PlotArea, | 51 | _attrMap = AttrMap(BASE=PlotArea, |
2587 | 52 | useAbsolute = AttrMapValue(EitherOr((isBoolean,EitherOr((isString,isNumber)))), desc='Flag to use absolute spacing values; use string of gsb for finer control\n(g=groupSpacing,s=barSpacing,b=barWidth). ',advancedUsage=1), | 52 | useAbsolute = AttrMapValue(EitherOr((isBoolean,EitherOr((isString,isNumber)))), desc='Flag to use absolute spacing values; use string of gsb for finer control\n(g=groupSpacing,s=barSpacing,b=barWidth).',advancedUsage=1), |
2588 | 53 | barWidth = AttrMapValue(isNumber, desc='The width of an individual bar.'), | 53 | barWidth = AttrMapValue(isNumber, desc='The width of an individual bar.'), |
2589 | 54 | groupSpacing = AttrMapValue(isNumber, desc='Width between groups of bars.'), | 54 | groupSpacing = AttrMapValue(isNumber, desc='Width between groups of bars.'), |
2590 | 55 | barSpacing = AttrMapValue(isNumber, desc='Width between individual bars.'), | 55 | barSpacing = AttrMapValue(isNumber, desc='Width between individual bars.'), |
2591 | @@ -67,6 +67,16 @@ | |||
2592 | 67 | categoryLabelBarSize = AttrMapValue(isNumber, desc='width to leave for a category label to go between categories.'), | 67 | categoryLabelBarSize = AttrMapValue(isNumber, desc='width to leave for a category label to go between categories.'), |
2593 | 68 | categoryLabelBarOrder = AttrMapValue(OneOf('first','last','auto'), desc='where any label bar should appear first/last'), | 68 | categoryLabelBarOrder = AttrMapValue(OneOf('first','last','auto'), desc='where any label bar should appear first/last'), |
2594 | 69 | barRecord = AttrMapValue(None, desc='callable(bar,label=labelText,value=value,**kwds) to record bar information', advancedUsage=1), | 69 | barRecord = AttrMapValue(None, desc='callable(bar,label=labelText,value=value,**kwds) to record bar information', advancedUsage=1), |
2595 | 70 | zIndexOverrides = AttrMapValue(isStringOrNone, desc='''None (the default ie use old z ordering scheme) or a ',' separated list of key=value (int/float) for new zIndex ordering. If used defaults are | ||
2596 | 71 | background=0, | ||
2597 | 72 | categoryAxis=1, | ||
2598 | 73 | valueAxis=2, | ||
2599 | 74 | bars=3, | ||
2600 | 75 | barLabels=4, | ||
2601 | 76 | categoryAxisGrid=5, | ||
2602 | 77 | valueAxisGrid=6, | ||
2603 | 78 | annotations=7'''), | ||
2604 | 79 | categoryNALabel = AttrMapValue(NoneOrInstanceOfNA_Label, desc='Label to use for a group of N/A values.',advancedUsage=1), | ||
2605 | 70 | ) | 80 | ) |
2606 | 71 | 81 | ||
2607 | 72 | def makeSwatchSample(self, rowNo, x, y, width, height): | 82 | def makeSwatchSample(self, rowNo, x, y, width, height): |
2608 | @@ -144,8 +154,8 @@ | |||
2609 | 144 | self.bars[0].fillColor = colors.red | 154 | self.bars[0].fillColor = colors.red |
2610 | 145 | self.bars[1].fillColor = colors.green | 155 | self.bars[1].fillColor = colors.green |
2611 | 146 | self.bars[2].fillColor = colors.blue | 156 | self.bars[2].fillColor = colors.blue |
2614 | 147 | self.naLabel = None #NA_Label() | 157 | self.naLabel = self.categoryNALabel = None |
2615 | 148 | 158 | self.zIndexOverrides = None | |
2616 | 149 | 159 | ||
2617 | 150 | def demo(self): | 160 | def demo(self): |
2618 | 151 | """Shows basic use of a bar chart""" | 161 | """Shows basic use of a bar chart""" |
2619 | @@ -194,17 +204,68 @@ | |||
2620 | 194 | cA.configure(self._configureData) | 204 | cA.configure(self._configureData) |
2621 | 195 | self.calcBarPositions() | 205 | self.calcBarPositions() |
2622 | 196 | g = Group() | 206 | g = Group() |
2634 | 197 | g.add(self.makeBackground()) | 207 | |
2635 | 198 | cAdgl = getattr(cA,'drawGridLast',False) | 208 | zIndex = getattr(self,'zIndexOverrides',None) |
2636 | 199 | vAdgl = getattr(vA,'drawGridLast',False) | 209 | if not zIndex: |
2637 | 200 | if not cAdgl: cA.makeGrid(g,parent=self, dim=vA.getGridDims) | 210 | g.add(self.makeBackground()) |
2638 | 201 | if not vAdgl: vA.makeGrid(g,parent=self, dim=cA.getGridDims) | 211 | cAdgl = getattr(cA,'drawGridLast',False) |
2639 | 202 | g.add(self.makeBars()) | 212 | vAdgl = getattr(vA,'drawGridLast',False) |
2640 | 203 | g.add(cA) | 213 | if not cAdgl: cA.makeGrid(g,parent=self, dim=vA.getGridDims) |
2641 | 204 | g.add(vA) | 214 | if not vAdgl: vA.makeGrid(g,parent=self, dim=cA.getGridDims) |
2642 | 205 | if cAdgl: cA.makeGrid(g,parent=self, dim=vA.getGridDims) | 215 | g.add(self.makeBars()) |
2643 | 206 | if vAdgl: vA.makeGrid(g,parent=self, dim=cA.getGridDims) | 216 | g.add(cA) |
2644 | 207 | for a in getattr(self,'annotations',()): g.add(a(self,cA.scale,vA.scale)) | 217 | g.add(vA) |
2645 | 218 | if cAdgl: cA.makeGrid(g,parent=self, dim=vA.getGridDims) | ||
2646 | 219 | if vAdgl: vA.makeGrid(g,parent=self, dim=cA.getGridDims) | ||
2647 | 220 | for a in getattr(self,'annotations',()): g.add(a(self,cA.scale,vA.scale)) | ||
2648 | 221 | else: | ||
2649 | 222 | Z=dict( | ||
2650 | 223 | background=0, | ||
2651 | 224 | categoryAxis=1, | ||
2652 | 225 | valueAxis=2, | ||
2653 | 226 | bars=3, | ||
2654 | 227 | barLabels=4, | ||
2655 | 228 | categoryAxisGrid=5, | ||
2656 | 229 | valueAxisGrid=6, | ||
2657 | 230 | annotations=7, | ||
2658 | 231 | ) | ||
2659 | 232 | for z in zIndex.strip().split(','): | ||
2660 | 233 | z = z.strip() | ||
2661 | 234 | if not z: continue | ||
2662 | 235 | try: | ||
2663 | 236 | k,v=z.split('=') | ||
2664 | 237 | except: | ||
2665 | 238 | raise ValueError('Badly formatted zIndex clause %r in %r\nallowed variables are\n%s' % (z,zIndex,'\n'.join(['%s=%r'% (k,Z[k]) for k in sorted(Z.keys())]))) | ||
2666 | 239 | if k not in Z: | ||
2667 | 240 | raise ValueError('Unknown zIndex variable %r in %r\nallowed variables are\n%s' % (k,Z,'\n'.join(['%s=%r'% (k,Z[k]) for k in sorted(Z.keys())]))) | ||
2668 | 241 | try: | ||
2669 | 242 | v = eval(v,{}) #only constants allowed | ||
2670 | 243 | assert isinstance(v,(float,int)) | ||
2671 | 244 | except: | ||
2672 | 245 | raise ValueError('Bad zIndex value %r in clause %r of zIndex\nallowed variables are\n%s' % (v,z,zIndex,'\n'.join(['%s=%r'% (k,Z[k]) for k in sorted(Z.keys())]))) | ||
2673 | 246 | Z[k] = v | ||
2674 | 247 | Z = [(v,k) for k,v in Z.iteritems()] | ||
2675 | 248 | Z.sort() | ||
2676 | 249 | b = self.makeBars() | ||
2677 | 250 | bl = b.contents.pop(-1) | ||
2678 | 251 | for v,k in Z: | ||
2679 | 252 | if k=='background': | ||
2680 | 253 | g.add(self.makeBackground()) | ||
2681 | 254 | elif k=='categoryAxis': | ||
2682 | 255 | g.add(cA) | ||
2683 | 256 | elif k=='categoryAxisGrid': | ||
2684 | 257 | cA.makeGrid(g,parent=self, dim=vA.getGridDims) | ||
2685 | 258 | elif k=='valueAxis': | ||
2686 | 259 | g.add(vA) | ||
2687 | 260 | elif k=='valueAxisGrid': | ||
2688 | 261 | vA.makeGrid(g,parent=self, dim=cA.getGridDims) | ||
2689 | 262 | elif k=='bars': | ||
2690 | 263 | g.add(b) | ||
2691 | 264 | elif k=='barLabels': | ||
2692 | 265 | g.add(bl) | ||
2693 | 266 | elif k=='annotations': | ||
2694 | 267 | for a in getattr(self,'annotations',()): g.add(a(self,cA.scale,vA.scale)) | ||
2695 | 268 | |||
2696 | 208 | del self._configureData | 269 | del self._configureData |
2697 | 209 | return g | 270 | return g |
2698 | 210 | 271 | ||
2699 | @@ -398,16 +459,16 @@ | |||
2700 | 398 | if text: | 459 | if text: |
2701 | 399 | self._addLabel(text, self.barLabels[(rowNo, colNo)], g, rowNo, colNo, x, y, width, height) | 460 | self._addLabel(text, self.barLabels[(rowNo, colNo)], g, rowNo, colNo, x, y, width, height) |
2702 | 400 | 461 | ||
2705 | 401 | def _addNABarLabel(self, g, rowNo, colNo, x, y, width, height): | 462 | def _addNABarLabel(self, g, rowNo, colNo, x, y, width, height, calcOnly=False, na=None): |
2706 | 402 | na = self.naLabel | 463 | if na is None: na = self.naLabel |
2707 | 403 | if na and na.text: | 464 | if na and na.text: |
2708 | 404 | na = copy.copy(na) | 465 | na = copy.copy(na) |
2709 | 405 | v = self.valueAxis._valueMax<=0 and -1e-8 or 1e-8 | 466 | v = self.valueAxis._valueMax<=0 and -1e-8 or 1e-8 |
2710 | 406 | if width is None: width = v | 467 | if width is None: width = v |
2711 | 407 | if height is None: height = v | 468 | if height is None: height = v |
2713 | 408 | self._addLabel(na.text, na, g, rowNo, colNo, x, y, width, height) | 469 | return self._addLabel(na.text, na, g, rowNo, colNo, x, y, width, height, calcOnly=calcOnly) |
2714 | 409 | 470 | ||
2716 | 410 | def _addLabel(self, text, label, g, rowNo, colNo, x, y, width, height): | 471 | def _addLabel(self, text, label, g, rowNo, colNo, x, y, width, height, calcOnly=False): |
2717 | 411 | if label.visible: | 472 | if label.visible: |
2718 | 412 | labelWidth = stringWidth(text, label.fontName, label.fontSize) | 473 | labelWidth = stringWidth(text, label.fontName, label.fontSize) |
2719 | 413 | flipXY = self._flipXY | 474 | flipXY = self._flipXY |
2720 | @@ -447,6 +508,7 @@ | |||
2721 | 447 | dx = 0 | 508 | dx = 0 |
2722 | 448 | else: | 509 | else: |
2723 | 449 | dy = dx = 0 | 510 | dy = dx = 0 |
2724 | 511 | if calcOnly: return x0+dx, y0+dy | ||
2725 | 450 | label.setOrigin(x0+dx, y0+dy) | 512 | label.setOrigin(x0+dx, y0+dy) |
2726 | 451 | label.setText(text) | 513 | label.setText(text) |
2727 | 452 | sC, sW = label.lineStrokeColor, label.lineStrokeWidth | 514 | sC, sW = label.lineStrokeColor, label.lineStrokeWidth |
2728 | @@ -471,16 +533,41 @@ | |||
2729 | 471 | lenData = len(self.data) | 533 | lenData = len(self.data) |
2730 | 472 | bars = self.bars | 534 | bars = self.bars |
2731 | 473 | br = getattr(self,'barRecord',None) | 535 | br = getattr(self,'barRecord',None) |
2732 | 536 | BP = self._barPositions | ||
2733 | 537 | |||
2734 | 538 | catNAL = self.categoryNALabel | ||
2735 | 539 | catNNA = {} | ||
2736 | 540 | if catNAL: | ||
2737 | 541 | CBL = [] | ||
2738 | 542 | rowNoL = lenData - 1 | ||
2739 | 543 | #find all the categories that have at least one value | ||
2740 | 544 | for rowNo in xrange(lenData): | ||
2741 | 545 | row = BP[rowNo] | ||
2742 | 546 | for colNo in xrange(len(row)): | ||
2743 | 547 | x, y, width, height = row[colNo] | ||
2744 | 548 | if None not in (width,height): | ||
2745 | 549 | catNNA[colNo] = 1 | ||
2746 | 550 | |||
2747 | 474 | for rowNo in xrange(lenData): | 551 | for rowNo in xrange(lenData): |
2749 | 475 | row = self._barPositions[rowNo] | 552 | row = BP[rowNo] |
2750 | 476 | styleCount = len(bars) | 553 | styleCount = len(bars) |
2751 | 477 | styleIdx = rowNo % styleCount | 554 | styleIdx = rowNo % styleCount |
2752 | 478 | rowStyle = bars[styleIdx] | 555 | rowStyle = bars[styleIdx] |
2754 | 479 | for colNo in range(len(row)): | 556 | for colNo in xrange(len(row)): |
2755 | 480 | style = (styleIdx,colNo) in bars and bars[(styleIdx,colNo)] or rowStyle | 557 | style = (styleIdx,colNo) in bars and bars[(styleIdx,colNo)] or rowStyle |
2757 | 481 | (x, y, width, height) = row[colNo] | 558 | x, y, width, height = row[colNo] |
2758 | 482 | if None in (width,height): | 559 | if None in (width,height): |
2760 | 483 | self._addNABarLabel(lg,rowNo,colNo,x,y,width,height) | 560 | if colNo in catNNA: |
2761 | 561 | self._addNABarLabel(lg,rowNo,colNo,x,y,width,height) | ||
2762 | 562 | elif catNAL and colNo not in CBL: | ||
2763 | 563 | r0 = self._addNABarLabel(lg,rowNo,colNo,x,y,width,height,True,catNAL) | ||
2764 | 564 | if r0: | ||
2765 | 565 | x, y, width, height = BP[rowNoL][colNo] | ||
2766 | 566 | r1 = self._addNABarLabel(lg,rowNoL,colNo,x,y,width,height,True,catNAL) | ||
2767 | 567 | x = (r0[0]+r1[0])/2.0 | ||
2768 | 568 | y = (r0[1]+r1[1])/2.0 | ||
2769 | 569 | self._addNABarLabel(lg,rowNoL,colNo,x,y,width,height,na=catNAL) | ||
2770 | 570 | CBL.append(colNo) | ||
2771 | 484 | continue | 571 | continue |
2772 | 485 | 572 | ||
2773 | 486 | # Draw a rectangular symbol for each data item, | 573 | # Draw a rectangular symbol for each data item, |
2774 | 487 | 574 | ||
2775 | === modified file 'src/reportlab/graphics/charts/doughnut.py' | |||
2776 | --- src/reportlab/graphics/charts/doughnut.py 2010-12-06 12:45:44 +0000 | |||
2777 | +++ src/reportlab/graphics/charts/doughnut.py 2013-04-14 00:52:26 +0000 | |||
2778 | @@ -1,9 +1,9 @@ | |||
2780 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
2781 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
2782 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/doughnut.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/doughnut.py |
2783 | 4 | # doughnut chart | 4 | # doughnut chart |
2784 | 5 | 5 | ||
2786 | 6 | __version__=''' $Id: doughnut.py 3785 2010-09-28 16:41:27Z rgbecker $ ''' | 6 | __version__=''' $Id: doughnut.py 3959 2012-09-27 14:39:39Z robin $ ''' |
2787 | 7 | __doc__="""Doughnut chart | 7 | __doc__="""Doughnut chart |
2788 | 8 | 8 | ||
2789 | 9 | Produces a circular chart like the doughnut charts produced by Excel. | 9 | Produces a circular chart like the doughnut charts produced by Excel. |
2790 | @@ -27,7 +27,7 @@ | |||
2791 | 27 | from reportlab.graphics.shapes import Group, Drawing, Line, Rect, Polygon, Ellipse, \ | 27 | from reportlab.graphics.shapes import Group, Drawing, Line, Rect, Polygon, Ellipse, \ |
2792 | 28 | Wedge, String, SolidShape, UserNode, STATE_DEFAULTS | 28 | Wedge, String, SolidShape, UserNode, STATE_DEFAULTS |
2793 | 29 | from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder | 29 | from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder |
2795 | 30 | from reportlab.graphics.charts.piecharts import AbstractPieChart, WedgeProperties, _addWedgeLabel | 30 | from reportlab.graphics.charts.piecharts import AbstractPieChart, WedgeProperties, _addWedgeLabel, fixLabelOverlaps |
2796 | 31 | from reportlab.graphics.charts.textlabels import Label | 31 | from reportlab.graphics.charts.textlabels import Label |
2797 | 32 | from reportlab.graphics.widgets.markers import Marker | 32 | from reportlab.graphics.widgets.markers import Marker |
2798 | 33 | 33 | ||
2799 | @@ -54,6 +54,9 @@ | |||
2800 | 54 | direction = AttrMapValue(OneOf('clockwise', 'anticlockwise'), desc="'clockwise' or 'anticlockwise'"), | 54 | direction = AttrMapValue(OneOf('clockwise', 'anticlockwise'), desc="'clockwise' or 'anticlockwise'"), |
2801 | 55 | slices = AttrMapValue(None, desc="collection of sector descriptor objects"), | 55 | slices = AttrMapValue(None, desc="collection of sector descriptor objects"), |
2802 | 56 | simpleLabels = AttrMapValue(isBoolean, desc="If true(default) use String not super duper WedgeLabel"), | 56 | simpleLabels = AttrMapValue(isBoolean, desc="If true(default) use String not super duper WedgeLabel"), |
2803 | 57 | # advanced usage | ||
2804 | 58 | checkLabelOverlap = AttrMapValue(isBoolean, desc="If true check and attempt to fix\n standard label overlaps(default off)",advancedUsage=1), | ||
2805 | 59 | sideLabels = AttrMapValue(isBoolean, desc="If true attempt to make chart with labels along side and pointers", advancedUsage=1) | ||
2806 | 57 | ) | 60 | ) |
2807 | 58 | 61 | ||
2808 | 59 | def __init__(self): | 62 | def __init__(self): |
2809 | @@ -66,13 +69,19 @@ | |||
2810 | 66 | self.startAngle = 90 | 69 | self.startAngle = 90 |
2811 | 67 | self.direction = "clockwise" | 70 | self.direction = "clockwise" |
2812 | 68 | self.simpleLabels = 1 | 71 | self.simpleLabels = 1 |
2813 | 72 | self.checkLabelOverlap = 0 | ||
2814 | 73 | self.sideLabels = 0 | ||
2815 | 69 | 74 | ||
2816 | 70 | self.slices = TypedPropertyCollection(SectorProperties) | 75 | self.slices = TypedPropertyCollection(SectorProperties) |
2817 | 71 | self.slices[0].fillColor = colors.darkcyan | 76 | self.slices[0].fillColor = colors.darkcyan |
2818 | 72 | self.slices[1].fillColor = colors.blueviolet | 77 | self.slices[1].fillColor = colors.blueviolet |
2819 | 73 | self.slices[2].fillColor = colors.blue | 78 | self.slices[2].fillColor = colors.blue |
2820 | 74 | self.slices[3].fillColor = colors.cyan | 79 | self.slices[3].fillColor = colors.cyan |
2822 | 75 | 80 | self.slices[4].fillColor = colors.pink | |
2823 | 81 | self.slices[5].fillColor = colors.magenta | ||
2824 | 82 | self.slices[6].fillColor = colors.yellow | ||
2825 | 83 | |||
2826 | 84 | |||
2827 | 76 | def demo(self): | 85 | def demo(self): |
2828 | 77 | d = Drawing(200, 100) | 86 | d = Drawing(200, 100) |
2829 | 78 | 87 | ||
2830 | @@ -121,8 +130,12 @@ | |||
2831 | 121 | normData = self.normalizeData(self.data) | 130 | normData = self.normalizeData(self.data) |
2832 | 122 | n = len(normData) | 131 | n = len(normData) |
2833 | 123 | self._seriesCount = n | 132 | self._seriesCount = n |
2835 | 124 | 133 | ||
2836 | 125 | #labels | 134 | #labels |
2837 | 135 | checkLabelOverlap = self.checkLabelOverlap | ||
2838 | 136 | L = [] | ||
2839 | 137 | L_add = L.append | ||
2840 | 138 | |||
2841 | 126 | if self.labels is None: | 139 | if self.labels is None: |
2842 | 127 | labels = [] | 140 | labels = [] |
2843 | 128 | if type(n) not in (ListType,TupleType): | 141 | if type(n) not in (ListType,TupleType): |
2844 | @@ -157,7 +170,7 @@ | |||
2845 | 157 | whichWay = -1 | 170 | whichWay = -1 |
2846 | 158 | 171 | ||
2847 | 159 | g = Group() | 172 | g = Group() |
2849 | 160 | 173 | ||
2850 | 161 | startAngle = self.startAngle #% 360 | 174 | startAngle = self.startAngle #% 360 |
2851 | 162 | styleCount = len(self.slices) | 175 | styleCount = len(self.slices) |
2852 | 163 | if type(self.data[0]) in (ListType, TupleType): | 176 | if type(self.data[0]) in (ListType, TupleType): |
2853 | @@ -203,14 +216,23 @@ | |||
2854 | 203 | 216 | ||
2855 | 204 | g.add(theSector) | 217 | g.add(theSector) |
2856 | 205 | 218 | ||
2865 | 206 | text = self.getSeriesName(i,'') | 219 | if sn == 0: |
2866 | 207 | if text: | 220 | text = self.getSeriesName(i,'') |
2867 | 208 | averageAngle = (a1+a2)/2.0 | 221 | if text: |
2868 | 209 | aveAngleRadians = averageAngle*pi/180.0 | 222 | averageAngle = (a1+a2)/2.0 |
2869 | 210 | labelRadius = sectorStyle.labelRadius | 223 | aveAngleRadians = averageAngle*pi/180.0 |
2870 | 211 | labelX = centerx + (0.5 * self.width * cos(aveAngleRadians) * labelRadius) | 224 | labelRadius = sectorStyle.labelRadius |
2871 | 212 | labelY = centery + (0.5 * self.height * sin(aveAngleRadians) * labelRadius) | 225 | rx = xradius*labelRadius |
2872 | 213 | g.add(_addWedgeLabel(self,text,averageAngle,labelX,labelY,sectorStyle)) | 226 | ry = yradius*labelRadius |
2873 | 227 | labelX = centerx + (0.5 * self.width * cos(aveAngleRadians) * labelRadius) | ||
2874 | 228 | labelY = centery + (0.5 * self.height * sin(aveAngleRadians) * labelRadius) | ||
2875 | 229 | l = _addWedgeLabel(self,text,averageAngle,labelX,labelY,sectorStyle) | ||
2876 | 230 | if checkLabelOverlap: | ||
2877 | 231 | l._origdata = { 'x': labelX, 'y':labelY, 'angle': averageAngle, | ||
2878 | 232 | 'rx': rx, 'ry':ry, 'cx':cx, 'cy':cy, | ||
2879 | 233 | 'bounds': l.getBounds(), | ||
2880 | 234 | } | ||
2881 | 235 | L_add(l) | ||
2882 | 214 | 236 | ||
2883 | 215 | else: | 237 | else: |
2884 | 216 | #single series doughnut | 238 | #single series doughnut |
2885 | @@ -261,18 +283,23 @@ | |||
2886 | 261 | labelRadius = sectorStyle.labelRadius | 283 | labelRadius = sectorStyle.labelRadius |
2887 | 262 | labelX = centerx + (0.5 * self.width * cos(aveAngleRadians) * labelRadius) | 284 | labelX = centerx + (0.5 * self.width * cos(aveAngleRadians) * labelRadius) |
2888 | 263 | labelY = centery + (0.5 * self.height * sin(aveAngleRadians) * labelRadius) | 285 | labelY = centery + (0.5 * self.height * sin(aveAngleRadians) * labelRadius) |
2899 | 264 | 286 | rx = xradius*labelRadius | |
2900 | 265 | theLabel = String(labelX, labelY, labels[i]) | 287 | ry = yradius*labelRadius |
2901 | 266 | theLabel.textAnchor = "middle" | 288 | l = _addWedgeLabel(self,labels[i],averageAngle,labelX,labelY,sectorStyle) |
2902 | 267 | theLabel.fontSize = sectorStyle.fontSize | 289 | if checkLabelOverlap: |
2903 | 268 | theLabel.fontName = sectorStyle.fontName | 290 | l._origdata = { 'x': labelX, 'y':labelY, 'angle': averageAngle, |
2904 | 269 | theLabel.fillColor = sectorStyle.fontColor | 291 | 'rx': rx, 'ry':ry, 'cx':cx, 'cy':cy, |
2905 | 270 | 292 | 'bounds': l.getBounds(), | |
2906 | 271 | g.add(theLabel) | 293 | } |
2907 | 272 | 294 | L_add(l) | |
2908 | 273 | 295 | ||
2909 | 296 | if checkLabelOverlap and L: | ||
2910 | 297 | fixLabelOverlaps(L) | ||
2911 | 298 | |||
2912 | 299 | for l in L: g.add(l) | ||
2913 | 300 | |||
2914 | 274 | return g | 301 | return g |
2916 | 275 | 302 | ||
2917 | 276 | def draw(self): | 303 | def draw(self): |
2918 | 277 | g = Group() | 304 | g = Group() |
2919 | 278 | g.add(self.makeSectors()) | 305 | g.add(self.makeSectors()) |
2920 | @@ -336,6 +363,23 @@ | |||
2921 | 336 | 363 | ||
2922 | 337 | return d | 364 | return d |
2923 | 338 | 365 | ||
2924 | 366 | def sample4(): | ||
2925 | 367 | "Make a more complex demo with Label Overlap fixing" | ||
2926 | 368 | |||
2927 | 369 | d = Drawing(400, 400) | ||
2928 | 370 | dn = Doughnut() | ||
2929 | 371 | dn.x = 50 | ||
2930 | 372 | dn.y = 50 | ||
2931 | 373 | dn.width = 300 | ||
2932 | 374 | dn.height = 300 | ||
2933 | 375 | dn.data = [[10,20,30,40,50,60], [10,20,30,40]] | ||
2934 | 376 | dn.labels = ['a','b','c','d','e','f'] | ||
2935 | 377 | dn.checkLabelOverlap = True | ||
2936 | 378 | |||
2937 | 379 | d.add(dn) | ||
2938 | 380 | |||
2939 | 381 | return d | ||
2940 | 382 | |||
2941 | 339 | if __name__=='__main__': | 383 | if __name__=='__main__': |
2942 | 340 | 384 | ||
2943 | 341 | from reportlab.graphics.renderPDF import drawToFile | 385 | from reportlab.graphics.renderPDF import drawToFile |
2944 | 342 | 386 | ||
2945 | === modified file 'src/reportlab/graphics/charts/legends.py' | |||
2946 | --- src/reportlab/graphics/charts/legends.py 2010-12-06 12:45:44 +0000 | |||
2947 | +++ src/reportlab/graphics/charts/legends.py 2013-04-14 00:52:26 +0000 | |||
2948 | @@ -1,8 +1,8 @@ | |||
2950 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
2951 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
2952 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/legends.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/legends.py |
2953 | 4 | 4 | ||
2955 | 5 | __version__=''' $Id: legends.py 3723 2010-06-08 15:46:32Z juraj $ ''' | 5 | __version__=''' $Id: legends.py 3959 2012-09-27 14:39:39Z robin $ ''' |
2956 | 6 | __doc__="""This will be a collection of legends to be used with charts.""" | 6 | __doc__="""This will be a collection of legends to be used with charts.""" |
2957 | 7 | 7 | ||
2958 | 8 | import copy, operator | 8 | import copy, operator |
2959 | 9 | 9 | ||
2960 | === modified file 'src/reportlab/graphics/charts/linecharts.py' | |||
2961 | --- src/reportlab/graphics/charts/linecharts.py 2010-12-06 12:45:44 +0000 | |||
2962 | +++ src/reportlab/graphics/charts/linecharts.py 2013-04-14 00:52:26 +0000 | |||
2963 | @@ -1,8 +1,8 @@ | |||
2965 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
2966 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
2967 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/linecharts.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/linecharts.py |
2968 | 4 | 4 | ||
2970 | 5 | __version__=''' $Id: linecharts.py 3662 2010-02-09 11:23:58Z rgbecker $ ''' | 5 | __version__=''' $Id: linecharts.py 3959 2012-09-27 14:39:39Z robin $ ''' |
2971 | 6 | __doc__="""This modules defines a very preliminary Line Chart example.""" | 6 | __doc__="""This modules defines a very preliminary Line Chart example.""" |
2972 | 7 | 7 | ||
2973 | 8 | from reportlab.lib import colors | 8 | from reportlab.lib import colors |
2974 | 9 | 9 | ||
2975 | === modified file 'src/reportlab/graphics/charts/lineplots.py' | |||
2976 | --- src/reportlab/graphics/charts/lineplots.py 2010-12-06 12:45:44 +0000 | |||
2977 | +++ src/reportlab/graphics/charts/lineplots.py 2013-04-14 00:52:26 +0000 | |||
2978 | @@ -1,8 +1,8 @@ | |||
2980 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
2981 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
2982 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/lineplots.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/lineplots.py |
2983 | 4 | 4 | ||
2985 | 5 | __version__=''' $Id: lineplots.py 3735 2010-07-01 12:24:52Z rgbecker $ ''' | 5 | __version__=''' $Id: lineplots.py 3959 2012-09-27 14:39:39Z robin $ ''' |
2986 | 6 | __doc__="""This module defines a very preliminary Line Plot example.""" | 6 | __doc__="""This module defines a very preliminary Line Plot example.""" |
2987 | 7 | 7 | ||
2988 | 8 | import string, time | 8 | import string, time |
2989 | @@ -213,7 +213,10 @@ | |||
2990 | 213 | else: | 213 | else: |
2991 | 214 | labelText = labelFmt % labelValue | 214 | labelText = labelFmt % labelValue |
2992 | 215 | elif hasattr(labelFmt,'__call__'): | 215 | elif hasattr(labelFmt,'__call__'): |
2994 | 216 | labelText = labelFmt(labelValue) | 216 | if not hasattr(labelFmt,'__labelFmtEX__'): |
2995 | 217 | labelText = labelFmt(labelValue) | ||
2996 | 218 | else: | ||
2997 | 219 | labelText = labelFmt(self,rowNo,colNo,x,y) | ||
2998 | 217 | else: | 220 | else: |
2999 | 218 | raise ValueError("Unknown formatter type %s, expected string or function"%labelFmt) | 221 | raise ValueError("Unknown formatter type %s, expected string or function"%labelFmt) |
3000 | 219 | 222 | ||
3001 | @@ -298,10 +301,18 @@ | |||
3002 | 298 | uSymbol = None | 301 | uSymbol = None |
3003 | 299 | 302 | ||
3004 | 300 | if uSymbol: | 303 | if uSymbol: |
3009 | 301 | j = -1 | 304 | if bubblePlot: drow = self.data[rowNo] |
3010 | 302 | if bubblePlot: drow = self.data[rowNo] | 305 | for j,xy in enumerate(row): |
3011 | 303 | for xy in row: | 306 | symbol = uSymbol2Symbol(uSymbol,xy[0],xy[1],rowColor) |
3012 | 304 | j += 1 | 307 | if symbol: |
3013 | 308 | if bubblePlot: | ||
3014 | 309 | symbol.size = bubbleR*(drow[j][2]/bubbleMax)**0.5 | ||
3015 | 310 | g.add(symbol) | ||
3016 | 311 | else: | ||
3017 | 312 | if bubblePlot: drow = self.data[rowNo] | ||
3018 | 313 | for j,xy in enumerate(row): | ||
3019 | 314 | usymbol = getattr(self.lines[rowNo,j],'symbol',None) | ||
3020 | 315 | if not usymbol: continue | ||
3021 | 305 | symbol = uSymbol2Symbol(uSymbol,xy[0],xy[1],rowColor) | 316 | symbol = uSymbol2Symbol(uSymbol,xy[0],xy[1],rowColor) |
3022 | 306 | if symbol: | 317 | if symbol: |
3023 | 307 | if bubblePlot: | 318 | if bubblePlot: |
3024 | @@ -348,13 +359,27 @@ | |||
3025 | 348 | if self.behindAxes: | 359 | if self.behindAxes: |
3026 | 349 | self._lineG = Group() | 360 | self._lineG = Group() |
3027 | 350 | g.add(self._lineG) | 361 | g.add(self._lineG) |
3028 | 362 | xA._joinToAxis() | ||
3029 | 363 | yA._joinToAxis() | ||
3030 | 364 | xAex = xA.visibleAxis and [xA._y] or [] | ||
3031 | 365 | yAex = yA.visibleAxis and [yA._x] or [] | ||
3032 | 366 | skipGrid = getattr(xA,'skipGrid','none') | ||
3033 | 367 | if skipGrid!=None: | ||
3034 | 368 | if skipGrid in ('both','top'): | ||
3035 | 369 | yAex.append(xA._x+xA._length) | ||
3036 | 370 | if skipGrid in ('both','bottom'): | ||
3037 | 371 | yAex.append(xA._x) | ||
3038 | 372 | skipGrid = getattr(yA,'skipGrid','none') | ||
3039 | 373 | if skipGrid!=None: | ||
3040 | 374 | if skipGrid in ('both','top'): | ||
3041 | 375 | xAex.append(yA._y+yA._length) | ||
3042 | 376 | if skipGrid in ('both','bottom'): | ||
3043 | 377 | xAex.append(yA._y) | ||
3044 | 351 | if self.gridFirst: | 378 | if self.gridFirst: |
3047 | 352 | xA.makeGrid(g,parent=self,dim=yA.getGridDims) | 379 | xA.makeGrid(g,parent=self,dim=yA.getGridDims,exclude=yAex) |
3048 | 353 | yA.makeGrid(g,parent=self,dim=xA.getGridDims) | 380 | yA.makeGrid(g,parent=self,dim=xA.getGridDims,exclude=xAex) |
3049 | 354 | g.add(xA.draw()) | 381 | g.add(xA.draw()) |
3050 | 355 | g.add(yA.draw()) | 382 | g.add(yA.draw()) |
3051 | 356 | xAex = xA.visibleAxis and (xA._y,) or () | ||
3052 | 357 | yAex = yA.visibleAxis and (yA._x,) or () | ||
3053 | 358 | if not self.gridFirst: | 383 | if not self.gridFirst: |
3054 | 359 | xAdgl = getattr(xA,'drawGridLast',False) | 384 | xAdgl = getattr(xA,'drawGridLast',False) |
3055 | 360 | yAdgl = getattr(yA,'drawGridLast',False) | 385 | yAdgl = getattr(yA,'drawGridLast',False) |
3056 | @@ -801,7 +826,6 @@ | |||
3057 | 801 | height = AttrMapValue(isNumber, desc="Height of the area inside the axes"), | 826 | height = AttrMapValue(isNumber, desc="Height of the area inside the axes"), |
3058 | 802 | outerBorderOn = AttrMapValue(isBoolean, desc="Is there an outer border (continuation of axes)"), | 827 | outerBorderOn = AttrMapValue(isBoolean, desc="Is there an outer border (continuation of axes)"), |
3059 | 803 | outerBorderColor = AttrMapValue(isColorOrNone, desc="Color of outer border (if any)"), | 828 | outerBorderColor = AttrMapValue(isColorOrNone, desc="Color of outer border (if any)"), |
3060 | 804 | background = AttrMapValue(isColorOrNone, desc="Background color (if any)"), | ||
3061 | 805 | labelOffset = AttrMapValue(isNumber, desc="Space between label and Axis (or other labels)",advancedUsage=1), | 829 | labelOffset = AttrMapValue(isNumber, desc="Space between label and Axis (or other labels)",advancedUsage=1), |
3062 | 806 | axisTickLengths = AttrMapValue(isNumber, desc="Lenth of the ticks on both axes"), | 830 | axisTickLengths = AttrMapValue(isNumber, desc="Lenth of the ticks on both axes"), |
3063 | 807 | axisStrokeWidth = AttrMapValue(isNumber, desc="Stroke width for both axes"), | 831 | axisStrokeWidth = AttrMapValue(isNumber, desc="Stroke width for both axes"), |
3064 | @@ -853,7 +877,6 @@ | |||
3065 | 853 | 877 | ||
3066 | 854 | #values for lineplot | 878 | #values for lineplot |
3067 | 855 | self.joinedLines = 0 | 879 | self.joinedLines = 0 |
3068 | 856 | self.fillColor = self.background | ||
3069 | 857 | 880 | ||
3070 | 858 | self.leftPadding=5 | 881 | self.leftPadding=5 |
3071 | 859 | self.rightPadding=10 | 882 | self.rightPadding=10 |
3072 | 860 | 883 | ||
3073 | === modified file 'src/reportlab/graphics/charts/markers.py' | |||
3074 | --- src/reportlab/graphics/charts/markers.py 2009-02-22 14:19:44 +0000 | |||
3075 | +++ src/reportlab/graphics/charts/markers.py 2013-04-14 00:52:26 +0000 | |||
3076 | @@ -1,8 +1,8 @@ | |||
3078 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
3079 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
3080 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/markers.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/markers.py |
3081 | 4 | 4 | ||
3083 | 5 | __version__=''' $Id: markers.py 3345 2008-12-12 17:55:22Z damian $ ''' | 5 | __version__=''' $Id: markers.py 3959 2012-09-27 14:39:39Z robin $ ''' |
3084 | 6 | __doc__="""This modules defines a collection of markers used in charts. | 6 | __doc__="""This modules defines a collection of markers used in charts. |
3085 | 7 | 7 | ||
3086 | 8 | The make* functions return a simple shape or a widget as for | 8 | The make* functions return a simple shape or a widget as for |
3087 | 9 | 9 | ||
3088 | === modified file 'src/reportlab/graphics/charts/piecharts.py' | |||
3089 | --- src/reportlab/graphics/charts/piecharts.py 2010-12-06 12:45:44 +0000 | |||
3090 | +++ src/reportlab/graphics/charts/piecharts.py 2013-04-14 00:52:26 +0000 | |||
3091 | @@ -1,4 +1,4 @@ | |||
3093 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
3094 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
3095 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/piecharts.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/piecharts.py |
3096 | 4 | # experimental pie chart script. Two types of pie - one is a monolithic | 4 | # experimental pie chart script. Two types of pie - one is a monolithic |
3097 | @@ -6,7 +6,7 @@ | |||
3098 | 6 | #a wedges collection whic lets you customize the group or every individual | 6 | #a wedges collection whic lets you customize the group or every individual |
3099 | 7 | #wedge. | 7 | #wedge. |
3100 | 8 | 8 | ||
3102 | 9 | __version__=''' $Id: piecharts.py 3744 2010-07-19 10:48:38Z rgbecker $ ''' | 9 | __version__=''' $Id: piecharts.py 3959 2012-09-27 14:39:39Z robin $ ''' |
3103 | 10 | __doc__="""Basic Pie Chart class. | 10 | __doc__="""Basic Pie Chart class. |
3104 | 11 | 11 | ||
3105 | 12 | This permits you to customize and pop out individual wedges; | 12 | This permits you to customize and pop out individual wedges; |
3106 | @@ -31,10 +31,14 @@ | |||
3107 | 31 | from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder | 31 | from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder |
3108 | 32 | from reportlab.graphics.charts.areas import PlotArea | 32 | from reportlab.graphics.charts.areas import PlotArea |
3109 | 33 | from reportlab.graphics.charts.legends import _objStr | 33 | from reportlab.graphics.charts.legends import _objStr |
3111 | 34 | from textlabels import Label | 34 | from reportlab.graphics.charts.textlabels import Label |
3112 | 35 | 35 | ||
3113 | 36 | _ANGLE2BOXANCHOR={0:'w', 45:'sw', 90:'s', 135:'se', 180:'e', 225:'ne', 270:'n', 315: 'nw', -45: 'nw'} | 36 | _ANGLE2BOXANCHOR={0:'w', 45:'sw', 90:'s', 135:'se', 180:'e', 225:'ne', 270:'n', 315: 'nw', -45: 'nw'} |
3114 | 37 | _ANGLE2RBOXANCHOR={0:'e', 45:'ne', 90:'n', 135:'nw', 180:'w', 225:'sw', 270:'s', 315: 'se', -45: 'se'} | 37 | _ANGLE2RBOXANCHOR={0:'e', 45:'ne', 90:'n', 135:'nw', 180:'w', 225:'sw', 270:'s', 315: 'se', -45: 'se'} |
3115 | 38 | |||
3116 | 39 | _ANGLELO = 1e-7 | ||
3117 | 40 | _ANGLEHI = 360.0 - _ANGLELO | ||
3118 | 41 | |||
3119 | 38 | class WedgeLabel(Label): | 42 | class WedgeLabel(Label): |
3120 | 39 | def _checkDXY(self,ba): | 43 | def _checkDXY(self,ba): |
3121 | 40 | pass | 44 | pass |
3122 | @@ -59,46 +63,46 @@ | |||
3123 | 59 | format method. | 63 | format method. |
3124 | 60 | """ | 64 | """ |
3125 | 61 | _attrMap = AttrMap( | 65 | _attrMap = AttrMap( |
3130 | 62 | strokeWidth = AttrMapValue(isNumber,desc=''), | 66 | strokeWidth = AttrMapValue(isNumber,desc='Width of the wedge border'), |
3131 | 63 | fillColor = AttrMapValue(isColorOrNone,desc=''), | 67 | fillColor = AttrMapValue(isColorOrNone,desc='Filling color of the wedge'), |
3132 | 64 | strokeColor = AttrMapValue(isColorOrNone,desc=''), | 68 | strokeColor = AttrMapValue(isColorOrNone,desc='Color of the wedge border'), |
3133 | 65 | strokeDashArray = AttrMapValue(isListOfNumbersOrNone,desc=''), | 69 | strokeDashArray = AttrMapValue(isListOfNumbersOrNone,desc='Style of the wedge border, expressed as a list of lengths of alternating dashes and blanks'), |
3134 | 66 | strokeLineCap = AttrMapValue(OneOf(0,1,2),desc="Line cap 0=butt, 1=round & 2=square"), | 70 | strokeLineCap = AttrMapValue(OneOf(0,1,2),desc="Line cap 0=butt, 1=round & 2=square"), |
3135 | 67 | strokeLineJoin = AttrMapValue(OneOf(0,1,2),desc="Line join 0=miter, 1=round & 2=bevel"), | 71 | strokeLineJoin = AttrMapValue(OneOf(0,1,2),desc="Line join 0=miter, 1=round & 2=bevel"), |
3152 | 68 | strokeMiterLimit = AttrMapValue(isNumber,desc='miter limit control miter line joins'), | 72 | strokeMiterLimit = AttrMapValue(isNumber,desc='Miter limit control miter line joins'), |
3153 | 69 | popout = AttrMapValue(isNumber,desc="how far of centre a wedge to pop."), | 73 | popout = AttrMapValue(isNumber,desc="How far of centre a wedge to pop"), |
3154 | 70 | fontName = AttrMapValue(isString,desc=''), | 74 | fontName = AttrMapValue(isString,desc='Name of the font of the label text'), |
3155 | 71 | fontSize = AttrMapValue(isNumber,desc=''), | 75 | fontSize = AttrMapValue(isNumber,desc='Size of the font of the label text in points'), |
3156 | 72 | fontColor = AttrMapValue(isColorOrNone,desc=''), | 76 | fontColor = AttrMapValue(isColorOrNone,desc='Color of the font of the label text'), |
3157 | 73 | labelRadius = AttrMapValue(isNumber,desc=''), | 77 | labelRadius = AttrMapValue(isNumber,desc='Distance between the center of the label box and the center of the pie, expressed in times the radius of the pie'), |
3158 | 74 | label_dx = AttrMapValue(isNumber,desc=''), | 78 | label_dx = AttrMapValue(isNumber,desc='X Offset of the label'), |
3159 | 75 | label_dy = AttrMapValue(isNumber,desc=''), | 79 | label_dy = AttrMapValue(isNumber,desc='Y Offset of the label'), |
3160 | 76 | label_angle = AttrMapValue(isNumber,desc=''), | 80 | label_angle = AttrMapValue(isNumber,desc='Angle of the label, default (0) is horizontal, 90 is vertical, 180 is upside down'), |
3161 | 77 | label_boxAnchor = AttrMapValue(isBoxAnchor,desc=''), | 81 | label_boxAnchor = AttrMapValue(isBoxAnchor,desc='Anchoring point of the label'), |
3162 | 78 | label_boxStrokeColor = AttrMapValue(isColorOrNone,desc=''), | 82 | label_boxStrokeColor = AttrMapValue(isColorOrNone,desc='Border color for the label box'), |
3163 | 79 | label_boxStrokeWidth = AttrMapValue(isNumber,desc=''), | 83 | label_boxStrokeWidth = AttrMapValue(isNumber,desc='Border width for the label box'), |
3164 | 80 | label_boxFillColor = AttrMapValue(isColorOrNone,desc=''), | 84 | label_boxFillColor = AttrMapValue(isColorOrNone,desc='Filling color of the label box'), |
3165 | 81 | label_strokeColor = AttrMapValue(isColorOrNone,desc=''), | 85 | label_strokeColor = AttrMapValue(isColorOrNone,desc='Border color for the label text'), |
3166 | 82 | label_strokeWidth = AttrMapValue(isNumber,desc=''), | 86 | label_strokeWidth = AttrMapValue(isNumber,desc='Border width for the label text'), |
3167 | 83 | label_text = AttrMapValue(isStringOrNone,desc=''), | 87 | label_text = AttrMapValue(isStringOrNone,desc='Text of the label'), |
3168 | 84 | label_leading = AttrMapValue(isNumberOrNone,desc=''), | 88 | label_leading = AttrMapValue(isNumberOrNone,desc=''), |
3173 | 85 | label_width = AttrMapValue(isNumberOrNone,desc=''), | 89 | label_width = AttrMapValue(isNumberOrNone,desc='Width of the label'), |
3174 | 86 | label_maxWidth = AttrMapValue(isNumberOrNone,desc=''), | 90 | label_maxWidth = AttrMapValue(isNumberOrNone,desc='Maximum width the label can grow to'), |
3175 | 87 | label_height = AttrMapValue(isNumberOrNone,desc=''), | 91 | label_height = AttrMapValue(isNumberOrNone,desc='Height of the label'), |
3176 | 88 | label_textAnchor = AttrMapValue(isTextAnchor,desc=''), | 92 | label_textAnchor = AttrMapValue(isTextAnchor,desc='Maximum height the label can grow to'), |
3177 | 89 | label_visible = AttrMapValue(isBoolean,desc="True if the label is to be drawn"), | 93 | label_visible = AttrMapValue(isBoolean,desc="True if the label is to be drawn"), |
3183 | 90 | label_topPadding = AttrMapValue(isNumber,'padding at top of box'), | 94 | label_topPadding = AttrMapValue(isNumber,'Padding at top of box'), |
3184 | 91 | label_leftPadding = AttrMapValue(isNumber,'padding at left of box'), | 95 | label_leftPadding = AttrMapValue(isNumber,'Padding at left of box'), |
3185 | 92 | label_rightPadding = AttrMapValue(isNumber,'padding at right of box'), | 96 | label_rightPadding = AttrMapValue(isNumber,'Padding at right of box'), |
3186 | 93 | label_bottomPadding = AttrMapValue(isNumber,'padding at bottom of box'), | 97 | label_bottomPadding = AttrMapValue(isNumber,'Padding at bottom of box'), |
3187 | 94 | label_simple_pointer = AttrMapValue(isBoolean,'set to True for simple pointers'), | 98 | label_simple_pointer = AttrMapValue(isBoolean,'Set to True for simple pointers'), |
3188 | 95 | label_pointer_strokeColor = AttrMapValue(isColorOrNone,desc='Color of indicator line'), | 99 | label_pointer_strokeColor = AttrMapValue(isColorOrNone,desc='Color of indicator line'), |
3189 | 96 | label_pointer_strokeWidth = AttrMapValue(isNumber,desc='StrokeWidth of indicator line'), | 100 | label_pointer_strokeWidth = AttrMapValue(isNumber,desc='StrokeWidth of indicator line'), |
3191 | 97 | label_pointer_elbowLength = AttrMapValue(isNumber,desc='length of final indicator line segment'), | 101 | label_pointer_elbowLength = AttrMapValue(isNumber,desc='Length of final indicator line segment'), |
3192 | 98 | label_pointer_edgePad = AttrMapValue(isNumber,desc='pad between pointer label and box'), | 102 | label_pointer_edgePad = AttrMapValue(isNumber,desc='pad between pointer label and box'), |
3193 | 99 | label_pointer_piePad = AttrMapValue(isNumber,desc='pad between pointer label and pie'), | 103 | label_pointer_piePad = AttrMapValue(isNumber,desc='pad between pointer label and pie'), |
3194 | 100 | swatchMarker = AttrMapValue(NoneOr(isSymbol), desc="None or makeMarker('Diamond') ...",advancedUsage=1), | 104 | swatchMarker = AttrMapValue(NoneOr(isSymbol), desc="None or makeMarker('Diamond') ...",advancedUsage=1), |
3196 | 101 | visible = AttrMapValue(isBoolean,'set to false to skip displaying'), | 105 | visible = AttrMapValue(isBoolean,'Set to false to skip displaying'), |
3197 | 102 | ) | 106 | ) |
3198 | 103 | 107 | ||
3199 | 104 | def __init__(self): | 108 | def __init__(self): |
3200 | @@ -138,7 +142,13 @@ | |||
3201 | 138 | # now draw a label | 142 | # now draw a label |
3202 | 139 | if self.simpleLabels: | 143 | if self.simpleLabels: |
3203 | 140 | theLabel = String(labelX, labelY, text) | 144 | theLabel = String(labelX, labelY, text) |
3205 | 141 | theLabel.textAnchor = "middle" | 145 | if not self.sideLabels: |
3206 | 146 | theLabel.textAnchor = "middle" | ||
3207 | 147 | else: | ||
3208 | 148 | if (abs(angle) < 90 ) or (angle >270 and angle<450) or (-450< angle <-270): | ||
3209 | 149 | theLabel.textAnchor = "start" | ||
3210 | 150 | else: | ||
3211 | 151 | theLabel.textAnchor = "end" | ||
3212 | 142 | theLabel._pmv = angle | 152 | theLabel._pmv = angle |
3213 | 143 | theLabel._simple_pointer = 0 | 153 | theLabel._simple_pointer = 0 |
3214 | 144 | else: | 154 | else: |
3215 | @@ -147,9 +157,23 @@ | |||
3216 | 147 | theLabel.x = labelX | 157 | theLabel.x = labelX |
3217 | 148 | theLabel.y = labelY | 158 | theLabel.y = labelY |
3218 | 149 | theLabel.dx = wedgeStyle.label_dx | 159 | theLabel.dx = wedgeStyle.label_dx |
3220 | 150 | theLabel.dy = wedgeStyle.label_dy | 160 | if not self.sideLabels: |
3221 | 161 | theLabel.dy = wedgeStyle.label_dy | ||
3222 | 162 | theLabel.boxAnchor = wedgeStyle.label_boxAnchor | ||
3223 | 163 | else: | ||
3224 | 164 | if wedgeStyle.fontSize is None: | ||
3225 | 165 | sideLabels_dy = self.fontSize / 2.5 | ||
3226 | 166 | else: | ||
3227 | 167 | sideLabels_dy = wedgeStyle.fontSize / 2.5 | ||
3228 | 168 | if wedgeStyle.label_dy is None: | ||
3229 | 169 | theLabel.dy = sideLabels_dy | ||
3230 | 170 | else: | ||
3231 | 171 | theLabel.dy = wedgeStyle.label_dy + sideLabels_dy | ||
3232 | 172 | if (abs(angle) < 90 ) or (angle >270 and angle<450) or (-450< angle <-270): | ||
3233 | 173 | theLabel.boxAnchor = 'w' | ||
3234 | 174 | else: | ||
3235 | 175 | theLabel.boxAnchor = 'e' | ||
3236 | 151 | theLabel.angle = wedgeStyle.label_angle | 176 | theLabel.angle = wedgeStyle.label_angle |
3237 | 152 | theLabel.boxAnchor = wedgeStyle.label_boxAnchor | ||
3238 | 153 | theLabel.boxStrokeColor = wedgeStyle.label_boxStrokeColor | 177 | theLabel.boxStrokeColor = wedgeStyle.label_boxStrokeColor |
3239 | 154 | theLabel.boxStrokeWidth = wedgeStyle.label_boxStrokeWidth | 178 | theLabel.boxStrokeWidth = wedgeStyle.label_boxStrokeWidth |
3240 | 155 | theLabel.boxFillColor = wedgeStyle.label_boxFillColor | 179 | theLabel.boxFillColor = wedgeStyle.label_boxFillColor |
3241 | @@ -210,7 +234,7 @@ | |||
3242 | 210 | return text | 234 | return text |
3243 | 211 | 235 | ||
3244 | 212 | def boundsOverlap(P,Q): | 236 | def boundsOverlap(P,Q): |
3246 | 213 | return not(P[0]>Q[2]-1e-2 or Q[0]>P[2]-1e-2 or P[1]>Q[3]-1e-2 or Q[1]>P[3]-1e-2) | 237 | return not(P[0]>Q[2]-1e-2 or Q[0]>P[2]-1e-2 or P[1]>(0.5*(Q[1]+Q[3]))-1e-2 or Q[1]>(0.5*(P[1]+P[3]))-1e-2) |
3247 | 214 | 238 | ||
3248 | 215 | def _findOverlapRun(B,i,wrap): | 239 | def _findOverlapRun(B,i,wrap): |
3249 | 216 | '''find overlap run containing B[i]''' | 240 | '''find overlap run containing B[i]''' |
3250 | @@ -237,7 +261,7 @@ | |||
3251 | 237 | if len(R)>1: return R | 261 | if len(R)>1: return R |
3252 | 238 | return None | 262 | return None |
3253 | 239 | 263 | ||
3255 | 240 | def fixLabelOverlaps(L): | 264 | def fixLabelOverlaps(L, sideLabels=False): |
3256 | 241 | nL = len(L) | 265 | nL = len(L) |
3257 | 242 | if nL<2: return | 266 | if nL<2: return |
3258 | 243 | B = [l._origdata['bounds'] for l in L] | 267 | B = [l._origdata['bounds'] for l in L] |
3259 | @@ -246,40 +270,69 @@ | |||
3260 | 246 | iter = 0 | 270 | iter = 0 |
3261 | 247 | mult = 1. | 271 | mult = 1. |
3262 | 248 | 272 | ||
3297 | 249 | while iter<30: | 273 | if not sideLabels: |
3298 | 250 | R = findOverlapRun(B) | 274 | while iter<30: |
3299 | 251 | if not R: break | 275 | R = findOverlapRun(B) |
3300 | 252 | nR = len(R) | 276 | if not R: break |
3301 | 253 | if nR==nL: break | 277 | nR = len(R) |
3302 | 254 | if not [r for r in RP if r in R]: | 278 | if nR==nL: break |
3303 | 255 | mult = 1.0 | 279 | if not [r for r in RP if r in R]: |
3304 | 256 | da = 0 | 280 | mult = 1.0 |
3305 | 257 | r0 = R[0] | 281 | da = 0 |
3306 | 258 | rL = R[-1] | 282 | r0 = R[0] |
3307 | 259 | bi = B[r0] | 283 | rL = R[-1] |
3308 | 260 | taa = aa = _360(L[r0]._pmv) | 284 | bi = B[r0] |
3309 | 261 | for r in R[1:]: | 285 | taa = aa = _360(L[r0]._pmv) |
3310 | 262 | b = B[r] | 286 | for r in R[1:]: |
3311 | 263 | da = max(da,min(b[3]-bi[1],bi[3]-b[1])) | 287 | b = B[r] |
3312 | 264 | bi = b | 288 | da = max(da,min(b[3]-bi[1],bi[3]-b[1])) |
3313 | 265 | aa += L[r]._pmv | 289 | bi = b |
3314 | 266 | aa = aa/float(nR) | 290 | aa += L[r]._pmv |
3315 | 267 | utaa = abs(L[rL]._pmv-taa) | 291 | aa = aa/float(nR) |
3316 | 268 | ntaa = _360(utaa) | 292 | utaa = abs(L[rL]._pmv-taa) |
3317 | 269 | da *= mult*(nR-1)/ntaa | 293 | ntaa = _360(utaa) |
3318 | 270 | 294 | da *= mult*(nR-1)/ntaa | |
3319 | 271 | for r in R: | 295 | |
3320 | 272 | l = L[r] | 296 | for r in R: |
3321 | 273 | orig = l._origdata | 297 | l = L[r] |
3322 | 274 | angle = l._pmv = _360(l._pmv+da*(_360(l._pmv)-aa)) | 298 | orig = l._origdata |
3323 | 275 | rad = angle/_180_pi | 299 | angle = l._pmv = _360(l._pmv+da*(_360(l._pmv)-aa)) |
3324 | 276 | l.x = orig['cx'] + orig['rx']*cos(rad) | 300 | rad = angle/_180_pi |
3325 | 277 | l.y = orig['cy'] + orig['ry']*sin(rad) | 301 | l.x = orig['cx'] + orig['rx']*cos(rad) |
3326 | 278 | B[r] = l.getBounds() | 302 | l.y = orig['cy'] + orig['ry']*sin(rad) |
3327 | 279 | RP = R | 303 | B[r] = l.getBounds() |
3328 | 280 | mult *= 1.05 | 304 | RP = R |
3329 | 281 | iter += 1 | 305 | mult *= 1.05 |
3330 | 282 | 306 | iter += 1 | |
3331 | 307 | |||
3332 | 308 | else: | ||
3333 | 309 | while iter<30: | ||
3334 | 310 | R = findOverlapRun(B) | ||
3335 | 311 | if not R: break | ||
3336 | 312 | nR = len(R) | ||
3337 | 313 | if nR == nL: break | ||
3338 | 314 | l1 = L[-1] | ||
3339 | 315 | orig1 = l1._origdata | ||
3340 | 316 | bounds1 = orig1['bounds'] | ||
3341 | 317 | for i,r in enumerate(R): | ||
3342 | 318 | l = L[r] | ||
3343 | 319 | orig = l._origdata | ||
3344 | 320 | bounds = orig['bounds'] | ||
3345 | 321 | diff1 = 0 | ||
3346 | 322 | diff2 = 0 | ||
3347 | 323 | if not i == nR-1: | ||
3348 | 324 | if not bounds == bounds1: | ||
3349 | 325 | if bounds[3]>bounds1[1] and bounds1[1]<bounds[1]: | ||
3350 | 326 | diff1 = bounds[3]-bounds1[1] | ||
3351 | 327 | if bounds1[3]>bounds[1] and bounds[1]<bounds1[1]: | ||
3352 | 328 | diff2 = bounds1[3]-bounds[1] | ||
3353 | 329 | if diff1 > diff2: | ||
3354 | 330 | l.y +=0.5*(bounds1[3]-bounds1[1]) | ||
3355 | 331 | elif diff2 >= diff1: | ||
3356 | 332 | l.y -= 0.5*(bounds1[3]-bounds1[1]) | ||
3357 | 333 | B[r] = l.getBounds() | ||
3358 | 334 | iter += 1 | ||
3359 | 335 | |||
3360 | 283 | def intervalIntersection(A,B): | 336 | def intervalIntersection(A,B): |
3361 | 284 | x,y = max(min(A),min(B)),min(max(A),max(B)) | 337 | x,y = max(min(A),min(B)),min(max(A),max(B)) |
3362 | 285 | if x>=y: return None | 338 | if x>=y: return None |
3363 | @@ -415,6 +468,31 @@ | |||
3364 | 415 | mul = -1 | 468 | mul = -1 |
3365 | 416 | return G, mlr[0], mlr[1], mel | 469 | return G, mlr[0], mlr[1], mel |
3366 | 417 | 470 | ||
3367 | 471 | def theta0(data, direction): | ||
3368 | 472 | fac = (2*pi)/sum(data) | ||
3369 | 473 | rads = [d*fac for d in data] | ||
3370 | 474 | |||
3371 | 475 | r0 = 0 | ||
3372 | 476 | hrads = [] | ||
3373 | 477 | for r in rads: | ||
3374 | 478 | hrads.append(r0+r*0.5) | ||
3375 | 479 | r0 += r | ||
3376 | 480 | |||
3377 | 481 | vstar = len(data)*1e6 | ||
3378 | 482 | rstar = 0 | ||
3379 | 483 | delta = pi/36.0 | ||
3380 | 484 | for i in xrange(36): | ||
3381 | 485 | r = i*delta | ||
3382 | 486 | v = sum([abs(sin(r+a)) for a in hrads]) | ||
3383 | 487 | if v < vstar: | ||
3384 | 488 | if direction == 'clockwise': | ||
3385 | 489 | rstar=-r | ||
3386 | 490 | else: | ||
3387 | 491 | rstar=r | ||
3388 | 492 | vstar = v | ||
3389 | 493 | return rstar*180/pi | ||
3390 | 494 | |||
3391 | 495 | |||
3392 | 418 | class AngleData(float): | 496 | class AngleData(float): |
3393 | 419 | '''use this to carry the data along with the angle''' | 497 | '''use this to carry the data along with the angle''' |
3394 | 420 | def __new__(cls,angle,data): | 498 | def __new__(cls,angle,data): |
3395 | @@ -424,12 +502,12 @@ | |||
3396 | 424 | 502 | ||
3397 | 425 | class Pie(AbstractPieChart): | 503 | class Pie(AbstractPieChart): |
3398 | 426 | _attrMap = AttrMap(BASE=AbstractPieChart, | 504 | _attrMap = AttrMap(BASE=AbstractPieChart, |
3402 | 427 | data = AttrMapValue(isListOfNumbers, desc='list of numbers defining wedge sizes; need not sum to 1'), | 505 | data = AttrMapValue(isListOfNumbers, desc='List of numbers defining wedge sizes; need not sum to 1'), |
3403 | 428 | labels = AttrMapValue(isListOfStringsOrNone, desc="optional list of labels to use for each data point"), | 506 | labels = AttrMapValue(isListOfStringsOrNone, desc="Optional list of labels to use for each data point"), |
3404 | 429 | startAngle = AttrMapValue(isNumber, desc="angle of first slice; like the compass, 0 is due North"), | 507 | startAngle = AttrMapValue(isNumber, desc="Angle of first slice; 0 is due East"), |
3405 | 430 | direction = AttrMapValue(OneOf('clockwise', 'anticlockwise'), desc="'clockwise' or 'anticlockwise'"), | 508 | direction = AttrMapValue(OneOf('clockwise', 'anticlockwise'), desc="'clockwise' or 'anticlockwise'"), |
3408 | 431 | slices = AttrMapValue(None, desc="collection of wedge descriptor objects"), | 509 | slices = AttrMapValue(None, desc="Collection of wedge descriptor objects"), |
3409 | 432 | simpleLabels = AttrMapValue(isBoolean, desc="If true(default) use String not super duper WedgeLabel",advancedUsage=1), | 510 | simpleLabels = AttrMapValue(isBoolean, desc="If true(default) use a simple String not an advanced WedgeLabel. A WedgeLabel is customisable using the properties prefixed label_ in the collection slices."), |
3410 | 433 | other_threshold = AttrMapValue(isNumber, desc='A value for doing threshholding, not used yet.',advancedUsage=1), | 511 | other_threshold = AttrMapValue(isNumber, desc='A value for doing threshholding, not used yet.',advancedUsage=1), |
3411 | 434 | checkLabelOverlap = AttrMapValue(isBoolean, desc="If true check and attempt to fix\n standard label overlaps(default off)",advancedUsage=1), | 512 | checkLabelOverlap = AttrMapValue(isBoolean, desc="If true check and attempt to fix\n standard label overlaps(default off)",advancedUsage=1), |
3412 | 435 | pointerLabelMode = AttrMapValue(OneOf(None,'LeftRight','LeftAndRight'), desc='',advancedUsage=1), | 513 | pointerLabelMode = AttrMapValue(OneOf(None,'LeftRight','LeftAndRight'), desc='',advancedUsage=1), |
3413 | @@ -438,6 +516,8 @@ | |||
3414 | 438 | xradius = AttrMapValue(isNumberOrNone, desc="X direction Radius"), | 516 | xradius = AttrMapValue(isNumberOrNone, desc="X direction Radius"), |
3415 | 439 | yradius = AttrMapValue(isNumberOrNone, desc="Y direction Radius"), | 517 | yradius = AttrMapValue(isNumberOrNone, desc="Y direction Radius"), |
3416 | 440 | wedgeRecord = AttrMapValue(None, desc="callable(wedge,*args,**kwds)",advancedUsage=1), | 518 | wedgeRecord = AttrMapValue(None, desc="callable(wedge,*args,**kwds)",advancedUsage=1), |
3417 | 519 | sideLabels = AttrMapValue(isBoolean, desc="If true attempt to make piechart with labels along side and pointers"), | ||
3418 | 520 | sideLabelsOffset = AttrMapValue(isNumber, desc="The fraction of the pie width that the labels are situated at from the edges of the pie"), | ||
3419 | 441 | ) | 521 | ) |
3420 | 442 | other_threshold=None | 522 | other_threshold=None |
3421 | 443 | 523 | ||
3422 | @@ -457,6 +537,8 @@ | |||
3423 | 457 | self.sameRadii = False | 537 | self.sameRadii = False |
3424 | 458 | self.orderMode = 'fixed' | 538 | self.orderMode = 'fixed' |
3425 | 459 | self.xradius = self.yradius = None | 539 | self.xradius = self.yradius = None |
3426 | 540 | self.sideLabels = 0 | ||
3427 | 541 | self.sideLabelsOffset = 0.1 | ||
3428 | 460 | 542 | ||
3429 | 461 | self.slices = TypedPropertyCollection(WedgeProperties) | 543 | self.slices = TypedPropertyCollection(WedgeProperties) |
3430 | 462 | self.slices[0].fillColor = colors.darkcyan | 544 | self.slices[0].fillColor = colors.darkcyan |
3431 | @@ -586,10 +668,14 @@ | |||
3432 | 586 | 668 | ||
3433 | 587 | def makeAngles(self): | 669 | def makeAngles(self): |
3434 | 588 | wr = getattr(self,'wedgeRecord',None) | 670 | wr = getattr(self,'wedgeRecord',None) |
3436 | 589 | startAngle = self.startAngle % 360 | 671 | if self.sideLabels: |
3437 | 672 | startAngle = theta0(self.data, self.direction) | ||
3438 | 673 | self.slices.label_visible = 1 | ||
3439 | 674 | else: | ||
3440 | 675 | startAngle = self.startAngle % 360 | ||
3441 | 590 | whichWay = self.direction == "clockwise" and -1 or 1 | 676 | whichWay = self.direction == "clockwise" and -1 or 1 |
3442 | 591 | D = [a for a in enumerate(self.normalizeData(keepData=wr))] | 677 | D = [a for a in enumerate(self.normalizeData(keepData=wr))] |
3444 | 592 | if self.orderMode=='alternate': | 678 | if self.orderMode=='alternate' and not self.sideLabels: |
3445 | 593 | W = [a for a in D if abs(a[1])>=1e-5] | 679 | W = [a for a in D if abs(a[1])>=1e-5] |
3446 | 594 | W.sort(_arcCF) | 680 | W.sort(_arcCF) |
3447 | 595 | T = [[],[]] | 681 | T = [[],[]] |
3448 | @@ -608,7 +694,7 @@ | |||
3449 | 608 | a = A.append | 694 | a = A.append |
3450 | 609 | for i, angle in D: | 695 | for i, angle in D: |
3451 | 610 | endAngle = (startAngle + (angle * whichWay)) | 696 | endAngle = (startAngle + (angle * whichWay)) |
3453 | 611 | if abs(angle)>=1e-5: | 697 | if abs(angle)>=_ANGLELO: |
3454 | 612 | if startAngle >= endAngle: | 698 | if startAngle >= endAngle: |
3455 | 613 | aa = endAngle,startAngle | 699 | aa = endAngle,startAngle |
3456 | 614 | else: | 700 | else: |
3457 | @@ -623,6 +709,15 @@ | |||
3458 | 623 | 709 | ||
3459 | 624 | def makeWedges(self): | 710 | def makeWedges(self): |
3460 | 625 | angles = self.makeAngles() | 711 | angles = self.makeAngles() |
3461 | 712 | #Checking to see whether there are too many wedges packed in too small a space | ||
3462 | 713 | halfAngles = [] | ||
3463 | 714 | for i,(a1,a2) in angles: | ||
3464 | 715 | if a2 is None: | ||
3465 | 716 | halfAngle = a1 | ||
3466 | 717 | else: | ||
3467 | 718 | halfAngle = 0.5*(a2+a1) | ||
3468 | 719 | halfAngles.append(halfAngle) | ||
3469 | 720 | sideLabels = self.sideLabels | ||
3470 | 626 | n = len(angles) | 721 | n = len(angles) |
3471 | 627 | labels = _fixLabels(self.labels,n) | 722 | labels = _fixLabels(self.labels,n) |
3472 | 628 | wr = getattr(self,'wedgeRecord',None) | 723 | wr = getattr(self,'wedgeRecord',None) |
3473 | @@ -631,6 +726,8 @@ | |||
3474 | 631 | styleCount = len(self.slices) | 726 | styleCount = len(self.slices) |
3475 | 632 | 727 | ||
3476 | 633 | plMode = self.pointerLabelMode | 728 | plMode = self.pointerLabelMode |
3477 | 729 | if sideLabels: | ||
3478 | 730 | plMode = None | ||
3479 | 634 | if plMode: | 731 | if plMode: |
3480 | 635 | checkLabelOverlap = False | 732 | checkLabelOverlap = False |
3481 | 636 | PL=self.makePointerLabels(angles,plMode) | 733 | PL=self.makePointerLabels(angles,plMode) |
3482 | @@ -662,6 +759,7 @@ | |||
3483 | 662 | #all having the default style | 759 | #all having the default style |
3484 | 663 | wedgeStyle = self.slices[i%styleCount] | 760 | wedgeStyle = self.slices[i%styleCount] |
3485 | 664 | if not wedgeStyle.visible: continue | 761 | if not wedgeStyle.visible: continue |
3486 | 762 | aa = abs(a2-a1) | ||
3487 | 665 | 763 | ||
3488 | 666 | # is it a popout? | 764 | # is it a popout? |
3489 | 667 | cx, cy = centerx, centery | 765 | cx, cy = centerx, centery |
3490 | @@ -672,15 +770,15 @@ | |||
3491 | 672 | aveAngleRadians = averageAngle/_180_pi | 770 | aveAngleRadians = averageAngle/_180_pi |
3492 | 673 | cosAA = cos(aveAngleRadians) | 771 | cosAA = cos(aveAngleRadians) |
3493 | 674 | sinAA = sin(aveAngleRadians) | 772 | sinAA = sin(aveAngleRadians) |
3495 | 675 | if popout: | 773 | if popout and aa<_ANGLEHI: |
3496 | 676 | # pop out the wedge | 774 | # pop out the wedge |
3497 | 677 | cx = centerx + popout*cosAA | 775 | cx = centerx + popout*cosAA |
3498 | 678 | cy = centery + popout*sinAA | 776 | cy = centery + popout*sinAA |
3499 | 679 | 777 | ||
3501 | 680 | if n > 1: | 778 | if aa>=_ANGLEHI: |
3502 | 779 | theWedge = Ellipse(cx, cy, xradius, yradius) | ||
3503 | 780 | else: | ||
3504 | 681 | theWedge = Wedge(cx, cy, xradius, a1, a2, yradius=yradius) | 781 | theWedge = Wedge(cx, cy, xradius, a1, a2, yradius=yradius) |
3505 | 682 | elif n==1: | ||
3506 | 683 | theWedge = Ellipse(cx, cy, xradius, yradius) | ||
3507 | 684 | 782 | ||
3508 | 685 | theWedge.fillColor = wedgeStyle.fillColor | 783 | theWedge.fillColor = wedgeStyle.fillColor |
3509 | 686 | theWedge.strokeColor = wedgeStyle.strokeColor | 784 | theWedge.strokeColor = wedgeStyle.strokeColor |
3510 | @@ -695,48 +793,101 @@ | |||
3511 | 695 | if wr: | 793 | if wr: |
3512 | 696 | wr(theWedge,value=a1._data,label=text) | 794 | wr(theWedge,value=a1._data,label=text) |
3513 | 697 | if wedgeStyle.label_visible: | 795 | if wedgeStyle.label_visible: |
3546 | 698 | if text: | 796 | if not sideLabels: |
3547 | 699 | labelRadius = wedgeStyle.labelRadius | 797 | if text: |
3548 | 700 | rx = xradius*labelRadius | 798 | labelRadius = wedgeStyle.labelRadius |
3549 | 701 | ry = yradius*labelRadius | 799 | rx = xradius*labelRadius |
3550 | 702 | labelX = cx + rx*cosAA | 800 | ry = yradius*labelRadius |
3551 | 703 | labelY = cy + ry*sinAA | 801 | labelX = cx + rx*cosAA |
3552 | 704 | l = _addWedgeLabel(self,text,averageAngle,labelX,labelY,wedgeStyle) | 802 | labelY = cy + ry*sinAA |
3553 | 705 | L_add(l) | 803 | l = _addWedgeLabel(self,text,averageAngle,labelX,labelY,wedgeStyle) |
3554 | 706 | if not plMode and l._simple_pointer: | 804 | L_add(l) |
3555 | 707 | l._aax = cx+xradius*cosAA | 805 | if not plMode and l._simple_pointer: |
3556 | 708 | l._aay = cy+yradius*sinAA | 806 | l._aax = cx+xradius*cosAA |
3557 | 709 | if checkLabelOverlap: | 807 | l._aay = cy+yradius*sinAA |
3558 | 710 | l._origdata = { 'x': labelX, 'y':labelY, 'angle': averageAngle, | 808 | if checkLabelOverlap: |
3559 | 711 | 'rx': rx, 'ry':ry, 'cx':cx, 'cy':cy, | 809 | l._origdata = { 'x': labelX, 'y':labelY, 'angle': averageAngle, |
3560 | 712 | 'bounds': l.getBounds(), | 810 | 'rx': rx, 'ry':ry, 'cx':cx, 'cy':cy, |
3561 | 713 | } | 811 | 'bounds': l.getBounds(), |
3562 | 714 | elif plMode and PL_data: | 812 | } |
3563 | 715 | l = PL_data[i] | 813 | elif plMode and PL_data: |
3564 | 716 | if l: | 814 | l = PL_data[i] |
3565 | 717 | data = l._origdata | 815 | if l: |
3566 | 718 | sinM = data['smid'] | 816 | data = l._origdata |
3567 | 719 | cosM = data['cmid'] | 817 | sinM = data['smid'] |
3568 | 720 | lX = cx + xradius*cosM | 818 | cosM = data['cmid'] |
3569 | 721 | lY = cy + yradius*sinM | 819 | lX = cx + xradius*cosM |
3570 | 722 | lpel = wedgeStyle.label_pointer_elbowLength | 820 | lY = cy + yradius*sinM |
3571 | 723 | lXi = lX + lpel*cosM | 821 | lpel = wedgeStyle.label_pointer_elbowLength |
3572 | 724 | lYi = lY + lpel*sinM | 822 | lXi = lX + lpel*cosM |
3573 | 725 | L_add(PolyLine((lX,lY,lXi,lYi,l.x,l.y), | 823 | lYi = lY + lpel*sinM |
3574 | 726 | strokeWidth=wedgeStyle.label_pointer_strokeWidth, | 824 | L_add(PolyLine((lX,lY,lXi,lYi,l.x,l.y), |
3575 | 727 | strokeColor=wedgeStyle.label_pointer_strokeColor)) | 825 | strokeWidth=wedgeStyle.label_pointer_strokeWidth, |
3576 | 728 | L_add(l) | 826 | strokeColor=wedgeStyle.label_pointer_strokeColor)) |
3577 | 729 | 827 | L_add(l) | |
3578 | 828 | else: | ||
3579 | 829 | if text: | ||
3580 | 830 | slices_popout = self.slices.popout | ||
3581 | 831 | m=0 | ||
3582 | 832 | for n, angle in angles: | ||
3583 | 833 | if self.slices[n].fillColor: | ||
3584 | 834 | m += 1 | ||
3585 | 835 | else: | ||
3586 | 836 | r = n%m | ||
3587 | 837 | self.slices[n].fillColor = self.slices[r].fillColor | ||
3588 | 838 | self.slices[n].popout = self.slices[r].popout | ||
3589 | 839 | for j in range(0,m-1): | ||
3590 | 840 | if self.slices[j].popout > slices_popout: | ||
3591 | 841 | slices_popout = self.slices[j].popout | ||
3592 | 842 | labelRadius = wedgeStyle.labelRadius | ||
3593 | 843 | ry = yradius*labelRadius | ||
3594 | 844 | if (abs(averageAngle) < 90 ) or (averageAngle >270 and averageAngle <450) or (-450< | ||
3595 | 845 | averageAngle <-270): | ||
3596 | 846 | labelX = (1+self.sideLabelsOffset)*self.width + self.x + slices_popout | ||
3597 | 847 | rx = 0 | ||
3598 | 848 | else: | ||
3599 | 849 | labelX = self.x - (self.sideLabelsOffset)*self.width - slices_popout | ||
3600 | 850 | rx = 0 | ||
3601 | 851 | labelY = cy + ry*sinAA | ||
3602 | 852 | l = _addWedgeLabel(self,text,averageAngle,labelX,labelY,wedgeStyle) | ||
3603 | 853 | L_add(l) | ||
3604 | 854 | if not plMode: | ||
3605 | 855 | l._aax = cx+xradius*cosAA | ||
3606 | 856 | l._aay = cy+yradius*sinAA | ||
3607 | 857 | if checkLabelOverlap: | ||
3608 | 858 | l._origdata = { 'x': labelX, 'y':labelY, 'angle': averageAngle, | ||
3609 | 859 | 'rx': rx, 'ry':ry, 'cx':cx, 'cy':cy, | ||
3610 | 860 | 'bounds': l.getBounds(), | ||
3611 | 861 | } | ||
3612 | 862 | x1,y1,x2,y2 = l.getBounds() | ||
3613 | 863 | |||
3614 | 730 | if checkLabelOverlap and L: | 864 | if checkLabelOverlap and L: |
3616 | 731 | fixLabelOverlaps(L) | 865 | fixLabelOverlaps(L, sideLabels) |
3617 | 732 | for l in L: g_add(l) | 866 | for l in L: g_add(l) |
3618 | 733 | 867 | ||
3619 | 734 | if not plMode: | 868 | if not plMode: |
3620 | 735 | for l in L: | 869 | for l in L: |
3622 | 736 | if l._simple_pointer: | 870 | if l._simple_pointer and not sideLabels: |
3623 | 737 | g_add(Line(l.x,l.y,l._aax,l._aay, | 871 | g_add(Line(l.x,l.y,l._aax,l._aay, |
3624 | 738 | strokeWidth=wedgeStyle.label_pointer_strokeWidth, | 872 | strokeWidth=wedgeStyle.label_pointer_strokeWidth, |
3625 | 739 | strokeColor=wedgeStyle.label_pointer_strokeColor)) | 873 | strokeColor=wedgeStyle.label_pointer_strokeColor)) |
3626 | 874 | elif sideLabels: | ||
3627 | 875 | x1,y1,x2,y2 = l.getBounds() | ||
3628 | 876 | #add pointers | ||
3629 | 877 | if l.x == (1+self.sideLabelsOffset)*self.width + self.x: | ||
3630 | 878 | g_add(Line(l._aax,l._aay,0.5*(l._aax+l.x),l.y+(0.25*(y2-y1)), | ||
3631 | 879 | strokeWidth=wedgeStyle.label_pointer_strokeWidth, | ||
3632 | 880 | strokeColor=wedgeStyle.label_pointer_strokeColor)) | ||
3633 | 881 | g_add(Line(0.5*(l._aax+l.x),l.y+(0.25*(y2-y1)),l.x,l.y+(0.25*(y2-y1)), | ||
3634 | 882 | strokeWidth=wedgeStyle.label_pointer_strokeWidth, | ||
3635 | 883 | strokeColor=wedgeStyle.label_pointer_strokeColor)) | ||
3636 | 884 | else: | ||
3637 | 885 | g_add(Line(l._aax,l._aay,0.5*(l._aax+l.x),l.y+(0.25*(y2-y1)), | ||
3638 | 886 | strokeWidth=wedgeStyle.label_pointer_strokeWidth, | ||
3639 | 887 | strokeColor=wedgeStyle.label_pointer_strokeColor)) | ||
3640 | 888 | g_add(Line(0.5*(l._aax+l.x),l.y+(0.25*(y2-y1)),l.x,l.y+(0.25*(y2-y1)), | ||
3641 | 889 | strokeWidth=wedgeStyle.label_pointer_strokeWidth, | ||
3642 | 890 | strokeColor=wedgeStyle.label_pointer_strokeColor)) | ||
3643 | 740 | 891 | ||
3644 | 741 | return g | 892 | return g |
3645 | 742 | 893 | ||
3646 | @@ -899,7 +1050,7 @@ | |||
3647 | 899 | drawing.add(self.draw()) | 1050 | drawing.add(self.draw()) |
3648 | 900 | return drawing | 1051 | return drawing |
3649 | 901 | 1052 | ||
3651 | 902 | from utils3d import _getShaded, _2rad, _360, _pi_2, _2pi, _180_pi | 1053 | from reportlab.graphics.charts.utils3d import _getShaded, _2rad, _360, _pi_2, _2pi, _180_pi |
3652 | 903 | class Wedge3dProperties(PropHolder): | 1054 | class Wedge3dProperties(PropHolder): |
3653 | 904 | """This holds descriptive information about the wedges in a pie chart. | 1055 | """This holds descriptive information about the wedges in a pie chart. |
3654 | 905 | 1056 | ||
3655 | @@ -979,6 +1130,7 @@ | |||
3656 | 979 | self.lo = lo | 1130 | self.lo = lo |
3657 | 980 | self.hi = hi | 1131 | self.hi = hi |
3658 | 981 | self.mid = (lo+hi)*0.5 | 1132 | self.mid = (lo+hi)*0.5 |
3659 | 1133 | self.not360 = abs(hi-lo) < _ANGLEHI | ||
3660 | 982 | 1134 | ||
3661 | 983 | def __str__(self): | 1135 | def __str__(self): |
3662 | 984 | return '_SL3D(%.2f,%.2f)' % (self.lo,self.hi) | 1136 | return '_SL3D(%.2f,%.2f)' % (self.lo,self.hi) |
3663 | @@ -995,7 +1147,7 @@ | |||
3664 | 995 | angle_3d = 180 | 1147 | angle_3d = 180 |
3665 | 996 | 1148 | ||
3666 | 997 | def _popout(self,i): | 1149 | def _popout(self,i): |
3668 | 998 | return self.slices[i].popout or 0 | 1150 | return self._sl3d[i].not360 and self.slices[i].popout or 0 |
3669 | 999 | 1151 | ||
3670 | 1000 | def CX(self, i,d ): | 1152 | def CX(self, i,d ): |
3671 | 1001 | return self._cx+(d and self._xdepth_3d or 0)+self._popout(i)*cos(_2rad(self._sl3d[i].mid)) | 1153 | return self._cx+(d and self._xdepth_3d or 0)+self._popout(i)*cos(_2rad(self._sl3d[i].mid)) |
3672 | @@ -1045,8 +1197,9 @@ | |||
3673 | 1045 | _3d_angle = self.angle_3d | 1197 | _3d_angle = self.angle_3d |
3674 | 1046 | _3dva = self._3dva = _360(_3d_angle+90) | 1198 | _3dva = self._3dva = _360(_3d_angle+90) |
3675 | 1047 | a0 = _2rad(_3dva) | 1199 | a0 = _2rad(_3dva) |
3678 | 1048 | self._xdepth_3d = cos(a0)*self.depth_3d | 1200 | depth_3d = self.depth_3d |
3679 | 1049 | self._ydepth_3d = sin(a0)*self.depth_3d | 1201 | self._xdepth_3d = cos(a0)*depth_3d |
3680 | 1202 | self._ydepth_3d = sin(a0)*depth_3d | ||
3681 | 1050 | self._cx = self.x+self.width/2.0 | 1203 | self._cx = self.x+self.width/2.0 |
3682 | 1051 | self._cy = self.y+(self.height - self._ydepth_3d)/2.0 | 1204 | self._cy = self.y+(self.height - self._ydepth_3d)/2.0 |
3683 | 1052 | radiusx = radiusy = self._cx-self.x | 1205 | radiusx = radiusy = self._cx-self.x |
3684 | @@ -1098,7 +1251,8 @@ | |||
3685 | 1098 | sl = _sl3d[i] | 1251 | sl = _sl3d[i] |
3686 | 1099 | lo = angle0 = sl.lo | 1252 | lo = angle0 = sl.lo |
3687 | 1100 | hi = angle1 = sl.hi | 1253 | hi = angle1 = sl.hi |
3689 | 1101 | if abs(hi-lo)<=1e-7: continue | 1254 | aa = abs(hi-lo) |
3690 | 1255 | if aa<_ANGLELO: continue | ||
3691 | 1102 | fillColor = _getShaded(style.fillColor,style.fillColorShaded,style.shading) | 1256 | fillColor = _getShaded(style.fillColor,style.fillColorShaded,style.shading) |
3692 | 1103 | strokeColor = _getShaded(style.strokeColor,style.strokeColorShaded,style.shading) or fillColor | 1257 | strokeColor = _getShaded(style.strokeColor,style.strokeColorShaded,style.shading) or fillColor |
3693 | 1104 | strokeWidth = style.strokeWidth | 1258 | strokeWidth = style.strokeWidth |
3694 | @@ -1106,31 +1260,39 @@ | |||
3695 | 1106 | cy0 = CY(i,0) | 1260 | cy0 = CY(i,0) |
3696 | 1107 | cx1 = CX(i,1) | 1261 | cx1 = CX(i,1) |
3697 | 1108 | cy1 = CY(i,1) | 1262 | cy1 = CY(i,1) |
3717 | 1109 | #background shaded pie bottom | 1263 | if depth_3d: |
3718 | 1110 | g.add(Wedge(cx1,cy1,radiusx, lo, hi,yradius=radiusy, | 1264 | #background shaded pie bottom |
3719 | 1111 | strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor, | 1265 | g.add(Wedge(cx1,cy1,radiusx, lo, hi,yradius=radiusy, |
3720 | 1112 | strokeLineJoin=1)) | 1266 | strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor, |
3721 | 1113 | #connect to top | 1267 | strokeLineJoin=1)) |
3722 | 1114 | if lo < a0 < hi: angle0 = a0 | 1268 | #connect to top |
3723 | 1115 | if lo < a1 < hi: angle1 = a1 | 1269 | if lo < a0 < hi: angle0 = a0 |
3724 | 1116 | p = ArcPath(strokeColor=strokeColor, fillColor=fillColor,strokeWidth=strokeWidth,strokeLineJoin=1) | 1270 | if lo < a1 < hi: angle1 = a1 |
3725 | 1117 | p.addArc(cx1,cy1,radiusx,angle0,angle1,yradius=radiusy,moveTo=1) | 1271 | p = ArcPath(strokeColor=strokeColor, fillColor=fillColor,strokeWidth=strokeWidth,strokeLineJoin=1) |
3726 | 1118 | p.lineTo(OX(i,angle1,0),OY(i,angle1,0)) | 1272 | p.addArc(cx1,cy1,radiusx,angle0,angle1,yradius=radiusy,moveTo=1) |
3727 | 1119 | p.addArc(cx0,cy0,radiusx,angle0,angle1,yradius=radiusy,reverse=1) | 1273 | p.lineTo(OX(i,angle1,0),OY(i,angle1,0)) |
3728 | 1120 | p.closePath() | 1274 | p.addArc(cx0,cy0,radiusx,angle0,angle1,yradius=radiusy,reverse=1) |
3729 | 1121 | if angle0<=_3dva and angle1>=_3dva: | 1275 | p.closePath() |
3730 | 1122 | rd = 0 | 1276 | if angle0<=_3dva and angle1>=_3dva: |
3731 | 1123 | else: | 1277 | rd = 0 |
3732 | 1124 | rd = min(rad_dist(angle0),rad_dist(angle1)) | 1278 | else: |
3733 | 1125 | S.append((rd,p)) | 1279 | rd = min(rad_dist(angle0),rad_dist(angle1)) |
3734 | 1126 | _fillSide(S,i,lo,strokeColor,strokeWidth,fillColor) | 1280 | S.append((rd,p)) |
3735 | 1127 | _fillSide(S,i,hi,strokeColor,strokeWidth,fillColor) | 1281 | _fillSide(S,i,lo,strokeColor,strokeWidth,fillColor) |
3736 | 1282 | _fillSide(S,i,hi,strokeColor,strokeWidth,fillColor) | ||
3737 | 1128 | 1283 | ||
3738 | 1129 | #bright shaded top | 1284 | #bright shaded top |
3739 | 1130 | fillColor = style.fillColor | 1285 | fillColor = style.fillColor |
3740 | 1131 | strokeColor = style.strokeColor or fillColor | 1286 | strokeColor = style.strokeColor or fillColor |
3741 | 1132 | T.append(Wedge(cx0,cy0,radiusx,lo,hi,yradius=radiusy, | 1287 | T.append(Wedge(cx0,cy0,radiusx,lo,hi,yradius=radiusy, |
3742 | 1133 | strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor,strokeLineJoin=1)) | 1288 | strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor,strokeLineJoin=1)) |
3743 | 1289 | if aa>=_ANGLEHI: | ||
3744 | 1290 | theWedge = Ellipse(cx0, cy0, radiusx, radiusy, | ||
3745 | 1291 | strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor,strokeLineJoin=1) | ||
3746 | 1292 | else: | ||
3747 | 1293 | theWedge = Wedge(cx0,cy0,radiusx,lo,hi,yradius=radiusy, | ||
3748 | 1294 | strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor,strokeLineJoin=1) | ||
3749 | 1295 | T.append(theWedge) | ||
3750 | 1134 | 1296 | ||
3751 | 1135 | text = labels[i] | 1297 | text = labels[i] |
3752 | 1136 | if style.label_visible and text: | 1298 | if style.label_visible and text: |
3753 | @@ -1152,7 +1314,7 @@ | |||
3754 | 1152 | 1314 | ||
3755 | 1153 | S.sort(lambda a,b: -cmp(a[0],b[0])) | 1315 | S.sort(lambda a,b: -cmp(a[0],b[0])) |
3756 | 1154 | if checkLabelOverlap and L: | 1316 | if checkLabelOverlap and L: |
3758 | 1155 | fixLabelOverlaps(L) | 1317 | fixLabelOverlaps(L,sideLabels) |
3759 | 1156 | for x in ([s[1] for s in S]+T+L): | 1318 | for x in ([s[1] for s in S]+T+L): |
3760 | 1157 | g.add(x) | 1319 | g.add(x) |
3761 | 1158 | return g | 1320 | return g |
3762 | @@ -1329,3 +1491,175 @@ | |||
3763 | 1329 | d.add(pc) | 1491 | d.add(pc) |
3764 | 1330 | 1492 | ||
3765 | 1331 | return d | 1493 | return d |
3766 | 1494 | |||
3767 | 1495 | def sample5(): | ||
3768 | 1496 | "Make a pie with side labels." | ||
3769 | 1497 | |||
3770 | 1498 | d = Drawing(400, 200) | ||
3771 | 1499 | |||
3772 | 1500 | pc = Pie() | ||
3773 | 1501 | pc.x = 125 | ||
3774 | 1502 | pc.y = 25 | ||
3775 | 1503 | |||
3776 | 1504 | pc.data = [7, 1, 1, 1, 1, 2] | ||
3777 | 1505 | pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6'] | ||
3778 | 1506 | pc.sideLabels = 1 | ||
3779 | 1507 | |||
3780 | 1508 | pc.width = 150 | ||
3781 | 1509 | pc.height = 150 | ||
3782 | 1510 | pc.slices.strokeWidth=1#0.5 | ||
3783 | 1511 | pc.slices[0].fillColor = colors.steelblue | ||
3784 | 1512 | pc.slices[1].fillColor = colors.thistle | ||
3785 | 1513 | pc.slices[2].fillColor = colors.cornflower | ||
3786 | 1514 | pc.slices[3].fillColor = colors.lightsteelblue | ||
3787 | 1515 | pc.slices[4].fillColor = colors.aquamarine | ||
3788 | 1516 | pc.slices[5].fillColor = colors.cadetblue | ||
3789 | 1517 | |||
3790 | 1518 | d.add(pc) | ||
3791 | 1519 | |||
3792 | 1520 | return d | ||
3793 | 1521 | |||
3794 | 1522 | def sample6(): | ||
3795 | 1523 | |||
3796 | 1524 | "Illustrates the pie moving to leave space for the left labels" | ||
3797 | 1525 | |||
3798 | 1526 | d = Drawing(400, 200) | ||
3799 | 1527 | |||
3800 | 1528 | pc = Pie() | ||
3801 | 1529 | "The x value of the pie chart is 0" | ||
3802 | 1530 | pc.x = 0 | ||
3803 | 1531 | pc.y = 25 | ||
3804 | 1532 | |||
3805 | 1533 | pc.data = [74, 1, 1, 1, 1, 22] | ||
3806 | 1534 | pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6'] | ||
3807 | 1535 | pc.sideLabels = 1 | ||
3808 | 1536 | |||
3809 | 1537 | pc.width = 150 | ||
3810 | 1538 | pc.height = 150 | ||
3811 | 1539 | pc.slices.strokeWidth=1#0.5 | ||
3812 | 1540 | pc.slices[0].fillColor = colors.steelblue | ||
3813 | 1541 | pc.slices[1].fillColor = colors.thistle | ||
3814 | 1542 | pc.slices[2].fillColor = colors.cornflower | ||
3815 | 1543 | pc.slices[3].fillColor = colors.lightsteelblue | ||
3816 | 1544 | pc.slices[4].fillColor = colors.aquamarine | ||
3817 | 1545 | pc.slices[5].fillColor = colors.cadetblue | ||
3818 | 1546 | |||
3819 | 1547 | l = Line(0,0,0,200) | ||
3820 | 1548 | |||
3821 | 1549 | d.add(pc) | ||
3822 | 1550 | d.add(l) | ||
3823 | 1551 | |||
3824 | 1552 | return d | ||
3825 | 1553 | |||
3826 | 1554 | def sample7(): | ||
3827 | 1555 | |||
3828 | 1556 | "Case with overlapping pointers" | ||
3829 | 1557 | |||
3830 | 1558 | d = Drawing(400, 200) | ||
3831 | 1559 | |||
3832 | 1560 | pc = Pie() | ||
3833 | 1561 | pc.y = 50 | ||
3834 | 1562 | pc.x = 150 | ||
3835 | 1563 | pc.width = 100 | ||
3836 | 1564 | pc.height = 100 | ||
3837 | 1565 | |||
3838 | 1566 | pc.data = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] | ||
3839 | 1567 | pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6', 'example7', | ||
3840 | 1568 | 'example8', 'example9', 'example10', 'example11', 'example12', 'example13', 'example14', | ||
3841 | 1569 | 'example15', 'example16', 'example17', 'example18', 'example19', 'example20', 'example21', | ||
3842 | 1570 | 'example22', 'example23', 'example24', 'example25', 'example26', 'example27', 'example28'] | ||
3843 | 1571 | pc.sideLabels = 1 | ||
3844 | 1572 | pc.checkLabelOverlap = 1 | ||
3845 | 1573 | pc.simpleLabels = 0 | ||
3846 | 1574 | |||
3847 | 1575 | |||
3848 | 1576 | pc.slices.strokeWidth=1#0.5 | ||
3849 | 1577 | pc.slices[0].fillColor = colors.steelblue | ||
3850 | 1578 | pc.slices[1].fillColor = colors.thistle | ||
3851 | 1579 | pc.slices[2].fillColor = colors.cornflower | ||
3852 | 1580 | pc.slices[3].fillColor = colors.lightsteelblue | ||
3853 | 1581 | pc.slices[4].fillColor = colors.aquamarine | ||
3854 | 1582 | pc.slices[5].fillColor = colors.cadetblue | ||
3855 | 1583 | |||
3856 | 1584 | d.add(pc) | ||
3857 | 1585 | |||
3858 | 1586 | return d | ||
3859 | 1587 | |||
3860 | 1588 | def sample8(): | ||
3861 | 1589 | |||
3862 | 1590 | "Case with overlapping labels" | ||
3863 | 1591 | "Labels overlap if they do not belong to adjacent pie slices due to nature of checkLabelOverlap" | ||
3864 | 1592 | |||
3865 | 1593 | d = Drawing(400, 200) | ||
3866 | 1594 | |||
3867 | 1595 | pc = Pie() | ||
3868 | 1596 | pc.y = 50 | ||
3869 | 1597 | pc.x = 150 | ||
3870 | 1598 | pc.width = 100 | ||
3871 | 1599 | pc.height = 100 | ||
3872 | 1600 | |||
3873 | 1601 | pc.data = [1, 1, 1, 1, 1, 30, 50, 1, 1, 1, 1, 1, 1, 40,20,10] | ||
3874 | 1602 | pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6', 'example7', | ||
3875 | 1603 | 'example8', 'example9', 'example10', 'example11', 'example12', 'example13', 'example14', | ||
3876 | 1604 | 'example15', 'example16'] | ||
3877 | 1605 | pc.sideLabels = 1 | ||
3878 | 1606 | pc.checkLabelOverlap = 1 | ||
3879 | 1607 | |||
3880 | 1608 | pc.slices.strokeWidth=1#0.5 | ||
3881 | 1609 | pc.slices[0].fillColor = colors.steelblue | ||
3882 | 1610 | pc.slices[1].fillColor = colors.thistle | ||
3883 | 1611 | pc.slices[2].fillColor = colors.cornflower | ||
3884 | 1612 | pc.slices[3].fillColor = colors.lightsteelblue | ||
3885 | 1613 | pc.slices[4].fillColor = colors.aquamarine | ||
3886 | 1614 | pc.slices[5].fillColor = colors.cadetblue | ||
3887 | 1615 | |||
3888 | 1616 | d.add(pc) | ||
3889 | 1617 | |||
3890 | 1618 | return d | ||
3891 | 1619 | |||
3892 | 1620 | def sample9(): | ||
3893 | 1621 | |||
3894 | 1622 | "Case with overlapping labels" | ||
3895 | 1623 | "Labels overlap if they do not belong to adjacent pies due to nature of checkLabelOverlap" | ||
3896 | 1624 | |||
3897 | 1625 | d = Drawing(400, 200) | ||
3898 | 1626 | |||
3899 | 1627 | pc = Pie() | ||
3900 | 1628 | pc.x = 125 | ||
3901 | 1629 | pc.y = 50 | ||
3902 | 1630 | |||
3903 | 1631 | pc.data = [41, 20, 40, 15, 20, 30, 50, 15, 25, 35, 25, 20, 30, 40, 20, 30] | ||
3904 | 1632 | pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6', 'example7', | ||
3905 | 1633 | 'example8', 'example9', 'example10', 'example11', 'example12', 'example13', 'example14', | ||
3906 | 1634 | 'example15', 'example16'] | ||
3907 | 1635 | pc.sideLabels = 1 | ||
3908 | 1636 | pc.checkLabelOverlap = 1 | ||
3909 | 1637 | |||
3910 | 1638 | pc.width = 100 | ||
3911 | 1639 | pc.height = 100 | ||
3912 | 1640 | pc.slices.strokeWidth=1#0.5 | ||
3913 | 1641 | pc.slices[0].fillColor = colors.steelblue | ||
3914 | 1642 | pc.slices[1].fillColor = colors.thistle | ||
3915 | 1643 | pc.slices[2].fillColor = colors.cornflower | ||
3916 | 1644 | pc.slices[3].fillColor = colors.lightsteelblue | ||
3917 | 1645 | pc.slices[4].fillColor = colors.aquamarine | ||
3918 | 1646 | pc.slices[5].fillColor = colors.cadetblue | ||
3919 | 1647 | |||
3920 | 1648 | d.add(pc) | ||
3921 | 1649 | |||
3922 | 1650 | return d | ||
3923 | 1651 | |||
3924 | 1652 | |||
3925 | 1653 | |||
3926 | 1654 | if __name__=='__main__': | ||
3927 | 1655 | """Normally nobody will execute this | ||
3928 | 1656 | |||
3929 | 1657 | It's helpful for reportlab developers to put a 'main' block in to execute | ||
3930 | 1658 | the most recently edited feature. | ||
3931 | 1659 | """ | ||
3932 | 1660 | drawing = sample7() | ||
3933 | 1661 | from reportlab.graphics import renderPDF | ||
3934 | 1662 | renderPDF.drawToFile(drawing, 'side_labelled_pie.pdf', 'Side Labelled Pie') | ||
3935 | 1663 | |||
3936 | 1664 | |||
3937 | 1665 | |||
3938 | 1332 | 1666 | ||
3939 | === modified file 'src/reportlab/graphics/charts/textlabels.py' | |||
3940 | --- src/reportlab/graphics/charts/textlabels.py 2010-12-06 12:45:44 +0000 | |||
3941 | +++ src/reportlab/graphics/charts/textlabels.py 2013-04-14 00:52:26 +0000 | |||
3942 | @@ -1,7 +1,7 @@ | |||
3944 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
3945 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
3946 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/textlabels.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/textlabels.py |
3948 | 4 | __version__=''' $Id: textlabels.py 3702 2010-04-14 17:13:41Z rgbecker $ ''' | 4 | __version__=''' $Id: textlabels.py 3959 2012-09-27 14:39:39Z robin $ ''' |
3949 | 5 | import string | 5 | import string |
3950 | 6 | 6 | ||
3951 | 7 | from reportlab.lib import colors | 7 | from reportlab.lib import colors |
3952 | 8 | 8 | ||
3953 | === modified file 'src/reportlab/graphics/charts/utils.py' | |||
3954 | --- src/reportlab/graphics/charts/utils.py 2010-12-06 12:45:44 +0000 | |||
3955 | +++ src/reportlab/graphics/charts/utils.py 2013-04-14 00:52:26 +0000 | |||
3956 | @@ -1,13 +1,17 @@ | |||
3958 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
3959 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
3960 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/utils.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/utils.py |
3961 | 4 | 4 | ||
3963 | 5 | __version__=''' $Id: utils.py 3746 2010-07-21 10:32:55Z rgbecker $ ''' | 5 | __version__=''' $Id: utils.py 3959 2012-09-27 14:39:39Z robin $ ''' |
3964 | 6 | __doc__="Utilities used here and there." | 6 | __doc__="Utilities used here and there." |
3965 | 7 | from time import mktime, gmtime, strftime | 7 | from time import mktime, gmtime, strftime |
3966 | 8 | from math import log10, pi, floor, sin, cos, sqrt, hypot | ||
3967 | 9 | import weakref | ||
3968 | 10 | from reportlab.graphics.shapes import transformPoint, transformPoints, inverse, Ellipse, Group, String, Path | ||
3969 | 11 | from reportlab.lib.utils import flatten | ||
3970 | 12 | from reportlab.pdfbase.pdfmetrics import stringWidth | ||
3971 | 8 | 13 | ||
3972 | 9 | ### Dinu's stuff used in some line plots (likely to vansih). | 14 | ### Dinu's stuff used in some line plots (likely to vansih). |
3973 | 10 | |||
3974 | 11 | def mkTimeTuple(timeString): | 15 | def mkTimeTuple(timeString): |
3975 | 12 | "Convert a 'dd/mm/yyyy' formatted string to a tuple for use in the time module." | 16 | "Convert a 'dd/mm/yyyy' formatted string to a tuple for use in the time module." |
3976 | 13 | 17 | ||
3977 | @@ -17,23 +21,17 @@ | |||
3978 | 17 | 21 | ||
3979 | 18 | return tuple(list) | 22 | return tuple(list) |
3980 | 19 | 23 | ||
3981 | 20 | |||
3982 | 21 | def str2seconds(timeString): | 24 | def str2seconds(timeString): |
3983 | 22 | "Convert a number of seconds since the epoch into a date string." | 25 | "Convert a number of seconds since the epoch into a date string." |
3984 | 23 | 26 | ||
3985 | 24 | return mktime(mkTimeTuple(timeString)) | 27 | return mktime(mkTimeTuple(timeString)) |
3986 | 25 | 28 | ||
3987 | 26 | |||
3988 | 27 | def seconds2str(seconds): | 29 | def seconds2str(seconds): |
3989 | 28 | "Convert a date string into the number of seconds since the epoch." | 30 | "Convert a date string into the number of seconds since the epoch." |
3990 | 29 | 31 | ||
3991 | 30 | return strftime('%Y-%m-%d', gmtime(seconds)) | 32 | return strftime('%Y-%m-%d', gmtime(seconds)) |
3992 | 31 | 33 | ||
3993 | 32 | |||
3994 | 33 | ### Aaron's rounding function for making nice values on axes. | 34 | ### Aaron's rounding function for making nice values on axes. |
3995 | 34 | |||
3996 | 35 | from math import log10 | ||
3997 | 36 | |||
3998 | 37 | def nextRoundNumber(x): | 35 | def nextRoundNumber(x): |
3999 | 38 | """Return the first 'nice round number' greater than or equal to x | 36 | """Return the first 'nice round number' greater than or equal to x |
4000 | 39 | 37 | ||
4001 | @@ -72,15 +70,8 @@ | |||
4002 | 72 | else: | 70 | else: |
4003 | 73 | return base * 10.0 | 71 | return base * 10.0 |
4004 | 74 | 72 | ||
4005 | 75 | |||
4006 | 76 | ### Robin's stuff from rgb_ticks. | ||
4007 | 77 | |||
4008 | 78 | from math import log10, floor | ||
4009 | 79 | |||
4010 | 80 | _intervals=(.1, .2, .25, .5) | 73 | _intervals=(.1, .2, .25, .5) |
4011 | 81 | _j_max=len(_intervals)-1 | 74 | _j_max=len(_intervals)-1 |
4012 | 82 | |||
4013 | 83 | |||
4014 | 84 | def find_interval(lo,hi,I=5): | 75 | def find_interval(lo,hi,I=5): |
4015 | 85 | 'determine tick parameters for range [lo, hi] using I intervals' | 76 | 'determine tick parameters for range [lo, hi] using I intervals' |
4016 | 86 | 77 | ||
4017 | @@ -128,7 +119,6 @@ | |||
4018 | 128 | b = b*10 | 119 | b = b*10 |
4019 | 129 | return n, x, ss, lo - n + x - hi | 120 | return n, x, ss, lo - n + x - hi |
4020 | 130 | 121 | ||
4021 | 131 | |||
4022 | 132 | def find_good_grid(lower,upper,n=(4,5,6,7,8,9), grid=None): | 122 | def find_good_grid(lower,upper,n=(4,5,6,7,8,9), grid=None): |
4023 | 133 | if grid: | 123 | if grid: |
4024 | 134 | t = divmod(lower,grid)[0] * grid | 124 | t = divmod(lower,grid)[0] * grid |
4025 | @@ -149,7 +139,6 @@ | |||
4026 | 149 | w=z[3] | 139 | w=z[3] |
4027 | 150 | return t, hi, grid | 140 | return t, hi, grid |
4028 | 151 | 141 | ||
4029 | 152 | |||
4030 | 153 | def ticks(lower, upper, n=(4,5,6,7,8,9), split=1, percent=0, grid=None, labelVOffset=0): | 142 | def ticks(lower, upper, n=(4,5,6,7,8,9), split=1, percent=0, grid=None, labelVOffset=0): |
4031 | 154 | ''' | 143 | ''' |
4032 | 155 | return tick positions and labels for range lower<=x<=upper | 144 | return tick positions and labels for range lower<=x<=upper |
4033 | @@ -223,9 +212,6 @@ | |||
4034 | 223 | def pairMaverage(data,n=6): | 212 | def pairMaverage(data,n=6): |
4035 | 224 | return [(x[0],s) for x,s in zip(data, maverage([x[1] for x in data],n))] | 213 | return [(x[0],s) for x,s in zip(data, maverage([x[1] for x in data],n))] |
4036 | 225 | 214 | ||
4037 | 226 | import weakref | ||
4038 | 227 | from reportlab.graphics.shapes import transformPoint, transformPoints, inverse, Ellipse | ||
4039 | 228 | from reportlab.lib.utils import flatten | ||
4040 | 229 | class DrawTimeCollector(object): | 215 | class DrawTimeCollector(object): |
4041 | 230 | ''' | 216 | ''' |
4042 | 231 | generic mechanism for collecting information about nodes at the time they are about to be drawn | 217 | generic mechanism for collecting information about nodes at the time they are about to be drawn |
4043 | @@ -311,3 +297,66 @@ | |||
4044 | 311 | pprint.pprint(self._info,f) | 297 | pprint.pprint(self._info,f) |
4045 | 312 | finally: | 298 | finally: |
4046 | 313 | f.close() | 299 | f.close() |
4047 | 300 | |||
4048 | 301 | def xyDist( (x0,y0),(x1,y1) ): | ||
4049 | 302 | '''return distance between two points''' | ||
4050 | 303 | return hypot((x1-x0),(y1-y0)) | ||
4051 | 304 | |||
4052 | 305 | def lineSegmentIntersect( | ||
4053 | 306 | (x00,y00),(x01,y01), | ||
4054 | 307 | (x10,y10),(x11,y11) | ||
4055 | 308 | ): | ||
4056 | 309 | p = x00,y00 | ||
4057 | 310 | r = x01-x00,y01-y00 | ||
4058 | 311 | |||
4059 | 312 | |||
4060 | 313 | q = x10,y10 | ||
4061 | 314 | s = x11-x10,y11-y10 | ||
4062 | 315 | |||
4063 | 316 | rs = float(r[0]*s[1]-r[1]*s[0]) | ||
4064 | 317 | qp = q[0]-p[0],q[1]-p[1] | ||
4065 | 318 | |||
4066 | 319 | qpr = qp[0]*r[1]-qp[1]*r[0] | ||
4067 | 320 | qps = qp[0]*s[1]-qp[1]*s[0] | ||
4068 | 321 | |||
4069 | 322 | if abs(rs)<1e-8: | ||
4070 | 323 | if abs(qpr)<1e-8: return 'collinear' | ||
4071 | 324 | return None | ||
4072 | 325 | |||
4073 | 326 | t = qps/rs | ||
4074 | 327 | u = qpr/rs | ||
4075 | 328 | |||
4076 | 329 | if 0<=t<=1 and 0<=u<=1: | ||
4077 | 330 | return p[0]+t*r[0], p[1]+t*r[1] | ||
4078 | 331 | |||
4079 | 332 | def makeCircularString(x, y, radius, angle, text, fontName, fontSize, inside=0, G=None,textAnchor='start'): | ||
4080 | 333 | '''make a group with circular text in it''' | ||
4081 | 334 | if not G: G = Group() | ||
4082 | 335 | |||
4083 | 336 | angle %= 360 | ||
4084 | 337 | pi180 = pi/180 | ||
4085 | 338 | phi = angle*pi180 | ||
4086 | 339 | width = stringWidth(text, fontName, fontSize) | ||
4087 | 340 | sig = inside and -1 or 1 | ||
4088 | 341 | hsig = sig*0.5 | ||
4089 | 342 | sig90 = sig*90 | ||
4090 | 343 | |||
4091 | 344 | if textAnchor!='start': | ||
4092 | 345 | if textAnchor=='middle': | ||
4093 | 346 | phi += sig*(0.5*width)/radius | ||
4094 | 347 | elif textAnchor=='end': | ||
4095 | 348 | phi += sig*float(width)/radius | ||
4096 | 349 | elif textAnchor=='numeric': | ||
4097 | 350 | phi += sig*float(numericXShift(textAnchor,text,width,fontName,fontSize,None))/radius | ||
4098 | 351 | |||
4099 | 352 | for letter in text: | ||
4100 | 353 | width = stringWidth(letter, fontName, fontSize) | ||
4101 | 354 | beta = float(width)/radius | ||
4102 | 355 | h = Group() | ||
4103 | 356 | h.add(String(0, 0, letter, fontName=fontName,fontSize=fontSize,textAnchor="start")) | ||
4104 | 357 | h.translate(x+cos(phi)*radius,y+sin(phi)*radius) #translate to radius and angle | ||
4105 | 358 | h.rotate((phi-hsig*beta)/pi180-sig90) # rotate as needed | ||
4106 | 359 | G.add(h) #add to main group | ||
4107 | 360 | phi -= sig*beta #increment | ||
4108 | 361 | |||
4109 | 362 | return G | ||
4110 | 314 | 363 | ||
4111 | === modified file 'src/reportlab/graphics/renderPDF.py' | |||
4112 | --- src/reportlab/graphics/renderPDF.py 2010-12-06 12:45:44 +0000 | |||
4113 | +++ src/reportlab/graphics/renderPDF.py 2013-04-14 00:52:26 +0000 | |||
4114 | @@ -1,9 +1,9 @@ | |||
4116 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4117 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4118 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/renderPDF.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/renderPDF.py |
4119 | 4 | # renderPDF - draws Drawings onto a canvas | 4 | # renderPDF - draws Drawings onto a canvas |
4120 | 5 | 5 | ||
4122 | 6 | __version__=''' $Id: renderPDF.py 3751 2010-07-30 09:28:28Z rgbecker $ ''' | 6 | __version__=''' $Id: renderPDF.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4123 | 7 | __doc__="""Render Drawing objects within others PDFs or standalone | 7 | __doc__="""Render Drawing objects within others PDFs or standalone |
4124 | 8 | 8 | ||
4125 | 9 | Usage:: | 9 | Usage:: |
4126 | @@ -78,10 +78,11 @@ | |||
4127 | 78 | ) | 78 | ) |
4128 | 79 | 79 | ||
4129 | 80 | def drawImage(self, image): | 80 | def drawImage(self, image): |
4130 | 81 | path = image.path | ||
4131 | 81 | # currently not implemented in other renderers | 82 | # currently not implemented in other renderers |
4133 | 82 | if image.path and os.path.exists(image.path): | 83 | if path and (hasattr(path,'mode') or os.path.exists(image.path)): |
4134 | 83 | self._canvas.drawInlineImage( | 84 | self._canvas.drawInlineImage( |
4136 | 84 | image.path, | 85 | path, |
4137 | 85 | image.x, image.y, | 86 | image.x, image.y, |
4138 | 86 | image.width, image.height | 87 | image.width, image.height |
4139 | 87 | ) | 88 | ) |
4140 | @@ -217,7 +218,12 @@ | |||
4141 | 217 | # self._canvas.setDash(array=value) | 218 | # self._canvas.setDash(array=value) |
4142 | 218 | elif key == 'strokeDashArray': | 219 | elif key == 'strokeDashArray': |
4143 | 219 | if value: | 220 | if value: |
4145 | 220 | self._canvas.setDash(value) | 221 | if isinstance(value,(list,tuple)) and len(value)==2 and isinstance(value[1],(tuple,list)): |
4146 | 222 | phase = value[0] | ||
4147 | 223 | value = value[1] | ||
4148 | 224 | else: | ||
4149 | 225 | phase = 0 | ||
4150 | 226 | self._canvas.setDash(value,phase) | ||
4151 | 221 | else: | 227 | else: |
4152 | 222 | self._canvas.setDash() | 228 | self._canvas.setDash() |
4153 | 223 | elif key == 'fillColor': | 229 | elif key == 'fillColor': |
4154 | 224 | 230 | ||
4155 | === modified file 'src/reportlab/graphics/renderPM.py' | |||
4156 | --- src/reportlab/graphics/renderPM.py 2010-12-06 12:45:44 +0000 | |||
4157 | +++ src/reportlab/graphics/renderPM.py 2013-04-14 00:52:26 +0000 | |||
4158 | @@ -1,7 +1,7 @@ | |||
4160 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4161 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4162 | 3 | #history www.reportlab.co.uk/rl-cgi/viewcvs.cgi/rlextra/graphics/Csrc/renderPM/renderP.py | 3 | #history www.reportlab.co.uk/rl-cgi/viewcvs.cgi/rlextra/graphics/Csrc/renderPM/renderP.py |
4164 | 4 | __version__=''' $Id: renderPM.py 3704 2010-04-15 13:41:32Z rgbecker $ ''' | 4 | __version__=''' $Id: renderPM.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4165 | 5 | __doc__="""Render drawing objects in common bitmap formats | 5 | __doc__="""Render drawing objects in common bitmap formats |
4166 | 6 | 6 | ||
4167 | 7 | Usage:: | 7 | Usage:: |
4168 | @@ -78,7 +78,13 @@ | |||
4169 | 78 | self._canvas.lineCap = s['strokeLineCap'] | 78 | self._canvas.lineCap = s['strokeLineCap'] |
4170 | 79 | self._canvas.lineJoin = s['strokeLineJoin'] | 79 | self._canvas.lineJoin = s['strokeLineJoin'] |
4171 | 80 | da = s['strokeDashArray'] | 80 | da = s['strokeDashArray'] |
4173 | 81 | da = da and (0,da) or None | 81 | if not da: |
4174 | 82 | da = None | ||
4175 | 83 | else: | ||
4176 | 84 | if not isinstance(da,(list,tuple)): | ||
4177 | 85 | da = da, | ||
4178 | 86 | if len(da)!=2 or not isinstance(da[1],(list,tuple)): | ||
4179 | 87 | da = 0, da #assume phase of 0 | ||
4180 | 82 | self._canvas.dashArray = da | 88 | self._canvas.dashArray = da |
4181 | 83 | alpha = s['fillOpacity'] | 89 | alpha = s['fillOpacity'] |
4182 | 84 | if alpha is not None: | 90 | if alpha is not None: |
4183 | @@ -117,19 +123,22 @@ | |||
4184 | 117 | self._canvas.line(line.x1,line.y1,line.x2,line.y2) | 123 | self._canvas.line(line.x1,line.y1,line.x2,line.y2) |
4185 | 118 | 124 | ||
4186 | 119 | def drawImage(self, image): | 125 | def drawImage(self, image): |
4200 | 120 | if image.path and os.path.exists(image.path): | 126 | path = image.path |
4201 | 121 | if type(image.path) is type(''): | 127 | if isinstance(path,basestring): |
4202 | 122 | im = _getImage().open(image.path).convert('RGB') | 128 | if not (path and os.path.isfile(path)): return |
4203 | 123 | else: | 129 | im = _getImage().open(path).convert('RGB') |
4204 | 124 | im = image.path.convert('RGB') | 130 | elif hasattr(path,'convert'): |
4205 | 125 | srcW, srcH = im.size | 131 | im = path.convert('RGB') |
4206 | 126 | dstW, dstH = image.width, image.height | 132 | else: |
4207 | 127 | if dstW is None: dstW = srcW | 133 | return |
4208 | 128 | if dstH is None: dstH = srcH | 134 | srcW, srcH = im.size |
4209 | 129 | self._canvas._aapixbuf( | 135 | dstW, dstH = image.width, image.height |
4210 | 130 | image.x, image.y, dstW, dstH, | 136 | if dstW is None: dstW = srcW |
4211 | 131 | im.tostring(), srcW, srcH, 3, | 137 | if dstH is None: dstH = srcH |
4212 | 132 | ) | 138 | self._canvas._aapixbuf( |
4213 | 139 | image.x, image.y, dstW, dstH, | ||
4214 | 140 | im.tostring(), srcW, srcH, 3, | ||
4215 | 141 | ) | ||
4216 | 133 | 142 | ||
4217 | 134 | def drawCircle(self, circle): | 143 | def drawCircle(self, circle): |
4218 | 135 | c = self._canvas | 144 | c = self._canvas |
4219 | @@ -658,7 +667,7 @@ | |||
4220 | 658 | 667 | ||
4221 | 659 | save = drawToFile | 668 | save = drawToFile |
4222 | 660 | 669 | ||
4224 | 661 | def test(): | 670 | def test(verbose=True): |
4225 | 662 | def ext(x): | 671 | def ext(x): |
4226 | 663 | if x=='tiff': x='tif' | 672 | if x=='tiff': x='tif' |
4227 | 664 | return x | 673 | return x |
4228 | @@ -719,7 +728,7 @@ | |||
4229 | 719 | html.append('<a href="%s">python source</a><br>\n' % filename) | 728 | html.append('<a href="%s">python source</a><br>\n' % filename) |
4230 | 720 | elif k=='svg': | 729 | elif k=='svg': |
4231 | 721 | html.append('<a href="%s">SVG</a><br>\n' % filename) | 730 | html.append('<a href="%s">SVG</a><br>\n' % filename) |
4233 | 722 | print 'wrote',fullpath | 731 | if verbose: print 'wrote',fullpath |
4234 | 723 | except AttributeError: | 732 | except AttributeError: |
4235 | 724 | print 'Problem drawing %s file'%k | 733 | print 'Problem drawing %s file'%k |
4236 | 725 | raise | 734 | raise |
4237 | @@ -731,7 +740,7 @@ | |||
4238 | 731 | if sys.platform=='mac': | 740 | if sys.platform=='mac': |
4239 | 732 | from reportlab.lib.utils import markfilename | 741 | from reportlab.lib.utils import markfilename |
4240 | 733 | markfilename(htmlFileName,ext='HTML') | 742 | markfilename(htmlFileName,ext='HTML') |
4242 | 734 | print 'wrote %s' % htmlFileName | 743 | if verbose: print 'wrote %s' % htmlFileName |
4243 | 735 | 744 | ||
4244 | 736 | if __name__=='__main__': | 745 | if __name__=='__main__': |
4245 | 737 | test() | 746 | test() |
4246 | 738 | 747 | ||
4247 | === modified file 'src/reportlab/graphics/renderPS.py' | |||
4248 | --- src/reportlab/graphics/renderPS.py 2010-12-06 12:45:44 +0000 | |||
4249 | +++ src/reportlab/graphics/renderPS.py 2013-04-14 00:52:26 +0000 | |||
4250 | @@ -1,7 +1,7 @@ | |||
4252 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4253 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4254 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/renderPS.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/renderPS.py |
4256 | 4 | __version__=''' $Id: renderPS.py 3695 2010-04-06 16:16:27Z rgbecker $ ''' | 4 | __version__=''' $Id: renderPS.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4257 | 5 | __doc__="""Render drawing objects in Postscript""" | 5 | __doc__="""Render drawing objects in Postscript""" |
4258 | 6 | 6 | ||
4259 | 7 | import string, types | 7 | import string, types |
4260 | @@ -186,9 +186,9 @@ | |||
4261 | 186 | """Two notations. pass two numbers, or an array and phase""" | 186 | """Two notations. pass two numbers, or an array and phase""" |
4262 | 187 | # copied and modified from reportlab.canvas | 187 | # copied and modified from reportlab.canvas |
4263 | 188 | psoperation = "setdash" | 188 | psoperation = "setdash" |
4265 | 189 | if type(array) == types.IntType or type(array) == types.FloatType: | 189 | if isinstance(array,(float,int)): |
4266 | 190 | self.code_append('[%s %s] 0 %s' % (array, phase, psoperation)) | 190 | self.code_append('[%s %s] 0 %s' % (array, phase, psoperation)) |
4268 | 191 | elif type(array) == types.ListType or type(array) == types.TupleType: | 191 | elif isinstance(array,(tuple,list)): |
4269 | 192 | assert phase >= 0, "phase is a length in user space" | 192 | assert phase >= 0, "phase is a length in user space" |
4270 | 193 | textarray = string.join(map(str, array)) | 193 | textarray = string.join(map(str, array)) |
4271 | 194 | self.code_append('[%s] %s %s' % (textarray, phase, psoperation)) | 194 | self.code_append('[%s] %s %s' % (textarray, phase, psoperation)) |
4272 | @@ -833,7 +833,12 @@ | |||
4273 | 833 | self._canvas.setLineJoin(value) | 833 | self._canvas.setLineJoin(value) |
4274 | 834 | elif key == 'strokeDashArray': | 834 | elif key == 'strokeDashArray': |
4275 | 835 | if value: | 835 | if value: |
4277 | 836 | self._canvas.setDash(value) | 836 | if isinstance(value,(list,tuple)) and len(value)==2 and isinstance(value[1],(tuple,list)): |
4278 | 837 | phase = value[0] | ||
4279 | 838 | value = value[1] | ||
4280 | 839 | else: | ||
4281 | 840 | phase = 0 | ||
4282 | 841 | self._canvas.setDash(value,phase) | ||
4283 | 837 | else: | 842 | else: |
4284 | 838 | self._canvas.setDash() | 843 | self._canvas.setDash() |
4285 | 839 | ## elif key == 'stroke_opacity': | 844 | ## elif key == 'stroke_opacity': |
4286 | 840 | 845 | ||
4287 | === modified file 'src/reportlab/graphics/renderSVG.py' | |||
4288 | --- src/reportlab/graphics/renderSVG.py 2010-12-06 12:45:44 +0000 | |||
4289 | +++ src/reportlab/graphics/renderSVG.py 2013-04-14 00:52:26 +0000 | |||
4290 | @@ -95,8 +95,9 @@ | |||
4291 | 95 | 95 | ||
4292 | 96 | ### classes ### | 96 | ### classes ### |
4293 | 97 | class SVGCanvas: | 97 | class SVGCanvas: |
4296 | 98 | def __init__(self, size=(300,300)): | 98 | def __init__(self, size=(300,300), encoding='utf-8', verbose=0): |
4297 | 99 | self.verbose = 0 | 99 | self.verbose = verbose |
4298 | 100 | self.encoding = encoding | ||
4299 | 100 | self.width, self.height = self.size = size | 101 | self.width, self.height = self.size = size |
4300 | 101 | # self.height = size[1] | 102 | # self.height = size[1] |
4301 | 102 | self.code = [] | 103 | self.code = [] |
4302 | @@ -126,11 +127,16 @@ | |||
4303 | 126 | self.svg = self.doc.documentElement | 127 | self.svg = self.doc.documentElement |
4304 | 127 | self.svg.setAttribute("width", str(size[0])) | 128 | self.svg.setAttribute("width", str(size[0])) |
4305 | 128 | self.svg.setAttribute("height", str(self.height)) | 129 | self.svg.setAttribute("height", str(self.height)) |
4306 | 130 | self.svg.setAttribute("preserveAspectRatio", "xMinYMin meet") | ||
4307 | 131 | self.svg.setAttribute("viewBox", "0 0 %d %d" % (self.width, self.height)) | ||
4308 | 129 | 132 | ||
4309 | 130 | #these suggested by Tim Roberts, as updated by peter@maubp.freeserve.co.uk | 133 | #these suggested by Tim Roberts, as updated by peter@maubp.freeserve.co.uk |
4310 | 131 | self.svg.setAttribute("xmlns", "http://www.w3.org/2000/svg") | 134 | self.svg.setAttribute("xmlns", "http://www.w3.org/2000/svg") |
4311 | 132 | self.svg.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink") | 135 | self.svg.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink") |
4312 | 133 | self.svg.setAttribute("version", "1.0") | 136 | self.svg.setAttribute("version", "1.0") |
4313 | 137 | |||
4314 | 138 | |||
4315 | 139 | |||
4316 | 134 | #self.svg.setAttribute("baseProfile", "full") #disliked in V 1.0 | 140 | #self.svg.setAttribute("baseProfile", "full") #disliked in V 1.0 |
4317 | 135 | title = self.doc.createElement('title') | 141 | title = self.doc.createElement('title') |
4318 | 136 | text = self.doc.createTextNode('...') | 142 | text = self.doc.createTextNode('...') |
4319 | @@ -163,12 +169,12 @@ | |||
4320 | 163 | self.currGroup = self.groupTree | 169 | self.currGroup = self.groupTree |
4321 | 164 | 170 | ||
4322 | 165 | def save(self, fn=None): | 171 | def save(self, fn=None): |
4324 | 166 | if isinstance(fn,str): | 172 | if type(fn) in types.StringTypes: |
4325 | 167 | f = open(fn, 'w') | 173 | f = open(fn, 'w') |
4326 | 168 | else: | 174 | else: |
4327 | 169 | f = fn | 175 | f = fn |
4328 | 170 | 176 | ||
4330 | 171 | f.write(self.doc.toprettyxml(indent=" ")) | 177 | f.write(self.doc.toprettyxml(indent=" ",encoding=self.encoding)) |
4331 | 172 | 178 | ||
4332 | 173 | if f is not fn: | 179 | if f is not fn: |
4333 | 174 | f.close() | 180 | f.close() |
4334 | @@ -253,9 +259,9 @@ | |||
4335 | 253 | def setDash(self, array=[], phase=0): | 259 | def setDash(self, array=[], phase=0): |
4336 | 254 | """Two notations. Pass two numbers, or an array and phase.""" | 260 | """Two notations. Pass two numbers, or an array and phase.""" |
4337 | 255 | 261 | ||
4339 | 256 | if type(array) in (types.IntType, types.FloatType): | 262 | if isinstance(array,(float,int)): |
4340 | 257 | self.style['stroke-dasharray'] = ', '.join(map(str, ([array, phase]))) | 263 | self.style['stroke-dasharray'] = ', '.join(map(str, ([array, phase]))) |
4342 | 258 | elif type(array) in (types.ListType, types.TupleType) and len(array) > 0: | 264 | elif isinstance(array,(tuple,list)) and len(array) > 0: |
4343 | 259 | assert phase >= 0, "phase is a length in user space" | 265 | assert phase >= 0, "phase is a length in user space" |
4344 | 260 | self.style['stroke-dasharray'] = ', '.join(map(str, (array+[phase]))) | 266 | self.style['stroke-dasharray'] = ', '.join(map(str, (array+[phase]))) |
4345 | 261 | 267 | ||
4346 | @@ -754,7 +760,12 @@ | |||
4347 | 754 | self._canvas.setLineJoin(value) | 760 | self._canvas.setLineJoin(value) |
4348 | 755 | elif key == 'strokeDashArray': | 761 | elif key == 'strokeDashArray': |
4349 | 756 | if value: | 762 | if value: |
4351 | 757 | self._canvas.setDash(value) | 763 | if isinstance(value,(list,tuple)) and len(value)==2 and isinstance(value[1],(tuple,list)): |
4352 | 764 | phase = value[0] | ||
4353 | 765 | value = value[1] | ||
4354 | 766 | else: | ||
4355 | 767 | phase = 0 | ||
4356 | 768 | self._canvas.setDash(value,phase) | ||
4357 | 758 | else: | 769 | else: |
4358 | 759 | self._canvas.setDash() | 770 | self._canvas.setDash() |
4359 | 760 | elif key == 'fillColor': | 771 | elif key == 'fillColor': |
4360 | 761 | 772 | ||
4361 | === modified file 'src/reportlab/graphics/renderbase.py' | |||
4362 | --- src/reportlab/graphics/renderbase.py 2010-12-06 12:45:44 +0000 | |||
4363 | +++ src/reportlab/graphics/renderbase.py 2013-04-14 00:52:26 +0000 | |||
4364 | @@ -1,4 +1,4 @@ | |||
4366 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4367 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4368 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/renderbase.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/renderbase.py |
4369 | 4 | 4 | ||
4370 | 5 | 5 | ||
4371 | === modified file 'src/reportlab/graphics/shapes.py' | |||
4372 | --- src/reportlab/graphics/shapes.py 2010-12-06 12:45:44 +0000 | |||
4373 | +++ src/reportlab/graphics/shapes.py 2013-04-14 00:52:26 +0000 | |||
4374 | @@ -1,12 +1,12 @@ | |||
4376 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4377 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4378 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/shapes.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/shapes.py |
4379 | 4 | 4 | ||
4381 | 5 | __version__=''' $Id: shapes.py 3751 2010-07-30 09:28:28Z rgbecker $ ''' | 5 | __version__=''' $Id: shapes.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4382 | 6 | __doc__='''Core of the graphics library - defines Drawing and Shapes''' | 6 | __doc__='''Core of the graphics library - defines Drawing and Shapes''' |
4383 | 7 | 7 | ||
4384 | 8 | import string, os, sys | 8 | import string, os, sys |
4386 | 9 | from math import pi, cos, sin, tan | 9 | from math import pi, cos, sin, tan, sqrt |
4387 | 10 | from types import FloatType, IntType, ListType, TupleType, StringType, InstanceType | 10 | from types import FloatType, IntType, ListType, TupleType, StringType, InstanceType |
4388 | 11 | from pprint import pprint | 11 | from pprint import pprint |
4389 | 12 | 12 | ||
4390 | @@ -210,6 +210,59 @@ | |||
4391 | 210 | yMax = y2 | 210 | yMax = y2 |
4392 | 211 | return (xMin, yMin, xMax, yMax) | 211 | return (xMin, yMin, xMax, yMax) |
4393 | 212 | 212 | ||
4394 | 213 | def _getBezierExtrema(y0,y1,y2,y3): | ||
4395 | 214 | ''' | ||
4396 | 215 | this is used to find if a curveTo path operator has extrema in its range | ||
4397 | 216 | The curveTo operator is defined by the points y0, y1, y2, y3 | ||
4398 | 217 | |||
4399 | 218 | B(t):=(1-t)^3*y0+3*(1-t)^2*t*y1+3*(1-t)*t^2*y2+t^3*y3 | ||
4400 | 219 | :=t^3*(y3-3*y2+3*y1-y0)+t^2*(3*y2-6*y1+3*y0)+t*(3*y1-3*y0)+y0 | ||
4401 | 220 | and is a cubic bezier curve. | ||
4402 | 221 | |||
4403 | 222 | The differential is a quadratic | ||
4404 | 223 | t^2*(3*y3-9*y2+9*y1-3*y0)+t*(6*y2-12*y1+6*y0)+3*y1-3*y0 | ||
4405 | 224 | |||
4406 | 225 | The extrema must be at real roots, r, of the above which lie in 0<=r<=1 | ||
4407 | 226 | |||
4408 | 227 | The quadratic coefficients are | ||
4409 | 228 | a=3*y3-9*y2+9*y1-3*y0 b=6*y2-12*y1+6*y0 c=3*y1-3*y0 | ||
4410 | 229 | or | ||
4411 | 230 | a=y3-3*y2+3*y1-y0 b=2*y2-4*y1+2*y0 c=y1-y0 (remove common factor of 3) | ||
4412 | 231 | or | ||
4413 | 232 | a=y3-3*(y2-y1)-y0 b=2*(y2-2*y1+y0) c=y1-y0 | ||
4414 | 233 | |||
4415 | 234 | The returned value is [y0,x1,x2,y3] where if found x1, x2 are any extremals that were found; | ||
4416 | 235 | there can be 0, 1 or 2 extremals | ||
4417 | 236 | ''' | ||
4418 | 237 | a=y3-3*(y2-y1)-y0 | ||
4419 | 238 | b=2*(y2-2*y1+y0) | ||
4420 | 239 | c=y1-y0 | ||
4421 | 240 | Y = [y0] #the set of points | ||
4422 | 241 | |||
4423 | 242 | #standard method to find roots of quadratic | ||
4424 | 243 | d = b*b - 4*a*c | ||
4425 | 244 | if d>=0: | ||
4426 | 245 | d = sqrt(d) | ||
4427 | 246 | if b<0: d = -d | ||
4428 | 247 | q = -0.5*(b+d) | ||
4429 | 248 | R = [] | ||
4430 | 249 | try: | ||
4431 | 250 | R.append(q/a) | ||
4432 | 251 | except: | ||
4433 | 252 | pass | ||
4434 | 253 | try: | ||
4435 | 254 | R.append(c/q) | ||
4436 | 255 | except: | ||
4437 | 256 | pass | ||
4438 | 257 | b *= 1.5 | ||
4439 | 258 | c *= 3 | ||
4440 | 259 | for t in R: | ||
4441 | 260 | if 0<=t<=1: | ||
4442 | 261 | #real root in range evaluate spline there and add to X | ||
4443 | 262 | Y.append(t*(t*(t*a+b)+c)+y0) | ||
4444 | 263 | Y.append(y3) | ||
4445 | 264 | return Y | ||
4446 | 265 | |||
4447 | 213 | def getPathBounds(points): | 266 | def getPathBounds(points): |
4448 | 214 | n = len(points) | 267 | n = len(points) |
4449 | 215 | f = lambda i,p = points: p[i] | 268 | f = lambda i,p = points: p[i] |
4450 | @@ -918,7 +971,7 @@ | |||
4451 | 918 | if op == _CLOSEPATH: | 971 | if op == _CLOSEPATH: |
4452 | 919 | hadClosePath = hadClosePath + 1 | 972 | hadClosePath = hadClosePath + 1 |
4453 | 920 | if op == _MOVETO: | 973 | if op == _MOVETO: |
4455 | 921 | hadMoveTo = hadMoveTo + 1 | 974 | hadMoveTo += 1 |
4456 | 922 | return hadMoveTo == hadClosePath | 975 | return hadMoveTo == hadClosePath |
4457 | 923 | 976 | ||
4458 | 924 | class Path(SolidShape): | 977 | class Path(SolidShape): |
4459 | @@ -962,7 +1015,32 @@ | |||
4460 | 962 | self.operators.append(_CLOSEPATH) | 1015 | self.operators.append(_CLOSEPATH) |
4461 | 963 | 1016 | ||
4462 | 964 | def getBounds(self): | 1017 | def getBounds(self): |
4464 | 965 | return getPathBounds(self.points) | 1018 | points = self.points |
4465 | 1019 | try: #in case this complex algorithm is not yet ready :) | ||
4466 | 1020 | X = [] | ||
4467 | 1021 | aX = X.append | ||
4468 | 1022 | eX = X.extend | ||
4469 | 1023 | Y=[] | ||
4470 | 1024 | aY = Y.append | ||
4471 | 1025 | eY = Y.extend | ||
4472 | 1026 | i = 0 | ||
4473 | 1027 | for op in self.operators: | ||
4474 | 1028 | nArgs = _PATH_OP_ARG_COUNT[op] | ||
4475 | 1029 | j = i + nArgs | ||
4476 | 1030 | if nArgs==2: | ||
4477 | 1031 | #either moveTo or lineT0 | ||
4478 | 1032 | aX(points[i]) | ||
4479 | 1033 | aY(points[i+1]) | ||
4480 | 1034 | elif nArgs==6: | ||
4481 | 1035 | #curveTo | ||
4482 | 1036 | x1,x2,x3 = points[i:j:2] | ||
4483 | 1037 | eX(_getBezierExtrema(X[-1],x1,x2,x3)) | ||
4484 | 1038 | y1,y2,y3 = points[i+1:j:2] | ||
4485 | 1039 | eY(_getBezierExtrema(Y[-1],y1,y2,y3)) | ||
4486 | 1040 | i = j | ||
4487 | 1041 | return min(X),min(Y),max(X),max(Y) | ||
4488 | 1042 | except: | ||
4489 | 1043 | return getPathBounds(points) | ||
4490 | 966 | 1044 | ||
4491 | 967 | EmptyClipPath=Path() #special path | 1045 | EmptyClipPath=Path() #special path |
4492 | 968 | 1046 | ||
4493 | 969 | 1047 | ||
4494 | === modified file 'src/reportlab/graphics/testdrawings.py' | |||
4495 | --- src/reportlab/graphics/testdrawings.py 2009-02-22 14:19:44 +0000 | |||
4496 | +++ src/reportlab/graphics/testdrawings.py 2013-04-14 00:52:26 +0000 | |||
4497 | @@ -1,5 +1,5 @@ | |||
4498 | 1 | #!/bin/env python | 1 | #!/bin/env python |
4500 | 2 | #Copyright ReportLab Europe Ltd. 2000-2004 | 2 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4501 | 3 | #see license.txt for license details | 3 | #see license.txt for license details |
4502 | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/testdrawings.py | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/testdrawings.py |
4503 | 5 | __version__=''' $Id $ ''' | 5 | __version__=''' $Id $ ''' |
4504 | 6 | 6 | ||
4505 | === modified file 'src/reportlab/graphics/testshapes.py' | |||
4506 | --- src/reportlab/graphics/testshapes.py 2010-12-06 12:45:44 +0000 | |||
4507 | +++ src/reportlab/graphics/testshapes.py 2013-04-14 00:52:26 +0000 | |||
4508 | @@ -1,5 +1,5 @@ | |||
4509 | 1 | #!/bin/env python | 1 | #!/bin/env python |
4511 | 2 | #Copyright ReportLab Europe Ltd. 2000-2004 | 2 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4512 | 3 | #see license.txt for license details | 3 | #see license.txt for license details |
4513 | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/testshapes.py | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/testshapes.py |
4514 | 5 | 5 | ||
4515 | @@ -60,7 +60,11 @@ | |||
4516 | 60 | F.append(name) | 60 | F.append(name) |
4517 | 61 | except: | 61 | except: |
4518 | 62 | pass | 62 | pass |
4520 | 63 | _setup() | 63 | return F |
4521 | 64 | |||
4522 | 65 | for f in _setup(): | ||
4523 | 66 | if f not in _FONTS: | ||
4524 | 67 | _FONTS.append(f) | ||
4525 | 64 | 68 | ||
4526 | 65 | ######################################################### | 69 | ######################################################### |
4527 | 66 | # | 70 | # |
4528 | @@ -439,8 +443,8 @@ | |||
4529 | 439 | String(10, y, text, fontName=fontName, fontSize = fontSize))) | 443 | String(10, y, text, fontName=fontName, fontSize = fontSize))) |
4530 | 440 | y -= 5 | 444 | y -= 5 |
4531 | 441 | return maxx, h-y+gap, D | 445 | return maxx, h-y+gap, D |
4534 | 442 | maxx, maxy, D = drawit(F) | 446 | maxx, maxy, D = drawit(_FONTS) |
4535 | 443 | if maxx>400 or maxy>200: _,_,D = drawit(F,maxx,maxy) | 447 | if maxx>400 or maxy>200: _,_,D = drawit(_FONTS,maxx,maxy) |
4536 | 444 | return D | 448 | return D |
4537 | 445 | 449 | ||
4538 | 446 | ##def getDrawing14(): | 450 | ##def getDrawing14(): |
4539 | 447 | 451 | ||
4540 | === modified file 'src/reportlab/graphics/widgetbase.py' | |||
4541 | --- src/reportlab/graphics/widgetbase.py 2010-12-06 12:45:44 +0000 | |||
4542 | +++ src/reportlab/graphics/widgetbase.py 2013-04-14 00:52:26 +0000 | |||
4543 | @@ -1,7 +1,7 @@ | |||
4545 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4546 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4547 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgetbase.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgetbase.py |
4549 | 4 | __version__=''' $Id: widgetbase.py 3742 2010-07-06 16:19:30Z rgbecker $ ''' | 4 | __version__=''' $Id: widgetbase.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4550 | 5 | __doc__='''Base class for user-defined graphical widgets''' | 5 | __doc__='''Base class for user-defined graphical widgets''' |
4551 | 6 | 6 | ||
4552 | 7 | import string | 7 | import string |
4553 | 8 | 8 | ||
4554 | === modified file 'src/reportlab/graphics/widgets/__init__.py' | |||
4555 | --- src/reportlab/graphics/widgets/__init__.py 2009-02-22 14:19:44 +0000 | |||
4556 | +++ src/reportlab/graphics/widgets/__init__.py 2013-04-14 00:52:26 +0000 | |||
4557 | @@ -1,5 +1,5 @@ | |||
4559 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4560 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4561 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/__init__.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/__init__.py |
4563 | 4 | __version__=''' $Id: __init__.py 3345 2008-12-12 17:55:22Z damian $ ''' | 4 | __version__=''' $Id: __init__.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4564 | 5 | __doc__='''Some non-chart widgets''' | 5 | __doc__='''Some non-chart widgets''' |
4565 | 6 | 6 | ||
4566 | === modified file 'src/reportlab/graphics/widgets/grids.py' | |||
4567 | --- src/reportlab/graphics/widgets/grids.py 2010-12-06 12:45:44 +0000 | |||
4568 | +++ src/reportlab/graphics/widgets/grids.py 2013-04-14 00:52:26 +0000 | |||
4569 | @@ -1,7 +1,7 @@ | |||
4571 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4572 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4573 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/grids.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/grids.py |
4575 | 4 | __version__=''' $Id: grids.py 3660 2010-02-08 18:17:33Z damian $ ''' | 4 | __version__=''' $Id: grids.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4576 | 5 | 5 | ||
4577 | 6 | from reportlab.lib import colors | 6 | from reportlab.lib import colors |
4578 | 7 | from reportlab.lib.validators import isNumber, isColorOrNone, isBoolean, isListOfNumbers, OneOf, isListOfColors, isNumberOrNone | 7 | from reportlab.lib.validators import isNumber, isColorOrNone, isBoolean, isListOfNumbers, OneOf, isListOfColors, isNumberOrNone |
4579 | @@ -424,7 +424,13 @@ | |||
4580 | 424 | 424 | ||
4581 | 425 | def centroid(P): | 425 | def centroid(P): |
4582 | 426 | '''compute average point of a set of points''' | 426 | '''compute average point of a set of points''' |
4584 | 427 | return reduce(lambda x,y, fn=float(len(P)): (x[0]+y[0]/fn,x[1]+y[1]/fn),P,(0,0)) | 427 | cx = 0 |
4585 | 428 | cy = 0 | ||
4586 | 429 | for x,y in P: | ||
4587 | 430 | cx+=x | ||
4588 | 431 | cy+=y | ||
4589 | 432 | n = float(len(P)) | ||
4590 | 433 | return cx/n, cy/n | ||
4591 | 428 | 434 | ||
4592 | 429 | def rotatedEnclosingRect(P, angle, rect): | 435 | def rotatedEnclosingRect(P, angle, rect): |
4593 | 430 | ''' | 436 | ''' |
4594 | @@ -485,10 +491,17 @@ | |||
4595 | 485 | path.isClipPath = 1 | 491 | path.isClipPath = 1 |
4596 | 486 | g = Group() | 492 | g = Group() |
4597 | 487 | g.add(path) | 493 | g.add(path) |
4599 | 488 | rect = ShadedRect(strokeWidth=0,strokeColor=None) | 494 | angle = self.angle |
4600 | 495 | orientation = 'vertical' | ||
4601 | 496 | if angle==180: | ||
4602 | 497 | angle = 0 | ||
4603 | 498 | elif angle in (90,270): | ||
4604 | 499 | orientation ='horizontal' | ||
4605 | 500 | angle = 0 | ||
4606 | 501 | rect = ShadedRect(strokeWidth=0,strokeColor=None,orientation=orientation) | ||
4607 | 489 | for k in 'fillColorStart', 'fillColorEnd', 'numShades', 'cylinderMode': | 502 | for k in 'fillColorStart', 'fillColorEnd', 'numShades', 'cylinderMode': |
4608 | 490 | setattr(rect,k,getattr(self,k)) | 503 | setattr(rect,k,getattr(self,k)) |
4610 | 491 | g.add(rotatedEnclosingRect(P, self.angle, rect)) | 504 | g.add(rotatedEnclosingRect(P, angle, rect)) |
4611 | 492 | g.add(EmptyClipPath) | 505 | g.add(EmptyClipPath) |
4612 | 493 | path = path.copy() | 506 | path = path.copy() |
4613 | 494 | path.isClipPath = 0 | 507 | path.isClipPath = 0 |
4614 | 495 | 508 | ||
4615 | === modified file 'src/reportlab/graphics/widgets/markers.py' | |||
4616 | --- src/reportlab/graphics/widgets/markers.py 2010-12-06 12:45:44 +0000 | |||
4617 | +++ src/reportlab/graphics/widgets/markers.py 2013-04-14 00:52:26 +0000 | |||
4618 | @@ -1,8 +1,8 @@ | |||
4620 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4621 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4622 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/markers.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/markers.py |
4623 | 4 | 4 | ||
4625 | 5 | __version__=''' $Id: markers.py 3660 2010-02-08 18:17:33Z damian $ ''' | 5 | __version__=''' $Id: markers.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4626 | 6 | __doc__="""This modules defines a collection of markers used in charts. | 6 | __doc__="""This modules defines a collection of markers used in charts. |
4627 | 7 | """ | 7 | """ |
4628 | 8 | 8 | ||
4629 | 9 | 9 | ||
4630 | === modified file 'src/reportlab/graphics/widgets/signsandsymbols.py' | |||
4631 | --- src/reportlab/graphics/widgets/signsandsymbols.py 2010-02-16 23:32:55 +0000 | |||
4632 | +++ src/reportlab/graphics/widgets/signsandsymbols.py 2013-04-14 00:52:26 +0000 | |||
4633 | @@ -1,11 +1,11 @@ | |||
4635 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4636 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4637 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/signsandsymbols.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/signsandsymbols.py |
4638 | 4 | # signsandsymbols.py | 4 | # signsandsymbols.py |
4639 | 5 | # A collection of new widgets | 5 | # A collection of new widgets |
4640 | 6 | # author: John Precedo (johnp@reportlab.com) | 6 | # author: John Precedo (johnp@reportlab.com) |
4641 | 7 | 7 | ||
4643 | 8 | __version__=''' $Id: signsandsymbols.py 3632 2010-01-14 10:25:06Z rgbecker $ ''' | 8 | __version__=''' $Id: signsandsymbols.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4644 | 9 | __doc__="""This file is a collection of widgets to produce some common signs and symbols. | 9 | __doc__="""This file is a collection of widgets to produce some common signs and symbols. |
4645 | 10 | 10 | ||
4646 | 11 | Widgets include: | 11 | Widgets include: |
4647 | 12 | 12 | ||
4648 | === modified file 'src/reportlab/graphics/widgets/table.py' | |||
4649 | --- src/reportlab/graphics/widgets/table.py 2010-02-16 23:32:55 +0000 | |||
4650 | +++ src/reportlab/graphics/widgets/table.py 2013-04-14 00:52:26 +0000 | |||
4651 | @@ -1,8 +1,8 @@ | |||
4652 | 1 | #!/usr/bin/env python | 1 | #!/usr/bin/env python |
4654 | 2 | #Copyright ReportLab Europe Ltd. 2000-2004 | 2 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4655 | 3 | #see license.txt for license details | 3 | #see license.txt for license details |
4656 | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/grids.py | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/grids.py |
4658 | 5 | __version__=''' $Id: table.py 3559 2009-09-22 11:27:25Z meitham $ ''' | 5 | __version__=''' $Id: table.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4659 | 6 | 6 | ||
4660 | 7 | from reportlab.graphics.widgetbase import Widget | 7 | from reportlab.graphics.widgetbase import Widget |
4661 | 8 | from reportlab.graphics.charts.textlabels import Label | 8 | from reportlab.graphics.charts.textlabels import Label |
4662 | 9 | 9 | ||
4663 | === modified file 'src/reportlab/lib/PyFontify.py' | |||
4664 | --- src/reportlab/lib/PyFontify.py 2010-12-06 12:45:44 +0000 | |||
4665 | +++ src/reportlab/lib/PyFontify.py 2013-04-14 00:52:26 +0000 | |||
4666 | @@ -1,6 +1,6 @@ | |||
4668 | 1 | #Copyright ReportLab Europe Ltd. 2000-2008 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4669 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4671 | 3 | __version__=''' $Id: PyFontify.py 3660 2010-02-08 18:17:33Z damian $ ''' | 3 | __version__=''' $Id: PyFontify.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4672 | 4 | __doc__=""" | 4 | __doc__=""" |
4673 | 5 | Module to analyze Python source code; for syntax coloring tools. | 5 | Module to analyze Python source code; for syntax coloring tools. |
4674 | 6 | 6 | ||
4675 | 7 | 7 | ||
4676 | === modified file 'src/reportlab/lib/__init__.py' | |||
4677 | --- src/reportlab/lib/__init__.py 2010-12-06 12:45:44 +0000 | |||
4678 | +++ src/reportlab/lib/__init__.py 2013-04-14 00:52:26 +0000 | |||
4679 | @@ -1,7 +1,7 @@ | |||
4680 | 1 | #!/bin/env python | 1 | #!/bin/env python |
4682 | 2 | #Copyright ReportLab Europe Ltd. 2000-2004 | 2 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4683 | 3 | #see license.txt for license details | 3 | #see license.txt for license details |
4684 | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/__init__.py | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/__init__.py |
4686 | 5 | __version__=''' $Id: __init__.py 3660 2010-02-08 18:17:33Z damian $ ''' | 5 | __version__=''' $Id: __init__.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4687 | 6 | import os | 6 | import os |
4688 | 7 | RL_DEBUG = 'RL_DEBUG' in os.environ | 7 | RL_DEBUG = 'RL_DEBUG' in os.environ |
4689 | 8 | 8 | ||
4690 | === modified file 'src/reportlab/lib/abag.py' | |||
4691 | --- src/reportlab/lib/abag.py 2010-02-16 23:32:55 +0000 | |||
4692 | +++ src/reportlab/lib/abag.py 2013-04-14 00:52:26 +0000 | |||
4693 | @@ -1,7 +1,7 @@ | |||
4695 | 1 | #Copyright ReportLab Europe Ltd. 2000-2010 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4696 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4697 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/abag.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/abag.py |
4699 | 4 | __version__=''' $Id: abag.py 3623 2009-12-17 16:18:34Z andy $ ''' | 4 | __version__=''' $Id: abag.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4700 | 5 | __doc__='''Data structure to hold a collection of attributes, used by styles.''' | 5 | __doc__='''Data structure to hold a collection of attributes, used by styles.''' |
4701 | 6 | class ABag: | 6 | class ABag: |
4702 | 7 | """ | 7 | """ |
4703 | 8 | 8 | ||
4704 | === modified file 'src/reportlab/lib/arciv.py' | |||
4705 | --- src/reportlab/lib/arciv.py 2009-02-22 14:19:44 +0000 | |||
4706 | +++ src/reportlab/lib/arciv.py 2013-04-14 00:52:26 +0000 | |||
4707 | @@ -1,9 +1,9 @@ | |||
4709 | 1 | #copyright ReportLab Europe Limited. 2000-2006 | 1 | #copyright ReportLab Europe Limited. 2000-2012 |
4710 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4711 | 3 | ''' | 3 | ''' |
4712 | 4 | Arciv Stream ciphering | 4 | Arciv Stream ciphering |
4713 | 5 | ''' | 5 | ''' |
4715 | 6 | __version__=''' $Id: arciv.py 3386 2009-01-22 14:21:27Z rgbecker $ ''' | 6 | __version__=''' $Id: arciv.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4716 | 7 | from types import StringType | 7 | from types import StringType |
4717 | 8 | class ArcIV: | 8 | class ArcIV: |
4718 | 9 | ''' | 9 | ''' |
4719 | 10 | 10 | ||
4720 | === modified file 'src/reportlab/lib/attrmap.py' | |||
4721 | --- src/reportlab/lib/attrmap.py 2010-12-06 12:45:44 +0000 | |||
4722 | +++ src/reportlab/lib/attrmap.py 2013-04-14 00:52:26 +0000 | |||
4723 | @@ -1,7 +1,7 @@ | |||
4725 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4726 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4727 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/attrmap.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/attrmap.py |
4729 | 4 | __version__=''' $Id: attrmap.py 3660 2010-02-08 18:17:33Z damian $ ''' | 4 | __version__=''' $Id: attrmap.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4730 | 5 | __doc__='''Framework for objects whose assignments are checked. Used by graphics. | 5 | __doc__='''Framework for objects whose assignments are checked. Used by graphics. |
4731 | 6 | 6 | ||
4732 | 7 | We developed reportlab/graphics prior to Python 2 and metaclasses. For the | 7 | We developed reportlab/graphics prior to Python 2 and metaclasses. For the |
4733 | 8 | 8 | ||
4734 | === modified file 'src/reportlab/lib/boxstuff.py' | |||
4735 | --- src/reportlab/lib/boxstuff.py 2009-02-22 14:19:44 +0000 | |||
4736 | +++ src/reportlab/lib/boxstuff.py 2013-04-14 00:52:26 +0000 | |||
4737 | @@ -1,6 +1,6 @@ | |||
4739 | 1 | #Copyright ReportLab Europe Ltd. 2000-2006 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4740 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4742 | 3 | __version__=''' $Id: boxstuff.py 3408 2009-01-28 12:25:33Z rptlab $ ''' | 3 | __version__=''' $Id: boxstuff.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4743 | 4 | __doc__='''Utility functions to position and resize boxes within boxes''' | 4 | __doc__='''Utility functions to position and resize boxes within boxes''' |
4744 | 5 | 5 | ||
4745 | 6 | def aspectRatioFix(preserve,anchor,x,y,width,height,imWidth,imHeight): | 6 | def aspectRatioFix(preserve,anchor,x,y,width,height,imWidth,imHeight): |
4746 | 7 | 7 | ||
4747 | === modified file 'src/reportlab/lib/codecharts.py' | |||
4748 | --- src/reportlab/lib/codecharts.py 2009-02-22 14:19:44 +0000 | |||
4749 | +++ src/reportlab/lib/codecharts.py 2013-04-14 00:52:26 +0000 | |||
4750 | @@ -1,4 +1,4 @@ | |||
4752 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4753 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4754 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/codecharts.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/codecharts.py |
4755 | 4 | #$Header $ | 4 | #$Header $ |
4756 | 5 | 5 | ||
4757 | === modified file 'src/reportlab/lib/colors.py' | |||
4758 | --- src/reportlab/lib/colors.py 2010-12-06 12:45:44 +0000 | |||
4759 | +++ src/reportlab/lib/colors.py 2013-04-14 00:52:26 +0000 | |||
4760 | @@ -1,7 +1,7 @@ | |||
4762 | 1 | #Copyright ReportLab Europe Ltd. 2000-2010 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4763 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4764 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/colors.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/colors.py |
4766 | 4 | __version__=''' $Id: colors.py 3780 2010-09-17 13:40:59Z rgbecker $ ''' | 4 | __version__=''' $Id: colors.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4767 | 5 | __doc__='''Defines standard colour-handling classes and colour names. | 5 | __doc__='''Defines standard colour-handling classes and colour names. |
4768 | 6 | 6 | ||
4769 | 7 | We define standard classes to hold colours in two models: RGB and CMYK. | 7 | We define standard classes to hold colours in two models: RGB and CMYK. |
4770 | @@ -12,8 +12,34 @@ | |||
4771 | 12 | - pre-built colours used in ReportLab's branding | 12 | - pre-built colours used in ReportLab's branding |
4772 | 13 | 13 | ||
4773 | 14 | - various conversion and construction functions | 14 | - various conversion and construction functions |
4774 | 15 | |||
4775 | 16 | These tests are here because doctest cannot find them otherwise. | ||
4776 | 17 | >>> toColor('rgb(128,0,0)')==toColor('rgb(50%,0%,0%)') | ||
4777 | 18 | True | ||
4778 | 19 | >>> toColor('rgb(50%,0%,0%)')!=Color(0.5,0,0,1) | ||
4779 | 20 | True | ||
4780 | 21 | >>> toColor('hsl(0,100%,50%)')==toColor('rgb(255,0,0)') | ||
4781 | 22 | True | ||
4782 | 23 | >>> toColor('hsl(-120,100%,50%)')==toColor('rgb(0,0,255)') | ||
4783 | 24 | True | ||
4784 | 25 | >>> toColor('hsl(120,100%,50%)')==toColor('rgb(0,255,0)') | ||
4785 | 26 | True | ||
4786 | 27 | >>> toColor('rgba( 255,0,0,0.5)')==Color(1,0,0,0.5) | ||
4787 | 28 | True | ||
4788 | 29 | >>> toColor('cmyk(1,0,0,0 )')==CMYKColor(1,0,0,0) | ||
4789 | 30 | True | ||
4790 | 31 | >>> toColor('pcmyk( 100 , 0 , 0 , 0 )')==PCMYKColor(100,0,0,0) | ||
4791 | 32 | True | ||
4792 | 33 | >>> toColor('cmyka(1,0,0,0,0.5)')==CMYKColor(1,0,0,0,alpha=0.5) | ||
4793 | 34 | True | ||
4794 | 35 | >>> toColor('pcmyka(100,0,0,0,0.5)')==PCMYKColor(100,0,0,0,alpha=0.5) | ||
4795 | 36 | True | ||
4796 | 37 | >>> toColor('pcmyka(100,0,0,0)') | ||
4797 | 38 | Traceback (most recent call last): | ||
4798 | 39 | .... | ||
4799 | 40 | ValueError: css color 'pcmyka(100,0,0,0)' has wrong number of components | ||
4800 | 15 | ''' | 41 | ''' |
4802 | 16 | import math | 42 | import math, re |
4803 | 17 | from reportlab.lib.utils import fp_str | 43 | from reportlab.lib.utils import fp_str |
4804 | 18 | 44 | ||
4805 | 19 | class Color: | 45 | class Color: |
4806 | @@ -70,6 +96,14 @@ | |||
4807 | 70 | def hexvala(self): | 96 | def hexvala(self): |
4808 | 71 | return '0x%02x%02x%02x%02x' % self.bitmap_rgba() | 97 | return '0x%02x%02x%02x%02x' % self.bitmap_rgba() |
4809 | 72 | 98 | ||
4810 | 99 | def int_rgb(self): | ||
4811 | 100 | v = self.bitmap_rgb() | ||
4812 | 101 | return v[0]<<16|v[1]<<8|v[2] | ||
4813 | 102 | |||
4814 | 103 | def int_rgba(self): | ||
4815 | 104 | v = self.bitmap_rgba() | ||
4816 | 105 | return int((v[0]<<24|v[1]<<16|v[2]<<8|v[3])&0xffffff) | ||
4817 | 106 | |||
4818 | 73 | _cKwds='red green blue alpha'.split() | 107 | _cKwds='red green blue alpha'.split() |
4819 | 74 | def cKwds(self): | 108 | def cKwds(self): |
4820 | 75 | for k in self._cKwds: | 109 | for k in self._cKwds: |
4821 | @@ -706,6 +740,8 @@ | |||
4822 | 706 | m1 = l*2-m2 | 740 | m1 = l*2-m2 |
4823 | 707 | return hue2rgb(m1, m2, h+1./3),hue2rgb(m1, m2, h),hue2rgb(m1, m2, h-1./3) | 741 | return hue2rgb(m1, m2, h+1./3),hue2rgb(m1, m2, h),hue2rgb(m1, m2, h-1./3) |
4824 | 708 | 742 | ||
4825 | 743 | import re | ||
4826 | 744 | _re_css = re.compile(r'^\s*(pcmyk|cmyk|rgb|hsl)(a|)\s*\(\s*([^)]*)\)\s*$') | ||
4827 | 709 | class cssParse: | 745 | class cssParse: |
4828 | 710 | def pcVal(self,v): | 746 | def pcVal(self,v): |
4829 | 711 | v = v.strip() | 747 | v = v.strip() |
4830 | @@ -746,32 +782,16 @@ | |||
4831 | 746 | except: | 782 | except: |
4832 | 747 | raise ValueError('bad %s argument value %r in css color %r' % (n,v,self.s)) | 783 | raise ValueError('bad %s argument value %r in css color %r' % (n,v,self.s)) |
4833 | 748 | 784 | ||
4834 | 785 | _n_c = dict(pcmyk=(4,100,True,False),cmyk=(4,1,True,False),hsl=(3,1,False,True),rgb=(3,1,False,False)) | ||
4835 | 786 | |||
4836 | 749 | def __call__(self,s): | 787 | def __call__(self,s): |
4852 | 750 | s = s.strip() | 788 | n = _re_css.match(s) |
4853 | 751 | hsl = s.startswith('hsl') | 789 | if not n: return |
4839 | 752 | rgb = s.startswith('rgb') | ||
4840 | 753 | cmyk = s.startswith('cmyk') | ||
4841 | 754 | c = 1 | ||
4842 | 755 | if hsl: n = 3 | ||
4843 | 756 | if rgb: n = 3 | ||
4844 | 757 | if cmyk: | ||
4845 | 758 | n = 4 | ||
4846 | 759 | else: | ||
4847 | 760 | cmyk = s.startswith('pcmyk') | ||
4848 | 761 | if cmyk: | ||
4849 | 762 | n = 5 | ||
4850 | 763 | c = 100 | ||
4851 | 764 | if not (rgb or hsl or cmyk): return None | ||
4854 | 765 | self.s = s | 790 | self.s = s |
4864 | 766 | n = s[n:] | 791 | b,c,cmyk,hsl = self._n_c[n.group(1)] |
4865 | 767 | ha = n.startswith('a') | 792 | ha = n.group(2) |
4866 | 768 | n = n[(ha and 1 or 0):].strip() | 793 | n = n.group(3).split(',') #strip parens and split on comma |
4867 | 769 | if not n.startswith('(') or not n.endswith(')'): | 794 | if len(n)!=(b+(ha and 1 or 0)): |
4859 | 770 | raise ValueError('improperly formatted css style color %r' % s) | ||
4860 | 771 | n = n[1:-1].split(',') #strip parens and split on comma | ||
4861 | 772 | a = len(n) | ||
4862 | 773 | b = cmyk and 4 or 3 | ||
4863 | 774 | if ha and a!=(b+1) or not ha and a!=b: | ||
4868 | 775 | raise ValueError('css color %r has wrong number of components' % s) | 795 | raise ValueError('css color %r has wrong number of components' % s) |
4869 | 776 | if ha: | 796 | if ha: |
4870 | 777 | n,a = n[:b],self.alphaVal(n[b],c) | 797 | n,a = n[:b],self.alphaVal(n[b],c) |
4871 | @@ -805,26 +825,6 @@ | |||
4872 | 805 | 825 | ||
4873 | 806 | def __call__(self,arg,default=None): | 826 | def __call__(self,arg,default=None): |
4874 | 807 | '''try to map an arbitrary arg to a color instance | 827 | '''try to map an arbitrary arg to a color instance |
4875 | 808 | >>> toColor('rgb(128,0,0)')==toColor('rgb(50%,0%,0%)') | ||
4876 | 809 | True | ||
4877 | 810 | >>> toColor('rgb(50%,0%,0%)')!=Color(0.5,0,0,1) | ||
4878 | 811 | True | ||
4879 | 812 | >>> toColor('hsl(0,100%,50%)')==toColor('rgb(255,0,0)') | ||
4880 | 813 | True | ||
4881 | 814 | >>> toColor('hsl(-120,100%,50%)')==toColor('rgb(0,0,255)') | ||
4882 | 815 | True | ||
4883 | 816 | >>> toColor('hsl(120,100%,50%)')==toColor('rgb(0,255,0)') | ||
4884 | 817 | True | ||
4885 | 818 | >>> toColor('rgba(255,0,0,0.5)')==Color(1,0,0,0.5) | ||
4886 | 819 | True | ||
4887 | 820 | >>> toColor('cmyk(1,0,0,0)')==CMYKColor(1,0,0,0) | ||
4888 | 821 | True | ||
4889 | 822 | >>> toColor('pcmyk(100,0,0,0)')==PCMYKColor(100,0,0,0) | ||
4890 | 823 | True | ||
4891 | 824 | >>> toColor('cmyka(1,0,0,0,0.5)')==CMYKColor(1,0,0,0,alpha=0.5) | ||
4892 | 825 | True | ||
4893 | 826 | >>> toColor('pcmyka(100,0,0,0,0.5)')==PCMYKColor(100,0,0,0,alpha=0.5) | ||
4894 | 827 | True | ||
4895 | 828 | ''' | 828 | ''' |
4896 | 829 | if isinstance(arg,Color): return arg | 829 | if isinstance(arg,Color): return arg |
4897 | 830 | if isinstance(arg,(tuple,list)): | 830 | if isinstance(arg,(tuple,list)): |
4898 | @@ -914,7 +914,6 @@ | |||
4899 | 914 | else: b = black | 914 | else: b = black |
4900 | 915 | return linearlyInterpolatedColor(b, c, 0, 1, f) | 915 | return linearlyInterpolatedColor(b, c, 0, 1, f) |
4901 | 916 | 916 | ||
4902 | 917 | |||
4903 | 918 | def fade(aSpotColor, percentages): | 917 | def fade(aSpotColor, percentages): |
4904 | 919 | """Waters down spot colors and returns a list of new ones | 918 | """Waters down spot colors and returns a list of new ones |
4905 | 920 | 919 | ||
4906 | 921 | 920 | ||
4907 | === modified file 'src/reportlab/lib/corp.py' | |||
4908 | --- src/reportlab/lib/corp.py 2010-12-06 12:45:44 +0000 | |||
4909 | +++ src/reportlab/lib/corp.py 2013-04-14 00:52:26 +0000 | |||
4910 | @@ -1,7 +1,7 @@ | |||
4911 | 1 | #!/bin/env python | 1 | #!/bin/env python |
4913 | 2 | #Copyright ReportLab Europe Ltd. 2000-2004 | 2 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4914 | 3 | #see license.txt for license details | 3 | #see license.txt for license details |
4916 | 4 | __version__=''' $Id: corp.py 3786 2010-09-29 09:51:54Z rgbecker $ ''' | 4 | __version__=''' $Id: corp.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4917 | 5 | __doc__="""Generate ReportLab logo in a variety of sizes and formats. | 5 | __doc__="""Generate ReportLab logo in a variety of sizes and formats. |
4918 | 6 | 6 | ||
4919 | 7 | 7 | ||
4920 | 8 | 8 | ||
4921 | === modified file 'src/reportlab/lib/enums.py' | |||
4922 | --- src/reportlab/lib/enums.py 2009-02-22 14:19:44 +0000 | |||
4923 | +++ src/reportlab/lib/enums.py 2013-04-14 00:52:26 +0000 | |||
4924 | @@ -1,7 +1,7 @@ | |||
4926 | 1 | #Copyright ReportLab Europe Ltd. 2000-2004 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4927 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4928 | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/enums.py | 3 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/enums.py |
4930 | 4 | __version__=''' $Id: enums.py 3342 2008-12-12 15:55:34Z andy $ ''' | 4 | __version__=''' $Id: enums.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4931 | 5 | __doc__=""" | 5 | __doc__=""" |
4932 | 6 | Container for constants. Hardly used! | 6 | Container for constants. Hardly used! |
4933 | 7 | """ | 7 | """ |
4934 | 8 | 8 | ||
4935 | === modified file 'src/reportlab/lib/extformat.py' | |||
4936 | --- src/reportlab/lib/extformat.py 2010-12-06 12:45:44 +0000 | |||
4937 | +++ src/reportlab/lib/extformat.py 2013-04-14 00:52:26 +0000 | |||
4938 | @@ -1,6 +1,6 @@ | |||
4940 | 1 | #Copyright ReportLab Europe Ltd. 2000-2010 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4941 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4943 | 3 | __version__='''$Id: extformat.py 3665 2010-02-09 15:55:45Z rgbecker $''' | 3 | __version__='''$Id: extformat.py 3959 2012-09-27 14:39:39Z robin $''' |
4944 | 4 | __doc__='''Apparently not used anywhere, purpose unknown!''' | 4 | __doc__='''Apparently not used anywhere, purpose unknown!''' |
4945 | 5 | from tokenize import tokenprog | 5 | from tokenize import tokenprog |
4946 | 6 | import sys | 6 | import sys |
4947 | 7 | 7 | ||
4948 | === modified file 'src/reportlab/lib/fontfinder.py' | |||
4949 | --- src/reportlab/lib/fontfinder.py 2010-12-06 12:45:44 +0000 | |||
4950 | +++ src/reportlab/lib/fontfinder.py 2013-04-14 00:52:26 +0000 | |||
4951 | @@ -1,6 +1,6 @@ | |||
4953 | 1 | #Copyright ReportLab Europe Ltd. 2000-2007 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4954 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
4956 | 3 | __version__=''' $Id: fontfinder.py 3660 2010-02-08 18:17:33Z damian $ ''' | 3 | __version__=''' $Id: fontfinder.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4957 | 4 | 4 | ||
4958 | 5 | #modification of users/robin/ttflist.py. | 5 | #modification of users/robin/ttflist.py. |
4959 | 6 | __doc__="""This provides some general-purpose tools for finding fonts. | 6 | __doc__="""This provides some general-purpose tools for finding fonts. |
4960 | 7 | 7 | ||
4961 | === modified file 'src/reportlab/lib/fonts.py' | |||
4962 | --- src/reportlab/lib/fonts.py 2010-12-06 12:45:44 +0000 | |||
4963 | +++ src/reportlab/lib/fonts.py 2013-04-14 00:52:26 +0000 | |||
4964 | @@ -1,8 +1,8 @@ | |||
4965 | 1 | #!/bin/env python | 1 | #!/bin/env python |
4967 | 2 | #Copyright ReportLab Europe Ltd. 2000-2004 | 2 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4968 | 3 | #see license.txt for license details | 3 | #see license.txt for license details |
4969 | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/fonts.py | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/fonts.py |
4971 | 5 | __version__=''' $Id: fonts.py 3702 2010-04-14 17:13:41Z rgbecker $ ''' | 5 | __version__=''' $Id: fonts.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4972 | 6 | __doc__='''Utilities to associate bold and italic versions of fonts into families | 6 | __doc__='''Utilities to associate bold and italic versions of fonts into families |
4973 | 7 | 7 | ||
4974 | 8 | Bold, italic and plain fonts are usually implemented in separate disk files; | 8 | Bold, italic and plain fonts are usually implemented in separate disk files; |
4975 | 9 | 9 | ||
4976 | === modified file 'src/reportlab/lib/formatters.py' | |||
4977 | --- src/reportlab/lib/formatters.py 2008-10-19 23:16:31 +0000 | |||
4978 | +++ src/reportlab/lib/formatters.py 2013-04-14 00:52:26 +0000 | |||
4979 | @@ -1,9 +1,9 @@ | |||
4980 | 1 | #!/bin/env python | 1 | #!/bin/env python |
4982 | 2 | #Copyright ReportLab Europe Ltd. 2000-2004 | 2 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4983 | 3 | #see license.txt for license details | 3 | #see license.txt for license details |
4984 | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/formatters.py | 4 | #history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/formatters.py |
4985 | 5 | __all__=('Formatter','DecimalFormatter') | 5 | __all__=('Formatter','DecimalFormatter') |
4987 | 6 | __version__=''' $Id: formatters.py 3155 2007-10-05 10:55:52Z rgbecker $ ''' | 6 | __version__=''' $Id: formatters.py 3959 2012-09-27 14:39:39Z robin $ ''' |
4988 | 7 | __doc__=""" | 7 | __doc__=""" |
4989 | 8 | These help format numbers and dates in a user friendly way. | 8 | These help format numbers and dates in a user friendly way. |
4990 | 9 | Used by the graphics framework. | 9 | Used by the graphics framework. |
4991 | 10 | 10 | ||
4992 | === modified file 'src/reportlab/lib/geomutils.py' | |||
4993 | --- src/reportlab/lib/geomutils.py 2009-02-22 14:19:44 +0000 | |||
4994 | +++ src/reportlab/lib/geomutils.py 2013-04-14 00:52:26 +0000 | |||
4995 | @@ -1,6 +1,6 @@ | |||
4997 | 1 | #Copyright ReportLab Europe Ltd. 2000-2006 | 1 | #Copyright ReportLab Europe Ltd. 2000-2012 |
4998 | 2 | #see license.txt for license details | 2 | #see license.txt for license details |
5000 | 3 | __version__=''' $Id: geomutils.py 3355 2009-01-08 14:58:44Z jonas $ ''' | 3 | __version__=''' $Id: geomutils.py 3959 2012-09-27 14:39:39Z robin $ ''' |
The diff has been truncated for viewing.
Did you forward this to Debian?
Also, please resumbit this MP against lp:ubuntu/python-reportlab, not against lp:ubuntu/precise/python-reportlab. Thanks!